write.array-component.inc

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

;
  ; Реализация среды исполнения языка программирования
  ; Объектно-ориентированный продвинутый векторный транслятор
  ;
  ; 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>