;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold скалярное сложение>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на аккумуляторе>
macro sadde {
fld tbyte [rsp+$00]
faddp esc1, esc0
__pop $01
}
macro saddd {
vaddsd xmm0, xmm0, [rsp+$00]
__pop $01
}
macro saddd2 {
vaddpd xmm0, xmm0, [rsp+$00]
__pop $01
}
macro saddd4 {
vmovdqu ymm1, [rsp+$00]
vaddpd ymm0, ymm1, ymm0
__cltag_y $00
__pop $02
}
macro saddd8 {
vmovdqu64 zmm1, [rsp+$00]
vaddpd zmm0, zmm1, zmm0
__cltag_z $00
__pop $04
}
macro saddf {
vaddss xmm0, xmm0, [rsp+$00]
__pop $01
}
macro saddf2 {
vaddps xmm0, xmm0, [rsp+$00]
__pop $01
}
macro saddf4 {
vaddps xmm0, xmm0, [rsp+$00]
__pop $01
}
macro saddf8 {
vmovdqu ymm1, [rsp+$00]
vaddps ymm0, ymm1, ymm0
__cltag_y $00
__pop $02
}
macro saddi {
add dsc0, [rsp+$00]
__pop $01
}
macro saddi2 {
vpaddd xmm0, xmm0, [rsp+$00]
__pop $01
}
macro saddi4 {
vpaddd xmm0, xmm0, [rsp+$00]
__pop $01
}
macro saddi8 {
vmovdqu ymm1, [rsp+$00]
vpaddd ymm0, ymm1, ymm0
__cltag_y $00
__pop $02
}
macro saddl {
add qsc0, [rsp+$00]
__pop $01
}
macro saddl2 {
vpaddq xmm0, xmm0, [rsp+$00]
__pop $01
}
macro saddl4 {
vmovdqu ymm1, [rsp+$00]
vpaddq ymm0, ymm1, ymm0
__cltag_y $00
__pop $02
}
macro saddl8 {
vmovdqu64 zmm1, [rsp+$00]
vpaddq zmm0, zmm1, zmm0
__cltag_z $00
__pop $04
}
; </fold>
; <fold первый операнд — на стаке, второй операнд — на аккумуляторе, результат — на стаке>
macro sadde_p {
fld tbyte [rsp+$00]
faddp esc1, esc0
fstp tbyte [rsp+$00]
}
macro saddd_p {
vaddsd xmm0, xmm0, [rsp+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro saddd2_p {
vaddpd xmm0, xmm0, [rsp+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro saddd4_p {
vmovdqu ymm1, [rsp+$00]
vaddpd ymm0, ymm1, ymm0
vmovdqu yword [rsp+$00], ymm0
}
macro saddd8_p {
vmovdqu64 zmm1, [rsp+$00]
vaddpd zmm0, zmm1, zmm0
vmovdqu64 zword [rsp+$00], zmm0
}
macro saddf_p {
vaddss xmm0, xmm0, [rsp+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro saddf2_p {
vaddps xmm0, xmm0, [rsp+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro saddf4_p {
vaddps xmm0, xmm0, [rsp+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro saddf8_p {
vmovdqu ymm1, [rsp+$00]
vaddps ymm0, ymm1, ymm0
vmovdqu yword [rsp+$00], ymm0
}
macro saddi_p {
add dword [rsp+$00], dsc0
}
macro saddi2_p {
vpaddd xmm0, xmm0, [rsp+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro saddi4_p {
vpaddd xmm0, xmm0, [rsp+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro saddi8_p {
vmovdqu ymm1, [rsp+$00]
vpaddd ymm0, ymm1, ymm0
vmovdqu yword [rsp+$00], ymm0
}
macro saddl_p {
add qword [rsp+$00], qsc0
}
macro saddl2_p {
vpaddq xmm0, xmm0, [rsp+$00]
vmovdqa xword [rsp+$00], xmm0
}
macro saddl4_p {
vmovdqu ymm1, [rsp+$00]
vpaddq ymm0, ymm1, ymm0
vmovdqu yword [rsp+$00], ymm0
}
macro saddl8_p {
vmovdqu64 zmm1, [rsp+$00]
vpaddq zmm0, zmm1, zmm0
vmovdqu64 zword [rsp+$00], zmm0
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — локальная переменная, результат — на аккумуляторе>
macro sadde_l localvarName* {
fld tbyte [.#localvarName]
faddp esc1, esc0
}
macro saddd_l localvarName* {
vaddsd xmm0, xmm0, [.#localvarName]
}
macro saddd2_l localvarName* {
vaddpd xmm0, xmm0, [.#localvarName]
}
macro saddd4_l localvarName* {
vmovdqu ymm1, [.#localvarName]
vaddpd ymm0, ymm0, ymm1
}
macro saddd8_l localvarName* {
vmovdqu64 zmm1, [.#localvarName]
vaddpd zmm0, zmm0, zmm1
}
macro saddf_l localvarName* {
vaddss xmm0, xmm0, [.#localvarName]
}
macro saddf2_l localvarName* {
vaddps xmm0, xmm0, [.#localvarName]
}
macro saddf4_l localvarName* {
vaddps xmm0, xmm0, [.#localvarName]
}
macro saddf8_l localvarName* {
vmovdqu ymm1, [.#localvarName]
vaddps ymm0, ymm0, ymm1
}
macro saddi_l localvarName* {
add dsc0, [.#localvarName]
}
macro saddi2_l localvarName* {
vpaddd xmm0, xmm0, [.#localvarName]
}
macro saddi4_l localvarName* {
vpaddd xmm0, xmm0, [.#localvarName]
}
macro saddi8_l localvarName* {
vmovdqu ymm1, [.#localvarName]
vpaddd ymm0, ymm0, ymm1
}
macro saddl_l localvarName* {
add qsc0, [.#localvarName]
}
macro saddl2_l localvarName* {
vpaddq xmm0, xmm0, [.#localvarName]
}
macro saddl4_l localvarName* {
vmovdqu ymm1, [.#localvarName]
vpaddq ymm0, ymm0, ymm1
}
macro saddl8_l localvarName* {
vmovdqu64 zmm1, [.#localvarName]
vpaddq zmm0, zmm0, zmm1
}
; </fold>
; <fold первый операнд — на аккумуляторе, второй операнд — глобальный член, результат — на аккумуляторе>
macro sadde_g globalmember* {
fld tbyte globalmember
faddp esc1, esc0
}
macro saddd_g globalmember* {
vaddsd xmm0, xmm0, globalmember
}
macro saddd2_g globalmember* {
vaddpd xmm0, xmm0, globalmember
}
macro saddd4_g globalmember* {
vaddpd ymm0, ymm0, globalmember
}
macro saddd8_g globalmember* {
vaddpd zmm0, zmm0, globalmember
}
macro saddf_g globalmember* {
vaddss xmm0, xmm0, globalmember
}
macro saddf2_g globalmember* {
vaddps xmm0, xmm0, globalmember
}
macro saddf4_g globalmember* {
vaddps xmm0, xmm0, globalmember
}
macro saddf8_g globalmember* {
vaddps ymm0, ymm0, globalmember
}
macro saddi_g globalmember* {
if(~(globalmember eqtype 0))
add dsc0, globalmember
else if((globalmember) <> 0)
lea dsc0, [dsc0+(globalmember)]
end if
}
macro saddi2_g globalmember* {
vpaddd xmm0, xmm0, globalmember
}
macro saddi4_g globalmember* {
vpaddd xmm0, xmm0, globalmember
}
macro saddi8_g globalmember* {
vpaddd ymm0, ymm0, globalmember
}
macro saddl_g globalmember* {
add qsc0, globalmember
}
macro saddl2_g globalmember* {
vpaddq xmm0, xmm0, globalmember
}
macro saddl4_g globalmember* {
vpaddq ymm0, ymm0, globalmember
}
macro saddl8_g globalmember* {
vpaddq zmm0, zmm0, globalmember
}
; </fold>
; </fold>