scalar.ne.inc

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

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

; <fold скалярное не равно>
    ; <fold приватные макросы — должны использоваться только этим текстом исходного кода>
        macro _setcmpnes {
                        sete        bsc0
                        dec         bsc0
                        movsx       dsc0, bsc0
        }

        macro _setcmpnev2 {
                        and         dsc0, $03
                        cmp         dsc0, $03
                        _setcmpnes
        }

        macro _setcmpnev4 {
                        and         dsc0, $0f
                        cmp         dsc0, $0f
                        _setcmpnes
        }

        macro _setcmpnev8 {
                        cmp         bsc0, $ff
                        _setcmpnes
        }

        macro _jcmpnev2 labelIsTrue* {
                        and         dsc0, $03
                        cmp         dsc0, $03
                        jne         labelIsTrue
        }

        macro _jcmpnev4 labelIsTrue* {
                        and         dsc0, $0f
                        cmp         dsc0, $0f
                        jne         labelIsTrue
        }

        macro _jcmpnev8 labelIsTrue* {
                        cmp         bsc0, $ff
                        jne         labelIsTrue
        }
    ; </fold>

    ; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
        macro setsnee {
                        fld         tbyte [rsp+$00]
                        __pop       $01
                        fcomip      esc0, esc1
                        releasee
                        _setcmpg
                        _setcmpnes
        }

        macro setsned {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcomisd     xmm1, xmm0
                        _setcmpg
                        _setcmpnes
        }

        macro setsned2 {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcmppd      xmm0, xmm1, xmm0, $00
                        vmovmskpd   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsned4 {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $02
                        vcmppd      ymm0, ymm1, ymm0, $00
                        vmovmskpd   dsc0, ymm0
                        _setcmpnev4
        }

        macro setsned8 {
                        vmovdqu64   zmm1, [rsp+$00]
                        __cltag_z   $00
                        __pop       $04
                        vcmppd      msk1, zmm1, zmm0, $00
                        kmovw       dsc0, msk1
                        _setcmpnev8
        }

        macro setsnef {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcomiss     xmm1, xmm0
                        _setcmpg
                        _setcmpnes
        }

        macro setsnef2 {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcmpps      xmm0, xmm1, xmm0, $00
                        vmovmskps   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnef4 {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcmpps      xmm0, xmm1, xmm0, $00
                        vmovmskps   dsc0, xmm0
                        _setcmpnev4
        }

        macro setsnef8 {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $02
                        vcmpps      ymm0, ymm1, ymm0, $00
                        vmovmskps   dsc0, ymm0
                        _setcmpnev8
        }

        macro setsnei {
                        mov         dsc1, [rsp+$00]
                        __pop       $01
                        cmp         dsc1, dsc0
                        _setcmpnes
        }

        macro setsnei2 {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vpcmpeqd    xmm0, xmm1, xmm0
                        vmovmskps   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnei4 {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vpcmpeqd    xmm0, xmm1, xmm0
                        vmovmskps   dsc0, xmm0
                        _setcmpnev4
        }

        macro setsnei8 {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $02
                        vpcmpeqd    ymm0, ymm1, ymm0
                        vmovmskps   dsc0, ymm0
                        _setcmpnev8
        }

        macro setsnel {
                        mov         qsc1, [rsp+$00]
                        __pop       $01
                        cmp         qsc1, qsc0
                        _setcmpnes
        }

        macro setsnel2 {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vpcmpeqq    xmm0, xmm1, xmm0
                        vmovmskpd   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnel4 {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $02
                        vpcmpeqq    ymm0, ymm1, ymm0
                        vmovmskpd   dsc0, ymm0
                        _setcmpnev4
        }

        macro setsnel8 {
                        vmovdqu64   zmm1, [rsp+$00]
                        __cltag_z   $00
                        __pop       $04
                        vpcmpeqq    msk1, zmm1, zmm0
                        kmovw       dsc0, msk1
                        _setcmpnev8
        }
    ; </fold>

    ; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
        macro setsnee_p {
                        fld         tbyte [rsp+$00]
                        fcomip      esc0, esc1
                        releasee
                        _setcmpg
                        _setcmpnes
                        _wrstb
        }

        macro setsned_p {
                        vmovdqa     xmm1, [rsp+$00]
                        vcomisd     xmm1, xmm0
                        _setcmpg
                        _setcmpnes
                        _wrstb
        }

        macro setsned2_p {
                        vmovdqa     xmm1, [rsp+$00]
                        vcmppd      xmm0, xmm1, xmm0, $00
                        vmovmskpd   dsc0, xmm0
                        _setcmpnev2
                        _wrstb
        }

        macro setsned4_p {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $01
                        vcmppd      ymm0, ymm1, ymm0, $00
                        vmovmskpd   dsc0, ymm0
                        _setcmpnev4
                        _wrstb
        }

        macro setsned8_p {
                        vmovdqu64   zmm1, [rsp+$00]
                        __cltag_z   $00
                        __pop       $03
                        vcmppd      msk1, zmm1, zmm0, $00
                        kmovw       dsc0, msk1
                        _setcmpnev8
                        _wrstb
        }

        macro setsnef_p {
                        vmovdqa     xmm1, [rsp+$00]
                        vcomiss     xmm1, xmm0
                        _setcmpg
                        _setcmpnes
                        _wrstb
        }

        macro setsnef2_p {
                        vmovdqa     xmm1, [rsp+$00]
                        vcmpps      xmm0, xmm1, xmm0, $00
                        vmovmskps   dsc0, xmm0
                        _setcmpnev2
                        _wrstb
        }

        macro setsnef4_p {
                        vmovdqa     xmm1, [rsp+$00]
                        vcmpps      xmm0, xmm1, xmm0, $00
                        vmovmskps   dsc0, xmm0
                        _setcmpnev4
                        _wrstb
        }

        macro setsnef8_p {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $01
                        vcmpps      ymm0, ymm1, ymm0, $00
                        vmovmskps   dsc0, ymm0
                        _setcmpnev8
                        _wrstb
        }

        macro setsnei_p {
                        cmp         dword [rsp+$00], dsc0
                        _setcmpnes
                        _wrstb
        }

        macro setsnei2_p {
                        vmovdqa     xmm1, [rsp+$00]
                        vpcmpeqd    xmm0, xmm1, xmm0
                        vmovmskps   dsc0, xmm0
                        _setcmpnev2
                        _wrstb
        }

        macro setsnei4_p {
                        vmovdqa     xmm1, [rsp+$00]
                        vpcmpeqd    xmm0, xmm1, xmm0
                        vmovmskps   dsc0, xmm0
                        _setcmpnev4
                        _wrstb
        }

        macro setsnei8_p {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $01
                        vpcmpeqd    ymm0, ymm1, ymm0
                        vmovmskps   dsc0, ymm0
                        _setcmpnev8
                        _wrstb
        }

        macro setsnel_p {
                        cmp         qword [rsp+$00], qsc0
                        _setcmpnes
                        _wrstb
        }

        macro setsnel2_p {
                        vmovdqa     xmm1, [rsp+$00]
                        vpcmpeqq    xmm0, xmm1, xmm0
                        vmovmskpd   dsc0, xmm0
                        _setcmpnev2
                        _wrstb
        }

        macro setsnel4_p {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $01
                        vpcmpeqq    ymm0, ymm1, ymm0
                        vmovmskpd   dsc0, ymm0
                        _setcmpnev4
                        _wrstb
        }

        macro setsnel8_p {
                        vmovdqu64   zmm1, [rsp+$00]
                        __cltag_z   $00
                        __pop       $03
                        vpcmpeqq    msk1, zmm1, zmm0
                        kmovw       dsc0, msk1
                        _setcmpnev8
                        _wrstb
        }
    ; </fold>

    ; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
        macro setsnee_l localvarName* {
                        fld         tbyte [.#localvarName]
                        fxch
                        fcomip      esc0, esc1
                        releasee
                        _setcmpg
                        _setcmpnes
        }

        macro setsned_l localvarName* {
                        vcomisd     xmm0, [.#localvarName]
                        _setcmpg
                        _setcmpnes
        }

        macro setsned2_l localvarName* {
                        vcmppd      xmm0, xmm0, [.#localvarName], $00
                        vmovmskpd   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsned4_l localvarName* {
                        vmovdqu     ymm1, [.#localvarName]
                        vcmppd      ymm0, ymm0, ymm1, $00
                        vmovmskpd   dsc0, ymm0
                        _setcmpnev4
        }

        macro setsned8_l localvarName* {
                        vmovdqu64   zmm1, [.#localvarName]
                        vcmppd      msk1, zmm0, zmm1, $00
                        kmovw       dsc0, msk1
                        _setcmpnev8
        }

        macro setsnef_l localvarName* {
                        vcomiss     xmm0, [.#localvarName]
                        _setcmpg
                        _setcmpnes
        }

        macro setsnef2_l localvarName* {
                        vcmpps      xmm0, xmm0, [.#localvarName], $00
                        vmovmskps   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnef4_l localvarName* {
                        vcmpps      xmm0, xmm0, [.#localvarName], $00
                        vmovmskps   dsc0, xmm0
                        _setcmpnev4
        }

        macro setsnef8_l localvarName* {
                        vmovdqu     ymm1, [.#localvarName]
                        vcmpps      ymm0, ymm0, ymm1, $00
                        vmovmskps   dsc0, ymm0
                        _setcmpnev8
        }

        macro setsnei_l localvarName* {
                        cmp         dsc0, [.#localvarName]
                        _setcmpnes
        }

        macro setsnei2_l localvarName* {
                        vpcmpeqd    xmm0, xmm0, [.#localvarName]
                        vmovmskps   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnei4_l localvarName* {
                        vpcmpeqd    xmm0, xmm0, [.#localvarName]
                        vmovmskps   dsc0, xmm0
                        _setcmpnev4
        }

        macro setsnei8_l localvarName* {
                        vmovdqu     ymm1, [.#localvarName]
                        vpcmpeqd    ymm0, ymm0, ymm1
                        vmovmskps   dsc0, ymm0
                        _setcmpnev8
        }

        macro setsnel_l localvarName* {
                        cmp         qsc0, [.#localvarName]
                        _setcmpnes
        }

        macro setsnel2_l localvarName* {
                        vpcmpeqq    xmm0, xmm0, [.#localvarName]
                        vmovmskpd   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnel4_l localvarName* {
                        vmovdqu     ymm1, [.#localvarName]
                        vpcmpeqq    ymm0, ymm0, ymm1
                        vmovmskpd   dsc0, ymm0
                        _setcmpnev4
        }

        macro setsnel8_l localvarName* {
                        vmovdqu64   zmm1, [.#localvarName]
                        vpcmpeqq    msk1, zmm0, zmm1
                        kmovw       dsc0, msk1
                        _setcmpnev8
        }
    ; </fold>

    ; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
        macro setsnee_g globalmember* {
                        fld         tbyte globalmember
                        fxch
                        fcomip      esc0, esc1
                        releasee
                        _setcmpg
                        _setcmpnes
        }

        macro setsned_g globalmember* {
                        vcomisd     xmm0, globalmember
                        _setcmpg
                        _setcmpnes
        }

        macro setsned2_g globalmember* {
                        vcmppd      xmm0, xmm0, globalmember, $00
                        vmovmskpd   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsned4_g globalmember* {
                        vcmppd      ymm0, ymm0, globalmember, $00
                        vmovmskpd   dsc0, ymm0
                        _setcmpnev4
        }

        macro setsned8_g globalmember* {
                        vcmppd      msk1, zmm0, globalmember, $00
                        kmovw       dsc0, msk1
                        _setcmpnev8
        }

        macro setsnef_g globalmember* {
                        vcomiss     xmm0, globalmember
                        _setcmpg
                        _setcmpnes
        }

        macro setsnef2_g globalmember* {
                        vcmpps      xmm0, xmm0, globalmember, $00
                        vmovmskps   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnef4_g globalmember* {
                        vcmpps      xmm0, xmm0, globalmember, $00
                        vmovmskps   dsc0, xmm0
                        _setcmpnev4
        }

        macro setsnef8_g globalmember* {
                        vcmpps      ymm0, ymm0, globalmember, $00
                        vmovmskps   dsc0, ymm0
                        _setcmpnev8
        }

        macro setsnei_g globalmember* {
                        cmp         dsc0, globalmember
                        _setcmpnes
        }

        macro setsnei2_g globalmember* {
                        vpcmpeqd    xmm0, xmm0, globalmember
                        vmovmskps   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnei4_g globalmember* {
                        vpcmpeqd    xmm0, xmm0, globalmember
                        vmovmskps   dsc0, xmm0
                        _setcmpnev4
        }

        macro setsnei8_g globalmember* {
                        vpcmpeqd    ymm0, ymm0, globalmember
                        vmovmskps   dsc0, ymm0
                        _setcmpnev8
        }

        macro setsnel_g globalmember* {
                        cmp         qsc0, globalmember
                        _setcmpnes
        }

        macro setsnel2_g globalmember* {
                        vpcmpeqq    xmm0, xmm0, globalmember
                        vmovmskpd   dsc0, xmm0
                        _setcmpnev2
        }

        macro setsnel4_g globalmember* {
                        vpcmpeqq    ymm0, ymm0, globalmember
                        vmovmskpd   dsc0, ymm0
                        _setcmpnev4
        }

        macro setsnel8_g globalmember* {
                        vpcmpeqq    msk1, zmm0, globalmember
                        kmovw       dsc0, msk1
                        _setcmpnev8
        }
    ; </fold>

    ; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — переход>
        macro jsnee labelIsTrue* {
                        fld         tbyte [rsp+$00]
                        __pop       $01
                        fcomip      esc0, esc1
                        releasee
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsned labelIsTrue* {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcomisd     xmm1, xmm0
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsned2 labelIsTrue* {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcmppd      xmm0, xmm1, xmm0, $00
                        vmovmskpd   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsned4 labelIsTrue* {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $02
                        vcmppd      ymm0, ymm1, ymm0, $00
                        vmovmskpd   dsc0, ymm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsned8 labelIsTrue* {
                        vmovdqu64   zmm1, [rsp+$00]
                        __cltag_z   $00
                        __pop       $04
                        vcmppd      msk1, zmm1, zmm0, $00
                        kmovw       dsc0, msk1
                        _jcmpnev8   labelIsTrue
        }

        macro jsnef labelIsTrue* {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcomiss     xmm1, xmm0
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsnef2 labelIsTrue* {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcmpps      xmm0, xmm1, xmm0, $00
                        vmovmskps   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnef4 labelIsTrue* {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vcmpps      xmm0, xmm1, xmm0, $00
                        vmovmskps   dsc0, xmm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnef8 labelIsTrue* {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $02
                        vcmpps      ymm0, ymm1, ymm0, $00
                        vmovmskps   dsc0, ymm0
                        _jcmpnev8   labelIsTrue
        }

        macro jsnei labelIsTrue* {
                        mov         dsc1, [rsp+$00]
                        __pop       $01
                        cmp         dsc1, dsc0
                        jne         labelIsTrue
        }

        macro jsnei2 labelIsTrue* {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vpcmpeqd    xmm0, xmm1, xmm0
                        vmovmskps   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnei4 labelIsTrue* {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vpcmpeqd    xmm0, xmm1, xmm0
                        vmovmskps   dsc0, xmm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnei8 labelIsTrue* {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $02
                        vpcmpeqd    ymm0, ymm1, ymm0
                        vmovmskps   dsc0, ymm0
                        _jcmpnev8   labelIsTrue
        }

        macro jsnel labelIsTrue* {
                        mov         qsc1, [rsp+$00]
                        __pop       $01
                        cmp         qsc1, qsc0
                        jne         labelIsTrue
        }

        macro jsnel2 labelIsTrue* {
                        vmovdqa     xmm1, [rsp+$00]
                        __pop       $01
                        vpcmpeqq    xmm0, xmm1, xmm0
                        vmovmskpd   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnel4 labelIsTrue* {
                        vmovdqu     ymm1, [rsp+$00]
                        __cltag_y   $00
                        __pop       $02
                        vpcmpeqq    ymm0, ymm1, ymm0
                        vmovmskpd   dsc0, ymm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnel8 labelIsTrue* {
                        vmovdqu64   zmm1, [rsp+$00]
                        __cltag_z   $00
                        __pop       $04
                        vpcmpeqq    msk1, zmm1, zmm0
                        kmovw       dsc0, msk1
                        _jcmpnev8   labelIsTrue
        }
    ; </fold>

    ; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — переход>
        macro jsnee_l labelIsTrue*, localvarName* {
                        fld         tbyte [.#localvarName]
                        fxch
                        fcomip      esc0, esc1
                        releasee
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsned_l labelIsTrue*, localvarName* {
                        vcomisd     xmm0, [.#localvarName]
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsned2_l labelIsTrue*, localvarName* {
                        vcmppd      xmm0, xmm0, [.#localvarName], $00
                        vmovmskpd   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsned4_l labelIsTrue*, localvarName* {
                        vmovdqu     ymm1, [.#localvarName]
                        vcmppd      ymm0, ymm0, ymm1, $00
                        vmovmskpd   dsc0, ymm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsned8_l labelIsTrue*, localvarName* {
                        vmovdqu64   zmm1, [.#localvarName]
                        vcmppd      msk1, zmm0, zmm1, $00
                        kmovw       dsc0, msk1
                        _jcmpnev8   labelIsTrue
        }

        macro jsnef_l labelIsTrue*, localvarName* {
                        vcomiss     xmm0, [.#localvarName]
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsnef2_l labelIsTrue*, localvarName* {
                        vcmpps      xmm0, xmm0, [.#localvarName], $00
                        vmovmskps   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnef4_l labelIsTrue*, localvarName* {
                        vcmpps      xmm0, xmm0, [.#localvarName], $00
                        vmovmskps   dsc0, xmm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnef8_l labelIsTrue*, localvarName* {
                        vmovdqu     ymm1, [.#localvarName]
                        vcmpps      ymm0, ymm0, ymm1, $00
                        vmovmskps   dsc0, ymm0
                        _jcmpnev8   labelIsTrue
        }

        macro jsnei_l labelIsTrue*, localvarName* {
                        cmp         dsc0, [.#localvarName]
                        jne         labelIsTrue
        }

        macro jsnei2_l labelIsTrue*, localvarName* {
                        vpcmpeqd    xmm0, xmm0, [.#localvarName]
                        vmovmskps   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnei4_l labelIsTrue*, localvarName* {
                        vpcmpeqd    xmm0, xmm0, [.#localvarName]
                        vmovmskps   dsc0, xmm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnei8_l labelIsTrue*, localvarName* {
                        vmovdqu     ymm1, [.#localvarName]
                        vpcmpeqd    ymm0, ymm0, ymm1
                        vmovmskps   dsc0, ymm0
                        _jcmpnev8   labelIsTrue
        }

        macro jsnel_l labelIsTrue*, localvarName* {
                        cmp         qsc0, [.#localvarName]
                        jne         labelIsTrue
        }

        macro jsnel2_l labelIsTrue*, localvarName* {
                        vpcmpeqq    xmm0, xmm0, [.#localvarName]
                        vmovmskpd   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnel4_l labelIsTrue*, localvarName* {
                        vmovdqu     ymm1, [.#localvarName]
                        vpcmpeqq    ymm0, ymm0, ymm1
                        vmovmskpd   dsc0, ymm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnel8_l labelIsTrue*, localvarName* {
                        vmovdqu64   zmm1, [.#localvarName]
                        vpcmpeqq    msk1, zmm0, zmm1
                        kmovw       dsc0, msk1
                        _jcmpnev8   labelIsTrue
        }
    ; </fold>

    ; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — переход>
        macro jsnee_g labelIsTrue*, globalmember* {
                        fld         tbyte globalmember
                        fxch
                        fcomip      esc0, esc1
                        releasee
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsned_g labelIsTrue*, globalmember* {
                        vcomisd     xmm0, globalmember
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsned2_g labelIsTrue*, globalmember* {
                        vcmppd      xmm0, xmm0, globalmember, $00
                        vmovmskpd   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsned4_g labelIsTrue*, globalmember* {
                        vcmppd      ymm0, ymm0, globalmember, $00
                        vmovmskpd   dsc0, ymm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsned8_g labelIsTrue*, globalmember* {
                        vcmppd      msk1, zmm0, globalmember, $00
                        kmovw       dsc0, msk1
                        _jcmpnev8   labelIsTrue
        }

        macro jsnef_g labelIsTrue*, globalmember* {
                        vcomiss     xmm0, globalmember
                        _setcmpg
                        jne         labelIsTrue
        }

        macro jsnef2_g labelIsTrue*, globalmember* {
                        vcmpps      xmm0, xmm0, globalmember, $00
                        vmovmskps   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnef4_g labelIsTrue*, globalmember* {
                        vcmpps      xmm0, xmm0, globalmember, $00
                        vmovmskps   dsc0, xmm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnef8_g labelIsTrue*, globalmember* {
                        vcmpps      ymm0, ymm0, globalmember, $00
                        vmovmskps   dsc0, ymm0
                        _jcmpnev8   labelIsTrue
        }

        macro jsnei_g labelIsTrue*, globalmember* {
                        cmp         dsc0, globalmember
                        jne         labelIsTrue
        }

        macro jsnei2_g labelIsTrue*, globalmember* {
                        vpcmpeqd    xmm0, xmm0, globalmember
                        vmovmskps   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnei4_g labelIsTrue*, globalmember* {
                        vpcmpeqd    xmm0, xmm0, globalmember
                        vmovmskps   dsc0, xmm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnei8_g labelIsTrue*, globalmember* {
                        vpcmpeqd    ymm0, ymm0, globalmember
                        vmovmskps   dsc0, ymm0
                        _jcmpnev8   labelIsTrue
        }

        macro jsnel_g labelIsTrue*, globalmember* {
                        cmp         qsc0, globalmember
                        jne         labelIsTrue
        }

        macro jsnel2_g labelIsTrue*, globalmember* {
                        vpcmpeqq    xmm0, xmm0, globalmember
                        vmovmskpd   dsc0, xmm0
                        _jcmpnev2   labelIsTrue
        }

        macro jsnel4_g labelIsTrue*, globalmember* {
                        vpcmpeqq    ymm0, ymm0, globalmember
                        vmovmskpd   dsc0, ymm0
                        _jcmpnev4   labelIsTrue
        }

        macro jsnel8_g labelIsTrue*, globalmember* {
                        vpcmpeqq    msk1, zmm0, globalmember
                        kmovw       dsc0, msk1
                        _jcmpnev8   labelIsTrue
        }
    ; </fold>
; </fold>