;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024, 2026 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold avt.lang.Runtime — родной код>
if(used avt.lang.Runtime$toPointer$avt.lang.Object$) ; <fold returns long>
fast avt.lang.Runtime$toPointer$avt.lang.Object$, \
instanceRef, avt.lang.Object
fenter
mov r00q, [.instanceRef]
tstdecrcoth r00q
fcltag_x instanceRef
fleave
end if ; </fold>
if(used avt.lang.Runtime$toInstance$long$) ; <fold returns avt.lang.Object>
fast avt.lang.Runtime$toInstance$long$, \
instancePtr, long
fenter
mov r00q, [.instancePtr]
tstincrcoth r00q
fleave
end if ; </fold>
if(used avt.lang.Runtime$initInstance$long$avt.lang.Class$long$int$) ; <fold returns avt.lang.Object>
fast avt.lang.Runtime$initInstance$long$avt.lang.Class$long$int$, \
instancePtr, long, \
instanceType, avt.lang.Class, \
instanceSize, long, \
arrayLength, int
fenter
savetbp
mov r07q, [.instancePtr]
mov r02q, [.instanceType]
mov r01q, [.instanceSize]
mov r00d, [.arrayLength]
lea r08q, [r02-$00] ; instanceType
sub r02q, r07q
mov qword [r07+avt.lang.Object$fldRefCountFromOthers], $01
mov qword [r07+avt.lang.Object$fldRefCountFromObjects], $00
mov qword [r07+avt.lang.Object$fldClassOffset], r02q
mov qword [r07+avt.lang.Object$fldMonitor], null
lea r02q, [r07+$00]
cmp r00d, $00
jge .L.0000
lea r07q, [r07+$20]
lea r01q, [r01-$20]
jmp .L.0001
.L.0000: mov qword [r07+avt.lang.Array$fldLength], r00q
mov qword [r07+avt.lang.Array$fldCapacity], r00q
mov qword [r07+avt.lang.Array$fldParentStruct], null
mov qword [r07+avt.lang.Array$fldOffset], $00
lea r07q, [r07+$40]
lea r01q, [r01-$40]
.L.0001: sar r01q, $03
jz .L.EXIT
xor r00q, r00q
cld
rep stosq
.L.EXIT: mov r00q, r02q
rstortbp
decrcoth r08q
fcltag_x instanceType
fleave
end if ; </fold>
if(used avt.lang.Runtime$initStruct$long$avt.lang.Class$long$long$) ; <fold returns avt.lang.Object>
fast avt.lang.Runtime$initStruct$long$avt.lang.Class$long$long$, \
instancePtr, long, \
instanceType, avt.lang.Class, \
instanceSize, long, \
structDataPtr, long
fenter
savetbp
mov r07q, [.instancePtr]
mov r02q, [.instanceType]
mov r01q, [.instanceSize]
mov r00q, [.structDataPtr]
lea r08q, [r02-$00] ; instanceType
lea r00q, [r00-$40]
sub r02q, r07q
sub r00q, r07q
mov qword [r07+avt.lang.Object$fldRefCountFromOthers], $01
mov qword [r07+avt.lang.Object$fldRefCountFromObjects], $00
mov qword [r07+avt.lang.Object$fldClassOffset], r02q
mov qword [r07+avt.lang.Object$fldMonitor], null
mov qword [r07+avt.lang.Struct$fldReserved20], $00
mov qword [r07+avt.lang.Struct$fldReserved28], $00
mov qword [r07+avt.lang.Struct$fldReserved30], $00
mov qword [r07+avt.lang.Struct$fldOffset], r00q
lea r02q, [r07+$00]
lea r07q, [r07+$40]
lea r01q, [r01-$40]
sar r01q, $03
jz .L.EXIT
xor r00q, r00q
cld
rep stosq
.L.EXIT: mov r00q, r02q
rstortbp
decrcoth r08q
fcltag_x instanceType
fleave
end if ; </fold>
if(used avt.lang.Runtime$initArray$long$avt.lang.Class$long$int$long$avt.lang.Struct$) ; <fold returns avt.lang.Object>
fast avt.lang.Runtime$initArray$long$avt.lang.Class$long$int$long$avt.lang.Struct$, \
instancePtr, long, \
instanceType, avt.lang.Class, \
instanceSize, long, \
arrayLength, int, \
arrayDataPtr, long, \
arrayParentStruct, avt.lang.Struct
fenter
savetbp
mov r07q, [.instancePtr]
mov r02q, [.instanceType]
mov r01q, [.instanceSize]
mov r00d, [.arrayLength]
mov r08q, [.arrayDataPtr]
mov r09q, [.arrayParentStruct]
lea r10q, [r02-$00] ; instanceType
lea r08q, [r08-$40]
sub r02q, r07q
sub r08q, r07q
mov qword [r07+avt.lang.Object$fldRefCountFromOthers], $01
mov qword [r07+avt.lang.Object$fldRefCountFromObjects], $00
mov qword [r07+avt.lang.Object$fldClassOffset], r02q
mov qword [r07+avt.lang.Object$fldMonitor], null
mov qword [r07+avt.lang.Array$fldLength], r00q
mov qword [r07+avt.lang.Array$fldCapacity], r00q
mov qword [r07+avt.lang.Array$fldParentStruct], r09q
mov qword [r07+avt.lang.Array$fldOffset], r08q
lea r02q, [r07+$00]
lea r07q, [r07+$40]
lea r01q, [r01-$40]
sar r01q, $03
jz .L.EXIT
xor r00q, r00q
cld
rep stosq
.L.EXIT: mov r00q, r02q
rstortbp
test r09q, r09q
jz @F
incrcobj r09q
decrcoth r09q
@@: decrcoth r10q
fcltag_x instanceType
fcltag_x arrayParentStruct
fleave
end if ; </fold>
if(used avt.lang.Runtime$finInstance$long$) ; <fold >
fast avt.lang.Runtime$finInstance$long$, \
instancePtr, long
fenter
mov r08q, [.instancePtr]
mov r09q, [r08+avt.lang.Object$fldClassOffset]
lea r09q, [r08+r09*1+$00]
mov r00q, [r09+avt.lang.Class$fldComponentTypeOffset]
test r00q, r00q
jz .L.NORA
lea r00q, [r09+r00*1+$00]
test dword [r00+avt.lang.ReflectiveObject$fldAttributes], avt.lang.Class$PRIMITIVE
jnz .L.NORA
mov r01d, [r08+avt.lang.Array$fldCapacity]
lea r02q, [r08+$40]
add r02q, [r02+avt.lang.Array$fldOffset-$40]
jmp .L.0001
.L.0000: mov r00q, [r02+r01*8+$00]
tstdecrcobj r00q
.L.0001: add r01d, -$01
jns .L.0000
.L.NORA: mov r01d, [r09+avt.lang.Class$fldInstanceReferencedFieldsCount]
movsxd r02q, [r09+avt.lang.Class$fldInstanceReferencedFieldsOffset]
lea r09q, [r09+r02*1+$00]
jmp .L.0003
.L.0002: movsxd r02q, [r09+r01*4+$00]
mov r00q, [r08+r02*1+$00]
tstdecrcobj r00q
.L.0003: add r01d, -$01
jns .L.0002
fleave
end if ; </fold>
if(used avt.lang.Runtime$getInstanceRefsCount$long$) ; <fold returns int>
fast avt.lang.Runtime$getInstanceRefsCount$long$, \
instancePtr, long
fenter
mov r00q, [.instancePtr]
mov r02q, [r00+avt.lang.Object$fldClassOffset]
lea r02q, [r00+r02*1+$00]
mov r08q, [r02+avt.lang.Class$fldComponentTypeOffset]
test r08q, r08q
jz .L.NORA
lea r08q, [r02+r08*1+$00]
test dword [r08+avt.lang.ReflectiveObject$fldAttributes], avt.lang.Class$PRIMITIVE
jnz .L.NORA
mov r00d, [r00+avt.lang.Array$fldCapacity]
jmp .L.EXIT
.L.NORA: mov r00d, [r02+avt.lang.Class$fldInstanceReferencedFieldsCount]
lea r00d, [r00d-$01]
.L.EXIT: fleave
end if ; </fold>
if(used avt.lang.Runtime$getInstanceRefAtIndex$long$int$) ; <fold returns long>
fast avt.lang.Runtime$getInstanceRefAtIndex$long$int$, \
instancePtr, long, \
index, int
fenter
mov r00q, [.instancePtr]
mov r01d, [.index]
mov r02q, [r00+avt.lang.Object$fldClassOffset]
lea r02q, [r00+r02*1+$00]
test r01d, r01d
js .L.INEG
mov r08q, [r02+avt.lang.Class$fldComponentTypeOffset]
test r08q, r08q
jz .L.NORA
lea r08q, [r02+r08*1+$00]
test dword [r08+avt.lang.ReflectiveObject$fldAttributes], avt.lang.Class$PRIMITIVE
jnz .L.NORA
lea r00q, [r00+$40]
add r00q, [r00+avt.lang.Array$fldOffset-$40]
mov r00q, [r00+r01*8+$00]
jmp .L.EXIT
.L.INEG: add r01d, [r02+avt.lang.Class$fldInstanceReferencedFieldsCount]
.L.NORA: movsxd r08q, [r02+avt.lang.Class$fldInstanceReferencedFieldsOffset]
lea r08q, [r02+r08*1+$00]
movsxd r08q, [r08+r01*4+$00]
mov r00q, [r00+r08*1+$00]
.L.EXIT: fleave
end if ; </fold>
if(used avt.lang.Runtime$refsToInstance$long$) ; <fold returns long2>
fast avt.lang.Runtime$refsToInstance$long$, \
instancePtr, long
fenter
mov r00q, [.instancePtr]
vmovdqa xmm0, [r00+$00]
fleave
end if ; </fold>
if(used avt.lang.Runtime$setActiveHeapIndex$avt.lang.Heap.01d$int$) ; <fold >
fast avt.lang.Runtime$setActiveHeapIndex$avt.lang.Heap.01d$int$, \
catalogue, avt.lang.Heap.01d, \
newActiveHeapIndex, int
fenter
mov r01q, [.catalogue]
mov r00d, [.newActiveHeapIndex]
mov dword [r01+$40], r00d
decrcoth r01q
fcltag_x catalogue
fleave
end if ; </fold>
if(used avt.lang.Runtime$getActiveHeapIndex$avt.lang.Heap.01d$) ; <fold returns int>
fast avt.lang.Runtime$getActiveHeapIndex$avt.lang.Heap.01d$, \
catalogue, avt.lang.Heap.01d
fenter
mov r01q, [.catalogue]
mov r00d, [r01+$40]
decrcoth r01q
fcltag_x catalogue
fleave
end if ; </fold>
if(used avt.lang.Runtime$copy$long$long$long$) ; <fold >
alias avt.lang.Runtime$copy$long$long$long$, \
avt.lang.Array$copyForwardByRef$long$long$long$
end if ; </fold>
if(used avt.lang.Runtime$getCodeMemoryRegionPointers$) ; <fold returns long2>
proc avt.lang.Runtime$getCodeMemoryRegionPointers$
lea r00q, [code$begin]
lea r01q, [code$end]
vmovq xmm0, r00q
vmovq xmm1, r01q
vpslldq xmm1, xmm1, $08
vpor xmm0, xmm0, xmm1
ret
end_proc
end if ; </fold>
if(used avt.lang.Runtime$getDataMemoryRegionPointers$) ; <fold returns long2>
proc avt.lang.Runtime$getDataMemoryRegionPointers$
lea r00q, [data$begin]
lea r01q, [data$end]
vmovq xmm0, r00q
vmovq xmm1, r01q
vpslldq xmm1, xmm1, $08
vpor xmm0, xmm0, xmm1
ret
end_proc
end if ; </fold>
; </fold>