Float8.inc

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

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

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

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

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

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

    if(used avt.lang.Float8$create$float2$float2$float2$float2$) ; <fold returns float8>
                    fast        avt.lang.Float8$create$float2$float2$float2$float2$, \
                                value0, float2, \
                                value1, float2, \
                                value2, float2, \
                                value3, float2
                    fenter
                    vmovdqa     xmm0, [.value0]
                    vmovdqa     xmm1, [.value1]
                    vmovdqa     xmm2, [.value2]
                    vmovdqa     xmm3, [.value3]
                    vpslldq     xmm1, xmm1, $08
                    vpslldq     xmm3, xmm3, $08
                    vpor        xmm0, xmm0, xmm1
                    vpor        xmm2, xmm2, xmm3
                    vinserti128 ymm0, ymm0, xmm2, $01
                    fleave
    end if ; </fold>

    if(used avt.lang.Float8$max$float8$float8$) ; <fold returns float8>
                    fast        avt.lang.Float8$max$float8$float8$, \
                                value0, float8, \
                                value1, float8
                    fenter
                    vmovdqu     ymm0, [.value0]
                    vmovdqu     ymm1, [.value1]
                    vmovdqa     ymm6, [avt.lang.Float8$MASK_NOT_A_NUMBER]
                    vmovdqa     ymm7, [avt.lang.Float8$MASK_NEGATIVE_ZERO]
                    vpand       ymm2, ymm0, ymm6
                    vpand       ymm3, ymm1, ymm6
                    vpor        ymm4, ymm0, ymm1
                    vpor        ymm4, ymm4, ymm7
                    vpcmpeqd    msk1, ymm4, ymm7
                    vpcmpeqd    msk2, ymm3, ymm6
                    vpcmpeqd    msk3, ymm2, ymm6
                    korw        msk2, msk2, msk3
                    korw        msk3, msk1, msk2
                    knotw       msk3, msk3
                    vpandd      ymm2{k1}{z}, ymm0, ymm1
                    vpord       ymm3{k2}{z}, ymm6, ymm7
                    vmaxps      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.Float8$min$float8$float8$) ; <fold returns float8>
                    fast        avt.lang.Float8$min$float8$float8$, \
                                value0, float8, \
                                value1, float8
                    fenter
                    vmovdqu     ymm0, [.value0]
                    vmovdqu     ymm1, [.value1]
                    vmovdqa     ymm6, [avt.lang.Float8$MASK_NOT_A_NUMBER]
                    vmovdqa     ymm7, [avt.lang.Float8$MASK_NEGATIVE_ZERO]
                    vpand       ymm2, ymm0, ymm6
                    vpand       ymm3, ymm1, ymm6
                    vpor        ymm4, ymm0, ymm1
                    vpor        ymm4, ymm4, ymm7
                    vpcmpeqd    msk1, ymm4, ymm7
                    vpcmpeqd    msk2, ymm3, ymm6
                    vpcmpeqd    msk3, ymm2, ymm6
                    korw        msk2, msk2, msk3
                    korw        msk3, msk1, msk2
                    knotw       msk3, msk3
                    vpord       ymm2{k1}{z}, ymm0, ymm1
                    vpord       ymm3{k2}{z}, ymm6, ymm7
                    vminps      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.Float8$setElement$float8$int$float$) ; <fold returns float8>
                    fast        avt.lang.Float8$setElement$float8$int$float$, \
                                value, float8, \
                                index, int, \
                                element, float
                    fenter
                    mov         r01d, [.index]
                    cmp         r01d, $08
                    jb          @F
                    fthrow      VectorIndexOutOfBoundsException
             @@:    mov         r00d, [.element]
                    mov         dword [.value+r01*4+$00], r00d
                    vmovdqu     ymm0, [.value]
                    fcltag_y    value
                    fleave
    end if ; </fold>
; </fold>