;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold чтение компонентов массивов>
; <fold приватные макросы — должны использоваться только этим текстом исходного кода>
macro _rdac type* {
_rdac_p
__pop $01
call inst$rdac#type
}
macro _rdac_p {
mov r02d, r00d
mov r08q, [rsp+$00]
__cltag_x $00
}
macro _rdac_l localvarName*, type* {
mov r02d, [.#localvarName]
lea r08q, [r00+$00]
call inst$rdac#type
}
macro _rdac_g globalmember*, type* {
mov r02d, globalmember
lea r08q, [r00+$00]
call inst$rdac#type
}
; </fold>
; <fold объектная ссылка на стаке, индекс на аккумуляторе, результат на аккумуляторе>
macro rdacr {
_rdac r
}
macro rdacc {
_rdac c
}
macro rdace {
_rdac e
}
macro rdacd {
_rdac d
}
macro rdacd2 {
_rdac d2
}
macro rdacd4 {
_rdac d4
}
macro rdacd8 {
_rdac d8
}
macro rdacf {
_rdac f
}
macro rdacf2 {
_rdac f2
}
macro rdacf4 {
_rdac f4
}
macro rdacf8 {
_rdac f8
}
macro rdacb {
_rdac b
}
macro rdacb2 {
_rdac b2
}
macro rdacb4 {
_rdac b4
}
macro rdacb8 {
_rdac b8
}
macro rdacs {
_rdac s
}
macro rdacs2 {
_rdac s2
}
macro rdacs4 {
_rdac s4
}
macro rdacs8 {
_rdac s8
}
macro rdaci {
_rdac i
}
macro rdaci2 {
_rdac i2
}
macro rdaci4 {
_rdac i4
}
macro rdaci8 {
_rdac i8
}
macro rdacl {
_rdac l
}
macro rdacl2 {
_rdac l2
}
macro rdacl4 {
_rdac l4
}
macro rdacl8 {
_rdac l8
}
; </fold>
; <fold объектная ссылка на стаке, индекс на аккумуляторе, результат на стаке>
macro rdacr_p {
_rdac_p
call inst$rdacr
mov qword [rsp+$00], qsc0
__sttag_x $00, TAG_OBJECT
}
macro rdacc_p {
_rdac_p
call inst$rdacc
mov qword [rsp+$00], qsc0
}
macro rdace_p {
_rdac_p
call inst$rdace
fstp tbyte [rsp+$00]
}
macro rdacd_p {
_rdac_p
call inst$rdacd
vmovdqa xword [rsp+$00], xmm0
}
macro rdacd2_p {
_rdac_p
call inst$rdacd2
vmovdqa xword [rsp+$00], xmm0
}
macro rdacd4_p {
_rdac_p
call inst$rdacd4
__push $01
vmovdqu yword [rsp+$00], ymm0
__sttag_y $00, TAG_DOUBLE4
}
macro rdacd8_p {
_rdac_p
call inst$rdacd8
__push $03
vmovdqu64 zword [rsp+$00], zmm0
__sttag_z $00, TAG_DOUBLE8
}
macro rdacf_p {
_rdac_p
call inst$rdacf
vmovdqa xword [rsp+$00], xmm0
}
macro rdacf2_p {
_rdac_p
call inst$rdacf2
vmovdqa xword [rsp+$00], xmm0
}
macro rdacf4_p {
_rdac_p
call inst$rdacf4
vmovdqa xword [rsp+$00], xmm0
}
macro rdacf8_p {
_rdac_p
call inst$rdacf8
__push $01
vmovdqu yword [rsp+$00], ymm0
__sttag_y $00, TAG_FLOAT8
}
macro rdacb_p {
_rdac_p
call inst$rdacb
mov qword [rsp+$00], qsc0
}
macro rdacb2_p {
_rdac_p
call inst$rdacb2
vmovdqa xword [rsp+$00], xmm0
}
macro rdacb4_p {
_rdac_p
call inst$rdacb4
vmovdqa xword [rsp+$00], xmm0
}
macro rdacb8_p {
_rdac_p
call inst$rdacb8
vmovdqa xword [rsp+$00], xmm0
}
macro rdacs_p {
_rdac_p
call inst$rdacs
mov qword [rsp+$00], qsc0
}
macro rdacs2_p {
_rdac_p
call inst$rdacs2
vmovdqa xword [rsp+$00], xmm0
}
macro rdacs4_p {
_rdac_p
call inst$rdacs4
vmovdqa xword [rsp+$00], xmm0
}
macro rdacs8_p {
_rdac_p
call inst$rdacs8
vmovdqa xword [rsp+$00], xmm0
}
macro rdaci_p {
_rdac_p
call inst$rdaci
mov qword [rsp+$00], qsc0
}
macro rdaci2_p {
_rdac_p
call inst$rdaci2
vmovdqa xword [rsp+$00], xmm0
}
macro rdaci4_p {
_rdac_p
call inst$rdaci4
vmovdqa xword [rsp+$00], xmm0
}
macro rdaci8_p {
_rdac_p
call inst$rdaci8
__push $01
vmovdqu yword [rsp+$00], ymm0
__sttag_y $00, TAG_INT8
}
macro rdacl_p {
_rdac_p
call inst$rdacl
mov qword [rsp+$00], qsc0
}
macro rdacl2_p {
_rdac_p
call inst$rdacl2
vmovdqa xword [rsp+$00], xmm0
}
macro rdacl4_p {
_rdac_p
call inst$rdacl4
__push $01
vmovdqu yword [rsp+$00], ymm0
__sttag_y $00, TAG_LONG4
}
macro rdacl8_p {
_rdac_p
call inst$rdacl8
__push $03
vmovdqu64 zword [rsp+$00], zmm0
__sttag_z $00, TAG_LONG8
}
; </fold>
; <fold объектная ссылка на аккумуляторе, индекс в локальной переменной, результат на аккумуляторе>
macro rdacr_l localvarName* {
_rdac_l localvarName, r
}
macro rdacc_l localvarName* {
_rdac_l localvarName, c
}
macro rdace_l localvarName* {
_rdac_l localvarName, e
}
macro rdacd_l localvarName* {
_rdac_l localvarName, d
}
macro rdacd2_l localvarName* {
_rdac_l localvarName, d2
}
macro rdacd4_l localvarName* {
_rdac_l localvarName, d4
}
macro rdacd8_l localvarName* {
_rdac_l localvarName, d8
}
macro rdacf_l localvarName* {
_rdac_l localvarName, f
}
macro rdacf2_l localvarName* {
_rdac_l localvarName, f2
}
macro rdacf4_l localvarName* {
_rdac_l localvarName, f4
}
macro rdacf8_l localvarName* {
_rdac_l localvarName, f8
}
macro rdacb_l localvarName* {
_rdac_l localvarName, b
}
macro rdacb2_l localvarName* {
_rdac_l localvarName, b2
}
macro rdacb4_l localvarName* {
_rdac_l localvarName, b4
}
macro rdacb8_l localvarName* {
_rdac_l localvarName, b8
}
macro rdacs_l localvarName* {
_rdac_l localvarName, s
}
macro rdacs2_l localvarName* {
_rdac_l localvarName, s2
}
macro rdacs4_l localvarName* {
_rdac_l localvarName, s4
}
macro rdacs8_l localvarName* {
_rdac_l localvarName, s8
}
macro rdaci_l localvarName* {
_rdac_l localvarName, i
}
macro rdaci2_l localvarName* {
_rdac_l localvarName, i2
}
macro rdaci4_l localvarName* {
_rdac_l localvarName, i4
}
macro rdaci8_l localvarName* {
_rdac_l localvarName, i8
}
macro rdacl_l localvarName* {
_rdac_l localvarName, l
}
macro rdacl2_l localvarName* {
_rdac_l localvarName, l2
}
macro rdacl4_l localvarName* {
_rdac_l localvarName, l4
}
macro rdacl8_l localvarName* {
_rdac_l localvarName, l8
}
; </fold>
; <fold объектная ссылка на аккумуляторе, индекс в глобальном члене, результат на аккумуляторе>
macro rdacr_g globalmember* {
_rdac_g globalmember, r
}
macro rdacc_g globalmember* {
_rdac_g globalmember, c
}
macro rdace_g globalmember* {
_rdac_g globalmember, e
}
macro rdacd_g globalmember* {
_rdac_g globalmember, d
}
macro rdacd2_g globalmember* {
_rdac_g globalmember, d2
}
macro rdacd4_g globalmember* {
_rdac_g globalmember, d4
}
macro rdacd8_g globalmember* {
_rdac_g globalmember, d8
}
macro rdacf_g globalmember* {
_rdac_g globalmember, f
}
macro rdacf2_g globalmember* {
_rdac_g globalmember, f2
}
macro rdacf4_g globalmember* {
_rdac_g globalmember, f4
}
macro rdacf8_g globalmember* {
_rdac_g globalmember, f8
}
macro rdacb_g globalmember* {
_rdac_g globalmember, b
}
macro rdacb2_g globalmember* {
_rdac_g globalmember, b2
}
macro rdacb4_g globalmember* {
_rdac_g globalmember, b4
}
macro rdacb8_g globalmember* {
_rdac_g globalmember, b8
}
macro rdacs_g globalmember* {
_rdac_g globalmember, s
}
macro rdacs2_g globalmember* {
_rdac_g globalmember, s2
}
macro rdacs4_g globalmember* {
_rdac_g globalmember, s4
}
macro rdacs8_g globalmember* {
_rdac_g globalmember, s8
}
macro rdaci_g globalmember* {
_rdac_g globalmember, i
}
macro rdaci2_g globalmember* {
_rdac_g globalmember, i2
}
macro rdaci4_g globalmember* {
_rdac_g globalmember, i4
}
macro rdaci8_g globalmember* {
_rdac_g globalmember, i8
}
macro rdacl_g globalmember* {
_rdac_g globalmember, l
}
macro rdacl2_g globalmember* {
_rdac_g globalmember, l2
}
macro rdacl4_g globalmember* {
_rdac_g globalmember, l4
}
macro rdacl8_g globalmember* {
_rdac_g globalmember, l8
}
; </fold>
; </fold>