;
; Исходный код среды исполнения ПВТ-ОО.
;
; Этот исходный код является частью проекта ПВТ-ОО.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
; <fold write array element>
if(used inst$setarrayelementi) ; <fold >
inst setarrayelementi
averify int, TAG_INT
mov ecx, [rsp]
mov dword[rax+rdi*4], ecx
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementi2) ; <fold >
inst setarrayelementi2
averify int2, TAG_INT2
vmovq xmm0, [rsp]
lea rdi, [rdi+rdi*1]
vmovq qword[rax+rdi*4], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementi4) ; <fold >
inst setarrayelementi4
averify int4, TAG_INT4
vmovdqa xmm0, [rsp]
lea rdi, [rdi*4]
vmovdqu xword[rax+rdi*4], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementi8) ; <fold >
inst setarrayelementi8
averify int8, TAG_INT8
vmovdqu ymm0, [rsp]
lea rdi, [rdi*8]
vmovdqu yword[rax+rdi*4], ymm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop4set
end_inst
end if ; </fold>
if(used inst$setarrayelementl) ; <fold >
inst setarrayelementl
averify long, TAG_LONG
mov rcx, [rsp]
mov qword[rax+rdi*8], rcx
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementl2) ; <fold >
inst setarrayelementl2
averify long2, TAG_LONG2
vmovdqa xmm0, [rsp]
lea rdi, [rdi+rdi*1]
vmovdqu xword[rax+rdi*8], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementl4) ; <fold >
inst setarrayelementl4
averify long4, TAG_LONG4
vmovdqu ymm0, [rsp]
lea rdi, [rdi*4]
vmovdqu yword[rax+rdi*8], ymm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop4set
end_inst
end if ; </fold>
if(used inst$setarrayelementl8) ; <fold >
inst setarrayelementl8
averify long8, TAG_LONG8
vmovdqu64 zmm0, [rsp]
lea rdi, [rdi*8]
vmovdqu64 zword[rax+rdi*8], zmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop6set
end_inst
end if ; </fold>
if(used inst$setarrayelementf) ; <fold >
inst setarrayelementf
averify float, TAG_FLOAT
vmovd xmm0, [rsp]
vmovd dword[rax+rdi*4], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementf2) ; <fold >
inst setarrayelementf2
averify float2, TAG_FLOAT2
vmovq xmm0, [rsp]
lea rdi, [rdi+rdi*1]
vmovq qword[rax+rdi*4], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementf4) ; <fold >
inst setarrayelementf4
averify float4, TAG_FLOAT4
vmovdqa xmm0, [rsp]
lea rdi, [rdi*4]
vmovdqu xword[rax+rdi*4], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementf8) ; <fold >
inst setarrayelementf8
averify float8, TAG_FLOAT8
vmovdqu ymm0, [rsp]
lea rdi, [rdi*8]
vmovdqu yword[rax+rdi*4], ymm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop4set
end_inst
end if ; </fold>
if(used inst$setarrayelementd) ; <fold >
inst setarrayelementd
averify double, TAG_DOUBLE
vmovq xmm0, [rsp]
vmovq qword[rax+rdi*8], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementd2) ; <fold >
inst setarrayelementd2
averify double2, TAG_DOUBLE2
vmovdqa xmm0, [rsp]
lea rdi, [rdi+rdi*1]
vmovdqu xword[rax+rdi*8], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementd4) ; <fold >
inst setarrayelementd4
averify double4, TAG_DOUBLE4
vmovdqu ymm0, [rsp]
lea rdi, [rdi*4]
vmovdqu yword[rax+rdi*8], ymm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop4set
end_inst
end if ; </fold>
if(used inst$setarrayelementd8) ; <fold >
inst setarrayelementd8
averify double8, TAG_DOUBLE8
vmovdqu64 zmm0, [rsp]
lea rdi, [rdi*8]
vmovdqu64 zword[rax+rdi*8], zmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop6set
end_inst
end if ; </fold>
if(used inst$setarrayelementb) ; <fold >
inst setarrayelementb
averify byte, TAG_INT
mov cl, [rsp]
mov byte[rax+rdi*1], cl
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementb2) ; <fold >
inst setarrayelementb2
averify byte2, TAG_BYTE2
mov cx, [rsp]
lea rdi, [rdi+rdi*1]
mov word[rax+rdi*1], cx
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementb4) ; <fold >
inst setarrayelementb4
averify byte4, TAG_BYTE4
vmovd xmm0, [rsp]
lea rdi, [rdi*4]
vmovd dword[rax+rdi*1], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementb8) ; <fold >
inst setarrayelementb8
averify byte8, TAG_BYTE8
vmovq xmm0, [rsp]
lea rdi, [rdi*8]
vmovq qword[rax+rdi*1], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelements) ; <fold >
inst setarrayelements
averify short, TAG_INT
mov cx, [rsp]
mov word[rax+rdi*2], cx
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelements2) ; <fold >
inst setarrayelements2
averify short2, TAG_SHORT2
vmovd xmm0, [rsp]
lea rdi, [rdi+rdi*1]
vmovd dword[rax+rdi*2], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelements4) ; <fold >
inst setarrayelements4
averify short4, TAG_SHORT4
vmovq xmm0, [rsp]
lea rdi, [rdi*4]
vmovq qword[rax+rdi*2], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelements8) ; <fold >
inst setarrayelements8
averify short8, TAG_SHORT8
vmovdqa xmm0, [rsp]
lea rdi, [rdi*8]
vmovdqu xword[rax+rdi*2], xmm0
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementx) ; <fold >
inst setarrayelementx
averify real, TAG_REAL
fld tbyte[rsp]
lea rdi, [rdi+rdi*4]
fstp tbyte[rax+rdi*2]
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementc) ; <fold >
inst setarrayelementc
averify char, TAG_INT
mov cx, [rsp]
mov word[rax+rdi*2], cx
lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
if(used inst$setarrayelementr) ; <fold >
inst setarrayelementr
averify avt.lang.Object, TAG_OBJECT
mov rcx, [rsp]
test rcx, rcx
jz @F
lock inc qword[rcx+avt.lang.Object$fldRefCountFromObjects]
lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
@@: xchg qword[rax+rdi*8], rcx
test rcx, rcx
jz @F
lock dec qword[rcx+avt.lang.Object$fldRefCountFromObjects]
@@: lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
pop3set
end_inst
end if ; </fold>
; </fold>