Array.inc

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

;
 ;  Исходный код среды исполнения ПВТ-ОО.
 ;
 ;  Этот исходный код является частью проекта ПВТ-ОО.
 ;
 ;  Copyright © 2021 Малик Разработчик
 ;
 ;  Это свободная программа: вы можете перераспространять её и/или
 ;  изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
 ;  в каком она была опубликована Фондом свободного программного обеспечения;
 ;  либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
 ;
 ;  Эта программа распространяется в надежде, что она может быть полезна,
 ;  но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
 ;  или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
 ;  общественной лицензии GNU.
 ;
 ;  Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
 ;  вместе с этой программой. Если это не так, см.
 ;  <http://www.gnu.org/licenses/>.
;

; <fold avt.lang.Array (natives)>

    method avt.lang.Array$indexOf$boolean$boolean.01d$int$int$, \
                value, boolean, \
                array, boolean.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                mempty ; Такой же код, как и для byte[]. Не перемещайте этот блок кода!
    ; </fold>

    method avt.lang.Array$indexOf$int$byte.01d$int$int$, \
                value, int, \
                array, byte.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_INT                           ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+byte.01d$fldLength]            ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, $00
                jge     @F
                xor     rdx, rdx
        @@:     cmp     rdx, rcx
                jl      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     sub     rcx, rdx
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     movsx   rax, byte[.value]                        ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+byte.01d$fldOffset]            ;
                lea     rdi, [rsi+rdx*1]                         ;
                cld
                repne scasb                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rax, [rdi-$01]                           ;
                sub     rax, rsi
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$indexOf$int$char.01d$int$int$, \
                value, int, \
                array, char.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                mempty ; Такой же код, как и для short[]. Не перемещайте этот блок кода!
    ; </fold>

    method avt.lang.Array$indexOf$int$short.01d$int$int$, \
                value, int, \
                array, short.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_INT                           ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+short.01d$fldLength]           ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, $00
                jge     @F
                xor     rdx, rdx
        @@:     cmp     rdx, rcx
                jl      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     sub     rcx, rdx
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     movsx   rax, word[.value]                        ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+short.01d$fldOffset]           ;
                lea     rdi, [rsi+rdx*2]                         ;
                cld
                repne scasw                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rax, [rdi-$02]                           ;
                sub     rax, rsi
                sar     rax, $01                                 ;
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$indexOf$int$int.01d$int$int$, \
                value, int, \
                array, int.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_INT                           ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+int.01d$fldLength]             ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, $00
                jge     @F
                xor     rdx, rdx
        @@:     cmp     rdx, rcx
                jl      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     sub     rcx, rdx
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     movsxd  rax, [.value]                            ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+int.01d$fldOffset]             ;
                lea     rdi, [rsi+rdx*4]                         ;
                cld
                repne scasd                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rax, [rdi-$04]                           ;
                sub     rax, rsi
                sar     rax, $02                                 ;
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$indexOf$long$long.01d$int$int$, \
                value, long, \
                array, long.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_LONG                          ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+long.01d$fldLength]            ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, $00
                jge     @F
                xor     rdx, rdx
        @@:     cmp     rdx, rcx
                jl      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     sub     rcx, rdx
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     mov     rax, [.value]                            ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+long.01d$fldOffset]            ;
                lea     rdi, [rsi+rdx*8]                         ;
                cld
                repne scasq                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rax, [rdi-$08]                           ;
                sub     rax, rsi
                sar     rax, $03                                 ;
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$indexOf$avt.lang.Object$avt.lang.Object.01d$int$int$, \
                value, avt.lang.Object, \
                array, avt.lang.Object.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_OBJECT                        ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+avt.lang.Object.01d$fldLength] ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, $00
                jge     @F
                xor     rdx, rdx
        @@:     cmp     rdx, rcx
                jl      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     sub     rcx, rdx
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     mov     rax, [.value]                            ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+avt.lang.Object.01d$fldOffset] ;
                lea     rdi, [rsi+rdx*8]                         ;
                cld
                repne scasq                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rax, [rdi-$08]                           ;
                sub     rax, rsi
                sar     rax, $03                                 ;
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$lastIndexOf$boolean$boolean.01d$int$int$, \
                value, boolean, \
                array, boolean.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                mempty ; Такой же код, как и для byte[]. Не перемещайте этот блок кода!
    ; </fold>

    method avt.lang.Array$lastIndexOf$int$byte.01d$int$int$, \
                value, int, \
                array, byte.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_INT                           ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+byte.01d$fldLength]            ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, rcx
                jl      @F
                lea     rdx, [rcx-$01]
        @@:     cmp     rdx, $00
                jge     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rcx, [rdx+$01]
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     movsx   rax, byte[.value]                        ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+byte.01d$fldOffset]            ;
                lea     rdi, [rsi+rdx*1]                         ;
                std
                repne scasb                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.000
        @@:     lea     rax, [rdi+$01]                           ;
                sub     rax, rsi
        .L.000: cld
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$lastIndexOf$int$char.01d$int$int$, \
                value, int, \
                array, char.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                mempty ; Такой же код, как и для short[]. Не перемещайте этот блок кода!
    ; </fold>

    method avt.lang.Array$lastIndexOf$int$short.01d$int$int$, \
                value, int, \
                array, short.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_INT                           ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+short.01d$fldLength]           ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, rcx
                jl      @F
                lea     rdx, [rcx-$01]
        @@:     cmp     rdx, $00
                jge     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rcx, [rdx+$01]
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     movsx   rax, word[.value]                        ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+short.01d$fldOffset]           ;
                lea     rdi, [rsi+rdx*2]                         ;
                std
                repne scasw                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.000
        @@:     lea     rax, [rdi+$02]                           ;
                sub     rax, rsi
                sar     rax, $01                                 ;
        .L.000: cld
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$lastIndexOf$int$int.01d$int$int$, \
                value, int, \
                array, int.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_INT                           ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+int.01d$fldLength]             ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, rcx
                jl      @F
                lea     rdx, [rcx-$01]
        @@:     cmp     rdx, $00
                jge     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rcx, [rdx+$01]
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     movsxd  rax, [.value]                            ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+int.01d$fldOffset]             ;
                lea     rdi, [rsi+rdx*4]                         ;
                std
                repne scasd                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.000
        @@:     lea     rax, [rdi+$04]                           ;
                sub     rax, rsi
                sar     rax, $02                                 ;
        .L.000: cld
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$lastIndexOf$long$long.01d$int$int$, \
                value, long, \
                array, long.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_LONG                          ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+long.01d$fldLength]            ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, rcx
                jl      @F
                lea     rdx, [rcx-$01]
        @@:     cmp     rdx, $00
                jge     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rcx, [rdx+$01]
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     mov     rax, [.value]                            ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+long.01d$fldOffset]            ;
                lea     rdi, [rsi+rdx*8]                         ;
                std
                repne scasq                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.000
        @@:     lea     rax, [rdi+$08]                           ;
                sub     rax, rsi
                sar     rax, $03                                 ;
        .L.000: cld
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$lastIndexOf$avt.lang.Object$avt.lang.Object.01d$int$int$, \
                value, avt.lang.Object, \
                array, avt.lang.Object.01d, \
                startFromIndex, int, \
                maximumScanLength, int  ; returns int <fold >
                menter
                lverify value, TAG_OBJECT                        ;
                lverify array, TAG_OBJECT
                lverify startFromIndex, TAG_INT
                lverify maximumScanLength, TAG_INT
                mov     rdi, [.array]
                test    rdi, rdi
                jnz     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     movsxd  rcx, [rdi+avt.lang.Object.01d$fldLength] ;
                movsxd  rdx, [.startFromIndex]
                cmp     rdx, rcx
                jl      @F
                lea     rdx, [rcx-$01]
        @@:     cmp     rdx, $00
                jge     @F
                mov     eax, -$01
                jmp     .L.RET
        @@:     lea     rcx, [rdx+$01]
                movsxd  rsi, [.maximumScanLength]
                cmp     rsi, $00
                jle     @F
                cmp     rsi, rcx
                jge     @F
                mov     rcx, rsi
        @@:     mov     rax, [.value]                            ;
                lea     rsi, [rdi+$40]
                add     rsi, [rdi+avt.lang.Object.01d$fldOffset] ;
                lea     rdi, [rsi+rdx*8]                         ;
                std
                repne scasq                                      ;
                je      @F
                mov     eax, -$01
                jmp     .L.000
        @@:     lea     rax, [rdi+$08]                           ;
                sub     rax, rsi
                sar     rax, $03                                 ;
        .L.000: cld
        .L.RET: call    inst$ipush
                mleaved
                eleave
    ; </fold>

    method avt.lang.Array$fillByByte$long$int$byte8$int$, \
                dst, long, \
                cnt, int, \
                val, byte8, \
                cap, int  ; <fold >
                menter
                lverify dst, TAG_LONG
                lverify cnt, TAG_INT
                lverify val, TAG_BYTE8
                lverify cap, TAG_INT
                mov     rax, [.val]
                mov     rdi, [.dst]
                movsxd  rcx, [.cnt]
                movsxd  rdx, [.cap]
                cmp     rdx, $01
                je      .L.000
                cmp     rdx, $02
                je      .L.001
                cmp     rdx, $04
                je      .L.002
                cmp     rdx, $08
                je      .L.003
                jmp     .L.RET
        .L.000: cld
                rep stosb
                jmp     .L.RET
        .L.001: cld
                rep stosw
                jmp     .L.RET
        .L.002: cld
                rep stosd
                jmp     .L.RET
        .L.003: cld
                rep stosq
        .L.RET: mleave
                eleave
    ; </fold>

    method avt.lang.Array$fillByShort$long$int$short8$int$, \
                dst, long, \
                cnt, int, \
                val, short8, \
                cap, int  ; <fold >
                menter
                lverify dst, TAG_LONG
                lverify cnt, TAG_INT
                lverify val, TAG_SHORT8
                lverify cap, TAG_INT
                vmovdqa xmm0, [.val]
                mov     rax, [.val]
                mov     rdi, [.dst]
                movsxd  rcx, [.cnt]
                movsxd  rdx, [.cap]
                cmp     rdx, $01
                je      .L.000
                cmp     rdx, $02
                je      .L.001
                cmp     rdx, $04
                je      .L.002
                cmp     rdx, $08
                je      .L.003
                jmp     .L.RET
        .L.000: cld
                rep stosw
                jmp     .L.RET
        .L.001: cld
                rep stosd
                jmp     .L.RET
        .L.002: cld
                rep stosq
                jmp     .L.RET
        .L.003: vmovdqu xword[rdi], xmm0
                lea     rdi, [rdi+$10]
                loop    .L.003
        .L.RET: mleave
                eleave
    ; </fold>

    method avt.lang.Array$fillByInt$long$int$int8$int$, \
                dst, long, \
                cnt, int, \
                val, int8, \
                cap, int  ; <fold >
                menter
                lverify dst, TAG_LONG
                lverify cnt, TAG_INT
                lverify val, TAG_INT8
                lverify cap, TAG_INT
                vmovdqu ymm0, [.val]
                mov     rax, [.val]
                mov     rdi, [.dst]
                movsxd  rcx, [.cnt]
                movsxd  rdx, [.cap]
                cmp     rdx, $01
                je      .L.000
                cmp     rdx, $02
                je      .L.001
                cmp     rdx, $04
                je      .L.002
                cmp     rdx, $08
                je      .L.003
                jmp     .L.RET
        .L.000: cld
                rep stosd
                jmp     .L.RET
        .L.001: cld
                rep stosq
                jmp     .L.RET
        .L.002: vmovdqu xword[rdi], xmm0
                lea     rdi, [rdi+$10]
                loop    .L.002
                jmp     .L.RET
        .L.003: vmovdqu yword[rdi], ymm0
                lea     rdi, [rdi+$20]
                loop    .L.003
        .L.RET: mleave
                eleave
    ; </fold>

    method avt.lang.Array$fillByLong$long$int$long8$int$, \
                dst, long, \
                cnt, int, \
                val, long8, \
                cap, int  ; <fold >
                menter
                lverify dst, TAG_LONG
                lverify cnt, TAG_INT
                lverify val, TAG_LONG8
                lverify cap, TAG_INT
                vmovdqu64 zmm0, [.val]
                mov     rax, [.val]
                mov     rdi, [.dst]
                movsxd  rcx, [.cnt]
                movsxd  rdx, [.cap]
                cmp     rdx, $01
                je      .L.000
                cmp     rdx, $02
                je      .L.001
                cmp     rdx, $04
                je      .L.002
                cmp     rdx, $08
                je      .L.003
                jmp     .L.RET
        .L.000: cld
                rep stosq
                jmp     .L.RET
        .L.001: vmovdqu xword[rdi], xmm0
                lea     rdi, [rdi+$10]
                loop    .L.001
                jmp     .L.RET
        .L.002: vmovdqu yword[rdi], ymm0
                lea     rdi, [rdi+$20]
                loop    .L.002
                jmp     .L.RET
        .L.003: vmovdqu64 zword[rdi], zmm0
                lea     rdi, [rdi+$40]
                loop    .L.003
        .L.RET: mleave
                eleave
    ; </fold>

    method avt.lang.Array$fillByFloat$long$int$float8$int$, \
                dst, long, \
                cnt, int, \
                val, float8, \
                cap, int  ; <fold >
                menter
                lverify dst, TAG_LONG
                lverify cnt, TAG_INT
                lverify val, TAG_FLOAT8
                lverify cap, TAG_INT
                vmovdqu ymm0, [.val]
                mov     rax, [.val]
                mov     rdi, [.dst]
                movsxd  rcx, [.cnt]
                movsxd  rdx, [.cap]
                cmp     rdx, $01
                je      .L.000
                cmp     rdx, $02
                je      .L.001
                cmp     rdx, $04
                je      .L.002
                cmp     rdx, $08
                je      .L.003
                jmp     .L.RET
        .L.000: cld
                rep stosd
                jmp     .L.RET
        .L.001: cld
                rep stosq
                jmp     .L.RET
        .L.002: vmovdqu xword[rdi], xmm0
                lea     rdi, [rdi+$10]
                loop    .L.002
                jmp     .L.RET
        .L.003: vmovdqu yword[rdi], ymm0
                lea     rdi, [rdi+$20]
                loop    .L.003
        .L.RET: mleave
                eleave
    ; </fold>

    method avt.lang.Array$fillByDouble$long$int$double8$int$, \
                dst, long, \
                cnt, int, \
                val, double8, \
                cap, int  ; <fold >
                menter
                lverify dst, TAG_LONG
                lverify cnt, TAG_INT
                lverify val, TAG_DOUBLE8
                lverify cap, TAG_INT
                vmovdqu64 zmm0, [.val]
                mov     rax, [.val]
                mov     rdi, [.dst]
                movsxd  rcx, [.cnt]
                movsxd  rdx, [.cap]
                cmp     rdx, $01
                je      .L.000
                cmp     rdx, $02
                je      .L.001
                cmp     rdx, $04
                je      .L.002
                cmp     rdx, $08
                je      .L.003
                jmp     .L.RET
        .L.000: cld
                rep stosq
                jmp     .L.RET
        .L.001: vmovdqu xword[rdi], xmm0
                lea     rdi, [rdi+$10]
                loop    .L.001
                jmp     .L.RET
        .L.002: vmovdqu yword[rdi], ymm0
                lea     rdi, [rdi+$20]
                loop    .L.002
                jmp     .L.RET
        .L.003: vmovdqu64 zword[rdi], zmm0
                lea     rdi, [rdi+$40]
                loop    .L.003
        .L.RET: mleave
                eleave
    ; </fold>

    method avt.lang.Array$fillByReal$long$int$real$, \
                dst, long, \
                cnt, int, \
                val, real  ; <fold >
                menter
                lverify dst, TAG_LONG
                lverify cnt, TAG_INT
                lverify val, TAG_REAL
                fld     tbyte[.val]
                mov     rdi, [.dst]
                movsxd  rcx, [.cnt]
        .L.000: fld     st0
                fstp    tbyte[rdi]
                lea     rdi, [rdi+$0a]
                loop    .L.000
                ffree   st0
                fincstp
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$fillByRef$long$int$avt.lang.Object$, \
                dst, long, \
                cnt, int, \
                val, avt.lang.Object  ; <fold >
                menter
                lverify dst, TAG_LONG
                lverify cnt, TAG_INT
                lverify val, TAG_OBJECT
                mov     rax, [.val]
                mov     rdi, [.dst]
                movsxd  rcx, [.cnt]
                test    rax, rax
                jz      @F
                lock add qword[rax+avt.lang.Object$fldRefCountFromObjects], rcx
        @@:     cld
        .L.000: mov     rdx, [rdi]
                test    rdx, rdx
                jz      @F
                lock dec qword[rdx+avt.lang.Object$fldRefCountFromObjects]
        @@:     stosq
                loop    .L.000
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyForwardByByte$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                cld
                rep movsb
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyForwardByShort$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                cld
                rep movsw
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyForwardByInt$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                cld
                rep movsd
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyForwardByLong$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                cld
                rep movsq
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyForwardByRef$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                cld
        .L.000: lodsq
                test    rax, rax
                jz      @F
                lock inc qword[rax+avt.lang.Object$fldRefCountFromObjects]
        @@:     mov     rdx, [rdi]
                test    rdx, rdx
                jz      @F
                lock dec qword[rdx+avt.lang.Object$fldRefCountFromObjects]
        @@:     stosq
                loop    .L.000
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyBackwardByByte$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                std
                rep movsb
                cld
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyBackwardByShort$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                std
                rep movsw
                cld
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyBackwardByInt$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                std
                rep movsd
                cld
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyBackwardByLong$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                std
                rep movsq
                cld
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$copyBackwardByRef$long$long$long$, \
                src, long, \
                dst, long, \
                cnt, long  ; <fold >
                menter
                lverify src, TAG_LONG
                lverify dst, TAG_LONG
                lverify cnt, TAG_LONG
                mov     rsi, [.src]
                mov     rdi, [.dst]
                mov     rcx, [.cnt]
                std
        .L.000: lodsq
                test    rax, rax
                jz      @F
                lock inc qword[rax+avt.lang.Object$fldRefCountFromObjects]
        @@:     mov     rdx, [rdi]
                test    rdx, rdx
                jz      @F
                lock dec qword[rdx+avt.lang.Object$fldRefCountFromObjects]
        @@:     stosq
                loop    .L.000
                cld
                mleave
                eleave
    ; </fold>

    method avt.lang.Array$getArrayPointer$avt.lang.array.Measureable$, \
                array, avt.lang.array.Measureable  ; returns long <fold >
                menter
                lverify array, TAG_OBJECT
                mov     r1, [.array]
                lea     r0, [r1+$40]
                add     r0, [r1+avt.lang.Object.01d$fldOffset]
                call    inst$lpush
                mleaveq
                eleave
    ; </fold>
; </fold>