;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold векторный сдвиг влево>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro vshlb {
mov dsc1, dsc0
mov dsc0, [rsp+$00]
shl dsc0, bsc1
movsx dsc0, bsc0
__pop $01
}
macro vshlb2 {
vpmovsxbd xmm0, [rsp+$00]
call inst$vshlb2
__pop $01
}
macro vshlb4 {
vpmovsxbd xmm0, [rsp+$00]
call inst$vshlb4
__pop $01
}
macro vshlb8 {
vpmovsxbd ymm0, [rsp+$00]
call inst$vshlb8
__pop $01
}
macro vshls {
mov dsc1, dsc0
mov dsc0, [rsp+$00]
shl dsc0, bsc1
movsx dsc0, wsc0
__pop $01
}
macro vshls2 {
vpmovsxwd xmm0, [rsp+$00]
call inst$vshls2
__pop $01
}
macro vshls4 {
vpmovsxwd xmm0, [rsp+$00]
call inst$vshls4
__pop $01
}
macro vshls8 {
vpmovsxwd ymm0, [rsp+$00]
call inst$vshls8
__pop $01
}
macro vshli {
sshli
}
macro vshli2 {
sshli2
}
macro vshli4 {
sshli4
}
macro vshli8 {
sshli8
}
macro vshll {
sshll
}
macro vshll2 {
sshll2
}
macro vshll4 {
sshll4
}
macro vshll8 {
sshll8
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro vshlb_p {
mov dsc1, dsc0
mov dsc0, [rsp+$00]
shl dsc0, bsc1
movsx dsc0, bsc0
mov dword [rsp+$00], dsc0
}
macro vshlb2_p {
vpmovsxbd xmm0, [rsp+$00]
call inst$vshlb2
vmovdqa xword [rsp+$00], xmm0
}
macro vshlb4_p {
vpmovsxbd xmm0, [rsp+$00]
call inst$vshlb4
vmovdqa xword [rsp+$00], xmm0
}
macro vshlb8_p {
vpmovsxbd ymm0, [rsp+$00]
call inst$vshlb8
vmovdqa xword [rsp+$00], xmm0
}
macro vshls_p {
mov dsc1, dsc0
mov dsc0, [rsp+$00]
shl dsc0, bsc1
movsx dsc0, wsc0
mov dword [rsp+$00], dsc0
}
macro vshls2_p {
vpmovsxwd xmm0, [rsp+$00]
call inst$vshls2
vmovdqa xword [rsp+$00], xmm0
}
macro vshls4_p {
vpmovsxwd xmm0, [rsp+$00]
call inst$vshls4
vmovdqa xword [rsp+$00], xmm0
}
macro vshls8_p {
vpmovsxwd ymm0, [rsp+$00]
call inst$vshls8
vmovdqa xword [rsp+$00], xmm0
}
macro vshli_p {
sshli_p
}
macro vshli2_p {
sshli2_p
}
macro vshli4_p {
sshli4_p
}
macro vshli8_p {
sshli8_p
}
macro vshll_p {
sshll_p
}
macro vshll2_p {
sshll2_p
}
macro vshll4_p {
sshll4_p
}
macro vshll8_p {
sshll8_p
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro vshlb_l localvarName* {
mov dsc1, [.#localvarName]
shl dsc0, bsc1
movsx dsc0, bsc0
}
macro vshlb2_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxbd xmm0, xmm0
call inst$vshlb2
}
macro vshlb4_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxbd xmm0, xmm0
call inst$vshlb4
}
macro vshlb8_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxbd ymm0, xmm0
call inst$vshlb8
}
macro vshls_l localvarName* {
mov dsc1, [.#localvarName]
shl dsc0, bsc1
movsx dsc0, wsc0
}
macro vshls2_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxwd xmm0, xmm0
call inst$vshls2
}
macro vshls4_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxwd xmm0, xmm0
call inst$vshls4
}
macro vshls8_l localvarName* {
mov dsc0, [.#localvarName]
vpmovsxwd ymm0, xmm0
call inst$vshls8
}
macro vshli_l localvarName* {
sshli_l localvarName
}
macro vshli2_l localvarName* {
sshli2_l localvarName
}
macro vshli4_l localvarName* {
sshli4_l localvarName
}
macro vshli8_l localvarName* {
sshli8_l localvarName
}
macro vshll_l localvarName* {
sshll_l localvarName
}
macro vshll2_l localvarName* {
sshll2_l localvarName
}
macro vshll4_l localvarName* {
sshll4_l localvarName
}
macro vshll8_l localvarName* {
sshll8_l localvarName
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro vshlb_g globalmember* {
if(globalmember eqtype 0)
shl dsc0, (globalmember) and $1f
else
mov dsc1, globalmember
shl dsc0, bsc1
end if
movsx dsc0, bsc0
}
macro vshlb2_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxbd xmm0, xmm0
call inst$vshlb2
}
macro vshlb4_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxbd xmm0, xmm0
call inst$vshlb4
}
macro vshlb8_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxbd ymm0, xmm0
call inst$vshlb8
}
macro vshls_g globalmember* {
if(globalmember eqtype 0)
shl dsc0, (globalmember) and $1f
else
mov dsc1, globalmember
shl dsc0, bsc1
end if
movsx dsc0, wsc0
}
macro vshls2_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxwd xmm0, xmm0
call inst$vshls2
}
macro vshls4_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxwd xmm0, xmm0
call inst$vshls4
}
macro vshls8_g globalmember* {
if(globalmember eqtype 0)
mov dsc0, (globalmember) and $1f
else
mov dsc0, globalmember
end if
vpmovsxwd ymm0, xmm0
call inst$vshls8
}
macro vshli_g globalmember* {
sshli_g globalmember
}
macro vshli2_g globalmember* {
sshli2_g globalmember
}
macro vshli4_g globalmember* {
sshli4_g globalmember
}
macro vshli8_g globalmember* {
sshli8_g globalmember
}
macro vshll_g globalmember* {
sshll_g globalmember
}
macro vshll2_g globalmember* {
sshll2_g globalmember
}
macro vshll4_g globalmember* {
sshll4_g globalmember
}
macro vshll8_g globalmember* {
sshll8_g globalmember
}
; </fold>
; </fold>