;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold макросы инструкций высокого уровня>
; <fold местные макросы — должны использоваться макросами инструкций высокого уровня и макросами в подпапках папки !macro>
macro __structp rs0q*, rs1q* {
lea rs0q, [rs1q+$40]
add rs0q, [rs0q+avt.lang.Struct$fldOffset-$40]
}
macro __push dataElements* {
lea rsp, [rsp-(dataElements)*$10]
lea rsi, [rsi-(dataElements)*$01]
}
macro __pop dataElements* {
lea rsi, [rsi+(dataElements)*$01]
lea rsp, [rsp+(dataElements)*$10]
}
macro __sttag_x ofs*, tag* {
mov byte [rsi+ofs], tag
}
macro __sttag_y ofs*, tag* {
mov word [rsi+ofs], tag
}
macro __sttag_z ofs*, tag* {
mov dword [rsi+ofs], tag
}
macro __cltag_x ofs* {
mov byte [rsi+ofs], TAG_EMPTY
}
macro __cltag_y ofs* {
mov word [rsi+ofs], TAG_EMPTY
}
macro __cltag_z ofs* {
mov dword [rsi+ofs], TAG_EMPTY
}
macro __saturb {
local .L.0000
local .L.0001
cmp dsc0, -$80
jge .L.0000
mov dsc0, -$80
jmp .L.0001
.L.0000: cmp dsc0, $7f
jle .L.0001
mov dsc0, $7f
.L.0001:
}
macro __saturs {
local .L.0000
local .L.0001
cmp dsc0, -$8000
jge .L.0000
mov dsc0, -$8000
jmp .L.0001
.L.0000: cmp dsc0, $7fff
jle .L.0001
mov dsc0, $7fff
.L.0001:
}
macro __saturub defaultValue* {
local .L.0000
cmp dsc0, $ff
jbe .L.0000
mov dsc0, defaultValue
.L.0000: movsx dsc0, bsc0
}
macro __saturus defaultValue* {
local .L.0000
cmp dsc0, $ffff
jbe .L.0000
mov dsc0, defaultValue
.L.0000: movsx dsc0, wsc0
}
; </fold>
; <fold приватные макросы — должны использоваться только макросами инструкций высокого уровня>
macro _throw exceptionType* {
local .L.0000
lea r00q, [avt.lang.#exceptionType#$create$long$]
lea r01q, [.L.0000]
jmp inst$throw
.L.0000:
}
macro _chknull rs0q* {
local .L.0000
test rs0q, rs0q
jnz .L.0000
_throw NullPointerException
.L.0000:
}
macro _chknullr rs0q* {
local .L.0000
test rs0q, rs0q
jnz .L.0000
releaser
_throw NullPointerException
.L.0000:
}
macro _chknulle rs0q* {
local .L.0000
test rs0q, rs0q
jnz .L.0000
releasee
_throw NullPointerException
.L.0000:
}
macro _loadw_l rs0q*, localvarName* {
mov rs0q, [.#localvarName]
if(~("this" eq `localvarName))
_chknull rs0q
end if
}
macro _wrstb {
mov qword [rsp+$08], $00
mov qword [rsp+$00], qsc0
}
macro _setcmpg {
local .L.0000
jnp .L.0000
mov bsc0, $ff
cmp bsc0, $00
.L.0000:
}
macro _setcmpl {
local .L.0000
jnp .L.0000
mov bsc0, $00
cmp bsc0, $ff
.L.0000:
}
; </fold>
; <fold сохранение и восстановление дополнений к rsp/esp и rbp/ebp>
macro savetsp {
mov qword [rbx+ctxt$tsp], rsi
}
macro savetbp {
mov qword [rbx+ctxt$tbp], rdi
}
macro savetp {
savetsp
savetbp
}
macro rstortsp {
mov rsi, [rbx+ctxt$tsp]
}
macro rstortbp {
mov rdi, [rbx+ctxt$tbp]
}
macro rstortp {
rstortsp
rstortbp
}
; </fold>
; <fold манипуляции счётчиками ссылок на объекты>
macro incrcoth rs0q* {
lock inc qword [rs0q+avt.lang.Object$fldRefCountFromOthers]
}
macro decrcoth rs0q* {
lock dec qword [rs0q+avt.lang.Object$fldRefCountFromOthers]
}
macro addrcoth rs0q*, delta* {
lock add qword [rs0q+avt.lang.Object$fldRefCountFromOthers], delta
}
macro subrcoth rs0q*, delta* {
lock sub qword [rs0q+avt.lang.Object$fldRefCountFromOthers], delta
}
macro incrcobj rs0q* {
lock inc qword [rs0q+avt.lang.Object$fldRefCountFromObjects]
}
macro decrcobj rs0q* {
lock dec qword [rs0q+avt.lang.Object$fldRefCountFromObjects]
}
macro addrcobj rs0q*, delta* {
lock add qword [rs0q+avt.lang.Object$fldRefCountFromObjects], delta
}
macro subrcobj rs0q*, delta* {
lock sub qword [rs0q+avt.lang.Object$fldRefCountFromObjects], delta
}
macro tstincrcoth rs0q* {
local .L.0000
test rs0q, rs0q
jz .L.0000
incrcoth rs0q
.L.0000:
}
macro tstdecrcoth rs0q* {
local .L.0000
test rs0q, rs0q
jz .L.0000
decrcoth rs0q
.L.0000:
}
macro tstaddrcoth rs0q*, delta* {
local .L.0000
test rs0q, rs0q
jz .L.0000
addrcoth rs0q, delta
.L.0000:
}
macro tstsubrcoth rs0q*, delta* {
local .L.0000
test rs0q, rs0q
jz .L.0000
subrcoth rs0q, delta
.L.0000:
}
macro tstincrcobj rs0q* {
local .L.0000
test rs0q, rs0q
jz .L.0000
incrcobj rs0q
.L.0000:
}
macro tstdecrcobj rs0q* {
local .L.0000
test rs0q, rs0q
jz .L.0000
decrcobj rs0q
.L.0000:
}
macro tstaddrcobj rs0q*, delta* {
local .L.0000
test rs0q, rs0q
jz .L.0000
addrcobj rs0q, delta
.L.0000:
}
macro tstsubrcobj rs0q*, delta* {
local .L.0000
test rs0q, rs0q
jz .L.0000
subrcobj rs0q, delta
.L.0000:
}
; </fold>
; <fold тексты исходного кода макросов инструкций высокого уровня>
include "fast/!main.inc"
include "invoke.inc"
include "exception.inc"
include "tagged-stack.inc"
include "switch.inc"
include "read.variable.inc"
include "read.struct-field.inc"
include "read.instance-field.inc"
include "read.vector-element.inc"
include "read.array-component.inc"
include "write.variable.inc"
include "write.struct-field.inc"
include "write.instance-field.inc"
include "write.array-component.inc"
include "increment-decrement.inc"
include "declare.inc"
include "reference.chktype.inc"
include "reference.compare.inc"
include "cast.real.inc"
include "cast.double.inc"
include "cast.float.inc"
include "cast.byte.inc"
include "cast.short.inc"
include "cast.int.inc"
include "cast.long.inc"
include "jump.boolean.inc"
include "bit.not.inc"
include "bit.or.inc"
include "bit.and.inc"
include "bit.xor.inc"
include "bit.test.inc"
include "scalar.neg.inc"
include "scalar.mul.inc"
include "scalar.div.inc"
include "scalar.divu.inc"
include "scalar.rem.inc"
include "scalar.remu.inc"
include "scalar.add.inc"
include "scalar.sub.inc"
include "scalar.shr.inc"
include "scalar.shru.inc"
include "scalar.shl.inc"
include "scalar.gt.inc"
include "scalar.ge.inc"
include "scalar.lt.inc"
include "scalar.le.inc"
include "scalar.eq.inc"
include "scalar.ne.inc"
include "vector.new.inc"
include "vector.lup.inc"
include "vector.uup.inc"
include "vector.pck.inc"
include "vector.neg.inc"
include "vector.mul.inc"
include "vector.div.inc"
include "vector.add.inc"
include "vector.sub.inc"
include "vector.shr.inc"
include "vector.shru.inc"
include "vector.shl.inc"
include "vector.gt.inc"
include "vector.ge.inc"
include "vector.lt.inc"
include "vector.le.inc"
include "vector.eq.inc"
include "vector.ne.inc"
include "vector.hmul.inc"
include "vector.hmulu.inc"
include "vector.sadd.inc"
include "vector.saddu.inc"
include "vector.ssub.inc"
include "vector.ssubu.inc"
; </fold>
; </fold>