instruction.reference.inc

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

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

; <fold push/pop/peek>
    if(used inst$rpush) ; <fold >
        inst rpush ; (value in rax)
                    push1
                    test    rax, rax
                    jz      @F
                    lock inc qword[rax+avt.lang.Object$fldRefCountFromOthers]
            @@:     mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_OBJECT
        end_inst
    end if ; </fold>

    if(used inst$rpushnull) ; <fold >
        inst rpushnull
                    push1
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], null ; $00
                    set     TAG_OBJECT
        end_inst
    end if ; </fold>

    if(used inst$rpop) ; <fold >
        inst rpop ; (): value in rax
                    overify TAG_OBJECT
                    mov     rax, [rsp]
                    pop1set
        end_inst
    end if ; </fold>
; </fold>

; <fold pull>
    if(used inst$rpull1) ; <fold >
        inst rpull1 ; (instance in rax)
                    push1
                    test    rax, rax
                    jz      @F
                    lock inc qword[rax+avt.lang.Object$fldRefCountFromOthers]
            @@:     mov     ch, TAG_OBJECT
                    mov     cl, [rsi+$01]
                    mov     rdx, [rsp+$10]
                    mov     qword[rsp+$18], $00
                    mov     qword[rsp+$10], rax
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rdx
                    mov     word[rsi], cx
        end_inst
    end if ; </fold>
; </fold>

; <fold throw>
    if(used inst$rthrow) ; <fold >
        inst rthrow
                    overify TAG_OBJECT
                    mov     rax, [rsp]
                    test    rax, rax
                    jnz     @F
                    throw   NullPointerException
            @@:     pop1set
                    mov     rcx, [rbx+context$irp]
                    jmp     qword[rbx+context$ehp]
    end if ; </fold>
; </fold>

; <fold relation>
    if(used inst$re) ; <fold >
        inst re
                    overify TAG_OBJECT, TAG_OBJECT
                    mov     rcx, [rsp+$10]
                    mov     rdx, [rsp+$00]
                    cmp     rcx, rdx
                    sete    al
                    movzx   rax, al
                    test    rcx, rcx
                    jz      @F
                    lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
            @@:     test    rdx, rdx
                    jz      @F
                    lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
            @@:     mov     qword[rsp+$10], rax
                    pop1set TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$rne) ; <fold >
        inst rne
                    overify TAG_OBJECT, TAG_OBJECT
                    mov     rcx, [rsp+$10]
                    mov     rdx, [rsp+$00]
                    cmp     rcx, rdx
                    setne   al
                    movzx   rax, al
                    test    rcx, rcx
                    jz      @F
                    lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
            @@:     test    rdx, rdx
                    jz      @F
                    lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
            @@:     mov     qword[rsp+$10], rax
                    pop1set TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$risnull) ; <fold >
        inst risnull
                    overify TAG_OBJECT
                    mov     rcx, [rsp]
                    test    rcx, rcx
                    setz    al
                    jz      @F
                    lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
            @@:     movzx   rax, al
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$risnotnull) ; <fold >
        inst risnotnull
                    overify TAG_OBJECT
                    mov     rcx, [rsp]
                    test    rcx, rcx
                    setnz   al
                    jz      @F
                    lock dec qword[rcx+avt.lang.Object$fldRefCountFromOthers]
            @@:     movzx   rax, al
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        end_inst
    end if ; </fold>
; </fold>