!inst.inc

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

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

; <fold макросы инструкций высокого уровня>
    ; <fold местные макросы — должны использоваться макросами инструкций высокого уровня и макросами в подпапках папки !macro>
        macro __structp rs0q*, rs1q* {
                        lea         rs0q, [rs1q+$40]
                        add         rs0q, [rs0q+avt.lang.Struct$fldOffset-$40]
        }

        macro __push dataElements* {
                        lea         rsp,  [rsp-(dataElements)*$10]
                        lea         rsi,  [rsi-(dataElements)*$01]
        }

        macro __pop dataElements* {
                        lea         rsi,  [rsi+(dataElements)*$01]
                        lea         rsp,  [rsp+(dataElements)*$10]
        }

        macro __sttag_x ofs*, tag* {
                        mov         byte  [rsi+ofs], tag
        }

        macro __sttag_y ofs*, tag* {
                        mov         word  [rsi+ofs], tag
        }

        macro __sttag_z ofs*, tag* {
                        mov         dword [rsi+ofs], tag
        }

        macro __cltag_x ofs* {
                        mov         byte  [rsi+ofs], TAG_EMPTY
        }

        macro __cltag_y ofs* {
                        mov         word  [rsi+ofs], TAG_EMPTY
        }

        macro __cltag_z ofs* {
                        mov         dword [rsi+ofs], TAG_EMPTY
        }

        macro __saturb {
                        local       .L.0000
                        local       .L.0001
                        cmp         dsc0, -$80
                        jge         .L.0000
                        mov         dsc0, -$80
                        jmp         .L.0001
            .L.0000:    cmp         dsc0, $7f
                        jle         .L.0001
                        mov         dsc0, $7f
            .L.0001:
        }

        macro __saturs {
                        local       .L.0000
                        local       .L.0001
                        cmp         dsc0, -$8000
                        jge         .L.0000
                        mov         dsc0, -$8000
                        jmp         .L.0001
            .L.0000:    cmp         dsc0, $7fff
                        jle         .L.0001
                        mov         dsc0, $7fff
            .L.0001:
        }

        macro __saturub defaultValue* {
                        local       .L.0000
                        cmp         dsc0, $ff
                        jbe         .L.0000
                        mov         dsc0, defaultValue
            .L.0000:    movsx       dsc0, bsc0
        }

        macro __saturus defaultValue* {
                        local       .L.0000
                        cmp         dsc0, $ffff
                        jbe         .L.0000
                        mov         dsc0, defaultValue
            .L.0000:    movsx       dsc0, wsc0
        }
    ; </fold>

    ; <fold приватные макросы — должны использоваться только макросами инструкций высокого уровня>
        macro _throw exceptionType* {
                        local       .L.0000
                        lea         r00q, [avt.lang.#exceptionType#$create$long$]
                        lea         r01q, [.L.0000]
                        jmp         inst$throw
            .L.0000:
        }

        macro _chknull rs0q* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jnz         .L.0000
                        _throw      NullPointerException
            .L.0000:
        }

        macro _chknullr rs0q* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jnz         .L.0000
                        releaser
                        _throw      NullPointerException
            .L.0000:
        }

        macro _chknulle rs0q* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jnz         .L.0000
                        releasee
                        _throw      NullPointerException
            .L.0000:
        }

        macro _loadw_l rs0q*, localvarName* {
                        mov         rs0q, [.#localvarName]
            if(~("this" eq `localvarName))
                            _chknull    rs0q
            end if
        }

        macro _wrstb {
                        mov         qword [rsp+$08], $00
                        mov         qword [rsp+$00], qsc0
        }

        macro _setcmpg {
                        local       .L.0000
                        jnp         .L.0000
                        mov         bsc0, $ff
                        cmp         bsc0, $00
            .L.0000:
        }

        macro _setcmpl {
                        local       .L.0000
                        jnp         .L.0000
                        mov         bsc0, $00
                        cmp         bsc0, $ff
            .L.0000:
        }
    ; </fold>

    ; <fold сохранение и восстановление дополнений к rsp/esp и rbp/ebp>
        macro savetsp {
                        mov         qword [rbx+ctxt$tsp], rsi
        }

        macro savetbp {
                        mov         qword [rbx+ctxt$tbp], rdi
        }

        macro savetp {
                        savetsp
                        savetbp
        }

        macro rstortsp {
                        mov         rsi,  [rbx+ctxt$tsp]
        }

        macro rstortbp {
                        mov         rdi,  [rbx+ctxt$tbp]
        }

        macro rstortp {
                        rstortsp
                        rstortbp
        }
    ; </fold>

    ; <fold манипуляции счётчиками ссылок на объекты>
        macro incrcoth rs0q* {
                        lock inc    qword [rs0q+avt.lang.Object$fldRefCountFromOthers]
        }

        macro decrcoth rs0q* {
                        lock dec    qword [rs0q+avt.lang.Object$fldRefCountFromOthers]
        }

        macro addrcoth rs0q*, delta* {
                        lock add    qword [rs0q+avt.lang.Object$fldRefCountFromOthers], delta
        }

        macro subrcoth rs0q*, delta* {
                        lock sub    qword [rs0q+avt.lang.Object$fldRefCountFromOthers], delta
        }

        macro incrcobj rs0q* {
                        lock inc    qword [rs0q+avt.lang.Object$fldRefCountFromObjects]
        }

        macro decrcobj rs0q* {
                        lock dec    qword [rs0q+avt.lang.Object$fldRefCountFromObjects]
        }

        macro addrcobj rs0q*, delta* {
                        lock add    qword [rs0q+avt.lang.Object$fldRefCountFromObjects], delta
        }

        macro subrcobj rs0q*, delta* {
                        lock sub    qword [rs0q+avt.lang.Object$fldRefCountFromObjects], delta
        }

        macro tstincrcoth rs0q* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jz          .L.0000
                        incrcoth    rs0q
            .L.0000:
        }

        macro tstdecrcoth rs0q* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jz          .L.0000
                        decrcoth    rs0q
            .L.0000:
        }

        macro tstaddrcoth rs0q*, delta* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jz          .L.0000
                        addrcoth    rs0q, delta
            .L.0000:
        }

        macro tstsubrcoth rs0q*, delta* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jz          .L.0000
                        subrcoth    rs0q, delta
            .L.0000:
        }

        macro tstincrcobj rs0q* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jz          .L.0000
                        incrcobj    rs0q
            .L.0000:
        }

        macro tstdecrcobj rs0q* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jz          .L.0000
                        decrcobj    rs0q
            .L.0000:
        }

        macro tstaddrcobj rs0q*, delta* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jz          .L.0000
                        addrcobj    rs0q, delta
            .L.0000:
        }

        macro tstsubrcobj rs0q*, delta* {
                        local       .L.0000
                        test        rs0q, rs0q
                        jz          .L.0000
                        subrcobj    rs0q, delta
            .L.0000:
        }
    ; </fold>

    ; <fold тексты исходного кода макросов инструкций высокого уровня>
                    include     "fast/!main.inc"
                    include     "invoke.inc"
                    include     "exception.inc"
                    include     "tagged-stack.inc"
                    include     "switch.inc"
                    include     "read.variable.inc"
                    include     "read.struct-field.inc"
                    include     "read.instance-field.inc"
                    include     "read.vector-element.inc"
                    include     "read.array-component.inc"
                    include     "write.variable.inc"
                    include     "write.struct-field.inc"
                    include     "write.instance-field.inc"
                    include     "write.array-component.inc"
                    include     "increment-decrement.inc"
                    include     "declare.inc"
                    include     "reference.chktype.inc"
                    include     "reference.compare.inc"
                    include     "cast.real.inc"
                    include     "cast.double.inc"
                    include     "cast.float.inc"
                    include     "cast.byte.inc"
                    include     "cast.short.inc"
                    include     "cast.int.inc"
                    include     "cast.long.inc"
                    include     "jump.boolean.inc"
                    include     "bit.not.inc"
                    include     "bit.or.inc"
                    include     "bit.and.inc"
                    include     "bit.xor.inc"
                    include     "bit.test.inc"
                    include     "scalar.neg.inc"
                    include     "scalar.mul.inc"
                    include     "scalar.div.inc"
                    include     "scalar.divu.inc"
                    include     "scalar.rem.inc"
                    include     "scalar.remu.inc"
                    include     "scalar.add.inc"
                    include     "scalar.sub.inc"
                    include     "scalar.shr.inc"
                    include     "scalar.shru.inc"
                    include     "scalar.shl.inc"
                    include     "scalar.gt.inc"
                    include     "scalar.ge.inc"
                    include     "scalar.lt.inc"
                    include     "scalar.le.inc"
                    include     "scalar.eq.inc"
                    include     "scalar.ne.inc"
                    include     "vector.new.inc"
                    include     "vector.lup.inc"
                    include     "vector.uup.inc"
                    include     "vector.pck.inc"
                    include     "vector.neg.inc"
                    include     "vector.mul.inc"
                    include     "vector.div.inc"
                    include     "vector.add.inc"
                    include     "vector.sub.inc"
                    include     "vector.shr.inc"
                    include     "vector.shru.inc"
                    include     "vector.shl.inc"
                    include     "vector.gt.inc"
                    include     "vector.ge.inc"
                    include     "vector.lt.inc"
                    include     "vector.le.inc"
                    include     "vector.eq.inc"
                    include     "vector.ne.inc"
                    include     "vector.hmul.inc"
                    include     "vector.hmulu.inc"
                    include     "vector.sadd.inc"
                    include     "vector.saddu.inc"
                    include     "vector.ssub.inc"
                    include     "vector.ssubu.inc"
    ; </fold>
; </fold>