instruction.real.inc

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

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

; <fold push/pop/peek>
    if(used inst$xpush) ; <fold >
        inst xpush ; (value in st0)
                    push1
                    mov     qword[rsp+$08], $00
                    fstp    tbyte[rsp+$00]
                    set     TAG_REAL
        end_inst
    end if ; </fold>

    if(used inst$xpop) ; <fold >
        inst xpop ; (): value in st0
                    overify TAG_REAL
                    fld     tbyte[rsp]
                    pop1set
        end_inst
    end if ; </fold>
; </fold>

; <fold conversion>
    if(used inst$xtoi) ; <fold >
        inst xtoi
                    overify TAG_REAL
                    fld     tbyte[rsp]
                    ficom   dword[i.00] ; $7fffffff
                    fnstsw  ax
                    shr     ax, $08
                    pushfq
                    mov     byte[rsp], al
                    popfq
                    jnp     @F
                    ffree   st0
                    fincstp
                    xor     eax, eax
                    jmp     .L.RET
            @@:     jbe     @F
                    ffree   st0
                    fincstp
                    mov     eax, $7fffffff
                    jmp     .L.RET
            @@:     fisttp  dword[rsp]
                    mov     eax, [rsp]
            .L.RET: mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$xtol) ; <fold >
        inst xtol
                    overify TAG_REAL
                    fld     tbyte[rsp]
                    fild    qword[l.02] ; $7fffffffffffffff
                    fcomp
                    fnstsw  ax
                    shr     ax, $08
                    pushfq
                    mov     byte[rsp], al
                    popfq
                    jnp     @F
                    ffree   st0
                    fincstp
                    xor     rax, rax
                    jmp     .L.RET
            @@:     ja      @F
                    ffree   st0
                    fincstp
                    mov     rax, [l.02] ; $7fffffffffffffff
                    jmp     .L.RET
            @@:     fisttp  qword[rsp]
                    mov     rax, [rsp]
            .L.RET: mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_LONG
        end_inst
    end if ; </fold>

    if(used inst$xtof) ; <fold >
        inst xtof
                    overify TAG_REAL
                    fld     tbyte[rsp]
                    mov     qword[rsp+$08], $00
                    mov     dword[rsp+$04], $00
                    fstp    dword[rsp+$00]
                    set     TAG_FLOAT
        end_inst
    end if ; </fold>

    if(used inst$xtod) ; <fold >
        inst xtod
                    overify TAG_REAL
                    fld     tbyte[rsp]
                    mov     qword[rsp+$08], $00
                    fstp    qword[rsp+$00]
                    set     TAG_DOUBLE
        end_inst
    end if ; </fold>
; </fold>

; <fold relation>
    if(used inst$xcmpg) ; <fold >
        inst xcmpg
                    overify TAG_REAL, TAG_REAL
                    fld     tbyte[rsp+$00]
                    fld     tbyte[rsp+$10]
                    fcomip  st0, st1
                    ffree   st0
                    fincstp
                    jp      .G
                    jc      .L
                    jz      .E
            .G:     mov     eax, $01
                    jmp     @F
            .L:     mov     eax, -$01
                    jmp     @F
            .E:     xor     eax, eax
            @@:     mov     qword[rsp+$18], $00
                    mov     qword[rsp+$10], rax
                    pop1set TAG_INT
        end_inst
    end if ; </fold>

    if(used inst$xcmpl) ; <fold >
        inst xcmpl
                    overify TAG_REAL, TAG_REAL
                    fld     tbyte[rsp+$00]
                    fld     tbyte[rsp+$10]
                    fcomip  st0, st1
                    ffree   st0
                    fincstp
                    jp      .L
                    jc      .L
                    jz      .E
                    mov     eax, $01
                    jmp     @F
            .L:     mov     eax, -$01
                    jmp     @F
            .E:     xor     eax, eax
            @@:     mov     qword[rsp+$18], $00
                    mov     qword[rsp+$10], rax
                    pop1set TAG_INT
        end_inst
    end if ; </fold>
; </fold>

; <fold scalar>
    if(used inst$xsneg) ; <fold >
        inst xsneg
                    overify TAG_REAL
                    fld     tbyte[rsp]
                    fchs
                    fstp    tbyte[rsp]
        end_inst
    end if ; </fold>

    if(used inst$xsmul) ; <fold >
        inst xsmul
                    overify TAG_REAL, TAG_REAL
                    fld     tbyte[rsp+$10]
                    fld     tbyte[rsp+$00]
                    fmulp   st1, st0
                    fstp    tbyte[rsp+$10]
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$xsdiv | used inst$xsdivu) ; <fold >
        inst xsdiv, xsdivu
                    overify TAG_REAL, TAG_REAL
                    fld     tbyte[rsp+$10]
                    fld     tbyte[rsp+$00]
                    fdivp   st1, st0
                    fstp    tbyte[rsp+$10]
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$xsrem | used inst$xsremu) ; <fold >
        inst xsrem, xsremu
                    overify TAG_REAL, TAG_REAL
                    fld     tbyte[rsp+$00]
                    fld     tbyte[rsp+$10]
            @@:     fprem
                    fnstsw  ax
                    test    ax, $0400
                    jnz     @B
                    fstp    st1
                    fstp    tbyte[rsp+$10]
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$xsadd) ; <fold >
        inst xsadd
                    overify TAG_REAL, TAG_REAL
                    fld     tbyte[rsp+$10]
                    fld     tbyte[rsp+$00]
                    faddp   st1, st0
                    fstp    tbyte[rsp+$10]
                    pop1set
        end_inst
    end if ; </fold>

    if(used inst$xssub) ; <fold >
        inst xssub
                    overify TAG_REAL, TAG_REAL
                    fld     tbyte[rsp+$10]
                    fld     tbyte[rsp+$00]
                    fsubp   st1, st0
                    fstp    tbyte[rsp+$10]
                    pop1set
        end_inst
    end if ; </fold>
; </fold>