scalar.eq.inc

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

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

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

        macro _setcmpeqv2 {
                        and         dsc0, $03
                        cmp         dsc0, $03
                        _setcmpeqs
        }

        macro _setcmpeqv4 {
                        and         dsc0, $0f
                        cmp         dsc0, $0f
                        _setcmpeqs
        }

        macro _setcmpeqv8 {
                        cmp         bsc0, $ff
                        _setcmpeqs
        }

        macro _jcmpeqv2 labelIsTrue* {
                        and         dsc0, $03
                        cmp         dsc0, $03
                        je          labelIsTrue
        }

        macro _jcmpeqv4 labelIsTrue* {
                        and         dsc0, $0f
                        cmp         dsc0, $0f
                        je          labelIsTrue
        }

        macro _jcmpeqv8 labelIsTrue* {
                        cmp         bsc0, $ff
                        je          labelIsTrue
        }
    ; </fold>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        macro setseqi_p {
                        cmp         dword [rsp+$00], dsc0
                        _setcmpeqs
                        _wrstb
        }

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

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

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

        macro setseql_p {
                        cmp         qword [rsp+$00], qsc0
                        _setcmpeqs
                        _wrstb
        }

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

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

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

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

        macro setseqd_l localvarName* {
                        vcomisd     xmm0, [.#localvarName]
                        _setcmpg
                        _setcmpeqs
        }

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

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

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

        macro setseqf_l localvarName* {
                        vcomiss     xmm0, [.#localvarName]
                        _setcmpg
                        _setcmpeqs
        }

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

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

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

        macro setseqi_l localvarName* {
                        cmp         dsc0, [.#localvarName]
                        _setcmpeqs
        }

        macro setseqi2_l localvarName* {
                        vpcmpeqd    xmm0, xmm0, [.#localvarName]
                        vmovmskps   dsc0, xmm0
                        _setcmpeqv2
        }

        macro setseqi4_l localvarName* {
                        vpcmpeqd    xmm0, xmm0, [.#localvarName]
                        vmovmskps   dsc0, xmm0
                        _setcmpeqv4
        }

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

        macro setseql_l localvarName* {
                        cmp         qsc0, [.#localvarName]
                        _setcmpeqs
        }

        macro setseql2_l localvarName* {
                        vpcmpeqq    xmm0, xmm0, [.#localvarName]
                        vmovmskpd   dsc0, xmm0
                        _setcmpeqv2
        }

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

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

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

        macro setseqd_g globalmember* {
                        vcomisd     xmm0, globalmember
                        _setcmpg
                        _setcmpeqs
        }

        macro setseqd2_g globalmember* {
                        vcmppd      xmm0, xmm0, globalmember, $00
                        vmovmskpd   dsc0, xmm0
                        _setcmpeqv2
        }

        macro setseqd4_g globalmember* {
                        vcmppd      ymm0, ymm0, globalmember, $00
                        vmovmskpd   dsc0, ymm0
                        _setcmpeqv4
        }

        macro setseqd8_g globalmember* {
                        vcmppd      msk1, zmm0, globalmember, $00
                        kmovw       dsc0, msk1
                        _setcmpeqv8
        }

        macro setseqf_g globalmember* {
                        vcomiss     xmm0, globalmember
                        _setcmpg
                        _setcmpeqs
        }

        macro setseqf2_g globalmember* {
                        vcmpps      xmm0, xmm0, globalmember, $00
                        vmovmskps   dsc0, xmm0
                        _setcmpeqv2
        }

        macro setseqf4_g globalmember* {
                        vcmpps      xmm0, xmm0, globalmember, $00
                        vmovmskps   dsc0, xmm0
                        _setcmpeqv4
        }

        macro setseqf8_g globalmember* {
                        vcmpps      ymm0, ymm0, globalmember, $00
                        vmovmskps   dsc0, ymm0
                        _setcmpeqv8
        }

        macro setseqi_g globalmember* {
                        cmp         dsc0, globalmember
                        _setcmpeqs
        }

        macro setseqi2_g globalmember* {
                        vpcmpeqd    xmm0, xmm0, globalmember
                        vmovmskps   dsc0, xmm0
                        _setcmpeqv2
        }

        macro setseqi4_g globalmember* {
                        vpcmpeqd    xmm0, xmm0, globalmember
                        vmovmskps   dsc0, xmm0
                        _setcmpeqv4
        }

        macro setseqi8_g globalmember* {
                        vpcmpeqd    ymm0, ymm0, globalmember
                        vmovmskps   dsc0, ymm0
                        _setcmpeqv8
        }

        macro setseql_g globalmember* {
                        cmp         qsc0, globalmember
                        _setcmpeqs
        }

        macro setseql2_g globalmember* {
                        vpcmpeqq    xmm0, xmm0, globalmember
                        vmovmskpd   dsc0, xmm0
                        _setcmpeqv2
        }

        macro setseql4_g globalmember* {
                        vpcmpeqq    ymm0, ymm0, globalmember
                        vmovmskpd   dsc0, ymm0
                        _setcmpeqv4
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        macro jseqd_l labelIsTrue*, localvarName* {
                        vcomisd     xmm0, [.#localvarName]
                        _setcmpg
                        je          labelIsTrue
        }

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

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

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

        macro jseqf_l labelIsTrue*, localvarName* {
                        vcomiss     xmm0, [.#localvarName]
                        _setcmpg
                        je          labelIsTrue
        }

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

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

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

        macro jseqi_l labelIsTrue*, localvarName* {
                        cmp         dsc0, [.#localvarName]
                        je          labelIsTrue
        }

        macro jseqi2_l labelIsTrue*, localvarName* {
                        vpcmpeqd    xmm0, xmm0, [.#localvarName]
                        vmovmskps   dsc0, xmm0
                        _jcmpeqv2   labelIsTrue
        }

        macro jseqi4_l labelIsTrue*, localvarName* {
                        vpcmpeqd    xmm0, xmm0, [.#localvarName]
                        vmovmskps   dsc0, xmm0
                        _jcmpeqv4   labelIsTrue
        }

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

        macro jseql_l labelIsTrue*, localvarName* {
                        cmp         qsc0, [.#localvarName]
                        je          labelIsTrue
        }

        macro jseql2_l labelIsTrue*, localvarName* {
                        vpcmpeqq    xmm0, xmm0, [.#localvarName]
                        vmovmskpd   dsc0, xmm0
                        _jcmpeqv2   labelIsTrue
        }

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

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

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

        macro jseqd_g labelIsTrue*, globalmember* {
                        vcomisd     xmm0, globalmember
                        _setcmpg
                        je          labelIsTrue
        }

        macro jseqd2_g labelIsTrue*, globalmember* {
                        vcmppd      xmm0, xmm0, globalmember, $00
                        vmovmskpd   dsc0, xmm0
                        _jcmpeqv2   labelIsTrue
        }

        macro jseqd4_g labelIsTrue*, globalmember* {
                        vcmppd      ymm0, ymm0, globalmember, $00
                        vmovmskpd   dsc0, ymm0
                        _jcmpeqv4   labelIsTrue
        }

        macro jseqd8_g labelIsTrue*, globalmember* {
                        vcmppd      msk1, zmm0, globalmember, $00
                        kmovw       dsc0, msk1
                        _jcmpeqv8   labelIsTrue
        }

        macro jseqf_g labelIsTrue*, globalmember* {
                        vcomiss     xmm0, globalmember
                        _setcmpg
                        je          labelIsTrue
        }

        macro jseqf2_g labelIsTrue*, globalmember* {
                        vcmpps      xmm0, xmm0, globalmember, $00
                        vmovmskps   dsc0, xmm0
                        _jcmpeqv2   labelIsTrue
        }

        macro jseqf4_g labelIsTrue*, globalmember* {
                        vcmpps      xmm0, xmm0, globalmember, $00
                        vmovmskps   dsc0, xmm0
                        _jcmpeqv4   labelIsTrue
        }

        macro jseqf8_g labelIsTrue*, globalmember* {
                        vcmpps      ymm0, ymm0, globalmember, $00
                        vmovmskps   dsc0, ymm0
                        _jcmpeqv8   labelIsTrue
        }

        macro jseqi_g labelIsTrue*, globalmember* {
                        cmp         dsc0, globalmember
                        je          labelIsTrue
        }

        macro jseqi2_g labelIsTrue*, globalmember* {
                        vpcmpeqd    xmm0, xmm0, globalmember
                        vmovmskps   dsc0, xmm0
                        _jcmpeqv2   labelIsTrue
        }

        macro jseqi4_g labelIsTrue*, globalmember* {
                        vpcmpeqd    xmm0, xmm0, globalmember
                        vmovmskps   dsc0, xmm0
                        _jcmpeqv4   labelIsTrue
        }

        macro jseqi8_g labelIsTrue*, globalmember* {
                        vpcmpeqd    ymm0, ymm0, globalmember
                        vmovmskps   dsc0, ymm0
                        _jcmpeqv8   labelIsTrue
        }

        macro jseql_g labelIsTrue*, globalmember* {
                        cmp         qsc0, globalmember
                        je          labelIsTrue
        }

        macro jseql2_g labelIsTrue*, globalmember* {
                        vpcmpeqq    xmm0, xmm0, globalmember
                        vmovmskpd   dsc0, xmm0
                        _jcmpeqv2   labelIsTrue
        }

        macro jseql4_g labelIsTrue*, globalmember* {
                        vpcmpeqq    ymm0, ymm0, globalmember
                        vmovmskpd   dsc0, ymm0
                        _jcmpeqv4   labelIsTrue
        }

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