;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold объявление локальных переменных>
; <fold приватные макросы — должны использоваться только макросами инструкций высокого уровня>
macro _release localvarName* {
local .L.0000
cmp byte [.#localvarName#.tag], TAG_OBJECT
jne .L.0000
mov qsc1, [.#localvarName]
tstdecrcoth qsc1
.L.0000: mov byte [.#localvarName#.tag], TAG_OBJECT
}
; </fold>
; <fold сохраняемое значение на аккумуляторе>
macro declarer localvarName* {
_release localvarName
mov qword [.#localvarName+$08], $00
mov qword [.#localvarName+$00], qsc0
}
macro declaree localvarName* {
mov dword [.#localvarName+$0c], $00
mov word [.#localvarName+$0a], $00
fstp tbyte [.#localvarName+$00]
}
macro declared localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declared2 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declared4 localvarName* {
vmovdqu yword [.#localvarName+$00], ymm0
}
macro declared8 localvarName* {
vmovdqu64 zword [.#localvarName+$00], zmm0
}
macro declaref localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declaref2 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declaref4 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declaref8 localvarName* {
vmovdqu yword [.#localvarName+$00], ymm0
}
macro declareb2 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declareb4 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declareb8 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declares2 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declares4 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declares8 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declarei localvarName* {
mov qword [.#localvarName+$08], $00
mov qword [.#localvarName+$00], qsc0
}
macro declarei2 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declarei4 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declarei8 localvarName* {
vmovdqu yword [.#localvarName+$00], ymm0
}
macro declarel localvarName* {
mov qword [.#localvarName+$08], $00
mov qword [.#localvarName+$00], qsc0
}
macro declarel2 localvarName* {
vmovdqa xword [.#localvarName+$00], xmm0
}
macro declarel4 localvarName* {
vmovdqu yword [.#localvarName+$00], ymm0
}
macro declarel8 localvarName* {
vmovdqu64 zword [.#localvarName+$00], zmm0
}
; </fold>
; <fold сохраняемое значение в непосредственном операнде>
macro declarer_c localvarName*, immediate* {
_release localvarName
if(immediate eq null)
mov qword [.#localvarName+$08], $00
mov qword [.#localvarName+$00], null
else
lea qsc0, [immediate]
incrcoth qsc0
mov qword [.#localvarName+$08], $00
mov qword [.#localvarName+$00], qsc0
end if
}
macro declarei_c localvarName*, immediate* {
if((immediate) >= 0)
mov qword [.#localvarName+$08], $00
mov qword [.#localvarName+$00], immediate
else
mov dsc0, immediate
mov qword [.#localvarName+$08], $00
mov qword [.#localvarName+$00], qsc0
end if
}
; </fold>
; </fold>