Double8.inc

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

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

; <fold avt.lang.Double8 — родной код>
    if(used avt.lang.Double8$toLong8Bits$double8$) ; <fold returns long8>
                    fast        avt.lang.Double8$toLong8Bits$double8$, \
                                value, double8
                    fenter
                    vmovdqu64   zmm0, [.value]
                    fcltag_z    value
                    fleave
    end if ; </fold>

    if(used avt.lang.Double8$low$double8$) ; <fold returns double4>
                    fast        avt.lang.Double8$low$double8$, \
                                value, double8
                    fenter
                    vmovdqu     ymm0, [.value+$00]
                    fcltag_z    value
                    fleave
    end if ; </fold>

    if(used avt.lang.Double8$high$double8$) ; <fold returns double4>
                    fast        avt.lang.Double8$high$double8$, \
                                value, double8
                    fenter
                    vmovdqu     ymm0, [.value+$20]
                    fcltag_z    value
                    fleave
    end if ; </fold>

    if(used avt.lang.Double8$create$double4$double4$) ; <fold returns double8>
                    fast        avt.lang.Double8$create$double4$double4$, \
                                value0, double4, \
                                value1, double4
                    fenter
                    vmovdqu     ymm0, [.value0]
                    vmovdqu     ymm1, [.value1]
                    vinserti64x4 zmm0, zmm0, ymm1, $01
                    fcltag_y    value0, value1
                    fleave
    end if ; </fold>

    if(used avt.lang.Double8$create$double2$double2$double2$double2$) ; <fold returns double8>
                    fast        avt.lang.Double8$create$double2$double2$double2$double2$, \
                                value0, double2, \
                                value1, double2, \
                                value2, double2, \
                                value3, double2
                    fenter
                    vmovdqa     xmm0, [.value0]
                    vinserti64x2 zmm0, zmm0, [.value1], $01
                    vinserti64x2 zmm0, zmm0, [.value2], $02
                    vinserti64x2 zmm0, zmm0, [.value3], $03
                    fleave
    end if ; </fold>

    if(used avt.lang.Double8$max$double8$double8$) ; <fold returns double8>
                    fast        avt.lang.Double8$max$double8$double8$, \
                                value0, double8, \
                                value1, double8
                    fenter
                    vmovdqu64   zmm0, [.value0]
                    vmovdqu64   zmm1, [.value1]
                    vmovdqa64   zmm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
                    vmovdqa64   zmm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
                    vpandq      zmm2, zmm0, zmm6
                    vpandq      zmm3, zmm1, zmm6
                    vporq       zmm4, zmm0, zmm1
                    vporq       zmm4, zmm4, zmm7
                    vpcmpeqq    msk1, zmm4, zmm7
                    vpcmpeqq    msk2, zmm3, zmm6
                    vpcmpeqq    msk3, zmm2, zmm6
                    korw        msk2, msk2, msk3
                    korw        msk3, msk1, msk2
                    knotw       msk3, msk3
                    vpandq      zmm2{k1}{z}, zmm0, zmm1
                    vporq       zmm3{k2}{z}, zmm6, zmm7
                    vmaxpd      zmm5{k3}{z}, zmm0, zmm1
                    vporq       zmm0, zmm2, zmm3
                    vporq       zmm0, zmm0, zmm5
                    fcltag_z    value0, value1
                    fleave
    end if ; </fold>

    if(used avt.lang.Double8$min$double8$double8$) ; <fold returns double8>
                    fast        avt.lang.Double8$min$double8$double8$, \
                                value0, double8, \
                                value1, double8
                    fenter
                    vmovdqu64   zmm0, [.value0]
                    vmovdqu64   zmm1, [.value1]
                    vmovdqa64   zmm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
                    vmovdqa64   zmm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
                    vpandq      zmm2, zmm0, zmm6
                    vpandq      zmm3, zmm1, zmm6
                    vporq       zmm4, zmm0, zmm1
                    vporq       zmm4, zmm4, zmm7
                    vpcmpeqq    msk1, zmm4, zmm7
                    vpcmpeqq    msk2, zmm3, zmm6
                    vpcmpeqq    msk3, zmm2, zmm6
                    korw        msk2, msk2, msk3
                    korw        msk3, msk1, msk2
                    knotw       msk3, msk3
                    vporq       zmm2{k1}{z}, zmm0, zmm1
                    vporq       zmm3{k2}{z}, zmm6, zmm7
                    vminpd      zmm5{k3}{z}, zmm0, zmm1
                    vporq       zmm0, zmm2, zmm3
                    vporq       zmm0, zmm0, zmm5
                    fcltag_z    value0, value1
                    fleave
    end if ; </fold>

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