Double4.inc

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

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

; <fold avt.lang.Double4 — родной код>
    if(used avt.lang.Double4$toLong4Bits$double4$) ; <fold returns long4>
                    fast        avt.lang.Double4$toLong4Bits$double4$, \
                                value, double4
                    fenter
                    vmovdqu     ymm0, [.value]
                    fcltag_y    value
                    fleave
    end if ; </fold>

    if(used avt.lang.Double4$low$double4$) ; <fold returns double2>
                    fast        avt.lang.Double4$low$double4$, \
                                value, double4
                    fenter
                    vmovdqa     xmm0, [.value+$00]
                    fcltag_y    value
                    fleave
    end if ; </fold>

    if(used avt.lang.Double4$high$double4$) ; <fold returns double2>
                    fast        avt.lang.Double4$high$double4$, \
                                value, double4
                    fenter
                    vmovdqa     xmm0, [.value+$10]
                    fcltag_y    value
                    fleave
    end if ; </fold>

    if(used avt.lang.Double4$create$double2$double2$) ; <fold returns double4>
                    fast        avt.lang.Double4$create$double2$double2$, \
                                value0, double2, \
                                value1, double2
                    fenter
                    vmovdqa     xmm0, [.value0]
                    vinserti128 ymm0, ymm0, [.value1], $01
                    fleave
    end if ; </fold>

    if(used avt.lang.Double4$max$double4$double4$) ; <fold returns double4>
                    fast        avt.lang.Double4$max$double4$double4$, \
                                value0, double4, \
                                value1, double4
                    fenter
                    vmovdqu     ymm0, [.value0]
                    vmovdqu     ymm1, [.value1]
                    vmovdqa     ymm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
                    vmovdqa     ymm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
                    vpand       ymm2, ymm0, ymm6
                    vpand       ymm3, ymm1, ymm6
                    vpor        ymm4, ymm0, ymm1
                    vpor        ymm4, ymm4, ymm7
                    vpcmpeqq    msk1, ymm4, ymm7
                    vpcmpeqq    msk2, ymm3, ymm6
                    vpcmpeqq    msk3, ymm2, ymm6
                    korw        msk2, msk2, msk3
                    korw        msk3, msk1, msk2
                    knotw       msk3, msk3
                    vpandq      ymm2{k1}{z}, ymm0, ymm1
                    vporq       ymm3{k2}{z}, ymm6, ymm7
                    vmaxpd      ymm5{k3}{z}, ymm0, ymm1
                    vpor        ymm0, ymm2, ymm3
                    vpor        ymm0, ymm0, ymm5
                    fcltag_y    value0, value1
                    fleave
    end if ; </fold>

    if(used avt.lang.Double4$min$double4$double4$) ; <fold returns double4>
                    fast        avt.lang.Double4$min$double4$double4$, \
                                value0, double4, \
                                value1, double4
                    fenter
                    vmovdqu     ymm0, [.value0]
                    vmovdqu     ymm1, [.value1]
                    vmovdqa     ymm6, [avt.lang.Double8$MASK_NOT_A_NUMBER]
                    vmovdqa     ymm7, [avt.lang.Double8$MASK_NEGATIVE_ZERO]
                    vpand       ymm2, ymm0, ymm6
                    vpand       ymm3, ymm1, ymm6
                    vpor        ymm4, ymm0, ymm1
                    vpor        ymm4, ymm4, ymm7
                    vpcmpeqq    msk1, ymm4, ymm7
                    vpcmpeqq    msk2, ymm3, ymm6
                    vpcmpeqq    msk3, ymm2, ymm6
                    korw        msk2, msk2, msk3
                    korw        msk3, msk1, msk2
                    knotw       msk3, msk3
                    vporq       ymm2{k1}{z}, ymm0, ymm1
                    vporq       ymm3{k2}{z}, ymm6, ymm7
                    vminpd      ymm5{k3}{z}, ymm0, ymm1
                    vpor        ymm0, ymm2, ymm3
                    vpor        ymm0, ymm0, ymm5
                    fcltag_y    value0, value1
                    fleave
    end if ; </fold>

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