;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold скалярное больше или равно>
; <fold приватные макросы — должны использоваться только этим текстом исходного кода>
macro _setcmpgef {
setnae bsc0
dec bsc0
movsx dsc0, bsc0
}
macro _setcmpgei {
setnge bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro setsgee {
fld tbyte [rsp+$00]
__pop $01
fcomip esc0, esc1
releasee
_setcmpl
_setcmpgef
}
macro setsged {
vmovdqa xmm1, [rsp+$00]
__pop $01
vcomisd xmm1, xmm0
_setcmpl
_setcmpgef
}
macro setsgef {
vmovdqa xmm1, [rsp+$00]
__pop $01
vcomiss xmm1, xmm0
_setcmpl
_setcmpgef
}
macro setsgei {
mov dsc1, [rsp+$00]
__pop $01
cmp dsc1, dsc0
_setcmpgei
}
macro setsgel {
mov qsc1, [rsp+$00]
__pop $01
cmp qsc1, qsc0
_setcmpgei
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro setsgee_p {
fld tbyte [rsp+$00]
fcomip esc0, esc1
releasee
_setcmpl
_setcmpgef
_wrstb
}
macro setsged_p {
vmovdqa xmm1, [rsp+$00]
vcomisd xmm1, xmm0
_setcmpl
_setcmpgef
_wrstb
}
macro setsgef_p {
vmovdqa xmm1, [rsp+$00]
vcomiss xmm1, xmm0
_setcmpl
_setcmpgef
_wrstb
}
macro setsgei_p {
cmp dword [rsp+$00], dsc0
_setcmpgei
_wrstb
}
macro setsgel_p {
cmp qword [rsp+$00], qsc0
_setcmpgei
_wrstb
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro setsgee_l localvarName* {
fld tbyte [.#localvarName]
fxch
fcomip esc0, esc1
releasee
_setcmpl
_setcmpgef
}
macro setsged_l localvarName* {
vcomisd xmm0, [.#localvarName]
_setcmpl
_setcmpgef
}
macro setsgef_l localvarName* {
vcomiss xmm0, [.#localvarName]
_setcmpl
_setcmpgef
}
macro setsgei_l localvarName* {
cmp dsc0, [.#localvarName]
_setcmpgei
}
macro setsgel_l localvarName* {
cmp qsc0, [.#localvarName]
_setcmpgei
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro setsgee_g globalmember* {
fld tbyte globalmember
fxch
fcomip esc0, esc1
releasee
_setcmpl
_setcmpgef
}
macro setsged_g globalmember* {
vcomisd xmm0, globalmember
_setcmpl
_setcmpgef
}
macro setsgef_g globalmember* {
vcomiss xmm0, globalmember
_setcmpl
_setcmpgef
}
macro setsgei_g globalmember* {
cmp dsc0, globalmember
_setcmpgei
}
macro setsgel_g globalmember* {
cmp qsc0, globalmember
_setcmpgei
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — переход>
macro jsgege labelIsTrue* {
fld tbyte [rsp+$00]
__pop $01
fcomip esc0, esc1
releasee
_setcmpg
jae labelIsTrue
}
macro jsgele labelIsTrue* {
fld tbyte [rsp+$00]
__pop $01
fcomip esc0, esc1
releasee
_setcmpl
jae labelIsTrue
}
macro jsgegd labelIsTrue* {
vmovdqa xmm1, [rsp+$00]
__pop $01
vcomisd xmm1, xmm0
_setcmpg
jae labelIsTrue
}
macro jsgeld labelIsTrue* {
vmovdqa xmm1, [rsp+$00]
__pop $01
vcomisd xmm1, xmm0
_setcmpl
jae labelIsTrue
}
macro jsgegf labelIsTrue* {
vmovdqa xmm1, [rsp+$00]
__pop $01
vcomiss xmm1, xmm0
_setcmpg
jae labelIsTrue
}
macro jsgelf labelIsTrue* {
vmovdqa xmm1, [rsp+$00]
__pop $01
vcomiss xmm1, xmm0
_setcmpl
jae labelIsTrue
}
macro jsgei labelIsTrue* {
mov dsc1, [rsp+$00]
__pop $01
cmp dsc1, dsc0
jge labelIsTrue
}
macro jsgel labelIsTrue* {
mov qsc1, [rsp+$00]
__pop $01
cmp qsc1, qsc0
jge labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — переход>
macro jsgege_l labelIsTrue*, localvarName* {
fld tbyte [.#localvarName]
fxch
fcomip esc0, esc1
releasee
_setcmpg
jae labelIsTrue
}
macro jsgele_l labelIsTrue*, localvarName* {
fld tbyte [.#localvarName]
fxch
fcomip esc0, esc1
releasee
_setcmpl
jae labelIsTrue
}
macro jsgegd_l labelIsTrue*, localvarName* {
vcomisd xmm0, [.#localvarName]
_setcmpg
jae labelIsTrue
}
macro jsgeld_l labelIsTrue*, localvarName* {
vcomisd xmm0, [.#localvarName]
_setcmpl
jae labelIsTrue
}
macro jsgegf_l labelIsTrue*, localvarName* {
vcomiss xmm0, [.#localvarName]
_setcmpg
jae labelIsTrue
}
macro jsgelf_l labelIsTrue*, localvarName* {
vcomiss xmm0, [.#localvarName]
_setcmpl
jae labelIsTrue
}
macro jsgei_l labelIsTrue*, localvarName* {
cmp dsc0, [.#localvarName]
jge labelIsTrue
}
macro jsgel_l labelIsTrue*, localvarName* {
cmp qsc0, [.#localvarName]
jge labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — переход>
macro jsgege_g labelIsTrue*, globalmember* {
fld tbyte globalmember
fxch
fcomip esc0, esc1
releasee
_setcmpg
jae labelIsTrue
}
macro jsgele_g labelIsTrue*, globalmember* {
fld tbyte globalmember
fxch
fcomip esc0, esc1
releasee
_setcmpl
jae labelIsTrue
}
macro jsgegd_g labelIsTrue*, globalmember* {
vcomisd xmm0, globalmember
_setcmpg
jae labelIsTrue
}
macro jsgeld_g labelIsTrue*, globalmember* {
vcomisd xmm0, globalmember
_setcmpl
jae labelIsTrue
}
macro jsgegf_g labelIsTrue*, globalmember* {
vcomiss xmm0, globalmember
_setcmpg
jae labelIsTrue
}
macro jsgelf_g labelIsTrue*, globalmember* {
vcomiss xmm0, globalmember
_setcmpl
jae labelIsTrue
}
macro jsgei_g labelIsTrue*, globalmember* {
cmp dsc0, globalmember
jge labelIsTrue
}
macro jsgel_g labelIsTrue*, globalmember* {
cmp qsc0, globalmember
jge labelIsTrue
}
; </fold>
; </fold>