;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold сравнение ссылок>
; <fold сравнение двух ссылок на равенство>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro setreq {
mov qsc1, [rsp+$00]
__cltag_x $00
__pop $01
tstdecrcoth qsc0
tstdecrcoth qsc1
cmp qsc0, qsc1
setne bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro setreq_p {
mov qsc1, [rsp+$00]
__cltag_x $00
tstdecrcoth qsc0
tstdecrcoth qsc1
cmp qsc0, qsc1
setne bsc0
dec bsc0
movsx dsc0, bsc0
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro setreq_l localvarName* {
tstdecrcoth qsc0
setweq_l localvarName
}
macro setweq_l localvarName* {
cmp qsc0, [.#localvarName]
setne bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro setreq_g globalmember* {
tstdecrcoth qsc0
setweq_g globalmember
}
macro setweq_g globalmember* {
if(globalmember eq null)
test qsc0, qsc0
else if(globalmember eqtype avt.lang.Object)
lea qsc1, [globalmember]
cmp qsc0, qsc1
else
cmp qsc0, globalmember
end if
setne bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — переход>
macro jreq labelIsTrue* {
mov qsc1, [rsp+$00]
__cltag_x $00
__pop $01
tstdecrcoth qsc0
tstdecrcoth qsc1
cmp qsc0, qsc1
je labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — переход>
macro jreq_l labelIsTrue*, localvarName* {
tstdecrcoth qsc0
jweq_l labelIsTrue, localvarName
}
macro jweq_l labelIsTrue*, localvarName* {
cmp qsc0, [.#localvarName]
je labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — переход>
macro jreq_g labelIsTrue*, globalmember* {
tstdecrcoth qsc0
jweq_g labelIsTrue, globalmember
}
macro jweq_g labelIsTrue*, globalmember* {
if(globalmember eq null)
test qsc0, qsc0
else if(globalmember eqtype avt.lang.Object)
lea qsc1, [globalmember]
cmp qsc0, qsc1
else
cmp qsc0, globalmember
end if
je labelIsTrue
}
; </fold>
; </fold>
; <fold сравнение двух ссылок на неравенство>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro setrne {
mov qsc1, [rsp+$00]
__cltag_x $00
__pop $01
tstdecrcoth qsc0
tstdecrcoth qsc1
cmp qsc0, qsc1
sete bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro setrne_p {
mov qsc1, [rsp+$00]
__cltag_x $00
tstdecrcoth qsc0
tstdecrcoth qsc1
cmp qsc0, qsc1
sete bsc0
dec bsc0
movsx dsc0, bsc0
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro setrne_l localvarName* {
tstdecrcoth qsc0
setwne_l localvarName
}
macro setwne_l localvarName* {
cmp qsc0, [.#localvarName]
sete bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro setrne_g globalmember* {
tstdecrcoth qsc0
setwne_g globalmember
}
macro setwne_g globalmember* {
if(globalmember eq null)
test qsc0, qsc0
else if(globalmember eqtype avt.lang.Object)
lea qsc1, [globalmember]
cmp qsc0, qsc1
else
cmp qsc0, globalmember
end if
sete bsc0
dec bsc0
movsx dsc0, bsc0
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — переход>
macro jrne labelIsTrue* {
mov qsc1, [rsp+$00]
__cltag_x $00
__pop $01
tstdecrcoth qsc0
tstdecrcoth qsc1
cmp qsc0, qsc1
jne labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — переход>
macro jrne_l labelIsTrue*, localvarName* {
tstdecrcoth qsc0
jwne_l labelIsTrue, localvarName
}
macro jwne_l labelIsTrue*, localvarName* {
cmp qsc0, [.#localvarName]
jne labelIsTrue
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — переход>
macro jrne_g labelIsTrue*, globalmember* {
tstdecrcoth qsc0
jwne_g labelIsTrue, globalmember
}
macro jwne_g labelIsTrue*, globalmember* {
if(globalmember eq null)
test qsc0, qsc0
else if(globalmember eqtype avt.lang.Object)
lea qsc1, [globalmember]
cmp qsc0, qsc1
else
cmp qsc0, globalmember
end if
jne labelIsTrue
}
; </fold>
; </fold>
; <fold сравнение ссылки с нулевой ссылкой на равенство>
; <fold результат — на аккумуляторе>
macro setrisnull {
setreq_g null
}
macro setwisnull {
setweq_g null
}
; </fold>
; <fold результат — переход>
macro jrisnull labelIsTrue* {
jreq_g labelIsTrue, null
}
macro jwisnull labelIsTrue* {
jweq_g labelIsTrue, null
}
; </fold>
; </fold>
; <fold сравнение ссылки с нулевой ссылкой на неравенство>
; <fold результат — на аккумуляторе>
macro setrisobj {
setrne_g null
}
macro setwisobj {
setwne_g null
}
; </fold>
; <fold результат — переход>
macro jrisobj labelIsTrue* {
jrne_g labelIsTrue, null
}
macro jwisobj labelIsTrue* {
jwne_g labelIsTrue, null
}
; </fold>
; </fold>
; </fold>