;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold запись компонентов массивов>
macro fenter_wrac {
local .L.0000
local .L.0001
fenter
mov r08q, [.array]
test r08q, r08q
jnz .L.0000
fthrow NullPointerException
.L.0000: mov r02d, [.index]
cmp r02d, [r08+avt.lang.Array$fldLength]
jb .L.0001
fthrow ArrayIndexOutOfBoundsException
.L.0001: lea r01q, [r08+$40]
add r01q, [r01+avt.lang.Array$fldOffset-$40]
}
macro fenter_wracr {
local .L.0000
fenter
mov r08q, [.array]
mov r02d, [.index]
cmp r02d, [r08+avt.lang.Array$fldLength]
jb .L.0000
releaser
fthrow ArrayIndexOutOfBoundsException
.L.0000: lea r01q, [r08+$40]
add r01q, [r01+avt.lang.Array$fldOffset-$40]
}
macro fenter_wrace {
local .L.0000
local .L.0001
fenter
mov r08q, [.array]
test r08q, r08q
jnz .L.0000
releasee
fthrow NullPointerException
.L.0000: mov r02d, [.index]
cmp r02d, [r08+avt.lang.Array$fldLength]
jb .L.0001
releasee
fthrow ArrayIndexOutOfBoundsException
.L.0001: lea r01q, [r08+$40]
add r01q, [r01+avt.lang.Array$fldOffset-$40]
}
macro fleave_wrac {
decrcoth r08q
fcltag_x array
fleave
}
if(used inst$wracr) ; <fold >
fast inst$wracr, \
array, avt.lang.Object.01d, \
index, int
fenter_wracr
test qsc0, qsc0
jz .L.0000
incrcobj qsc0
decrcoth qsc0
.L.0000: xchg qword [r01+r02*8+$00], qsc0
tstdecrcobj qsc0
fleave_wrac
end if ; </fold>
if(used inst$wracc) ; <fold >
label inst$wracc at inst$wracs
end if ; </fold>
if(used inst$wrace) ; <fold >
fast inst$wrace, \
array, real.01d, \
index, int
fenter_wrace
lea r02q, [r02+r02*4+$00]
fstp tbyte [r01+r02*2+$00]
fleave_wrac
end if ; </fold>
if(used inst$wracd) ; <fold >
fast inst$wracd, \
array, double.01d, \
index, int
fenter_wrac
vmovq qword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracd2) ; <fold >
fast inst$wracd2, \
array, double2.01d, \
index, int
fenter_wrac
lea r02q, [r02+r02*1+$00]
vmovdqu xword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracd4) ; <fold >
fast inst$wracd4, \
array, double4.01d, \
index, int
fenter_wrac
lea r02q, [$00+r02*4+$00]
vmovdqu yword [r01+r02*8+$00], ymm0
fleave_wrac
end if ; </fold>
if(used inst$wracd8) ; <fold >
fast inst$wracd8, \
array, double8.01d, \
index, int
fenter_wrac
lea r02q, [$00+r02*8+$00]
vmovdqu64 zword [r01+r02*8+$00], zmm0
fleave_wrac
end if ; </fold>
if(used inst$wracf) ; <fold >
fast inst$wracf, \
array, float.01d, \
index, int
fenter_wrac
vmovd dword [r01+r02*4+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracf2) ; <fold >
fast inst$wracf2, \
array, float2.01d, \
index, int
fenter_wrac
vmovq qword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracf4) ; <fold >
fast inst$wracf4, \
array, float4.01d, \
index, int
fenter_wrac
lea r02q, [r02+r02*1+$00]
vmovdqu xword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracf8) ; <fold >
fast inst$wracf8, \
array, float8.01d, \
index, int
fenter_wrac
lea r02q, [$00+r02*4+$00]
vmovdqu yword [r01+r02*8+$00], ymm0
fleave_wrac
end if ; </fold>
if(used inst$wracb) ; <fold >
fast inst$wracb, \
array, byte.01d, \
index, int
fenter_wrac
mov byte [r01+r02*1+$00], bsc0
fleave_wrac
end if ; </fold>
if(used inst$wracb2) ; <fold >
fast inst$wracb2, \
array, byte2.01d, \
index, int
fenter_wrac
vmovd dsc0, xmm0
mov word [r01+r02*2+$00], wsc0
fleave_wrac
end if ; </fold>
if(used inst$wracb4) ; <fold >
fast inst$wracb4, \
array, byte4.01d, \
index, int
fenter_wrac
vmovd dword [r01+r02*4+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracb8) ; <fold >
fast inst$wracb8, \
array, byte8.01d, \
index, int
fenter_wrac
vmovq qword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracs) ; <fold >
fast inst$wracs, \
array, short.01d, \
index, int
fenter_wrac
mov word [r01+r02*2+$00], wsc0
fleave_wrac
end if ; </fold>
if(used inst$wracs2) ; <fold >
fast inst$wracs2, \
array, short2.01d, \
index, int
fenter_wrac
vmovd dword [r01+r02*4+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracs4) ; <fold >
fast inst$wracs4, \
array, short4.01d, \
index, int
fenter_wrac
vmovq qword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracs8) ; <fold >
fast inst$wracs8, \
array, short8.01d, \
index, int
fenter_wrac
lea r02q, [r02+r02*1+$00]
vmovdqu xword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wraci) ; <fold >
fast inst$wraci, \
array, int.01d, \
index, int
fenter_wrac
mov dword [r01+r02*4+$00], dsc0
fleave_wrac
end if ; </fold>
if(used inst$wraci2) ; <fold >
fast inst$wraci2, \
array, int2.01d, \
index, int
fenter_wrac
vmovq qword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wraci4) ; <fold >
fast inst$wraci4, \
array, int4.01d, \
index, int
fenter_wrac
lea r02q, [r02+r02*1+$00]
vmovdqu xword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wraci8) ; <fold >
fast inst$wraci8, \
array, int8.01d, \
index, int
fenter_wrac
lea r02q, [$00+r02*4+$00]
vmovdqu yword [r01+r02*8+$00], ymm0
fleave_wrac
end if ; </fold>
if(used inst$wracl) ; <fold >
fast inst$wracl, \
array, long.01d, \
index, int
fenter_wrac
mov qword [r01+r02*8+$00], qsc0
fleave_wrac
end if ; </fold>
if(used inst$wracl2) ; <fold >
fast inst$wracl2, \
array, long2.01d, \
index, int
fenter_wrac
lea r02q, [r02+r02*1+$00]
vmovdqu xword [r01+r02*8+$00], xmm0
fleave_wrac
end if ; </fold>
if(used inst$wracl4) ; <fold >
fast inst$wracl4, \
array, long4.01d, \
index, int
fenter_wrac
lea r02q, [$00+r02*4+$00]
vmovdqu yword [r01+r02*8+$00], ymm0
fleave_wrac
end if ; </fold>
if(used inst$wracl8) ; <fold >
fast inst$wracl8, \
array, long8.01d, \
index, int
fenter_wrac
lea r02q, [$00+r02*8+$00]
vmovdqu64 zword [r01+r02*8+$00], zmm0
fleave_wrac
end if ; </fold>
; </fold>