instruction.setarrayelement.inc

Переключить прокрутку окна
Загрузить этот исходный код

;
 ;  Исходный код среды исполнения ПВТ-ОО.
 ;
 ;  Этот исходный код является частью проекта ПВТ-ОО.
 ;
 ;  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>