;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024, 2026 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold векторное вычитание>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro vsubd {
ssubd
}
macro vsubd2 {
ssubd2
}
macro vsubd4 {
ssubd4
}
macro vsubd8 {
ssubd8
}
macro vsubf {
ssubf
}
macro vsubf2 {
ssubf2
}
macro vsubf4 {
ssubf4
}
macro vsubf8 {
ssubf8
}
macro vsubb {
mov dsc1, [rsp+$00]
sub dsc1, dsc0
movsx dsc0, bsc1
__pop $01
}
macro vsubb2 {
vmovdqa xmm1, [rsp+$00]
vpsubb xmm0, xmm1, xmm0
__pop $01
}
macro vsubb4 {
vmovdqa xmm1, [rsp+$00]
vpsubb xmm0, xmm1, xmm0
__pop $01
}
macro vsubb8 {
vmovdqa xmm1, [rsp+$00]
vpsubb xmm0, xmm1, xmm0
__pop $01
}
macro vsubs {
mov dsc1, [rsp+$00]
sub dsc1, dsc0
movsx dsc0, wsc1
__pop $01
}
macro vsubs2 {
vmovdqa xmm1, [rsp+$00]
vpsubw xmm0, xmm1, xmm0
__pop $01
}
macro vsubs4 {
vmovdqa xmm1, [rsp+$00]
vpsubw xmm0, xmm1, xmm0
__pop $01
}
macro vsubs8 {
vmovdqa xmm1, [rsp+$00]
vpsubw xmm0, xmm1, xmm0
__pop $01
}
macro vsubi {
ssubi
}
macro vsubi2 {
ssubi2
}
macro vsubi4 {
ssubi4
}
macro vsubi8 {
ssubi8
}
macro vsubl {
ssubl
}
macro vsubl2 {
ssubl2
}
macro vsubl4 {
ssubl4
}
macro vsubl8 {
ssubl8
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro vsubd_p {
ssubd_p
}
macro vsubd2_p {
ssubd2_p
}
macro vsubd4_p {
ssubd4_p
}
macro vsubd8_p {
ssubd8_p
}
macro vsubf_p {
ssubf_p
}
macro vsubf2_p {
ssubf2_p
}
macro vsubf4_p {
ssubf4_p
}
macro vsubf8_p {
ssubf8_p
}
macro vsubb_p {
mov dsc1, [rsp+$00]
sub dsc1, dsc0
movsx dsc0, bsc1
mov dword [rsp+$00], dsc0
}
macro vsubb2_p {
vmovdqa xmm1, [rsp+$00]
vpsubb xmm0, xmm1, xmm0
vmovdqa xword [rsp+$00], xmm0
}
macro vsubb4_p {
vmovdqa xmm1, [rsp+$00]
vpsubb xmm0, xmm1, xmm0
vmovdqa xword [rsp+$00], xmm0
}
macro vsubb8_p {
vmovdqa xmm1, [rsp+$00]
vpsubb xmm0, xmm1, xmm0
vmovdqa xword [rsp+$00], xmm0
}
macro vsubs_p {
mov dsc1, [rsp+$00]
sub dsc1, dsc0
movsx dsc0, wsc1
mov dword [rsp+$00], dsc0
}
macro vsubs2_p {
vmovdqa xmm1, [rsp+$00]
vpsubw xmm0, xmm1, xmm0
vmovdqa xword [rsp+$00], xmm0
}
macro vsubs4_p {
vmovdqa xmm1, [rsp+$00]
vpsubw xmm0, xmm1, xmm0
vmovdqa xword [rsp+$00], xmm0
}
macro vsubs8_p {
vmovdqa xmm1, [rsp+$00]
vpsubw xmm0, xmm1, xmm0
vmovdqa xword [rsp+$00], xmm0
}
macro vsubi_p {
ssubi_p
}
macro vsubi2_p {
ssubi2_p
}
macro vsubi4_p {
ssubi4_p
}
macro vsubi8_p {
ssubi8_p
}
macro vsubl_p {
ssubl_p
}
macro vsubl2_p {
ssubl2_p
}
macro vsubl4_p {
ssubl4_p
}
macro vsubl8_p {
ssubl8_p
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro vsubd_l localvarName* {
ssubd_l localvarName
}
macro vsubd2_l localvarName* {
ssubd2_l localvarName
}
macro vsubd4_l localvarName* {
ssubd4_l localvarName
}
macro vsubd8_l localvarName* {
ssubd8_l localvarName
}
macro vsubf_l localvarName* {
ssubf_l localvarName
}
macro vsubf2_l localvarName* {
ssubf2_l localvarName
}
macro vsubf4_l localvarName* {
ssubf4_l localvarName
}
macro vsubf8_l localvarName* {
ssubf8_l localvarName
}
macro vsubb_l localvarName* {
ssubi_l localvarName
movsx dsc0, bsc0
}
macro vsubb2_l localvarName* {
vpsubb xmm0, xmm0, [.#localvarName]
}
macro vsubb4_l localvarName* {
vpsubb xmm0, xmm0, [.#localvarName]
}
macro vsubb8_l localvarName* {
vpsubb xmm0, xmm0, [.#localvarName]
}
macro vsubs_l localvarName* {
ssubi_l localvarName
movsx dsc0, wsc0
}
macro vsubs2_l localvarName* {
vpsubw xmm0, xmm0, [.#localvarName]
}
macro vsubs4_l localvarName* {
vpsubw xmm0, xmm0, [.#localvarName]
}
macro vsubs8_l localvarName* {
vpsubw xmm0, xmm0, [.#localvarName]
}
macro vsubi_l localvarName* {
ssubi_l localvarName
}
macro vsubi2_l localvarName* {
ssubi2_l localvarName
}
macro vsubi4_l localvarName* {
ssubi4_l localvarName
}
macro vsubi8_l localvarName* {
ssubi8_l localvarName
}
macro vsubl_l localvarName* {
ssubl_l localvarName
}
macro vsubl2_l localvarName* {
ssubl2_l localvarName
}
macro vsubl4_l localvarName* {
ssubl4_l localvarName
}
macro vsubl8_l localvarName* {
ssubl8_l localvarName
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro vsubd_g globalmember* {
ssubd_g globalmember
}
macro vsubd2_g globalmember* {
ssubd2_g globalmember
}
macro vsubd4_g globalmember* {
ssubd4_g globalmember
}
macro vsubd8_g globalmember* {
ssubd8_g globalmember
}
macro vsubf_g globalmember* {
ssubf_g globalmember
}
macro vsubf2_g globalmember* {
ssubf2_g globalmember
}
macro vsubf4_g globalmember* {
ssubf4_g globalmember
}
macro vsubf8_g globalmember* {
ssubf8_g globalmember
}
macro vsubb_g globalmember* {
ssubi_g globalmember
movsx dsc0, bsc0
}
macro vsubb2_g globalmember* {
vpsubb xmm0, xmm0, globalmember
}
macro vsubb4_g globalmember* {
vpsubb xmm0, xmm0, globalmember
}
macro vsubb8_g globalmember* {
vpsubb xmm0, xmm0, globalmember
}
macro vsubs_g globalmember* {
ssubi_g globalmember
movsx dsc0, wsc0
}
macro vsubs2_g globalmember* {
vpsubw xmm0, xmm0, globalmember
}
macro vsubs4_g globalmember* {
vpsubw xmm0, xmm0, globalmember
}
macro vsubs8_g globalmember* {
vpsubw xmm0, xmm0, globalmember
}
macro vsubi_g globalmember* {
ssubi_g globalmember
}
macro vsubi2_g globalmember* {
ssubi2_g globalmember
}
macro vsubi4_g globalmember* {
ssubi4_g globalmember
}
macro vsubi8_g globalmember* {
ssubi8_g globalmember
}
macro vsubl_g globalmember* {
ssubl_g globalmember
}
macro vsubl2_g globalmember* {
ssubl2_g globalmember
}
macro vsubl4_g globalmember* {
ssubl4_g globalmember
}
macro vsubl8_g globalmember* {
ssubl8_g globalmember
}
; </fold>
; </fold>