;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold побитовое тестирование>
; <fold побитовое тестирование на равенство нулю>
; <fold приватные макросы — должны использоваться только этим текстом исходного кода>
macro _settsteq {
setne bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro setteqi {
mov dsc1, [rsp+$00]
__pop $01
test dsc0, dsc1
_settsteq
}
macro setteql {
mov qsc1, [rsp+$00]
__pop $01
test qsc0, qsc1
_settsteq
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro setteqi_p {
test dsc0, [rsp+$00]
_settsteq
_wrstb
}
macro setteql_p {
test qsc0, [rsp+$00]
_settsteq
_wrstb
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro setteqi_l localvarName* {
test dsc0, [.#localvarName]
_settsteq
}
macro setteql_l localvarName* {
test qsc0, [.#localvarName]
_settsteq
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro setteqi_g globalmember* {
test dsc0, globalmember
_settsteq
}
macro setteql_g globalmember* {
test qsc0, globalmember
_settsteq
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — переход>
macro jteqi labelIsTrue* {
mov dsc1, [rsp+$00]
__pop $01
test dsc0, dsc1
je labelIsTrue
}
macro jteql labelIsTrue* {
mov qsc1, [rsp+$00]
__pop $01
test qsc0, qsc1
je labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — переход>
macro jteqi_l labelIsTrue*, localvarName* {
test dsc0, [.#localvarName]
je labelIsTrue
}
macro jteql_l labelIsTrue*, localvarName* {
test qsc0, [.#localvarName]
je labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — переход>
macro jteqi_g labelIsTrue*, globalmember* {
test dsc0, globalmember
je labelIsTrue
}
macro jteql_g labelIsTrue*, globalmember* {
test qsc0, globalmember
je labelIsTrue
}
; </fold>
; </fold>
; <fold побитовое тестирование на неравенство нулю>
; <fold приватные макросы — должны использоваться только этим текстом исходного кода>
macro _settstne {
sete bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro settnei {
mov dsc1, [rsp+$00]
__pop $01
test dsc0, dsc1
_settstne
}
macro settnel {
mov qsc1, [rsp+$00]
__pop $01
test qsc0, qsc1
_settstne
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro settnei_p {
test dsc0, [rsp+$00]
_settstne
_wrstb
}
macro settnel_p {
test qsc0, [rsp+$00]
_settstne
_wrstb
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro settnei_l localvarName* {
test dsc0, [.#localvarName]
_settstne
}
macro settnel_l localvarName* {
test qsc0, [.#localvarName]
_settstne
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro settnei_g globalmember* {
test dsc0, globalmember
_settstne
}
macro settnel_g globalmember* {
test qsc0, globalmember
_settstne
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — переход>
macro jtnei labelIsTrue* {
mov dsc1, [rsp+$00]
__pop $01
test dsc0, dsc1
jne labelIsTrue
}
macro jtnel labelIsTrue* {
mov qsc1, [rsp+$00]
__pop $01
test qsc0, qsc1
jne labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — переход>
macro jtnei_l labelIsTrue*, localvarName* {
test dsc0, [.#localvarName]
jne labelIsTrue
}
macro jtnel_l labelIsTrue*, localvarName* {
test qsc0, [.#localvarName]
jne labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — переход>
macro jtnei_g labelIsTrue*, globalmember* {
test dsc0, globalmember
jne labelIsTrue
}
macro jtnel_g labelIsTrue*, globalmember* {
test qsc0, globalmember
jne labelIsTrue
}
; </fold>
; </fold>
; </fold>