;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024, 2026 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold векторный беззнаковый сдвиг вправо>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro vshrub {
mov dsc1, dsc0
mov dsc0, [rsp+$00]
shr dsc0, bsc1
movsx dsc0, bsc0
__pop $01
}
macro vshrub2 {
vpmovsxbd xmm0, [rsp+$00]
call inst$vshrub2
__pop $01
}
macro vshrub4 {
vpmovsxbd xmm0, [rsp+$00]
call inst$vshrub4
__pop $01
}
macro vshrub8 {
vpmovsxbd ymm0, [rsp+$00]
call inst$vshrub8
__pop $01
}
macro vshrus {
mov dsc1, dsc0
mov dsc0, [rsp+$00]
shr dsc0, bsc1
movsx dsc0, wsc0
__pop $01
}
macro vshrus2 {
vpmovsxwd xmm0, [rsp+$00]
call inst$vshrus2
__pop $01
}
macro vshrus4 {
vpmovsxwd xmm0, [rsp+$00]
call inst$vshrus4
__pop $01
}
macro vshrus8 {
vpmovsxwd ymm0, [rsp+$00]
call inst$vshrus8
__pop $01
}
macro vshrui {
sshrui
}
macro vshrui2 {
sshrui2
}
macro vshrui4 {
sshrui4
}
macro vshrui8 {
sshrui8
}
macro vshrul {
sshrul
}
macro vshrul2 {
sshrul2
}
macro vshrul4 {
sshrul4
}
macro vshrul8 {
sshrul8
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro vshrub_p {
mov dsc1, dsc0
mov dsc0, [rsp+$00]
shr dsc0, bsc1
movsx dsc0, bsc0
mov dword [rsp+$00], dsc0
}
macro vshrub2_p {
vpmovsxbd xmm0, [rsp+$00]
call inst$vshrub2
vmovdqa xword [rsp+$00], xmm0
}
macro vshrub4_p {
vpmovsxbd xmm0, [rsp+$00]
call inst$vshrub4
vmovdqa xword [rsp+$00], xmm0
}
macro vshrub8_p {
vpmovsxbd ymm0, [rsp+$00]
call inst$vshrub8
vmovdqa xword [rsp+$00], xmm0
}
macro vshrus_p {
mov dsc1, dsc0
mov dsc0, [rsp+$00]
shr dsc0, bsc1
movsx dsc0, wsc0
mov dword [rsp+$00], dsc0
}
macro vshrus2_p {
vpmovsxwd xmm0, [rsp+$00]
call inst$vshrus2
vmovdqa xword [rsp+$00], xmm0
}
macro vshrus4_p {
vpmovsxwd xmm0, [rsp+$00]
call inst$vshrus4
vmovdqa xword [rsp+$00], xmm0
}
macro vshrus8_p {
vpmovsxwd ymm0, [rsp+$00]
call inst$vshrus8
vmovdqa xword [rsp+$00], xmm0
}
macro vshrui_p {
sshrui_p
}
macro vshrui2_p {
sshrui2_p
}
macro vshrui4_p {
sshrui4_p
}
macro vshrui8_p {
sshrui8_p
}
macro vshrul_p {
sshrul_p
}
macro vshrul2_p {
sshrul2_p
}
macro vshrul4_p {
sshrul4_p
}
macro vshrul8_p {
sshrul8_p
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro vshrub_l localvarName* {
mov dsc1, [.#localvarName]
shr dsc0, bsc1
movsx dsc0, bsc0
}
macro vshrub2_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxbd xmm0, xmm0
call inst$vshrub2
}
macro vshrub4_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxbd xmm0, xmm0
call inst$vshrub4
}
macro vshrub8_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxbd ymm0, xmm0
call inst$vshrub8
}
macro vshrus_l localvarName* {
mov dsc1, [.#localvarName]
shr dsc0, bsc1
movsx dsc0, wsc0
}
macro vshrus2_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxwd xmm0, xmm0
call inst$vshrus2
}
macro vshrus4_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxwd xmm0, xmm0
call inst$vshrus4
}
macro vshrus8_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxwd ymm0, xmm0
call inst$vshrus8
}
macro vshrui_l localvarName* {
sshrui_l localvarName
}
macro vshrui2_l localvarName* {
sshrui2_l localvarName
}
macro vshrui4_l localvarName* {
sshrui4_l localvarName
}
macro vshrui8_l localvarName* {
sshrui8_l localvarName
}
macro vshrul_l localvarName* {
sshrul_l localvarName
}
macro vshrul2_l localvarName* {
sshrul2_l localvarName
}
macro vshrul4_l localvarName* {
sshrul4_l localvarName
}
macro vshrul8_l localvarName* {
sshrul8_l localvarName
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro vshrub_g globalmember* {
if(globalmember eqtype 0)
shr dsc0, (globalmember) and $1f
else
mov dsc1, globalmember
shr dsc0, bsc1
end if
movsx dsc0, bsc0
}
macro vshrub2_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxbd xmm0, xmm0
call inst$vshrub2
}
macro vshrub4_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxbd xmm0, xmm0
call inst$vshrub4
}
macro vshrub8_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxbd ymm0, xmm0
call inst$vshrub8
}
macro vshrus_g globalmember* {
if(globalmember eqtype 0)
shr dsc0, (globalmember) and $1f
else
mov dsc1, globalmember
shr dsc0, bsc1
end if
movsx dsc0, wsc0
}
macro vshrus2_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxwd xmm0, xmm0
call inst$vshrus2
}
macro vshrus4_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxwd xmm0, xmm0
call inst$vshrus4
}
macro vshrus8_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxwd ymm0, xmm0
call inst$vshrus8
}
macro vshrui_g globalmember* {
sshrui_g globalmember
}
macro vshrui2_g globalmember* {
sshrui2_g globalmember
}
macro vshrui4_g globalmember* {
sshrui4_g globalmember
}
macro vshrui8_g globalmember* {
sshrui8_g globalmember
}
macro vshrul_g globalmember* {
sshrul_g globalmember
}
macro vshrul2_g globalmember* {
sshrul2_g globalmember
}
macro vshrul4_g globalmember* {
sshrul4_g globalmember
}
macro vshrul8_g globalmember* {
sshrul8_g globalmember
}
; </fold>
; </fold>