;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; 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>