read.array-component.inc

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

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

; <fold чтение компонентов массивов>
    macro fenter_rdac {
                    local       .L.0000
                    local       .L.0001
                    fenter
                    test        r08q, r08q
                    jnz         .L.0000
                    fthrow      NullPointerException
        .L.0000:    cmp         r02d, [r08+avt.lang.Array$fldLength]
                    jb          .L.0001
                    decrcoth    r08q
                    fthrow      ArrayIndexOutOfBoundsException
        .L.0001:    lea         r01q, [r08+$40]
                    add         r01q, [r01+avt.lang.Array$fldOffset-$40]
    }

    macro fleave_rdac {
                    decrcoth    r08q
                    fleave
    }

    if(used inst$rdacr) ; <fold returns avt.lang.Object>
                    fast        inst$rdacr
                    fenter_rdac
                    mov         qsc0, [r01+r02*8+$00]
                    tstincrcoth qsc0
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacc) ; <fold returns char>
                    fast        inst$rdacc
                    fenter_rdac
                    movzx       dsc0, word  [r01+r02*2+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdace) ; <fold returns real>
                    fast        inst$rdace
                    fenter_rdac
                    lea         r02q, [r02+r02*4+$00]
                    fld         tbyte [r01+r02*2+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacd) ; <fold returns double>
                    fast        inst$rdacd
                    fenter_rdac
                    vmovq       xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacd2) ; <fold returns double2>
                    fast        inst$rdacd2
                    fenter_rdac
                    lea         r02q, [r02+r02*1+$00]
                    vmovdqu     xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacd4) ; <fold returns double4>
                    fast        inst$rdacd4
                    fenter_rdac
                    lea         r02q, [$00+r02*4+$00]
                    vmovdqu     ymm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacd8) ; <fold returns double8>
                    fast        inst$rdacd8
                    fenter_rdac
                    lea         r02q, [$00+r02*8+$00]
                    vmovdqu64   zmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacf) ; <fold returns float>
                    fast        inst$rdacf
                    fenter_rdac
                    vmovd       xmm0, [r01+r02*4+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacf2) ; <fold returns float2>
                    fast        inst$rdacf2
                    fenter_rdac
                    vmovq       xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacf4) ; <fold returns float4>
                    fast        inst$rdacf4
                    fenter_rdac
                    lea         r02q, [r02+r02*1+$00]
                    vmovdqu     xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacf8) ; <fold returns float8>
                    fast        inst$rdacf8
                    fenter_rdac
                    lea         r02q, [$00+r02*4+$00]
                    vmovdqu     ymm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacb) ; <fold returns byte>
                    fast        inst$rdacb
                    fenter_rdac
                    movsx       dsc0, byte  [r01+r02*1+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacb2) ; <fold returns byte2>
                    fast        inst$rdacb2
                    fenter_rdac
                    movzx       dsc0, word  [r01+r02*2+$00]
                    vmovd       xmm0, dsc0
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacb4) ; <fold returns byte4>
                    fast        inst$rdacb4
                    fenter_rdac
                    vmovd       xmm0, [r01+r02*4+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacb8) ; <fold returns byte8>
                    fast        inst$rdacb8
                    fenter_rdac
                    vmovq       xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacs) ; <fold returns short>
                    fast        inst$rdacs
                    fenter_rdac
                    movsx       dsc0, word  [r01+r02*2+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacs2) ; <fold returns short2>
                    fast        inst$rdacs2
                    fenter_rdac
                    vmovd       xmm0, [r01+r02*4+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacs4) ; <fold returns short4>
                    fast        inst$rdacs4
                    fenter_rdac
                    vmovq       xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacs8) ; <fold returns short8>
                    fast        inst$rdacs8
                    fenter_rdac
                    lea         r02q, [r02+r02*1+$00]
                    vmovdqu     xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdaci) ; <fold returns int>
                    fast        inst$rdaci
                    fenter_rdac
                    mov         dsc0, [r01+r02*4+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdaci2) ; <fold returns int2>
                    fast        inst$rdaci2
                    fenter_rdac
                    vmovq       xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdaci4) ; <fold returns int4>
                    fast        inst$rdaci4
                    fenter_rdac
                    lea         r02q, [r02+r02*1+$00]
                    vmovdqu     xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdaci8) ; <fold returns int8>
                    fast        inst$rdaci8
                    fenter_rdac
                    lea         r02q, [$00+r02*4+$00]
                    vmovdqu     ymm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacl) ; <fold returns long>
                    fast        inst$rdacl
                    fenter_rdac
                    mov         qsc0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacl2) ; <fold returns long2>
                    fast        inst$rdacl2
                    fenter_rdac
                    lea         r02q, [r02+r02*1+$00]
                    vmovdqu     xmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacl4) ; <fold returns long4>
                    fast        inst$rdacl4
                    fenter_rdac
                    lea         r02q, [$00+r02*4+$00]
                    vmovdqu     ymm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>

    if(used inst$rdacl8) ; <fold returns long8>
                    fast        inst$rdacl8
                    fenter_rdac
                    lea         r02q, [$00+r02*8+$00]
                    vmovdqu64   zmm0, [r01+r02*8+$00]
                    fleave_rdac
    end if ; </fold>
; </fold>