Double2.inc

Переключить прокрутку окна
Загрузить этот исходный код

;
  ; Реализация среды исполнения языка программирования
  ; Объектно-ориентированный продвинутый векторный транслятор
  ;
  ; Copyright © 2021, 2024 Малик Разработчик
  ;
  ; Это свободная программа: вы можете перераспространять ее и/или изменять
  ; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
  ; в каком она была опубликована Фондом свободного программного обеспечения;
  ; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
  ;
  ; Эта программа распространяется в надежде, что она будет полезной,
  ; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
  ; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
  ; общественной лицензии GNU.
  ;
  ; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
  ; вместе с этой программой. Если это не так, см.
  ; <https://www.gnu.org/licenses/>.
;

; <fold avt.lang.Double2 — родной код>
    if(used avt.lang.Double2$toLong2Bits$double2$) ; <fold returns long2>
                    fast        avt.lang.Double2$toLong2Bits$double2$, \
                                value, double2
                    fenter
                    vmovdqa     xmm0, [.value]
                    fleave
    end if ; </fold>

    if(used avt.lang.Double2$max$double2$double2$) ; <fold returns double2>
                    fast        avt.lang.Double2$max$double2$double2$, \
                                value0, double2, \
                                value1, double2
                    fenter
                    vmovdqa     xmm0, [.value0]
                    vmovdqa     xmm1, [.value1]
                    vmovdqa     xmm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
                    vmovdqa     xmm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
                    vpand       xmm2, xmm0, xmm6
                    vpand       xmm3, xmm1, xmm6
                    vpor        xmm4, xmm0, xmm1
                    vpor        xmm4, xmm4, xmm7
                    vpcmpeqq    msk1, xmm4, xmm7
                    vpcmpeqq    msk2, xmm3, xmm6
                    vpcmpeqq    msk3, xmm2, xmm6
                    korw        msk2, msk2, msk3
                    korw        msk3, msk1, msk2
                    knotw       msk3, msk3
                    vpandq      xmm2{k1}{z}, xmm0, xmm1
                    vporq       xmm3{k2}{z}, xmm6, xmm7
                    vmaxpd      xmm5{k3}{z}, xmm0, xmm1
                    vpor        xmm0, xmm2, xmm3
                    vpor        xmm0, xmm0, xmm5
                    fleave
    end if ; </fold>

    if(used avt.lang.Double2$min$double2$double2$) ; <fold returns double2>
                    fast        avt.lang.Double2$min$double2$double2$, \
                                value0, double2, \
                                value1, double2
                    fenter
                    vmovdqa     xmm0, [.value0]
                    vmovdqa     xmm1, [.value1]
                    vmovdqa     xmm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
                    vmovdqa     xmm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
                    vpand       xmm2, xmm0, xmm6
                    vpand       xmm3, xmm1, xmm6
                    vpor        xmm4, xmm0, xmm1
                    vpor        xmm4, xmm4, xmm7
                    vpcmpeqq    msk1, xmm4, xmm7
                    vpcmpeqq    msk2, xmm3, xmm6
                    vpcmpeqq    msk3, xmm2, xmm6
                    korw        msk2, msk2, msk3
                    korw        msk3, msk1, msk2
                    knotw       msk3, msk3
                    vporq       xmm2{k1}{z}, xmm0, xmm1
                    vporq       xmm3{k2}{z}, xmm6, xmm7
                    vminpd      xmm5{k3}{z}, xmm0, xmm1
                    vpor        xmm0, xmm2, xmm3
                    vpor        xmm0, xmm0, xmm5
                    fleave
    end if ; </fold>

    if(used avt.lang.Double2$setElement$double2$int$double$) ; <fold returns double2>
                    fast        avt.lang.Double2$setElement$double2$int$double$, \
                                value, double2, \
                                index, int, \
                                element, double
                    fenter
                    mov         r01d, [.index]
                    cmp         r01d, $02
                    jb          @F
                    fthrow      VectorIndexOutOfBoundsException
             @@:    mov         r00q, [.element]
                    mov         qword [.value+r01*8+$00], r00q
                    vmovdqa     xmm0, [.value]
                    fleave
    end if ; </fold>
; </fold>