macro.inc

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

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

; <fold definitions>
    ; <fold support of numbered names of x86-64 registers>
                r0 equ rax
                r1 equ rcx
                r2 equ rdx
                r6 equ rsi
                r7 equ rdi
                r0d equ eax
                r1d equ ecx
                r2d equ edx
                r6d equ esi
                r7d equ edi
                r0w equ ax
                r1w equ cx
                r2w equ dx
                r6w equ si
                r7w equ di
                r0b equ al
                r1b equ cl
                r2b equ dl
                r6b equ sil
                r7b equ dil
                r0l equ al
                r1l equ cl
                r2l equ dl
                r6l equ sil
                r7l equ dil
    ; </fold>

    ; <fold language constants>
                null = 0
                true = 1
                false = 0
    ; </fold>

    ; <fold stack tags>
                TAG_EMPTY    =       $00
                TAG_INT      =       $01
                TAG_INT2     =       $12
                TAG_INT4     =       $14
                TAG_INT8     =     $1918
                TAG_LONG     =       $02
                TAG_LONG2    =       $22
                TAG_LONG4    =     $2524
                TAG_LONG8    = $2b2a2928
                TAG_FLOAT    =       $0f
                TAG_FLOAT2   =       $f2
                TAG_FLOAT4   =       $f4
                TAG_FLOAT8   =     $f9f8
                TAG_DOUBLE   =       $0d
                TAG_DOUBLE2  =       $d2
                TAG_DOUBLE4  =     $d5d4
                TAG_DOUBLE8  = $dbdad9d8
                TAG_BYTE2    =       $b2
                TAG_BYTE4    =       $b4
                TAG_BYTE8    =       $b8
                TAG_SHORT2   =       $52
                TAG_SHORT4   =       $54
                TAG_SHORT8   =       $58
                TAG_REAL     =       $07
                TAG_SUPPRESS =       $99
                TAG_OBJECT   =       $88
                TAG_FLEAVE   =       $ef
                TAG_MLEAVE   =     $cfca
                TAG_ILEAVE   = $afaeacaa
    ; </fold>

    ; <fold stack context field offsets>
                ; Тагированный стак вызовов имеет четыре области:
                ; 1. Область данных. Является массивом из 16-байтных элементов данных. Некоторые векторные типы (их всего 6: int8, long4, long8, float8, double4, double8) занимают 2 или 4 таких элемента.
                ; 2. Охранная область. Занимает определённое количество 16-байтных элементов на вершине (в начале) области данных, но не более 256 (4 КБ). При попытке записи данных в эту область возбуждается ошибка StackOverflowError.
                ; 3. Область тагов. Следует за областью данных и является массивом из 1-байтных тагов. Количество тагов равно количеству элементов данных, поэтому размер области тагов составляет 1/16 от размера области данных.
                ;    Каждому элементу данных соответствует свой таг, определяющий тип данных этого элемента.
                ; 4. Область контекста. Следует за областью тагов и является дополнением к регистрам процессора. На эту область всегда ссылается регистр rbx в 64-битных программах, или ebx — в 32-битных.
                ;    Эта область имеет размер 4 КБ и состоит из 64-битных полей:
                context$zero                         = $0000 ; always 0                                                   ; всегда равно нулю
                context$guardEnd                     = $0008 ; stack guard block end pointer                              ; указатель на конец охранной области
                context$dataPointer                  = $0010 ; stack data begin pointer (stack guard block begin pointer) ; указатель на начало области данных, он же – указатель на начало охранной области
                context$dataLength                   = $0018 ; stack data size, in bytes                                  ; размер области данных
                context$tagsPointer                  = $0020 ; stack tags begin pointer (stack data end pointer)          ; указатель на начало области тагов, он же — указатель на конец области данных
                context$ehp                          = $0028 ; exception handler pointer                                  ; указатель на обработчик исключений
                context$tsp                          = $0030 ; tags stack pointer                                         ; tsp — дополнение к rsp/esp, но ссылается на таг, а не на элемент данных
                context$tbp                          = $0038 ; tags block pointer                                         ; tbp — дополнение к rbp/ebp, но ссылается на таг, а не на элемент данных
                context$irp                          = $0040 ; instruction return pointer                                 ; указатель для возврата управления из процедуры-инструкции
                context$srp                          = $0048 ; subject return pointer                                     ; указатель для возврата управления из процедуры-субъекта
                context$temp0                        = $0050 ; instruction temporary data                                 ; временные данные процедур-инструкций
                context$temp1                        = $0058 ; instruction temporary data                                 ; временные данные процедур-инструкций
                context$temp2                        = $0060 ; instruction temporary data                                 ; временные данные процедур-инструкций
                context$temp3                        = $0068 ; instruction temporary data                                 ; временные данные процедур-инструкций
                context$suppressedInstancePointer    = $0070 ; suppressed exception instance pointer                      ; указатель на инстанцию подавленного исключения
                context$suppressedInstructionPointer = $0078 ; suppressed exception instruction pointer                   ; указатель на инструкцию, возбудившую подавленное исключение
                ; Остальное место зарезервировано и может быть использовано для хранения значений регистров процессора в функциях обратного вызова (каллбаках, от слова callback).
    ; </fold>
; </fold>

; <fold common macroinstructions>
    ; <fold code>
        macro proc procedureFullName* {
                    calign  $04
            procedureFullName:
        }

        macro end_proc {  }

        macro subj subjectFullName* {
                    calign  $04
            subj$#subjectFullName:
                    pop     qword[rbx+context$srp]
        }

        macro end_subj {
                    jmp     qword[rbx+context$srp]
        }

        macro inst [instructionFullName] {
            common
                        calign  $04
            forward
                inst$#instructionFullName:
            common
                        pop     qword[rbx+context$irp]
        }

        macro end_inst {
                    jmp     qword[rbx+context$irp]
        }

        macro method methodFullName*, [argumentName, argumentType] {
            common
                        calign $04
                methodFullName: 
                        local   .argsize
                        local   .tagsize
                        .argsize = $00
                        .tagsize = $00
            reverse
                if(~(argumentName eq) & ~(argumentType eq))
                            label   .#argumentName at rbp+.argsize+$20
                            label   .#argumentName#.tag at rdi+.tagsize+$02
                    if(argumentType in <long8, double8>)
                                .argsize = .argsize+$40
                                .tagsize = .tagsize+$04
                    else if(argumentType in <int8, long4, float8, double4>)
                                .argsize = .argsize+$20
                                .tagsize = .tagsize+$02
                    else
                                .argsize = .argsize+$10
                                .tagsize = .tagsize+$01
                    end if
                end if
            common
                        .size.arg = .argsize
                        .size.loc = $00
                        .tag.arg = .tagsize
                        .tag.loc = $00
        }

        macro loc localvarName*, localvarType* {
            if(localvarType in <long8, double8>)
                        .size.loc = .size.loc+$40
                        .tag.loc = .tag.loc+$04
            else if(localvarType in <int8, long4, float8, double4>)
                        .size.loc = .size.loc+$20
                        .tag.loc = .tag.loc+$02
            else
                        .size.loc = .size.loc+$10
                        .tag.loc = .tag.loc+$01
            end if
                    label   .#localvarName at rbp-.size.loc
                    label   .#localvarName#.tag at rdi-.tag.loc
        }

        macro impl classFullName*, serviceFullName* {
                    calign  $04
            classFullName#$$impl$$#serviceFullName:
        }
    ; </fold>

    ; <fold debug info>
        macro dbinfob compilerNameAndVersion* {
            ; базовая отладочная информация: только данные для построения трассировки стака
            @@:     db      "DBB", $00
                    dd      -@B+@F
                    db      compilerNameAndVersion, $00
                    dalign  $08
            @@:     dd      debuginfo$string-@B
                    dd      debuginfo$string.end-debuginfo$string
                    dd      debuginfo$source-@B
                    dd      debuginfo$source.end-debuginfo$source
                    dd      debuginfo$entry-@B
                    dd      debuginfo$entry.end-debuginfo$entry
        }

        ; macro dbinfof compilerNameAndVersion* {
        ;     ; полная отладочная информация: данные для построения трассировки стака + данные обо всех элементах программы
        ;     ; на данный момент не реализована, поскольку нет отладчиков, которые могли бы её использовать
        ;     @@:     db      "DBF", $00
        ;             dd      -@B+@F
        ;             db      compilerNameAndVersion, $00
        ;             dalign  $08
        ;     @@:     dd      debuginfo$string-@B
        ;             dd      debuginfo$string.end-debuginfo$string
        ;             dd      debuginfo$source-@B
        ;             dd      debuginfo$source.end-debuginfo$source
        ;             dd      debuginfo$entry-@B
        ;             dd      debuginfo$entry.end-debuginfo$entry
        ;             dd      debuginfo$package-@B
        ;             dd      debuginfo$package.end-debuginfo$package
        ;             dd      debuginfo$class-@B
        ;             dd      debuginfo$class.end-debuginfo$class
        ;             dd      debuginfo$const-@B
        ;             dd      debuginfo$const.end-debuginfo$const
        ;             dd      debuginfo$globro-@B
        ;             dd      debuginfo$globro.end-debuginfo$globro
        ;             dd      debuginfo$globrw-@B
        ;             dd      debuginfo$globrw.end-debuginfo$globrw
        ;             dd      debuginfo$field-@B
        ;             dd      debuginfo$field.end-debuginfo$field
        ;             dd      debuginfo$property-@B
        ;             dd      debuginfo$property.end-debuginfo$property
        ;             dd      debuginfo$method-@B
        ;             dd      debuginfo$method.end-debuginfo$method
        ;             dd      debuginfo$loc-@B
        ;             dd      debuginfo$loc.end-debuginfo$loc
        ; }

        macro dstr name* {
            if(used .#name)
                .#name:
                        db      `name, $00
            end if
        }

        macro dstrs name* {
            if(used .$#name#$)
                .$#name#$:
                        db      '<', `name, '>', $00
            end if
        }

        macro dsrc sourceName*, [nameChar] {
            common
                if(used .#sourceName)
                    .#sourceName:
                end if
            forward
                if(used .#sourceName & ~(nameChar eq))
                            dw      nameChar
                end if
            common
                if(used .#sourceName)
                            dw      $0000
                end if
        }

        macro dent blockBegin*, blockEnd*, sourceName*, lineNumber*, className*, methodName* {
            if(blockEnd > blockBegin)
                @@:     dd      -@B+blockBegin
                        dd      blockEnd-blockBegin
                        dd      -@B+debuginfo$source.#sourceName
                        dd      lineNumber
                        dd      -@B+className
                        dd      -@B+debuginfo$string.#methodName
                        dd      $00000000 ; зарезервировано
                        dd      $00000000 ; зарезервировано
            end if
        }

        macro dents blockBegin*, blockEnd*, sourceName*, lineNumber*, className*, methodName* {
            if(blockEnd > blockBegin)
                @@:     dd      -@B+blockBegin
                        dd      blockEnd-blockBegin
                        dd      -@B+debuginfo$source.#sourceName
                        dd      lineNumber
                        dd      -@B+className
                        dd      -@B+debuginfo$string.$#methodName#$
                        dd      $00000000 ; зарезервировано
                        dd      $00000000 ; зарезервировано
            end if
        }
    ; </fold>

    ; <fold resources>
        macro avtresource resourceName*, fileName* {
                    local   nameBegin
                    local   nameEnd
                    local   resBegin
                    local   resEnd
                    dalign  $10
                    dw      nameEnd-nameBegin
            nameBegin:
                    db      resourceName
            nameEnd:
                    dalign  $04
                    dd      resEnd-resBegin
            resBegin:
                    file    fileName
            resEnd:
        }

        macro endresource {
                    dalign  $10
                    dw      $0000
        }
    ; </fold>

    ; <fold data>
        macro package packageFullName* {
                    dalign  $10
            packageFullName:
            .package:
                    dq      $0000000000000000, $0000000000000000, avt.lang.Package-.package, $0000000000000000
        }

        macro class classFullName* {
                    dalign  $10
            classFullName:
            .class: dq      $0000000000000000, $0000000000000000, avt.lang.Class-.class, $0000000000000000
        }

        macro glob globalvarFullName* {
                    dalign  $10
            globalvarFullName:
        }

        macro field offset*, fieldFullName* {
                    fieldFullName = offset
        }
    ; </fold>

    ; <fold auxiliary>
        macro calign a* {
                    nopvar  (-$) and (a-1)
        }

        macro dalign a* {
            repeat((-$) and (a-1))
                        db      $00
            end repeat
        }

        macro nopvar length* {
                    local   .rem
                    .rem = length
            while(.rem > 0)
                if(.rem = 1)
                            db      $90
                    break
                else if(.rem = 2)
                            db      $66, $90
                    break
                else if(.rem = 3)
                            db      $0f, $1f, $00
                    break
                else if(.rem = 4)
                            db      $0f, $1f, $40, $00
                    break
                else if(.rem = 5)
                            db      $0f, $1f, $44, $00, $00
                    break
                else if(.rem = 6)
                            db      $66, $0f, $1f, $44, $00, $00
                    break
                else if(.rem = 7)
                            db      $0f, $1f, $80, $00, $00, $00, $00
                    break
                else if(.rem = 8)
                            db      $0f, $1f, $84, $00, $00, $00, $00, $00
                    break
                else
                            db      $66, $0f, $1f, $84, $00, $00, $00, $00, $00
                            .rem = .rem-9
                end if
            end while
        }
    ; </fold>
; </fold>

; <fold high-level instructions>
    ; <fold normal method>
        macro menter {
                    lea     rcx, [.L.EHP]
                    call    inst$methodenter
            if(.size.loc > 0)
                        mov     ecx, .size.loc
                        call    inst$stackrealize
            end if
        }

        macro mreturn {
            if(.size.arg > 0)
                        ret     .size.arg
            else
                        ret
            end if
                    calign  $04
            .L.EHP:
        }

        macro mleave {
                    lea     rcx, [rbp+.size.arg+$20]
                    call    inst$methodleave
                    mreturn
        }

        macro mleaved {
                    lea     rcx, [rbp+.size.arg+$20]
                    call    inst$methodleaved
                    mreturn
        }

        macro mleaveq {
                    lea     rcx, [rbp+.size.arg+$20]
                    call    inst$methodleaveq
                    mreturn
        }

        macro mleavet {
                    lea     rcx, [rbp+.size.arg+$20]
                    call    inst$methodleavet
                    mreturn
        }

        macro mleavex {
                    lea     rcx, [rbp+.size.arg+$20]
                    call    inst$methodleavex
                    mreturn
        }

        macro mleavey {
                    lea     rcx, [rbp+.size.arg+$20]
                    call    inst$methodleavey
                    mreturn
        }

        macro mleavez {
                    lea     rcx, [rbp+.size.arg+$20]
                    call    inst$methodleavez
                    mreturn
        }

        macro mleaver {
                    lea     rcx, [rbp+.size.arg+$20]
                    call    inst$methodleaver
                    mreturn
        }

        macro mempty {
            .D.END:
        }
    ; </fold>

    ; <fold interrupt method>
        macro ienter {
                    ; должно быть реализовано в будущем
        }

        macro ileave {
                    ; должно быть реализовано в будущем
                    iretq
                    calign  $04
            .L.EHP:
        }
    ; </fold>

    ; <fold finally block>
        macro fenter {
                    call    inst$finallyenter
        }

        macro fleave {
                    call    inst$finallyleave
                    ret
        }
    ; </fold>

    ; <fold static block>
        macro statictrylock classFullName* {
                    .class = classFullName
                    rloadclass .class
                    invokespeciald avt.lang.Class$clinitTryLock$
        }

        macro staticunlock {
                    rloadclass .class
                    invokespecial avt.lang.Class$clinitUnlock$
        }
    ; </fold>

    ; <fold i*switch>
        macro ilookupswitch defaultLabel*, [caseValue, caseLabel] {
            common
                        call    inst$ipop
            forward
                if(~(caseValue eq) & ~(caseLabel eq))
                            cmp     eax, caseValue
                            je      caseLabel
                end if
            common
                        jmp     defaultLabel
        }

        macro itableswitch defaultLabel*, caseValue*, [caseLabel] {
            common
                        local   .L.000
                        local   .count
                        .count = 0
            forward
                if(~(caseLabel eq))
                            .count = .count + 1
                end if
            common
                        call    inst$ipop
                        sub     eax, caseValue
                        jl      defaultLabel
                        cmp     eax, .count
                        jge     defaultLabel
                        lea     rcx, [.L.000]
                        movsxd  rdx, [rcx+rax*4]
                        lea     rcx, [rcx+rdx*1]
                        jmp     rcx
                        calign  $04
                .L.000:
            forward
                if(~(caseLabel eq))
                            dd      caseLabel-.L.000
                end if
            common
                        dq      $cccccccccccccccc, $cccccccccccccccc
        }
    ; </fold>

    ; <fold *load*>
        macro bloadf {
                    bload   false
        }

        macro bloadt {
                    bload   true
        }

        macro rloadnull {
                    call    inst$rpushnull
        }

        macro rloadclass classFullName* {
                    lea     rax, [classFullName]
                    call    inst$rpush
        }

        macro rloadstring stringIndex* {
                    iload   stringIndex
                    invokestaticr avt.lang.String$getConstant$int$
        }
    ; </fold>

    ; <fold *load>
        macro iload operand* {
                    mov     eax, operand
                    call    inst$ipush
        }

        macro i2load operand* {
                    vmovq   xmm0, operand
                    call    inst$i2push
        }

        macro i4load operand* {
                    vmovdqa xmm0, operand
                    call    inst$i4push
        }

        macro i8load operand* {
                    vmovdqu ymm0, operand
                    call    inst$i8push
        }

        macro lload operand* {
                    mov     rax, operand
                    call    inst$lpush
        }

        macro l2load operand* {
                    vmovdqa xmm0, operand
                    call    inst$l2push
        }

        macro l4load operand* {
                    vmovdqu ymm0, operand
                    call    inst$l4push
        }

        macro l8load operand* {
                    vmovdqu64 zmm0, operand
                    call    inst$l8push
        }

        macro fload operand* {
                    vmovd   xmm0, operand
                    call    inst$fpush
        }

        macro f2load operand* {
                    vmovq   xmm0, operand
                    call    inst$f2push
        }

        macro f4load operand* {
                    vmovdqa xmm0, operand
                    call    inst$f4push
        }

        macro f8load operand* {
                    vmovdqu ymm0, operand
                    call    inst$f8push
        }

        macro dload operand* {
                    vmovq   xmm0, operand
                    call    inst$dpush
        }

        macro d2load operand* {
                    vmovdqa xmm0, operand
                    call    inst$d2push
        }

        macro d4load operand* {
                    vmovdqu ymm0, operand
                    call    inst$d4push
        }

        macro d8load operand* {
                    vmovdqu64 zmm0, operand
                    call    inst$d8push
        }

        macro bload operand* {
            if(operand eqtype 0)
                        mov     al, operand
                        movsx   eax, al
            else
                        movsx   eax, byte operand
            end if
                    call    inst$ipush
        }

        macro b2load operand* {
                    movzx   eax, word operand
                    vmovd   xmm0, eax
                    call    inst$b2push
        }

        macro b4load operand* {
                    vmovd   xmm0, operand
                    call    inst$b4push
        }

        macro b8load operand* {
                    vmovq   xmm0, operand
                    call    inst$b8push
        }

        macro sload operand* {
            if(operand eqtype 0)
                        mov     ax, operand
                        movsx   eax, ax
            else
                        movsx   eax, word operand
            end if
                    call    inst$ipush
        }

        macro s2load operand* {
                    vmovd   xmm0, operand
                    call    inst$s2push
        }

        macro s4load operand* {
                    vmovq   xmm0, operand
                    call    inst$s4push
        }

        macro s8load operand* {
                    vmovdqa xmm0, operand
                    call    inst$s8push
        }

        macro xload operand* {
                    fld     tbyte operand
                    call    inst$xpush
        }

        macro cload operand* {
            if(operand eqtype 0)
                        mov     ax, operand
                        movzx   eax, ax
            else
                        movzx   eax, word operand
            end if
                    call    inst$ipush
        }

        macro rload operand* {
                    mov     rax, operand
                    call    inst$rpush
        }
    ; </fold>

    ; <fold *store>
        macro istore operand* {
                    call    inst$ipop
                    mov     dword operand, eax
        }

        macro i2store operand* {
                    call    inst$i2pop
                    vmovq   qword operand, xmm0
        }

        macro i4store operand* {
                    call    inst$i4pop
                    vmovdqa xword operand, xmm0
        }

        macro i8store operand* {
                    call    inst$i8pop
                    vmovdqu yword operand, ymm0
        }

        macro lstore operand* {
                    call    inst$lpop
                    mov     qword operand, rax
        }

        macro l2store operand* {
                    call    inst$l2pop
                    vmovdqa xword operand, xmm0
        }

        macro l4store operand* {
                    call    inst$l4pop
                    vmovdqu yword operand, ymm0
        }

        macro l8store operand* {
                    call    inst$l8pop
                    vmovdqu64 zword operand, zmm0
        }

        macro fstore operand* {
                    call    inst$fpop
                    vmovd   dword operand, xmm0
        }

        macro f2store operand* {
                    call    inst$f2pop
                    vmovq   qword operand, xmm0
        }

        macro f4store operand* {
                    call    inst$f4pop
                    vmovdqa xword operand, xmm0
        }

        macro f8store operand* {
                    call    inst$f8pop
                    vmovdqu yword operand, ymm0
        }

        macro dstore operand* {
                    call    inst$dpop
                    vmovq   qword operand, xmm0
        }

        macro d2store operand* {
                    call    inst$d2pop
                    vmovdqa xword operand, xmm0
        }

        macro d4store operand* {
                    call    inst$d4pop
                    vmovdqu yword operand, ymm0
        }

        macro d8store operand* {
                    call    inst$d8pop
                    vmovdqu64 zword operand, zmm0
        }

        macro bstore operand* {
                    call    inst$ipop
                    mov     byte operand, al
        }

        macro b2store operand* {
                    call    inst$b2pop
                    mov     word operand, ax
        }

        macro b4store operand* {
                    call    inst$b4pop
                    vmovd   dword operand, xmm0
        }

        macro b8store operand* {
                    call    inst$b8pop
                    vmovq   qword operand, xmm0
        }

        macro sstore operand* {
                    call    inst$ipop
                    mov     word operand, ax
        }

        macro s2store operand* {
                    call    inst$s2pop
                    vmovd   dword operand, xmm0
        }

        macro s4store operand* {
                    call    inst$s4pop
                    vmovq   qword operand, xmm0
        }

        macro s8store operand* {
                    call    inst$s8pop
                    vmovdqa xword operand, xmm0
        }

        macro xstore operand* {
                    call    inst$xpop
                    fstp    tbyte operand
        }

        macro cstore operand* {
                    call    inst$ipop
                    mov     word operand, ax
        }

        macro rstore operand* {
                    local   .L.000
                    call    inst$rpop
                    xchg    qword operand, rax
                    test    rax, rax
                    jz      .L.000
                    lock dec qword[rax+avt.lang.Object$fldRefCountFromOthers]
            .L.000:
        }
    ; </fold>

    ; <fold *loadloc>
        macro lverify loc*, tag* {
                    local   .L.000
                    rdtbp
            if(tag in <TAG_LONG8, TAG_DOUBLE8>)
                        cmp     dword[.#loc#.tag], tag
            else if(tag in <TAG_INT8, TAG_LONG4, TAG_FLOAT8, TAG_DOUBLE4>)
                        cmp     word[.#loc#.tag], tag
            else
                        cmp     byte[.#loc#.tag], tag
            end if
                    je      .L.000
                    call    inst$throwVerifyError
            .L.000:
        }

        macro iloadloc loc* {
                    lverify loc, TAG_INT
                    iload   [.#loc]
        }

        macro i2loadloc loc* {
                    lverify loc, TAG_INT2
                    i2load  [.#loc]
        }

        macro i4loadloc loc* {
                    lverify loc, TAG_INT4
                    i4load  [.#loc]
        }

        macro i8loadloc loc* {
                    lverify loc, TAG_INT8
                    i8load  [.#loc]
        }

        macro lloadloc loc* {
                    lverify loc, TAG_LONG
                    lload   [.#loc]
        }

        macro l2loadloc loc* {
                    lverify loc, TAG_LONG2
                    l2load  [.#loc]
        }

        macro l4loadloc loc* {
                    lverify loc, TAG_LONG4
                    l4load  [.#loc]
        }

        macro l8loadloc loc* {
                    lverify loc, TAG_LONG8
                    l8load  [.#loc]
        }

        macro floadloc loc* {
                    lverify loc, TAG_FLOAT
                    fload   [.#loc]
        }

        macro f2loadloc loc* {
                    lverify loc, TAG_FLOAT2
                    f2load  [.#loc]
        }

        macro f4loadloc loc* {
                    lverify loc, TAG_FLOAT4
                    f4load  [.#loc]
        }

        macro f8loadloc loc* {
                    lverify loc, TAG_FLOAT8
                    f8load  [.#loc]
        }

        macro dloadloc loc* {
                    lverify loc, TAG_DOUBLE
                    dload   [.#loc]
        }

        macro d2loadloc loc* {
                    lverify loc, TAG_DOUBLE2
                    d2load  [.#loc]
        }

        macro d4loadloc loc* {
                    lverify loc, TAG_DOUBLE4
                    d4load  [.#loc]
        }

        macro d8loadloc loc* {
                    lverify loc, TAG_DOUBLE8
                    d8load  [.#loc]
        }

        macro b2loadloc loc* {
                    lverify loc, TAG_BYTE2
                    b2load  [.#loc]
        }

        macro b4loadloc loc* {
                    lverify loc, TAG_BYTE4
                    b4load  [.#loc]
        }

        macro b8loadloc loc* {
                    lverify loc, TAG_BYTE8
                    b8load  [.#loc]
        }

        macro s2loadloc loc* {
                    lverify loc, TAG_SHORT2
                    s2load  [.#loc]
        }

        macro s4loadloc loc* {
                    lverify loc, TAG_SHORT4
                    s4load  [.#loc]
        }

        macro s8loadloc loc* {
                    lverify loc, TAG_SHORT8
                    s8load  [.#loc]
        }

        macro xloadloc loc* {
                    lverify loc, TAG_REAL
                    xload   [.#loc]
        }

        macro rloadloc loc* {
                    lverify loc, TAG_OBJECT
                    rload   [.#loc]
        }
    ; </fold>

    ; <fold *storeloc>
        macro lrelease loc* {
                    local   .L.000
                    rdtbp
                    cmp     byte[.#loc#.tag], TAG_OBJECT
                    jne     .L.000
                    mov     rdx, [.#loc]
                    test    rdx, rdx
                    jz      .L.000
                    lock dec qword[rdx+avt.lang.Object$fldRefCountFromOthers]
            .L.000:
        }

        macro istoreloc loc* {
                    call    inst$ipop
                    lrelease loc
                    mov     qword[.#loc+$08], $00
                    mov     qword[.#loc+$00], rax
                    mov     byte[.#loc#.tag], TAG_INT
        }

        macro i2storeloc loc* {
                    call    inst$i2pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_INT2
        }

        macro i4storeloc loc* {
                    call    inst$i4pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_INT4
        }

        macro i8storeloc loc* {
                    call    inst$i8pop
                    lrelease loc
                    vmovdqu yword[.#loc+$00], ymm0
                    mov     word[.#loc#.tag], TAG_INT8
        }

        macro lstoreloc loc* {
                    call    inst$lpop
                    lrelease loc
                    mov     qword[.#loc+$08], $00
                    mov     qword[.#loc+$00], rax
                    mov     byte[.#loc#.tag], TAG_LONG
        }

        macro l2storeloc loc* {
                    call    inst$l2pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_LONG2
        }

        macro l4storeloc loc* {
                    call    inst$l4pop
                    lrelease loc
                    vmovdqu yword[.#loc+$00], ymm0
                    mov     word[.#loc#.tag], TAG_LONG4
        }

        macro l8storeloc loc* {
                    call    inst$l8pop
                    lrelease loc
                    vmovdqu64 zword[.#loc+$00], zmm0
                    mov     dword[.#loc#.tag], TAG_LONG8
        }

        macro fstoreloc loc* {
                    call    inst$fpop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_FLOAT
        }

        macro f2storeloc loc* {
                    call    inst$f2pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_FLOAT2
        }

        macro f4storeloc loc* {
                    call    inst$f4pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_FLOAT4
        }

        macro f8storeloc loc* {
                    call    inst$f8pop
                    lrelease loc
                    vmovdqu yword[.#loc+$00], ymm0
                    mov     word[.#loc#.tag], TAG_FLOAT8
        }

        macro dstoreloc loc* {
                    call    inst$dpop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_DOUBLE
        }

        macro d2storeloc loc* {
                    call    inst$d2pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_DOUBLE2
        }

        macro d4storeloc loc* {
                    call    inst$d4pop
                    lrelease loc
                    vmovdqu yword[.#loc+$00], ymm0
                    mov     word[.#loc#.tag], TAG_DOUBLE4
        }

        macro d8storeloc loc* {
                    call    inst$d8pop
                    lrelease loc
                    vmovdqu64 zword[.#loc+$00], zmm0
                    mov     dword[.#loc#.tag], TAG_DOUBLE8
        }

        macro b2storeloc loc* {
                    call    inst$b2pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_BYTE2
        }

        macro b4storeloc loc* {
                    call    inst$b4pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_BYTE4
        }

        macro b8storeloc loc* {
                    call    inst$b8pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_BYTE8
        }

        macro s2storeloc loc* {
                    call    inst$s2pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_SHORT2
        }

        macro s4storeloc loc* {
                    call    inst$s4pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_SHORT4
        }

        macro s8storeloc loc* {
                    call    inst$s8pop
                    lrelease loc
                    vmovdqa xword[.#loc+$00], xmm0
                    mov     byte[.#loc#.tag], TAG_SHORT8
        }

        macro xstoreloc loc* {
                    call    inst$xpop
                    lrelease loc
                    mov     qword[.#loc+$08], $00
                    fstp    tbyte[.#loc+$00]
                    mov     byte[.#loc#.tag], TAG_REAL
        }

        macro rstoreloc loc* {
                    call    inst$rpop
                    lrelease loc
                    mov     qword[.#loc+$08], $00
                    mov     qword[.#loc+$00], rax
                    mov     byte[.#loc#.tag], TAG_OBJECT
        }
    ; </fold>

    ; <fold *inc>
        macro iinc loc* {
                    lverify loc, TAG_INT
                    inc     dword[.#loc]
        }

        macro i2inc loc* {
                    lverify loc, TAG_INT2
                    inc     dword[.#loc]
        }

        macro i4inc loc* {
                    lverify loc, TAG_INT4
                    inc     dword[.#loc]
        }

        macro i8inc loc* {
                    lverify loc, TAG_INT8
                    inc     dword[.#loc]
        }

        macro linc loc* {
                    lverify loc, TAG_LONG
                    inc     qword[.#loc]
        }

        macro l2inc loc* {
                    lverify loc, TAG_LONG2
                    inc     qword[.#loc]
        }

        macro l4inc loc* {
                    lverify loc, TAG_LONG4
                    inc     qword[.#loc]
        }

        macro l8inc loc* {
                    lverify loc, TAG_LONG8
                    inc     qword[.#loc]
        }

        macro finc loc* {
                    lverify loc, TAG_FLOAT
                    vmovd   xmm0, [.#loc]
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f2inc loc* {
                    lverify loc, TAG_FLOAT2
                    vmovd   xmm0, [.#loc]
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f4inc loc* {
                    lverify loc, TAG_FLOAT4
                    vmovd   xmm0, [.#loc]
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f8inc loc* {
                    lverify loc, TAG_FLOAT8
                    vmovd   xmm0, [.#loc]
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro dinc loc* {
                    lverify loc, TAG_DOUBLE
                    vmovq   xmm0, [.#loc]
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d2inc loc* {
                    lverify loc, TAG_DOUBLE2
                    vmovq   xmm0, [.#loc]
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d4inc loc* {
                    lverify loc, TAG_DOUBLE4
                    vmovq   xmm0, [.#loc]
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d8inc loc* {
                    lverify loc, TAG_DOUBLE8
                    vmovq   xmm0, [.#loc]
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro binc loc* {
                    lverify loc, TAG_INT
                    mov     al, [.#loc]
                    inc     al
                    movsx   eax, al
                    mov     dword[.#loc], eax
        }

        macro b2inc loc* {
                    lverify loc, TAG_BYTE2
                    inc     byte[.#loc]
        }

        macro b4inc loc* {
                    lverify loc, TAG_BYTE4
                    inc     byte[.#loc]
        }

        macro b8inc loc* {
                    lverify loc, TAG_BYTE8
                    inc     byte[.#loc]
        }

        macro sinc loc* {
                    lverify loc, TAG_INT
                    mov     ax, [.#loc]
                    inc     ax
                    movsx   eax, ax
                    mov     dword[.#loc], eax
        }

        macro s2inc loc* {
                    lverify loc, TAG_SHORT2
                    inc     word[.#loc]
        }

        macro s4inc loc* {
                    lverify loc, TAG_SHORT4
                    inc     word[.#loc]
        }

        macro s8inc loc* {
                    lverify loc, TAG_SHORT8
                    inc     word[.#loc]
        }

        macro xinc loc* {
                    lverify loc, TAG_REAL
                    fld     tbyte[.#loc]
                    fiadd   dword[i8.id]
                    fstp    tbyte[.#loc]
        }

        macro cinc loc* {
                    lverify loc, TAG_INT
                    mov     ax, [.#loc]
                    inc     ax
                    movzx   eax, ax
                    mov     dword[.#loc], eax
        }
    ; </fold>

    ; <fold *dec>
        macro idec loc* {
                    lverify loc, TAG_INT
                    dec     dword[.#loc]
        }

        macro i2dec loc* {
                    lverify loc, TAG_INT2
                    dec     dword[.#loc]
        }

        macro i4dec loc* {
                    lverify loc, TAG_INT4
                    dec     dword[.#loc]
        }

        macro i8dec loc* {
                    lverify loc, TAG_INT8
                    dec     dword[.#loc]
        }

        macro ldec loc* {
                    lverify loc, TAG_LONG
                    dec     qword[.#loc]
        }

        macro l2dec loc* {
                    lverify loc, TAG_LONG2
                    dec     qword[.#loc]
        }

        macro l4dec loc* {
                    lverify loc, TAG_LONG4
                    dec     qword[.#loc]
        }

        macro l8dec loc* {
                    lverify loc, TAG_LONG8
                    dec     qword[.#loc]
        }

        macro fdec loc* {
                    lverify loc, TAG_FLOAT
                    vmovd   xmm0, [.#loc]
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f2dec loc* {
                    lverify loc, TAG_FLOAT2
                    vmovd   xmm0, [.#loc]
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f4dec loc* {
                    lverify loc, TAG_FLOAT4
                    vmovd   xmm0, [.#loc]
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f8dec loc* {
                    lverify loc, TAG_FLOAT8
                    vmovd   xmm0, [.#loc]
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro ddec loc* {
                    lverify loc, TAG_DOUBLE
                    vmovq   xmm0, [.#loc]
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d2dec loc* {
                    lverify loc, TAG_DOUBLE2
                    vmovq   xmm0, [.#loc]
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d4dec loc* {
                    lverify loc, TAG_DOUBLE4
                    vmovq   xmm0, [.#loc]
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d8dec loc* {
                    lverify loc, TAG_DOUBLE8
                    vmovq   xmm0, [.#loc]
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro bdec loc* {
                    lverify loc, TAG_INT
                    mov     al, [.#loc]
                    dec     al
                    movsx   eax, al
                    mov     dword[.#loc], eax
        }

        macro b2dec loc* {
                    lverify loc, TAG_BYTE2
                    dec     byte[.#loc]
        }

        macro b4dec loc* {
                    lverify loc, TAG_BYTE4
                    dec     byte[.#loc]
        }

        macro b8dec loc* {
                    lverify loc, TAG_BYTE8
                    dec     byte[.#loc]
        }

        macro sdec loc* {
                    lverify loc, TAG_INT
                    mov     ax, [.#loc]
                    dec     ax
                    movsx   eax, ax
                    mov     dword[.#loc], eax
        }

        macro s2dec loc* {
                    lverify loc, TAG_SHORT2
                    dec     word[.#loc]
        }

        macro s4dec loc* {
                    lverify loc, TAG_SHORT4
                    dec     word[.#loc]
        }

        macro s8dec loc* {
                    lverify loc, TAG_SHORT8
                    dec     word[.#loc]
        }

        macro xdec loc* {
                    lverify loc, TAG_REAL
                    fld     tbyte[.#loc]
                    fisub   dword[i8.id]
                    fstp    tbyte[.#loc]
        }

        macro cdec loc* {
                    lverify loc, TAG_INT
                    mov     ax, [.#loc]
                    dec     ax
                    movzx   eax, ax
                    mov     dword[.#loc], eax
        }
    ; </fold>

    ; <fold *incpost>
        macro iincpost loc* {
                    iloadloc loc
                    inc     dword[.#loc]
        }

        macro i2incpost loc* {
                    i2loadloc loc
                    inc     dword[.#loc]
        }

        macro i4incpost loc* {
                    i4loadloc loc
                    inc     dword[.#loc]
        }

        macro i8incpost loc* {
                    i8loadloc loc
                    inc     dword[.#loc]
        }

        macro lincpost loc* {
                    lloadloc loc
                    inc     qword[.#loc]
        }

        macro l2incpost loc* {
                    l2loadloc loc
                    inc     qword[.#loc]
        }

        macro l4incpost loc* {
                    l4loadloc loc
                    inc     qword[.#loc]
        }

        macro l8incpost loc* {
                    l8loadloc loc
                    inc     qword[.#loc]
        }

        macro fincpost loc* {
                    floadloc loc
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f2incpost loc* {
                    f2loadloc loc
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f4incpost loc* {
                    f4loadloc loc
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f8incpost loc* {
                    f8loadloc loc
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro dincpost loc* {
                    dloadloc loc
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d2incpost loc* {
                    d2loadloc loc
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d4incpost loc* {
                    d4loadloc loc
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d8incpost loc* {
                    d8loadloc loc
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro bincpost loc* {
                    iloadloc loc
                    inc     al
                    movsx   eax, al
                    mov     dword[.#loc], eax
        }

        macro b2incpost loc* {
                    b2loadloc loc
                    inc     byte[.#loc]
        }

        macro b4incpost loc* {
                    b4loadloc loc
                    inc     byte[.#loc]
        }

        macro b8incpost loc* {
                    b8loadloc loc
                    inc     byte[.#loc]
        }

        macro sincpost loc* {
                    iloadloc loc
                    inc     ax
                    movsx   eax, ax
                    mov     dword[.#loc], eax
        }

        macro s2incpost loc* {
                    s2loadloc loc
                    inc     word[.#loc]
        }

        macro s4incpost loc* {
                    s4loadloc loc
                    inc     word[.#loc]
        }

        macro s8incpost loc* {
                    s8loadloc loc
                    inc     word[.#loc]
        }

        macro xincpost loc* {
                    lverify loc, TAG_REAL
                    fld     tbyte[.#loc]
                    fld     st0
                    call    inst$xpush
                    fiadd   dword[i8.id]
                    fstp    tbyte[.#loc]
        }

        macro cincpost loc* {
                    iloadloc loc
                    inc     ax
                    movzx   eax, ax
                    mov     dword[.#loc], eax
        }
    ; </fold>

    ; <fold *decpost>
        macro idecpost loc* {
                    iloadloc loc
                    dec     dword[.#loc]
        }

        macro i2decpost loc* {
                    i2loadloc loc
                    dec     dword[.#loc]
        }

        macro i4decpost loc* {
                    i4loadloc loc
                    dec     dword[.#loc]
        }

        macro i8decpost loc* {
                    i8loadloc loc
                    dec     dword[.#loc]
        }

        macro ldecpost loc* {
                    lloadloc loc
                    dec     qword[.#loc]
        }

        macro l2decpost loc* {
                    l2loadloc loc
                    dec     qword[.#loc]
        }

        macro l4decpost loc* {
                    l4loadloc loc
                    dec     qword[.#loc]
        }

        macro l8decpost loc* {
                    l8loadloc loc
                    dec     qword[.#loc]
        }

        macro fdecpost loc* {
                    floadloc loc
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f2decpost loc* {
                    f2loadloc loc
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f4decpost loc* {
                    f4loadloc loc
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro f8decpost loc* {
                    f8loadloc loc
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovd   dword[.#loc], xmm0
        }

        macro ddecpost loc* {
                    dloadloc loc
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d2decpost loc* {
                    d2loadloc loc
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d4decpost loc* {
                    d4loadloc loc
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro d8decpost loc* {
                    d8loadloc loc
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovq   qword[.#loc], xmm0
        }

        macro bdecpost loc* {
                    iloadloc loc
                    dec     al
                    movsx   eax, al
                    mov     dword[.#loc], eax
        }

        macro b2decpost loc* {
                    b2loadloc loc
                    dec     byte[.#loc]
        }

        macro b4decpost loc* {
                    b4loadloc loc
                    dec     byte[.#loc]
        }

        macro b8decpost loc* {
                    b8loadloc loc
                    dec     byte[.#loc]
        }

        macro sdecpost loc* {
                    iloadloc loc
                    dec     ax
                    movsx   eax, ax
                    mov     dword[.#loc], eax
        }

        macro s2decpost loc* {
                    s2loadloc loc
                    dec     word[.#loc]
        }

        macro s4decpost loc* {
                    s4loadloc loc
                    dec     word[.#loc]
        }

        macro s8decpost loc* {
                    s8loadloc loc
                    dec     word[.#loc]
        }

        macro xdecpost loc* {
                    lverify loc, TAG_REAL
                    fld     tbyte[.#loc]
                    fld     st0
                    call    inst$xpush
                    fisub   dword[i8.id]
                    fstp    tbyte[.#loc]
        }

        macro cdecpost loc* {
                    iloadloc loc
                    dec     ax
                    movzx   eax, ax
                    mov     dword[.#loc], eax
        }
    ; </fold>

    ; <fold *incpred>
        macro iincpred loc* {
                    lverify loc, TAG_INT
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     dword[.#loc]
                    mov     eax, [.#loc]
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        }

        macro i2incpred loc* {
                    lverify loc, TAG_INT2
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     dword[.#loc]
                    vmovq   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_INT2
        }

        macro i4incpred loc* {
                    lverify loc, TAG_INT4
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     dword[.#loc]
                    vmovdqa xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_INT4
        }

        macro i8incpred loc* {
                    lverify loc, TAG_INT8
                    mov     ecx, $20
                    call    inst$stackrealize
                    inc     dword[.#loc]
                    vmovdqu ymm0, [.#loc]
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        }

        macro lincpred loc* {
                    lverify loc, TAG_LONG
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     qword[.#loc]
                    mov     rax, [.#loc]
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_LONG
        }

        macro l2incpred loc* {
                    lverify loc, TAG_LONG2
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     qword[.#loc]
                    vmovdqa xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_LONG2
        }

        macro l4incpred loc* {
                    lverify loc, TAG_LONG4
                    mov     ecx, $20
                    call    inst$stackrealize
                    inc     qword[.#loc]
                    vmovdqu ymm0, [.#loc]
                    vmovdqu yword[rsp], ymm0
                    set     TAG_LONG4
        }

        macro l8incpred loc* {
                    lverify loc, TAG_LONG8
                    mov     ecx, $40
                    call    inst$stackrealize
                    inc     qword[.#loc]
                    vmovdqu64 zmm0, [.#loc]
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_LONG8
        }

        macro fincpred loc* {
                    lverify loc, TAG_FLOAT
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovd   xmm0, [.#loc]
                    vaddss  xmm0, xmm0, [f8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_FLOAT
        }

        macro f2incpred loc* {
                    lverify loc, TAG_FLOAT2
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovq   xmm0, [.#loc]
                    vaddps  xmm0, xmm0, [f8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_FLOAT2
        }

        macro f4incpred loc* {
                    lverify loc, TAG_FLOAT4
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovdqa xmm0, [.#loc]
                    vaddps  xmm0, xmm0, [f8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_FLOAT4
        }

        macro f8incpred loc* {
                    lverify loc, TAG_FLOAT8
                    mov     ecx, $20
                    call    inst$stackrealize
                    vmovdqu ymm0, [.#loc]
                    vaddps  ymm0, ymm0, [f8.id]
                    vmovdqu yword[.#loc], ymm0
                    vmovdqu yword[rsp], ymm0
                    set     TAG_FLOAT8
        }

        macro dincpred loc* {
                    lverify loc, TAG_DOUBLE
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovq   xmm0, [.#loc]
                    vaddsd  xmm0, xmm0, [d8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_DOUBLE
        }

        macro d2incpred loc* {
                    lverify loc, TAG_DOUBLE2
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovdqa xmm0, [.#loc]
                    vaddpd  xmm0, xmm0, [d8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_DOUBLE2
        }

        macro d4incpred loc* {
                    lverify loc, TAG_DOUBLE4
                    mov     ecx, $20
                    call    inst$stackrealize
                    vmovdqu ymm0, [.#loc]
                    vaddpd  ymm0, ymm0, [d8.id]
                    vmovdqu yword[.#loc], ymm0
                    vmovdqu yword[rsp], ymm0
                    set     TAG_DOUBLE4
        }

        macro d8incpred loc* {
                    lverify loc, TAG_DOUBLE8
                    mov     ecx, $40
                    call    inst$stackrealize
                    vmovdqu64 zmm0, [.#loc]
                    vaddpd  zmm0, zmm0, [d8.id]
                    vmovdqu64 zword[.#loc], zmm0
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_DOUBLE8
        }

        macro bincpred loc* {
                    lverify loc, TAG_INT
                    mov     ecx, $10
                    call    inst$stackrealize
                    mov     al, [.#loc]
                    inc     al
                    movsx   eax, al
                    mov     dword[.#loc], eax
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        }

        macro b2incpred loc* {
                    lverify loc, TAG_BYTE2
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     byte[.#loc]
                    movzx   eax, word[.#loc]
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE2
        }

        macro b4incpred loc* {
                    lverify loc, TAG_BYTE4
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     byte[.#loc]
                    vmovd   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE4
        }

        macro b8incpred loc* {
                    lverify loc, TAG_BYTE8
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     byte[.#loc]
                    vmovq   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE8
        }

        macro sincpred loc* {
                    lverify loc, TAG_INT
                    mov     ecx, $10
                    call    inst$stackrealize
                    mov     ax, [.#loc]
                    inc     ax
                    movsx   eax, ax
                    mov     dword[.#loc], eax
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        }

        macro s2incpred loc* {
                    lverify loc, TAG_SHORT2
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     word[.#loc]
                    vmovd   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT2
        }

        macro s4incpred loc* {
                    lverify loc, TAG_SHORT4
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     word[.#loc]
                    vmovq   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT4
        }

        macro s8incpred loc* {
                    lverify loc, TAG_SHORT8
                    mov     ecx, $10
                    call    inst$stackrealize
                    inc     word[.#loc]
                    vmovdqa xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT8
        }

        macro xincpred loc* {
                    lverify loc, TAG_REAL
                    mov     ecx, $10
                    call    inst$stackrealize
                    mov     qword[rsp+$08], $00
                    fld     tbyte[.#loc]
                    fiadd   dword[i8.id]
                    fld     st0
                    fstp    tbyte[.#loc]
                    fstp    tbyte[rsp+$00]
                    set     TAG_REAL
        }

        macro cincpred loc* {
                    lverify loc, TAG_INT
                    mov     ecx, $10
                    call    inst$stackrealize
                    mov     ax, [.#loc]
                    inc     ax
                    movzx   eax, ax
                    mov     dword[.#loc], eax
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        }
    ; </fold>

    ; <fold *decpred>
        macro idecpred loc* {
                    lverify loc, TAG_INT
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     dword[.#loc]
                    mov     eax, [.#loc]
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        }

        macro i2decpred loc* {
                    lverify loc, TAG_INT2
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     dword[.#loc]
                    vmovq   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_INT2
        }

        macro i4decpred loc* {
                    lverify loc, TAG_INT4
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     dword[.#loc]
                    vmovdqa xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_INT4
        }

        macro i8decpred loc* {
                    lverify loc, TAG_INT8
                    mov     ecx, $20
                    call    inst$stackrealize
                    dec     dword[.#loc]
                    vmovdqu ymm0, [.#loc]
                    vmovdqu yword[rsp], ymm0
                    set     TAG_INT8
        }

        macro ldecpred loc* {
                    lverify loc, TAG_LONG
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     qword[.#loc]
                    mov     rax, [.#loc]
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_LONG
        }

        macro l2decpred loc* {
                    lverify loc, TAG_LONG2
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     qword[.#loc]
                    vmovdqa xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_LONG2
        }

        macro l4decpred loc* {
                    lverify loc, TAG_LONG4
                    mov     ecx, $20
                    call    inst$stackrealize
                    dec     qword[.#loc]
                    vmovdqu ymm0, [.#loc]
                    vmovdqu yword[rsp], ymm0
                    set     TAG_LONG4
        }

        macro l8decpred loc* {
                    lverify loc, TAG_LONG8
                    mov     ecx, $40
                    call    inst$stackrealize
                    dec     qword[.#loc]
                    vmovdqu64 zmm0, [.#loc]
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_LONG8
        }

        macro fdecpred loc* {
                    lverify loc, TAG_FLOAT
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovd   xmm0, [.#loc]
                    vsubss  xmm0, xmm0, [f8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_FLOAT
        }

        macro f2decpred loc* {
                    lverify loc, TAG_FLOAT2
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovq   xmm0, [.#loc]
                    vsubps  xmm0, xmm0, [f8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_FLOAT2
        }

        macro f4decpred loc* {
                    lverify loc, TAG_FLOAT4
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovdqa xmm0, [.#loc]
                    vsubps  xmm0, xmm0, [f8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_FLOAT4
        }

        macro f8decpred loc* {
                    lverify loc, TAG_FLOAT8
                    mov     ecx, $20
                    call    inst$stackrealize
                    vmovdqu ymm0, [.#loc]
                    vsubps  ymm0, ymm0, [f8.id]
                    vmovdqu yword[.#loc], ymm0
                    vmovdqu yword[rsp], ymm0
                    set     TAG_FLOAT8
        }

        macro ddecpred loc* {
                    lverify loc, TAG_DOUBLE
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovq   xmm0, [.#loc]
                    vsubsd  xmm0, xmm0, [d8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_DOUBLE
        }

        macro d2decpred loc* {
                    lverify loc, TAG_DOUBLE2
                    mov     ecx, $10
                    call    inst$stackrealize
                    vmovdqa xmm0, [.#loc]
                    vsubpd  xmm0, xmm0, [d8.id]
                    vmovdqa xword[.#loc], xmm0
                    vmovdqa xword[rsp], xmm0
                    set     TAG_DOUBLE2
        }

        macro d4decpred loc* {
                    lverify loc, TAG_DOUBLE4
                    mov     ecx, $20
                    call    inst$stackrealize
                    vmovdqu ymm0, [.#loc]
                    vsubpd  ymm0, ymm0, [d8.id]
                    vmovdqu yword[.#loc], ymm0
                    vmovdqu yword[rsp], ymm0
                    set     TAG_DOUBLE4
        }

        macro d8decpred loc* {
                    lverify loc, TAG_DOUBLE8
                    mov     ecx, $40
                    call    inst$stackrealize
                    vmovdqu64 zmm0, [.#loc]
                    vsubpd  zmm0, zmm0, [d8.id]
                    vmovdqu64 zword[.#loc], zmm0
                    vmovdqu64 zword[rsp], zmm0
                    set     TAG_DOUBLE8
        }

        macro bdecpred loc* {
                    lverify loc, TAG_INT
                    mov     ecx, $10
                    call    inst$stackrealize
                    mov     al, [.#loc]
                    dec     al
                    movsx   eax, al
                    mov     dword[.#loc], eax
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        }

        macro b2decpred loc* {
                    lverify loc, TAG_BYTE2
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     byte[.#loc]
                    movzx   eax, word[.#loc]
                    vmovd   xmm0, eax
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE2
        }

        macro b4decpred loc* {
                    lverify loc, TAG_BYTE4
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     byte[.#loc]
                    vmovd   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE4
        }

        macro b8decpred loc* {
                    lverify loc, TAG_BYTE8
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     byte[.#loc]
                    vmovq   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_BYTE8
        }

        macro sdecpred loc* {
                    lverify loc, TAG_INT
                    mov     ecx, $10
                    call    inst$stackrealize
                    mov     ax, [.#loc]
                    dec     ax
                    movsx   eax, ax
                    mov     dword[.#loc], eax
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        }

        macro s2decpred loc* {
                    lverify loc, TAG_SHORT2
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     word[.#loc]
                    vmovd   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT2
        }

        macro s4decpred loc* {
                    lverify loc, TAG_SHORT4
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     word[.#loc]
                    vmovq   xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT4
        }

        macro s8decpred loc* {
                    lverify loc, TAG_SHORT8
                    mov     ecx, $10
                    call    inst$stackrealize
                    dec     word[.#loc]
                    vmovdqa xmm0, [.#loc]
                    vmovdqa xword[rsp], xmm0
                    set     TAG_SHORT8
        }

        macro xdecpred loc* {
                    lverify loc, TAG_REAL
                    mov     ecx, $10
                    call    inst$stackrealize
                    mov     qword[rsp+$08], $00
                    fld     tbyte[.#loc]
                    fisub   dword[i8.id]
                    fld     st0
                    fstp    tbyte[.#loc]
                    fstp    tbyte[rsp+$00]
                    set     TAG_REAL
        }

        macro cdecpred loc* {
                    lverify loc, TAG_INT
                    mov     ecx, $10
                    call    inst$stackrealize
                    mov     ax, [.#loc]
                    dec     ax
                    movzx   eax, ax
                    mov     dword[.#loc], eax
                    mov     qword[rsp+$08], $00
                    mov     qword[rsp+$00], rax
                    set     TAG_INT
        }
    ; </fold>

    ; <fold getfield*>
        macro getfieldi offset* {
                    mov     ecx, offset
                    call    inst$getfieldi
        }

        macro getfieldi2 offset* {
                    mov     ecx, offset
                    call    inst$getfieldi2
        }

        macro getfieldi4 offset* {
                    mov     ecx, offset
                    call    inst$getfieldi4
        }

        macro getfieldi8 offset* {
                    mov     ecx, offset
                    call    inst$getfieldi8
        }

        macro getfieldl offset* {
                    mov     ecx, offset
                    call    inst$getfieldl
        }

        macro getfieldl2 offset* {
                    mov     ecx, offset
                    call    inst$getfieldl2
        }

        macro getfieldl4 offset* {
                    mov     ecx, offset
                    call    inst$getfieldl4
        }

        macro getfieldl8 offset* {
                    mov     ecx, offset
                    call    inst$getfieldl8
        }

        macro getfieldf offset* {
                    mov     ecx, offset
                    call    inst$getfieldf
        }

        macro getfieldf2 offset* {
                    mov     ecx, offset
                    call    inst$getfieldf2
        }

        macro getfieldf4 offset* {
                    mov     ecx, offset
                    call    inst$getfieldf4
        }

        macro getfieldf8 offset* {
                    mov     ecx, offset
                    call    inst$getfieldf8
        }

        macro getfieldd offset* {
                    mov     ecx, offset
                    call    inst$getfieldd
        }

        macro getfieldd2 offset* {
                    mov     ecx, offset
                    call    inst$getfieldd2
        }

        macro getfieldd4 offset* {
                    mov     ecx, offset
                    call    inst$getfieldd4
        }

        macro getfieldd8 offset* {
                    mov     ecx, offset
                    call    inst$getfieldd8
        }

        macro getfieldb offset* {
                    mov     ecx, offset
                    call    inst$getfieldb
        }

        macro getfieldb2 offset* {
                    mov     ecx, offset
                    call    inst$getfieldb2
        }

        macro getfieldb4 offset* {
                    mov     ecx, offset
                    call    inst$getfieldb4
        }

        macro getfieldb8 offset* {
                    mov     ecx, offset
                    call    inst$getfieldb8
        }

        macro getfields offset* {
                    mov     ecx, offset
                    call    inst$getfields
        }

        macro getfields2 offset* {
                    mov     ecx, offset
                    call    inst$getfields2
        }

        macro getfields4 offset* {
                    mov     ecx, offset
                    call    inst$getfields4
        }

        macro getfields8 offset* {
                    mov     ecx, offset
                    call    inst$getfields8
        }

        macro getfieldx offset* {
                    mov     ecx, offset
                    call    inst$getfieldx
        }

        macro getfieldc offset* {
                    mov     ecx, offset
                    call    inst$getfieldc
        }

        macro getfieldr offset* {
                    mov     ecx, offset
                    call    inst$getfieldr
        }
    ; </fold>

    ; <fold getstructfield*>
        macro getstructfieldi offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldi
        }

        macro getstructfieldi2 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldi2
        }

        macro getstructfieldi4 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldi4
        }

        macro getstructfieldi8 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldi8
        }

        macro getstructfieldl offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldl
        }

        macro getstructfieldl2 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldl2
        }

        macro getstructfieldl4 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldl4
        }

        macro getstructfieldl8 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldl8
        }

        macro getstructfieldf offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldf
        }

        macro getstructfieldf2 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldf2
        }

        macro getstructfieldf4 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldf4
        }

        macro getstructfieldf8 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldf8
        }

        macro getstructfieldd offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldd
        }

        macro getstructfieldd2 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldd2
        }

        macro getstructfieldd4 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldd4
        }

        macro getstructfieldd8 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldd8
        }

        macro getstructfieldb offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldb
        }

        macro getstructfieldb2 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldb2
        }

        macro getstructfieldb4 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldb4
        }

        macro getstructfieldb8 offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldb8
        }

        macro getstructfields offset* {
                    mov     ecx, offset
                    call    inst$getstructfields
        }

        macro getstructfields2 offset* {
                    mov     ecx, offset
                    call    inst$getstructfields2
        }

        macro getstructfields4 offset* {
                    mov     ecx, offset
                    call    inst$getstructfields4
        }

        macro getstructfields8 offset* {
                    mov     ecx, offset
                    call    inst$getstructfields8
        }

        macro getstructfieldx offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldx
        }

        macro getstructfieldc offset* {
                    mov     ecx, offset
                    call    inst$getstructfieldc
        }
    ; </fold>

    ; <fold getarrayelement*>
        macro getarrayelementi {
                    call    inst$getarrayelementi
        }

        macro getarrayelementi2 {
                    call    inst$getarrayelementi2
        }

        macro getarrayelementi4 {
                    call    inst$getarrayelementi4
        }

        macro getarrayelementi8 {
                    call    inst$getarrayelementi8
        }

        macro getarrayelementl {
                    call    inst$getarrayelementl
        }

        macro getarrayelementl2 {
                    call    inst$getarrayelementl2
        }

        macro getarrayelementl4 {
                    call    inst$getarrayelementl4
        }

        macro getarrayelementl8 {
                    call    inst$getarrayelementl8
        }

        macro getarrayelementf {
                    call    inst$getarrayelementf
        }

        macro getarrayelementf2 {
                    call    inst$getarrayelementf2
        }

        macro getarrayelementf4 {
                    call    inst$getarrayelementf4
        }

        macro getarrayelementf8 {
                    call    inst$getarrayelementf8
        }

        macro getarrayelementd {
                    call    inst$getarrayelementd
        }

        macro getarrayelementd2 {
                    call    inst$getarrayelementd2
        }

        macro getarrayelementd4 {
                    call    inst$getarrayelementd4
        }

        macro getarrayelementd8 {
                    call    inst$getarrayelementd8
        }

        macro getarrayelementb {
                    call    inst$getarrayelementb
        }

        macro getarrayelementb2 {
                    call    inst$getarrayelementb2
        }

        macro getarrayelementb4 {
                    call    inst$getarrayelementb4
        }

        macro getarrayelementb8 {
                    call    inst$getarrayelementb8
        }

        macro getarrayelements {
                    call    inst$getarrayelements
        }

        macro getarrayelements2 {
                    call    inst$getarrayelements2
        }

        macro getarrayelements4 {
                    call    inst$getarrayelements4
        }

        macro getarrayelements8 {
                    call    inst$getarrayelements8
        }

        macro getarrayelementx {
                    call    inst$getarrayelementx
        }

        macro getarrayelementc {
                    call    inst$getarrayelementc
        }

        macro getarrayelementr {
                    call    inst$getarrayelementr
        }
    ; </fold>

    ; <fold getvectorelement>
        macro getvectorelementi2 {
                    call    inst$getvectorelementi2
        }

        macro getvectorelementi4 {
                    call    inst$getvectorelementi4
        }

        macro getvectorelementi8 {
                    call    inst$getvectorelementi8
        }

        macro getvectorelementl2 {
                    call    inst$getvectorelementl2
        }

        macro getvectorelementl4 {
                    call    inst$getvectorelementl4
        }

        macro getvectorelementl8 {
                    call    inst$getvectorelementl8
        }

        macro getvectorelementf2 {
                    call    inst$getvectorelementf2
        }

        macro getvectorelementf4 {
                    call    inst$getvectorelementf4
        }

        macro getvectorelementf8 {
                    call    inst$getvectorelementf8
        }

        macro getvectorelementd2 {
                    call    inst$getvectorelementd2
        }

        macro getvectorelementd4 {
                    call    inst$getvectorelementd4
        }

        macro getvectorelementd8 {
                    call    inst$getvectorelementd8
        }

        macro getvectorelementb2 {
                    call    inst$getvectorelementb2
        }

        macro getvectorelementb4 {
                    call    inst$getvectorelementb4
        }

        macro getvectorelementb8 {
                    call    inst$getvectorelementb8
        }

        macro getvectorelements2 {
                    call    inst$getvectorelements2
        }

        macro getvectorelements4 {
                    call    inst$getvectorelements4
        }

        macro getvectorelements8 {
                    call    inst$getvectorelements8
        }
    ; </fold>

    ; <fold setfield*>
        macro setfieldi offset* {
                    mov     ecx, offset
                    call    inst$setfieldi
        }

        macro setfieldi2 offset* {
                    mov     ecx, offset
                    call    inst$setfieldi2
        }

        macro setfieldi4 offset* {
                    mov     ecx, offset
                    call    inst$setfieldi4
        }

        macro setfieldi8 offset* {
                    mov     ecx, offset
                    call    inst$setfieldi8
        }

        macro setfieldl offset* {
                    mov     ecx, offset
                    call    inst$setfieldl
        }

        macro setfieldl2 offset* {
                    mov     ecx, offset
                    call    inst$setfieldl2
        }

        macro setfieldl4 offset* {
                    mov     ecx, offset
                    call    inst$setfieldl4
        }

        macro setfieldl8 offset* {
                    mov     ecx, offset
                    call    inst$setfieldl8
        }

        macro setfieldf offset* {
                    mov     ecx, offset
                    call    inst$setfieldf
        }

        macro setfieldf2 offset* {
                    mov     ecx, offset
                    call    inst$setfieldf2
        }

        macro setfieldf4 offset* {
                    mov     ecx, offset
                    call    inst$setfieldf4
        }

        macro setfieldf8 offset* {
                    mov     ecx, offset
                    call    inst$setfieldf8
        }

        macro setfieldd offset* {
                    mov     ecx, offset
                    call    inst$setfieldd
        }

        macro setfieldd2 offset* {
                    mov     ecx, offset
                    call    inst$setfieldd2
        }

        macro setfieldd4 offset* {
                    mov     ecx, offset
                    call    inst$setfieldd4
        }

        macro setfieldd8 offset* {
                    mov     ecx, offset
                    call    inst$setfieldd8
        }

        macro setfieldb offset* {
                    mov     ecx, offset
                    call    inst$setfieldb
        }

        macro setfieldb2 offset* {
                    mov     ecx, offset
                    call    inst$setfieldb2
        }

        macro setfieldb4 offset* {
                    mov     ecx, offset
                    call    inst$setfieldb4
        }

        macro setfieldb8 offset* {
                    mov     ecx, offset
                    call    inst$setfieldb8
        }

        macro setfields offset* {
                    mov     ecx, offset
                    call    inst$setfields
        }

        macro setfields2 offset* {
                    mov     ecx, offset
                    call    inst$setfields2
        }

        macro setfields4 offset* {
                    mov     ecx, offset
                    call    inst$setfields4
        }

        macro setfields8 offset* {
                    mov     ecx, offset
                    call    inst$setfields8
        }

        macro setfieldx offset* {
                    mov     ecx, offset
                    call    inst$setfieldx
        }

        macro setfieldc offset* {
                    mov     ecx, offset
                    call    inst$setfieldc
        }

        macro setfieldr offset* {
                    mov     ecx, offset
                    call    inst$setfieldr
        }
    ; </fold>

    ; <fold setstructfield*>
        macro setstructfieldi offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldi
        }

        macro setstructfieldi2 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldi2
        }

        macro setstructfieldi4 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldi4
        }

        macro setstructfieldi8 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldi8
        }

        macro setstructfieldl offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldl
        }

        macro setstructfieldl2 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldl2
        }

        macro setstructfieldl4 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldl4
        }

        macro setstructfieldl8 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldl8
        }

        macro setstructfieldf offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldf
        }

        macro setstructfieldf2 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldf2
        }

        macro setstructfieldf4 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldf4
        }

        macro setstructfieldf8 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldf8
        }

        macro setstructfieldd offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldd
        }

        macro setstructfieldd2 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldd2
        }

        macro setstructfieldd4 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldd4
        }

        macro setstructfieldd8 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldd8
        }

        macro setstructfieldb offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldb
        }

        macro setstructfieldb2 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldb2
        }

        macro setstructfieldb4 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldb4
        }

        macro setstructfieldb8 offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldb8
        }

        macro setstructfields offset* {
                    mov     ecx, offset
                    call    inst$setstructfields
        }

        macro setstructfields2 offset* {
                    mov     ecx, offset
                    call    inst$setstructfields2
        }

        macro setstructfields4 offset* {
                    mov     ecx, offset
                    call    inst$setstructfields4
        }

        macro setstructfields8 offset* {
                    mov     ecx, offset
                    call    inst$setstructfields8
        }

        macro setstructfieldx offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldx
        }

        macro setstructfieldc offset* {
                    mov     ecx, offset
                    call    inst$setstructfieldc
        }
    ; </fold>

    ; <fold setarrayelement*>
        macro setarrayelementi {
                    call    inst$setarrayelementi
        }

        macro setarrayelementi2 {
                    call    inst$setarrayelementi2
        }

        macro setarrayelementi4 {
                    call    inst$setarrayelementi4
        }

        macro setarrayelementi8 {
                    call    inst$setarrayelementi8
        }

        macro setarrayelementl {
                    call    inst$setarrayelementl
        }

        macro setarrayelementl2 {
                    call    inst$setarrayelementl2
        }

        macro setarrayelementl4 {
                    call    inst$setarrayelementl4
        }

        macro setarrayelementl8 {
                    call    inst$setarrayelementl8
        }

        macro setarrayelementf {
                    call    inst$setarrayelementf
        }

        macro setarrayelementf2 {
                    call    inst$setarrayelementf2
        }

        macro setarrayelementf4 {
                    call    inst$setarrayelementf4
        }

        macro setarrayelementf8 {
                    call    inst$setarrayelementf8
        }

        macro setarrayelementd {
                    call    inst$setarrayelementd
        }

        macro setarrayelementd2 {
                    call    inst$setarrayelementd2
        }

        macro setarrayelementd4 {
                    call    inst$setarrayelementd4
        }

        macro setarrayelementd8 {
                    call    inst$setarrayelementd8
        }

        macro setarrayelementb {
                    call    inst$setarrayelementb
        }

        macro setarrayelementb2 {
                    call    inst$setarrayelementb2
        }

        macro setarrayelementb4 {
                    call    inst$setarrayelementb4
        }

        macro setarrayelementb8 {
                    call    inst$setarrayelementb8
        }

        macro setarrayelements {
                    call    inst$setarrayelements
        }

        macro setarrayelements2 {
                    call    inst$setarrayelements2
        }

        macro setarrayelements4 {
                    call    inst$setarrayelements4
        }

        macro setarrayelements8 {
                    call    inst$setarrayelements8
        }

        macro setarrayelementx {
                    call    inst$setarrayelementx
        }

        macro setarrayelementc {
                    call    inst$setarrayelementc
        }

        macro setarrayelementr {
                    invokespecial avt.lang.Object.01d$$awr$$int$avt.lang.Object$
        }
    ; </fold>

    ; <fold invokefinally>
        macro invokefinally blockLabel* {
                    call    blockLabel
        }
    ; </fold>

    ; <fold invokestatic*>
        macro stackcheck bytes {
            if(bytes eq)
                        mov     ecx, $20
            else
                        mov     ecx, bytes
            end if
                    call    inst$stackcheck
        }

        macro invokestatic methodFullName* {
                    stackcheck
                    call    methodFullName
        }

        macro invokestaticd methodFullName* {
                    invokestatic methodFullName
                    call    inst$resultpushd
        }

        macro invokestaticq methodFullName* {
                    invokestatic methodFullName
                    call    inst$resultpushq
        }

        macro invokestatict methodFullName* {
                    invokestatic methodFullName
                    call    inst$resultpusht
        }

        macro invokestaticx methodFullName* {
                    invokestatic methodFullName
                    call    inst$resultpushx
        }

        macro invokestaticy methodFullName* {
                    invokestatic methodFullName
                    call    inst$resultpushy
        }

        macro invokestaticz methodFullName* {
                    invokestatic methodFullName
                    call    inst$resultpushz
        }

        macro invokestaticr methodFullName* {
                    invokestatic methodFullName
                    call    inst$resultpushr
        }

        ; macro resultdiscard {
        ;             call    inst$resultdiscard
        ; }
    ; </fold>

    ; <fold invokespecial*>
        macro nullcheck offset* {
                    mov     ecx, offset
                    call    inst$nullcheck
        }

        macro invokespecial methodFullName* {
                    nullcheck methodFullName#.tag.arg-$01
                    invokestatic methodFullName
        }

        macro invokespeciald methodFullName* {
                    nullcheck methodFullName#.tag.arg-$01
                    invokestaticd methodFullName
        }

        macro invokespecialq methodFullName* {
                    nullcheck methodFullName#.tag.arg-$01
                    invokestaticq methodFullName
        }

        macro invokespecialt methodFullName* {
                    nullcheck methodFullName#.tag.arg-$01
                    invokestatict methodFullName
        }

        macro invokespecialx methodFullName* {
                    nullcheck methodFullName#.tag.arg-$01
                    invokestaticx methodFullName
        }

        macro invokespecialy methodFullName* {
                    nullcheck methodFullName#.tag.arg-$01
                    invokestaticy methodFullName
        }

        macro invokespecialz methodFullName* {
                    nullcheck methodFullName#.tag.arg-$01
                    invokestaticz methodFullName
        }

        macro invokespecialr methodFullName* {
                    nullcheck methodFullName#.tag.arg-$01
                    invokestaticr methodFullName
        }
    ; </fold>

    ; <fold invokevirtual*>
        macro virtualmethod virtualIndex* {
                    add     rax, [rax+avt.lang.Object$fldClassOffset]
                    movsxd  rcx, [rax+avt.lang.Class$fldVirtualsOffset]
                    lea     rax, [rax+rcx*1]
                    add     rax, [rax+virtualIndex*8]
        }

        macro invokevirtual methodFullName*, virtualIndex* {
                    nullcheck methodFullName#.tag.arg-$01
                    stackcheck
                    virtualmethod virtualIndex
                    call    rax
        }

        macro invokevirtuald methodFullName*, virtualIndex* {
                    invokevirtual methodFullName, virtualIndex
                    call    inst$resultpushd
        }

        macro invokevirtualq methodFullName*, virtualIndex* {
                    invokevirtual methodFullName, virtualIndex
                    call    inst$resultpushq
        }

        macro invokevirtualt methodFullName*, virtualIndex* {
                    invokevirtual methodFullName, virtualIndex
                    call    inst$resultpusht
        }

        macro invokevirtualx methodFullName*, virtualIndex* {
                    invokevirtual methodFullName, virtualIndex
                    call    inst$resultpushx
        }

        macro invokevirtualy methodFullName*, virtualIndex* {
                    invokevirtual methodFullName, virtualIndex
                    call    inst$resultpushy
        }

        macro invokevirtualz methodFullName*, virtualIndex* {
                    invokevirtual methodFullName, virtualIndex
                    call    inst$resultpushz
        }

        macro invokevirtualr methodFullName*, virtualIndex* {
                    invokevirtual methodFullName, virtualIndex
                    call    inst$resultpushr
        }
    ; </fold>

    ; <fold invokeservice*>
        macro servicemethod classFullName*, serviceIndex* {
                    add     rax, [rax+avt.lang.Object$fldClassOffset]
                    call    inst$rpush
                    rloadclass classFullName
                    iload   serviceIndex*$20
                    invokestatic avt.lang.Class$getServiceMethodEntryPoint$avt.lang.Class$int$
        }

        macro invokeservice classFullName*, methodShortName*, serviceIndex* {
                    nullcheck classFullName#$#methodShortName#.tag.arg-$01
                    servicemethod classFullName, serviceIndex
                    call    rax
        }

        macro invokeserviced classFullName*, methodShortName*, serviceIndex* {
                    invokeservice classFullName, methodShortName, serviceIndex
                    call    inst$resultpushd
        }

        macro invokeserviceq classFullName*, methodShortName*, serviceIndex* {
                    invokeservice classFullName, methodShortName, serviceIndex
                    call    inst$resultpushq
        }

        macro invokeservicet classFullName*, methodShortName*, serviceIndex* {
                    invokeservice classFullName, methodShortName, serviceIndex
                    call    inst$resultpusht
        }

        macro invokeservicex classFullName*, methodShortName*, serviceIndex* {
                    invokeservice classFullName, methodShortName, serviceIndex
                    call    inst$resultpushx
        }

        macro invokeservicey classFullName*, methodShortName*, serviceIndex* {
                    invokeservice classFullName, methodShortName, serviceIndex
                    call    inst$resultpushy
        }

        macro invokeservicez classFullName*, methodShortName*, serviceIndex* {
                    invokeservice classFullName, methodShortName, serviceIndex
                    call    inst$resultpushz
        }

        macro invokeservicer classFullName*, methodShortName*, serviceIndex* {
                    invokeservice classFullName, methodShortName, serviceIndex
                    call    inst$resultpushr
        }
    ; </fold>

    ; <fold jump*>
        macro jumpspecial methodFullName* {
                    local   .L.000
                    local   .L.001
            .L.000: jmp     methodFullName
            .L.001: nopvar  $20-(.L.001-.L.000)
        }

        macro jumpvirtual methodFullName*, virtualIndex* {
                    local   .L.000
                    local   .L.001
            .L.000: mov     rax, [rsp+methodFullName#.size.arg-$08]
                    virtualmethod virtualIndex
                    jmp     rax
            .L.001: nopvar  $20-(.L.001-.L.000)
        }
    ; </fold>

    ; <fold new*>
        macro newarray classFullName* {
                    lea     rax, [classFullName]
                    call    inst$rpull1
                    invokestaticr avt.lang.Class$allocateArray$int$
        }

        macro newmultiarray classFullName* {
                    lea     rax, [classFullName]
                    call    inst$rpull1
                    invokestaticr avt.lang.Class$allocateArray$int.01d$
        }

        macro newclass classFullName* {
                    rloadclass classFullName
                    invokestaticr avt.lang.Class$allocateInstance$
        }

        macro newvectori2 {
                    call    inst$newvectori2
        }

        macro newvectori4 {
                    call    inst$newvectori4
        }

        macro newvectori8 {
                    call    inst$newvectori8
        }

        macro newvectorl2 {
                    call    inst$newvectorl2
        }

        macro newvectorl4 {
                    call    inst$newvectorl4
        }

        macro newvectorl8 {
                    call    inst$newvectorl8
        }

        macro newvectorf2 {
                    call    inst$newvectorf2
        }

        macro newvectorf4 {
                    call    inst$newvectorf4
        }

        macro newvectorf8 {
                    call    inst$newvectorf8
        }

        macro newvectord2 {
                    call    inst$newvectord2
        }

        macro newvectord4 {
                    call    inst$newvectord4
        }

        macro newvectord8 {
                    call    inst$newvectord8
        }

        macro newvectorb2 {
                    call    inst$newvectorb2
        }

        macro newvectorb4 {
                    call    inst$newvectorb4
        }

        macro newvectorb8 {
                    call    inst$newvectorb8
        }

        macro newvectors2 {
                    call    inst$newvectors2
        }

        macro newvectors4 {
                    call    inst$newvectors4
        }

        macro newvectors8 {
                    call    inst$newvectors8
        }
    ; </fold>

    ; <fold dup*>
        macro dup1 {
                    call    inst$dup1
        }

        macro dup1x1 {
                    call    inst$dup1x1
        }

        macro dup1x2 {
                    call    inst$dup1x2
        }

        macro dup2 {
                    call    inst$dup2
        }
    ; </fold>

    ; <fold pop1>
        macro pop1 {
                    call    inst$pop1
        }
    ; </fold>

    ; <fold rmonitor*>
        macro rmonitorenter {
                    invokespecial avt.lang.Object$lock$
        }

        macro rmonitorleave {
                    invokespecial avt.lang.Object$unlock$
        }
    ; </fold>

    ; <fold re>
        macro re {
                    call    inst$re
        }
    ; </fold>

    ; <fold rne>
        macro rne {
                    call    inst$rne
        }
    ; </fold>

    ; <fold risnull>
        macro risnull {
                    call    inst$risnull
        }
    ; </fold>

    ; <fold risnotnull>
        macro risnotnull {
                    call    inst$risnotnull
        }
    ; </fold>

    ; <fold rinstanceof>
        macro rinstanceof classFullName* {
                    lea     rax, [classFullName]
                    call    inst$rpull1
                    invokestaticd avt.lang.Class$isInstance$avt.lang.Object$
        }
    ; </fold>

    ; <fold rcast>
        macro rcast classFullName* {
                    lea     rax, [classFullName]
                    call    inst$rpull1
                    invokestaticr avt.lang.Class$cast$avt.lang.Object$
        }
    ; </fold>

    ; <fold rthrow>
        macro rthrow {
                    call    inst$rthrow
        }
    ; </fold>

    ; <fold jmp>
        ; используется инструкция jmp
    ; </fold>

    ; <fold ijmp*>
        macro ijmpt lbl* {
                    call    inst$ipop
                    test    eax, eax
                    jnz     lbl
        }

        macro ijmpf lbl* {
                    call    inst$ipop
                    test    eax, eax
                    jz      lbl
        }

        macro ijmpg lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jg      lbl
        }

        macro ijmpge lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jge     lbl
        }

        macro ijmpl lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jl      lbl
        }

        macro ijmple lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jle     lbl
        }

        macro ijmpe lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    je      lbl
        }

        macro ijmpnt lbl* {
                    call    inst$ipop
                    test    eax, eax
                    jz      lbl
        }

        macro ijmpnf lbl* {
                    call    inst$ipop
                    test    eax, eax
                    jnz     lbl
        }

        macro ijmpng lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jng     lbl
        }

        macro ijmpnge lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jnge    lbl
        }

        macro ijmpnl lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jnl     lbl
        }

        macro ijmpnle lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jnle    lbl
        }

        macro ijmpne lbl* {
                    call    inst$ipop
                    cmp     eax, $00
                    jne     lbl
        }
    ; </fold>

    ; <fold iset*>
        macro isetg {
                    call    inst$ipeek
                    cmp     eax, $00
                    setg    al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isetge {
                    call    inst$ipeek
                    cmp     eax, $00
                    setge   al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isetl {
                    call    inst$ipeek
                    cmp     eax, $00
                    setl    al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isetle {
                    call    inst$ipeek
                    cmp     eax, $00
                    setle   al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isete {
                    call    inst$ipeek
                    cmp     eax, $00
                    sete    al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isetng {
                    call    inst$ipeek
                    cmp     eax, $00
                    setng   al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isetnge {
                    call    inst$ipeek
                    cmp     eax, $00
                    setnge  al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isetnl {
                    call    inst$ipeek
                    cmp     eax, $00
                    setnl   al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isetnle {
                    call    inst$ipeek
                    cmp     eax, $00
                    setnle  al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }

        macro isetne {
                    call    inst$ipeek
                    cmp     eax, $00
                    setne   al
                    movzx   eax, al
                    mov     dword[rsp], eax
        }
    ; </fold>

    ; <fold *to*>
        macro itob {
                    call    inst$itob
        }

        macro itos {
                    call    inst$itos
        }

        macro itoi2 {
                    call    inst$itoi2
        }

        macro itoi4 {
                    call    inst$itoi4
        }

        macro itoi8 {
                    call    inst$itoi8
        }

        macro itol {
                    call    inst$itol
        }

        macro itof {
                    call    inst$itof
        }

        macro itod {
                    call    inst$itod
        }

        macro itox {
                    call    inst$itox
        }

        macro itoc {
                    call    inst$itoc
        }

        macro i2tob2 {
                    call    inst$i2tob2
        }

        macro i2tos2 {
                    call    inst$i2tos2
        }

        macro i2toi {
                    call    inst$i2toi
        }

        macro i2toi4 {
                    call    inst$i2toi4
        }

        macro i2toi8 {
                    call    inst$i2toi8
        }

        macro i2tol2 {
                    call    inst$i2tol2
        }

        macro i2tof2 {
                    call    inst$i2tof2
        }

        macro i2tod2 {
                    call    inst$i2tod2
        }

        macro i4tob4 {
                    call    inst$i4tob4
        }

        macro i4tos4 {
                    call    inst$i4tos4
        }

        macro i4toi {
                    call    inst$i4toi
        }

        macro i4toi2 {
                    call    inst$i4toi2
        }

        macro i4toi8 {
                    call    inst$i4toi8
        }

        macro i4tol4 {
                    call    inst$i4tol4
        }

        macro i4tof4 {
                    call    inst$i4tof4
        }

        macro i4tod4 {
                    call    inst$i4tod4
        }

        macro i8tob8 {
                    call    inst$i8tob8
        }

        macro i8tos8 {
                    call    inst$i8tos8
        }

        macro i8toi {
                    call    inst$i8toi
        }

        macro i8toi2 {
                    call    inst$i8toi2
        }

        macro i8toi4 {
                    call    inst$i8toi4
        }

        macro i8tol8 {
                    call    inst$i8tol8
        }

        macro i8tof8 {
                    call    inst$i8tof8
        }

        macro i8tod8 {
                    call    inst$i8tod8
        }

        macro ltob {
                    call    inst$ltob
        }

        macro ltos {
                    call    inst$ltos
        }

        macro ltoi {
                    call    inst$ltoi
        }

        macro ltol2 {
                    call    inst$ltol2
        }

        macro ltol4 {
                    call    inst$ltol4
        }

        macro ltol8 {
                    call    inst$ltol8
        }

        macro ltof {
                    call    inst$ltof
        }

        macro ltod {
                    call    inst$ltod
        }

        macro ltox {
                    call    inst$ltox
        }

        macro l2tob2 {
                    call    inst$l2tob2
        }

        macro l2tos2 {
                    call    inst$l2tos2
        }

        macro l2toi2 {
                    call    inst$l2toi2
        }

        macro l2tol {
                    call    inst$l2tol
        }

        macro l2tol4 {
                    call    inst$l2tol4
        }

        macro l2tol8 {
                    call    inst$l2tol8
        }

        macro l2tof2 {
                    call    inst$l2tof2
        }

        macro l2tod2 {
                    call    inst$l2tod2
        }

        macro l4tob4 {
                    call    inst$l4tob4
        }

        macro l4tos4 {
                    call    inst$l4tos4
        }

        macro l4toi4 {
                    call    inst$l4toi4
        }

        macro l4tol {
                    call    inst$l4tol
        }

        macro l4tol2 {
                    call    inst$l4tol2
        }

        macro l4tol8 {
                    call    inst$l4tol8
        }

        macro l4tof4 {
                    call    inst$l4tof4
        }

        macro l4tod4 {
                    call    inst$l4tod4
        }

        macro l8tob8 {
                    call    inst$l8tob8
        }

        macro l8tos8 {
                    call    inst$l8tos8
        }

        macro l8toi8 {
                    call    inst$l8toi8
        }

        macro l8tol {
                    call    inst$l8tol
        }

        macro l8tol2 {
                    call    inst$l8tol2
        }

        macro l8tol4 {
                    call    inst$l8tol4
        }

        macro l8tof8 {
                    call    inst$l8tof8
        }

        macro l8tod8 {
                    call    inst$l8tod8
        }

        macro ftoi {
                    call    inst$ftoi
        }

        macro ftol {
                    call    inst$ftol
        }

        macro ftof2 {
                    call    inst$ftof2
        }

        macro ftof4 {
                    call    inst$ftof4
        }

        macro ftof8 {
                    call    inst$ftof8
        }

        macro ftod {
                    call    inst$ftod
        }

        macro ftox {
                    call    inst$ftox
        }

        macro f2toi2 {
                    call    inst$f2toi2
        }

        macro f2tol2 {
                    call    inst$f2tol2
        }

        macro f2tof {
                    call    inst$f2tof
        }

        macro f2tof4 {
                    call    inst$f2tof4
        }

        macro f2tof8 {
                    call    inst$f2tof8
        }

        macro f2tod2 {
                    call    inst$f2tod2
        }

        macro f4toi4 {
                    call    inst$f4toi4
        }

        macro f4tol4 {
                    call    inst$f4tol4
        }

        macro f4tof {
                    call    inst$f4tof
        }

        macro f4tof2 {
                    call    inst$f4tof2
        }

        macro f4tof8 {
                    call    inst$f4tof8
        }

        macro f4tod4 {
                    call    inst$f4tod4
        }

        macro f8toi8 {
                    call    inst$f8toi8
        }

        macro f8tol8 {
                    call    inst$f8tol8
        }

        macro f8tof {
                    call    inst$f8tof
        }

        macro f8tof2 {
                    call    inst$f8tof2
        }

        macro f8tof4 {
                    call    inst$f8tof4
        }

        macro f8tod8 {
                    call    inst$f8tod8
        }

        macro dtoi {
                    call    inst$dtoi
        }

        macro dtol {
                    call    inst$dtol
        }

        macro dtof {
                    call    inst$dtof
        }

        macro dtod2 {
                    call    inst$dtod2
        }

        macro dtod4 {
                    call    inst$dtod4
        }

        macro dtod8 {
                    call    inst$dtod8
        }

        macro dtox {
                    call    inst$dtox
        }

        macro d2toi2 {
                    call    inst$d2toi2
        }

        macro d2tol2 {
                    call    inst$d2tol2
        }

        macro d2tof2 {
                    call    inst$d2tof2
        }

        macro d2tod {
                    call    inst$d2tod
        }

        macro d2tod4 {
                    call    inst$d2tod4
        }

        macro d2tod8 {
                    call    inst$d2tod8
        }

        macro d4toi4 {
                    call    inst$d4toi4
        }

        macro d4tol4 {
                    call    inst$d4tol4
        }

        macro d4tof4 {
                    call    inst$d4tof4
        }

        macro d4tod {
                    call    inst$d4tod
        }

        macro d4tod2 {
                    call    inst$d4tod2
        }

        macro d4tod8 {
                    call    inst$d4tod8
        }

        macro d8toi8 {
                    call    inst$d8toi8
        }

        macro d8tol8 {
                    call    inst$d8tol8
        }

        macro d8tof8 {
                    call    inst$d8tof8
        }

        macro d8tod {
                    call    inst$d8tod
        }

        macro d8tod2 {
                    call    inst$d8tod2
        }

        macro d8tod4 {
                    call    inst$d8tod4
        }

        macro btob2 {
                    call    inst$btob2
        }

        macro btob4 {
                    call    inst$btob4
        }

        macro btob8 {
                    call    inst$btob8
        }

        macro btos {
                    call    inst$btos
        }

        macro btoi {
                    call    inst$btoi
        }

        macro btol {
                    call    inst$btol
        }

        macro b2tob {
                    call    inst$b2tob
        }

        macro b2tob4 {
                    call    inst$b2tob4
        }

        macro b2tob8 {
                    call    inst$b2tob8
        }

        macro b2tos2 {
                    call    inst$b2tos2
        }

        macro b2toi2 {
                    call    inst$b2toi2
        }

        macro b2tol2 {
                    call    inst$b2tol2
        }

        macro b4tob {
                    call    inst$b4tob
        }

        macro b4tob2 {
                    call    inst$b4tob2
        }

        macro b4tob8 {
                    call    inst$b4tob8
        }

        macro b4tos4 {
                    call    inst$b4tos4
        }

        macro b4toi4 {
                    call    inst$b4toi4
        }

        macro b4tol4 {
                    call    inst$b4tol4
        }

        macro b8tob {
                    call    inst$b8tob
        }

        macro b8tob2 {
                    call    inst$b8tob2
        }

        macro b8tob4 {
                    call    inst$b8tob4
        }

        macro b8tos8 {
                    call    inst$b8tos8
        }

        macro b8toi8 {
                    call    inst$b8toi8
        }

        macro b8tol8 {
                    call    inst$b8tol8
        }

        macro stob {
                    call    inst$stob
        }

        macro stos2 {
                    call    inst$stos2
        }

        macro stos4 {
                    call    inst$stos4
        }

        macro stos8 {
                    call    inst$stos8
        }

        macro stoi {
                    call    inst$stoi
        }

        macro stol {
                    call    inst$stol
        }

        macro s2tob2 {
                    call    inst$s2tob2
        }

        macro s2tos {
                    call    inst$s2tos
        }

        macro s2tos4 {
                    call    inst$s2tos4
        }

        macro s2tos8 {
                    call    inst$s2tos8
        }

        macro s2toi2 {
                    call    inst$s2toi2
        }

        macro s2tol2 {
                    call    inst$s2tol2
        }

        macro s4tob4 {
                    call    inst$s4tob4
        }

        macro s4tos {
                    call    inst$s4tos
        }

        macro s4tos2 {
                    call    inst$s4tos2
        }

        macro s4tos8 {
                    call    inst$s4tos8
        }

        macro s4toi4 {
                    call    inst$s4toi4
        }

        macro s4tol4 {
                    call    inst$s4tol4
        }

        macro s8tob8 {
                    call    inst$s8tob8
        }

        macro s8tos {
                    call    inst$s8tos
        }

        macro s8tos2 {
                    call    inst$s8tos2
        }

        macro s8tos4 {
                    call    inst$s8tos4
        }

        macro s8toi8 {
                    call    inst$s8toi8
        }

        macro s8tol8 {
                    call    inst$s8tol8
        }

        macro xtoi {
                    call    inst$xtoi
        }

        macro xtol {
                    call    inst$xtol
        }

        macro xtof {
                    call    inst$xtof
        }

        macro xtod {
                    call    inst$xtod
        }
    ; </fold>

    ; <fold *cmp*>
        macro icmp {
                    call    inst$icmp
        }

        macro lcmp {
                    call    inst$lcmp
        }

        macro fcmpg {
                    call    inst$fcmpg
        }

        macro fcmpl {
                    call    inst$fcmpl
        }

        macro dcmpg {
                    call    inst$dcmpg
        }

        macro dcmpl {
                    call    inst$dcmpl
        }

        macro xcmpg {
                    call    inst$xcmpg
        }

        macro xcmpl {
                    call    inst$xcmpl
        }
    ; </fold>

    ; <fold *se>
        macro i2se {
                    call    inst$i2se
        }

        macro i4se {
                    call    inst$i4se
        }

        macro i8se {
                    call    inst$i8se
        }

        macro l2se {
                    call    inst$l2se
        }

        macro l4se {
                    call    inst$l4se
        }

        macro l8se {
                    call    inst$l8se
        }

        macro f2se {
                    call    inst$f2se
        }

        macro f4se {
                    call    inst$f4se
        }

        macro f8se {
                    call    inst$f8se
        }

        macro d2se {
                    call    inst$d2se
        }

        macro d4se {
                    call    inst$d4se
        }

        macro d8se {
                    call    inst$d8se
        }

        macro b2se {
                    call    inst$b2se
        }

        macro b4se {
                    call    inst$b4se
        }

        macro b8se {
                    call    inst$b8se
        }

        macro s2se {
                    call    inst$s2se
        }

        macro s4se {
                    call    inst$s4se
        }

        macro s8se {
                    call    inst$s8se
        }
    ; </fold>

    ; <fold *sne>
        macro i2sne {
                    call    inst$i2sne
        }

        macro i4sne {
                    call    inst$i4sne
        }

        macro i8sne {
                    call    inst$i8sne
        }

        macro l2sne {
                    call    inst$l2sne
        }

        macro l4sne {
                    call    inst$l4sne
        }

        macro l8sne {
                    call    inst$l8sne
        }

        macro f2sne {
                    call    inst$f2sne
        }

        macro f4sne {
                    call    inst$f4sne
        }

        macro f8sne {
                    call    inst$f8sne
        }

        macro d2sne {
                    call    inst$d2sne
        }

        macro d4sne {
                    call    inst$d4sne
        }

        macro d8sne {
                    call    inst$d8sne
        }

        macro b2sne {
                    call    inst$b2sne
        }

        macro b4sne {
                    call    inst$b4sne
        }

        macro b8sne {
                    call    inst$b8sne
        }

        macro s2sne {
                    call    inst$s2sne
        }

        macro s4sne {
                    call    inst$s4sne
        }

        macro s8sne {
                    call    inst$s8sne
        }
    ; </fold>

    ; <fold *not>
        macro inot {
                    call    inst$inot
        }

        macro i2not {
                    call    inst$i2not
        }

        macro i4not {
                    call    inst$i4not
        }

        macro i8not {
                    call    inst$i8not
        }

        macro lnot {
                    call    inst$lnot
        }

        macro l2not {
                    call    inst$l2not
        }

        macro l4not {
                    call    inst$l4not
        }

        macro l8not {
                    call    inst$l8not
        }

        macro bnot {
                    call    inst$bnot
        }

        macro b2not {
                    call    inst$b2not
        }

        macro b4not {
                    call    inst$b4not
        }

        macro b8not {
                    call    inst$b8not
        }

        macro snot {
                    call    inst$snot
        }

        macro s2not {
                    call    inst$s2not
        }

        macro s4not {
                    call    inst$s4not
        }

        macro s8not {
                    call    inst$s8not
        }
    ; </fold>

    ; <fold *and>
        macro iand {
                    call    inst$iand
        }

        macro i2and {
                    call    inst$i2and
        }

        macro i4and {
                    call    inst$i4and
        }

        macro i8and {
                    call    inst$i8and
        }

        macro land {
                    call    inst$land
        }

        macro l2and {
                    call    inst$l2and
        }

        macro l4and {
                    call    inst$l4and
        }

        macro l8and {
                    call    inst$l8and
        }

        macro band {
                    call    inst$band
        }

        macro b2and {
                    call    inst$b2and
        }

        macro b4and {
                    call    inst$b4and
        }

        macro b8and {
                    call    inst$b8and
        }

        macro sand {
                    call    inst$sand
        }

        macro s2and {
                    call    inst$s2and
        }

        macro s4and {
                    call    inst$s4and
        }

        macro s8and {
                    call    inst$s8and
        }
    ; </fold>

    ; <fold *or>
        macro ior {
                    call    inst$ior
        }

        macro i2or {
                    call    inst$i2or
        }

        macro i4or {
                    call    inst$i4or
        }

        macro i8or {
                    call    inst$i8or
        }

        macro lor {
                    call    inst$lor
        }

        macro l2or {
                    call    inst$l2or
        }

        macro l4or {
                    call    inst$l4or
        }

        macro l8or {
                    call    inst$l8or
        }

        macro bor {
                    call    inst$bor
        }

        macro b2or {
                    call    inst$b2or
        }

        macro b4or {
                    call    inst$b4or
        }

        macro b8or {
                    call    inst$b8or
        }

        macro sor {
                    call    inst$sor
        }

        macro s2or {
                    call    inst$s2or
        }

        macro s4or {
                    call    inst$s4or
        }

        macro s8or {
                    call    inst$s8or
        }
    ; </fold>

    ; <fold *xor>
        macro ixor {
                    call    inst$ixor
        }

        macro i2xor {
                    call    inst$i2xor
        }

        macro i4xor {
                    call    inst$i4xor
        }

        macro i8xor {
                    call    inst$i8xor
        }

        macro lxor {
                    call    inst$lxor
        }

        macro l2xor {
                    call    inst$l2xor
        }

        macro l4xor {
                    call    inst$l4xor
        }

        macro l8xor {
                    call    inst$l8xor
        }

        macro bxor {
                    call    inst$bxor
        }

        macro b2xor {
                    call    inst$b2xor
        }

        macro b4xor {
                    call    inst$b4xor
        }

        macro b8xor {
                    call    inst$b8xor
        }

        macro sxor {
                    call    inst$sxor
        }

        macro s2xor {
                    call    inst$s2xor
        }

        macro s4xor {
                    call    inst$s4xor
        }

        macro s8xor {
                    call    inst$s8xor
        }
    ; </fold>

    ; <fold *sneg>
        macro isneg {
                    call    inst$isneg
        }

        macro i2sneg {
                    call    inst$i2sneg
        }

        macro i4sneg {
                    call    inst$i4sneg
        }

        macro i8sneg {
                    call    inst$i8sneg
        }

        macro lsneg {
                    call    inst$lsneg
        }

        macro l2sneg {
                    call    inst$l2sneg
        }

        macro l4sneg {
                    call    inst$l4sneg
        }

        macro l8sneg {
                    call    inst$l8sneg
        }

        macro fsneg {
                    call    inst$fsneg
        }

        macro f2sneg {
                    call    inst$f2sneg
        }

        macro f4sneg {
                    call    inst$f4sneg
        }

        macro f8sneg {
                    call    inst$f8sneg
        }

        macro dsneg {
                    call    inst$dsneg
        }

        macro d2sneg {
                    call    inst$d2sneg
        }

        macro d4sneg {
                    call    inst$d4sneg
        }

        macro d8sneg {
                    call    inst$d8sneg
        }

        macro b2sneg {
                    call    inst$b2sneg
        }

        macro b4sneg {
                    call    inst$b4sneg
        }

        macro b8sneg {
                    call    inst$b8sneg
        }

        macro s2sneg {
                    call    inst$s2sneg
        }

        macro s4sneg {
                    call    inst$s4sneg
        }

        macro s8sneg {
                    call    inst$s8sneg
        }

        macro xsneg {
                    call    inst$xsneg
        }
    ; </fold>

    ; <fold *smul>
        macro ismul {
                    call    inst$ismul
        }

        macro i2smul {
                    call    inst$i2smul
        }

        macro i4smul {
                    call    inst$i4smul
        }

        macro i8smul {
                    call    inst$i8smul
        }

        macro lsmul {
                    call    inst$lsmul
        }

        macro l2smul {
                    call    inst$l2smul
        }

        macro l4smul {
                    call    inst$l4smul
        }

        macro l8smul {
                    call    inst$l8smul
        }

        macro fsmul {
                    call    inst$fsmul
        }

        macro f2smul {
                    call    inst$f2smul
        }

        macro f4smul {
                    call    inst$f4smul
        }

        macro f8smul {
                    call    inst$f8smul
        }

        macro dsmul {
                    call    inst$dsmul
        }

        macro d2smul {
                    call    inst$d2smul
        }

        macro d4smul {
                    call    inst$d4smul
        }

        macro d8smul {
                    call    inst$d8smul
        }

        macro b2smul {
                    call    inst$b2smul
        }

        macro b4smul {
                    call    inst$b4smul
        }

        macro b8smul {
                    call    inst$b8smul
        }

        macro s2smul {
                    call    inst$s2smul
        }

        macro s4smul {
                    call    inst$s4smul
        }

        macro s8smul {
                    call    inst$s8smul
        }

        macro xsmul {
                    call    inst$xsmul
        }
    ; </fold>

    ; <fold *sdiv>
        macro isdiv {
                    call    inst$isdiv
        }

        macro lsdiv {
                    call    inst$lsdiv
        }

        macro fsdiv {
                    call    inst$fsdiv
        }

        macro f2sdiv {
                    call    inst$f2sdiv
        }

        macro f4sdiv {
                    call    inst$f4sdiv
        }

        macro f8sdiv {
                    call    inst$f8sdiv
        }

        macro dsdiv {
                    call    inst$dsdiv
        }

        macro d2sdiv {
                    call    inst$d2sdiv
        }

        macro d4sdiv {
                    call    inst$d4sdiv
        }

        macro d8sdiv {
                    call    inst$d8sdiv
        }

        macro xsdiv {
                    call    inst$xsdiv
        }
    ; </fold>

    ; <fold *sdivu>
        macro isdivu {
                    call    inst$isdivu
        }

        macro lsdivu {
                    call    inst$lsdivu
        }

        macro fsdivu {
                    call    inst$fsdivu
        }

        macro f2sdivu {
                    call    inst$f2sdivu
        }

        macro f4sdivu {
                    call    inst$f4sdivu
        }

        macro f8sdivu {
                    call    inst$f8sdivu
        }

        macro dsdivu {
                    call    inst$dsdivu
        }

        macro d2sdivu {
                    call    inst$d2sdivu
        }

        macro d4sdivu {
                    call    inst$d4sdivu
        }

        macro d8sdivu {
                    call    inst$d8sdivu
        }

        macro xsdivu {
                    call    inst$xsdivu
        }
    ; </fold>

    ; <fold *srem>
        macro isrem {
                    call    inst$isrem
        }

        macro lsrem {
                    call    inst$lsrem
        }

        macro fsrem {
                    call    inst$fsrem
        }

        macro dsrem {
                    call    inst$dsrem
        }

        macro xsrem {
                    call    inst$xsrem
        }
    ; </fold>

    ; <fold *sremu>
        macro isremu {
                    call    inst$isremu
        }

        macro lsremu {
                    call    inst$lsremu
        }

        macro fsremu {
                    call    inst$fsremu
        }

        macro dsremu {
                    call    inst$dsremu
        }

        macro xsremu {
                    call    inst$xsremu
        }
    ; </fold>

    ; <fold *sadd>
        macro isadd {
                    call    inst$isadd
        }

        macro i2sadd {
                    call    inst$i2sadd
        }

        macro i4sadd {
                    call    inst$i4sadd
        }

        macro i8sadd {
                    call    inst$i8sadd
        }

        macro lsadd {
                    call    inst$lsadd
        }

        macro l2sadd {
                    call    inst$l2sadd
        }

        macro l4sadd {
                    call    inst$l4sadd
        }

        macro l8sadd {
                    call    inst$l8sadd
        }

        macro fsadd {
                    call    inst$fsadd
        }

        macro f2sadd {
                    call    inst$f2sadd
        }

        macro f4sadd {
                    call    inst$f4sadd
        }

        macro f8sadd {
                    call    inst$f8sadd
        }

        macro dsadd {
                    call    inst$dsadd
        }

        macro d2sadd {
                    call    inst$d2sadd
        }

        macro d4sadd {
                    call    inst$d4sadd
        }

        macro d8sadd {
                    call    inst$d8sadd
        }

        macro b2sadd {
                    call    inst$b2sadd
        }

        macro b4sadd {
                    call    inst$b4sadd
        }

        macro b8sadd {
                    call    inst$b8sadd
        }

        macro s2sadd {
                    call    inst$s2sadd
        }

        macro s4sadd {
                    call    inst$s4sadd
        }

        macro s8sadd {
                    call    inst$s8sadd
        }

        macro xsadd {
                    call    inst$xsadd
        }
    ; </fold>

    ; <fold *ssub>
        macro issub {
                    call    inst$issub
        }

        macro i2ssub {
                    call    inst$i2ssub
        }

        macro i4ssub {
                    call    inst$i4ssub
        }

        macro i8ssub {
                    call    inst$i8ssub
        }

        macro lssub {
                    call    inst$lssub
        }

        macro l2ssub {
                    call    inst$l2ssub
        }

        macro l4ssub {
                    call    inst$l4ssub
        }

        macro l8ssub {
                    call    inst$l8ssub
        }

        macro fssub {
                    call    inst$fssub
        }

        macro f2ssub {
                    call    inst$f2ssub
        }

        macro f4ssub {
                    call    inst$f4ssub
        }

        macro f8ssub {
                    call    inst$f8ssub
        }

        macro dssub {
                    call    inst$dssub
        }

        macro d2ssub {
                    call    inst$d2ssub
        }

        macro d4ssub {
                    call    inst$d4ssub
        }

        macro d8ssub {
                    call    inst$d8ssub
        }

        macro b2ssub {
                    call    inst$b2ssub
        }

        macro b4ssub {
                    call    inst$b4ssub
        }

        macro b8ssub {
                    call    inst$b8ssub
        }

        macro s2ssub {
                    call    inst$s2ssub
        }

        macro s4ssub {
                    call    inst$s4ssub
        }

        macro s8ssub {
                    call    inst$s8ssub
        }

        macro xssub {
                    call    inst$xssub
        }
    ; </fold>

    ; <fold *ssar>
        macro issar {
                    call    inst$issar
        }

        macro i2ssar {
                    call    inst$i2ssar
        }

        macro i4ssar {
                    call    inst$i4ssar
        }

        macro i8ssar {
                    call    inst$i8ssar
        }

        macro lssar {
                    call    inst$lssar
        }

        macro l2ssar {
                    call    inst$l2ssar
        }

        macro l4ssar {
                    call    inst$l4ssar
        }

        macro l8ssar {
                    call    inst$l8ssar
        }

        macro b2ssar {
                    call    inst$b2ssar
        }

        macro b4ssar {
                    call    inst$b4ssar
        }

        macro b8ssar {
                    call    inst$b8ssar
        }

        macro s2ssar {
                    call    inst$s2ssar
        }

        macro s4ssar {
                    call    inst$s4ssar
        }

        macro s8ssar {
                    call    inst$s8ssar
        }
    ; </fold>

    ; <fold *ssal>
        macro issal {
                    call    inst$issal
        }

        macro i2ssal {
                    call    inst$i2ssal
        }

        macro i4ssal {
                    call    inst$i4ssal
        }

        macro i8ssal {
                    call    inst$i8ssal
        }

        macro lssal {
                    call    inst$lssal
        }

        macro l2ssal {
                    call    inst$l2ssal
        }

        macro l4ssal {
                    call    inst$l4ssal
        }

        macro l8ssal {
                    call    inst$l8ssal
        }

        macro b2ssal {
                    call    inst$b2ssal
        }

        macro b4ssal {
                    call    inst$b4ssal
        }

        macro b8ssal {
                    call    inst$b8ssal
        }

        macro s2ssal {
                    call    inst$s2ssal
        }

        macro s4ssal {
                    call    inst$s4ssal
        }

        macro s8ssal {
                    call    inst$s8ssal
        }
    ; </fold>

    ; <fold *sshr>
        macro isshr {
                    call    inst$isshr
        }

        macro i2sshr {
                    call    inst$i2sshr
        }

        macro i4sshr {
                    call    inst$i4sshr
        }

        macro i8sshr {
                    call    inst$i8sshr
        }

        macro lsshr {
                    call    inst$lsshr
        }

        macro l2sshr {
                    call    inst$l2sshr
        }

        macro l4sshr {
                    call    inst$l4sshr
        }

        macro l8sshr {
                    call    inst$l8sshr
        }

        macro b2sshr {
                    call    inst$b2sshr
        }

        macro b4sshr {
                    call    inst$b4sshr
        }

        macro b8sshr {
                    call    inst$b8sshr
        }

        macro s2sshr {
                    call    inst$s2sshr
        }

        macro s4sshr {
                    call    inst$s4sshr
        }

        macro s8sshr {
                    call    inst$s8sshr
        }
    ; </fold>

    ; <fold *vpack>
        macro ivpack {
                    call    inst$ivpack
        }

        macro i2vpack {
                    call    inst$i2vpack
        }

        macro i4vpack {
                    call    inst$i4vpack
        }

        macro i8vpack {
                    call    inst$i8vpack
        }

        macro lvpack {
                    call    inst$lvpack
        }

        macro l2vpack {
                    call    inst$l2vpack
        }

        macro l4vpack {
                    call    inst$l4vpack
        }

        macro l8vpack {
                    call    inst$l8vpack
        }

        macro svpack {
                    call    inst$svpack
        }

        macro s2vpack {
                    call    inst$s2vpack
        }

        macro s4vpack {
                    call    inst$s4vpack
        }

        macro s8vpack {
                    call    inst$s8vpack
        }
    ; </fold>

    ; <fold *vunpckl>
        macro ivunpckl {
                    call    inst$ivunpckl
        }

        macro i2vunpckl {
                    call    inst$i2vunpckl
        }

        macro i4vunpckl {
                    call    inst$i4vunpckl
        }

        macro i8vunpckl {
                    call    inst$i8vunpckl
        }

        macro bvunpckl {
                    call    inst$bvunpckl
        }

        macro b2vunpckl {
                    call    inst$b2vunpckl
        }

        macro b4vunpckl {
                    call    inst$b4vunpckl
        }

        macro b8vunpckl {
                    call    inst$b8vunpckl
        }

        macro svunpckl {
                    call    inst$svunpckl
        }

        macro s2vunpckl {
                    call    inst$s2vunpckl
        }

        macro s4vunpckl {
                    call    inst$s4vunpckl
        }

        macro s8vunpckl {
                    call    inst$s8vunpckl
        }
    ; </fold>

    ; <fold *vunpcku>
        macro ivunpcku {
                    call    inst$ivunpcku
        }

        macro i2vunpcku {
                    call    inst$i2vunpcku
        }

        macro i4vunpcku {
                    call    inst$i4vunpcku
        }

        macro i8vunpcku {
                    call    inst$i8vunpcku
        }

        macro bvunpcku {
                    call    inst$bvunpcku
        }

        macro b2vunpcku {
                    call    inst$b2vunpcku
        }

        macro b4vunpcku {
                    call    inst$b4vunpcku
        }

        macro b8vunpcku {
                    call    inst$b8vunpcku
        }

        macro svunpcku {
                    call    inst$svunpcku
        }

        macro s2vunpcku {
                    call    inst$s2vunpcku
        }

        macro s4vunpcku {
                    call    inst$s4vunpcku
        }

        macro s8vunpcku {
                    call    inst$s8vunpcku
        }
    ; </fold>

    ; <fold *vneg>
        macro ivneg {
                    call    inst$ivneg
        }

        macro i2vneg {
                    call    inst$i2vneg
        }

        macro i4vneg {
                    call    inst$i4vneg
        }

        macro i8vneg {
                    call    inst$i8vneg
        }

        macro lvneg {
                    call    inst$lvneg
        }

        macro l2vneg {
                    call    inst$l2vneg
        }

        macro l4vneg {
                    call    inst$l4vneg
        }

        macro l8vneg {
                    call    inst$l8vneg
        }

        macro fvneg {
                    call    inst$fvneg
        }

        macro f2vneg {
                    call    inst$f2vneg
        }

        macro f4vneg {
                    call    inst$f4vneg
        }

        macro f8vneg {
                    call    inst$f8vneg
        }

        macro dvneg {
                    call    inst$dvneg
        }

        macro d2vneg {
                    call    inst$d2vneg
        }

        macro d4vneg {
                    call    inst$d4vneg
        }

        macro d8vneg {
                    call    inst$d8vneg
        }

        macro bvneg {
                    call    inst$bvneg
        }

        macro b2vneg {
                    call    inst$b2vneg
        }

        macro b4vneg {
                    call    inst$b4vneg
        }

        macro b8vneg {
                    call    inst$b8vneg
        }

        macro svneg {
                    call    inst$svneg
        }

        macro s2vneg {
                    call    inst$s2vneg
        }

        macro s4vneg {
                    call    inst$s4vneg
        }

        macro s8vneg {
                    call    inst$s8vneg
        }
    ; </fold>

    ; <fold *vmul>
        macro ivmul {
                    call    inst$ivmul
        }

        macro i2vmul {
                    call    inst$i2vmul
        }

        macro i4vmul {
                    call    inst$i4vmul
        }

        macro i8vmul {
                    call    inst$i8vmul
        }

        macro lvmul {
                    call    inst$lvmul
        }

        macro l2vmul {
                    call    inst$l2vmul
        }

        macro l4vmul {
                    call    inst$l4vmul
        }

        macro l8vmul {
                    call    inst$l8vmul
        }

        macro fvmul {
                    call    inst$fvmul
        }

        macro f2vmul {
                    call    inst$f2vmul
        }

        macro f4vmul {
                    call    inst$f4vmul
        }

        macro f8vmul {
                    call    inst$f8vmul
        }

        macro dvmul {
                    call    inst$dvmul
        }

        macro d2vmul {
                    call    inst$d2vmul
        }

        macro d4vmul {
                    call    inst$d4vmul
        }

        macro d8vmul {
                    call    inst$d8vmul
        }

        macro bvmul {
                    call    inst$bvmul
        }

        macro b2vmul {
                    call    inst$b2vmul
        }

        macro b4vmul {
                    call    inst$b4vmul
        }

        macro b8vmul {
                    call    inst$b8vmul
        }

        macro svmul {
                    call    inst$svmul
        }

        macro s2vmul {
                    call    inst$s2vmul
        }

        macro s4vmul {
                    call    inst$s4vmul
        }

        macro s8vmul {
                    call    inst$s8vmul
        }
    ; </fold>

    ; <fold *vdiv>
        macro fvdiv {
                    call    inst$fvdiv
        }

        macro f2vdiv {
                    call    inst$f2vdiv
        }

        macro f4vdiv {
                    call    inst$f4vdiv
        }

        macro f8vdiv {
                    call    inst$f8vdiv
        }

        macro dvdiv {
                    call    inst$dvdiv
        }

        macro d2vdiv {
                    call    inst$d2vdiv
        }

        macro d4vdiv {
                    call    inst$d4vdiv
        }

        macro d8vdiv {
                    call    inst$d8vdiv
        }
    ; </fold>

    ; <fold *vadd>
        macro ivadd {
                    call    inst$ivadd
        }

        macro i2vadd {
                    call    inst$i2vadd
        }

        macro i4vadd {
                    call    inst$i4vadd
        }

        macro i8vadd {
                    call    inst$i8vadd
        }

        macro lvadd {
                    call    inst$lvadd
        }

        macro l2vadd {
                    call    inst$l2vadd
        }

        macro l4vadd {
                    call    inst$l4vadd
        }

        macro l8vadd {
                    call    inst$l8vadd
        }

        macro fvadd {
                    call    inst$fvadd
        }

        macro f2vadd {
                    call    inst$f2vadd
        }

        macro f4vadd {
                    call    inst$f4vadd
        }

        macro f8vadd {
                    call    inst$f8vadd
        }

        macro dvadd {
                    call    inst$dvadd
        }

        macro d2vadd {
                    call    inst$d2vadd
        }

        macro d4vadd {
                    call    inst$d4vadd
        }

        macro d8vadd {
                    call    inst$d8vadd
        }

        macro bvadd {
                    call    inst$bvadd
        }

        macro b2vadd {
                    call    inst$b2vadd
        }

        macro b4vadd {
                    call    inst$b4vadd
        }

        macro b8vadd {
                    call    inst$b8vadd
        }

        macro svadd {
                    call    inst$svadd
        }

        macro s2vadd {
                    call    inst$s2vadd
        }

        macro s4vadd {
                    call    inst$s4vadd
        }

        macro s8vadd {
                    call    inst$s8vadd
        }
    ; </fold>

    ; <fold *vsub>
        macro ivsub {
                    call    inst$ivsub
        }

        macro i2vsub {
                    call    inst$i2vsub
        }

        macro i4vsub {
                    call    inst$i4vsub
        }

        macro i8vsub {
                    call    inst$i8vsub
        }

        macro lvsub {
                    call    inst$lvsub
        }

        macro l2vsub {
                    call    inst$l2vsub
        }

        macro l4vsub {
                    call    inst$l4vsub
        }

        macro l8vsub {
                    call    inst$l8vsub
        }

        macro fvsub {
                    call    inst$fvsub
        }

        macro f2vsub {
                    call    inst$f2vsub
        }

        macro f4vsub {
                    call    inst$f4vsub
        }

        macro f8vsub {
                    call    inst$f8vsub
        }

        macro dvsub {
                    call    inst$dvsub
        }

        macro d2vsub {
                    call    inst$d2vsub
        }

        macro d4vsub {
                    call    inst$d4vsub
        }

        macro d8vsub {
                    call    inst$d8vsub
        }

        macro bvsub {
                    call    inst$bvsub
        }

        macro b2vsub {
                    call    inst$b2vsub
        }

        macro b4vsub {
                    call    inst$b4vsub
        }

        macro b8vsub {
                    call    inst$b8vsub
        }

        macro svsub {
                    call    inst$svsub
        }

        macro s2vsub {
                    call    inst$s2vsub
        }

        macro s4vsub {
                    call    inst$s4vsub
        }

        macro s8vsub {
                    call    inst$s8vsub
        }
    ; </fold>

    ; <fold *vsar>
        macro ivsar {
                    call    inst$ivsar
        }

        macro i2vsar {
                    call    inst$i2vsar
        }

        macro i4vsar {
                    call    inst$i4vsar
        }

        macro i8vsar {
                    call    inst$i8vsar
        }

        macro lvsar {
                    call    inst$lvsar
        }

        macro l2vsar {
                    call    inst$l2vsar
        }

        macro l4vsar {
                    call    inst$l4vsar
        }

        macro l8vsar {
                    call    inst$l8vsar
        }

        macro bvsar {
                    call    inst$bvsar
        }

        macro b2vsar {
                    call    inst$b2vsar
        }

        macro b4vsar {
                    call    inst$b4vsar
        }

        macro b8vsar {
                    call    inst$b8vsar
        }

        macro svsar {
                    call    inst$svsar
        }

        macro s2vsar {
                    call    inst$s2vsar
        }

        macro s4vsar {
                    call    inst$s4vsar
        }

        macro s8vsar {
                    call    inst$s8vsar
        }
    ; </fold>

    ; <fold *vsal>
        macro ivsal {
                    call    inst$ivsal
        }

        macro i2vsal {
                    call    inst$i2vsal
        }

        macro i4vsal {
                    call    inst$i4vsal
        }

        macro i8vsal {
                    call    inst$i8vsal
        }

        macro lvsal {
                    call    inst$lvsal
        }

        macro l2vsal {
                    call    inst$l2vsal
        }

        macro l4vsal {
                    call    inst$l4vsal
        }

        macro l8vsal {
                    call    inst$l8vsal
        }

        macro bvsal {
                    call    inst$bvsal
        }

        macro b2vsal {
                    call    inst$b2vsal
        }

        macro b4vsal {
                    call    inst$b4vsal
        }

        macro b8vsal {
                    call    inst$b8vsal
        }

        macro svsal {
                    call    inst$svsal
        }

        macro s2vsal {
                    call    inst$s2vsal
        }

        macro s4vsal {
                    call    inst$s4vsal
        }

        macro s8vsal {
                    call    inst$s8vsal
        }
    ; </fold>

    ; <fold *vshr>
        macro ivshr {
                    call    inst$ivshr
        }

        macro i2vshr {
                    call    inst$i2vshr
        }

        macro i4vshr {
                    call    inst$i4vshr
        }

        macro i8vshr {
                    call    inst$i8vshr
        }

        macro lvshr {
                    call    inst$lvshr
        }

        macro l2vshr {
                    call    inst$l2vshr
        }

        macro l4vshr {
                    call    inst$l4vshr
        }

        macro l8vshr {
                    call    inst$l8vshr
        }

        macro bvshr {
                    call    inst$bvshr
        }

        macro b2vshr {
                    call    inst$b2vshr
        }

        macro b4vshr {
                    call    inst$b4vshr
        }

        macro b8vshr {
                    call    inst$b8vshr
        }

        macro svshr {
                    call    inst$svshr
        }

        macro s2vshr {
                    call    inst$s2vshr
        }

        macro s4vshr {
                    call    inst$s4vshr
        }

        macro s8vshr {
                    call    inst$s8vshr
        }
    ; </fold>

    ; <fold *vg>
        macro ivg {
                    call    inst$ivg
        }

        macro i2vg {
                    call    inst$i2vg
        }

        macro i4vg {
                    call    inst$i4vg
        }

        macro i8vg {
                    call    inst$i8vg
        }

        macro lvg {
                    call    inst$lvg
        }

        macro l2vg {
                    call    inst$l2vg
        }

        macro l4vg {
                    call    inst$l4vg
        }

        macro l8vg {
                    call    inst$l8vg
        }

        macro fvg {
                    call    inst$fvg
        }

        macro f2vg {
                    call    inst$f2vg
        }

        macro f4vg {
                    call    inst$f4vg
        }

        macro f8vg {
                    call    inst$f8vg
        }

        macro dvg {
                    call    inst$dvg
        }

        macro d2vg {
                    call    inst$d2vg
        }

        macro d4vg {
                    call    inst$d4vg
        }

        macro d8vg {
                    call    inst$d8vg
        }

        macro bvg {
                    call    inst$bvg
        }

        macro b2vg {
                    call    inst$b2vg
        }

        macro b4vg {
                    call    inst$b4vg
        }

        macro b8vg {
                    call    inst$b8vg
        }

        macro svg {
                    call    inst$svg
        }

        macro s2vg {
                    call    inst$s2vg
        }

        macro s4vg {
                    call    inst$s4vg
        }

        macro s8vg {
                    call    inst$s8vg
        }
    ; </fold>

    ; <fold *vge>
        macro ivge {
                    call    inst$ivge
        }

        macro i2vge {
                    call    inst$i2vge
        }

        macro i4vge {
                    call    inst$i4vge
        }

        macro i8vge {
                    call    inst$i8vge
        }

        macro lvge {
                    call    inst$lvge
        }

        macro l2vge {
                    call    inst$l2vge
        }

        macro l4vge {
                    call    inst$l4vge
        }

        macro l8vge {
                    call    inst$l8vge
        }

        macro fvge {
                    call    inst$fvge
        }

        macro f2vge {
                    call    inst$f2vge
        }

        macro f4vge {
                    call    inst$f4vge
        }

        macro f8vge {
                    call    inst$f8vge
        }

        macro dvge {
                    call    inst$dvge
        }

        macro d2vge {
                    call    inst$d2vge
        }

        macro d4vge {
                    call    inst$d4vge
        }

        macro d8vge {
                    call    inst$d8vge
        }

        macro bvge {
                    call    inst$bvge
        }

        macro b2vge {
                    call    inst$b2vge
        }

        macro b4vge {
                    call    inst$b4vge
        }

        macro b8vge {
                    call    inst$b8vge
        }

        macro svge {
                    call    inst$svge
        }

        macro s2vge {
                    call    inst$s2vge
        }

        macro s4vge {
                    call    inst$s4vge
        }

        macro s8vge {
                    call    inst$s8vge
        }
    ; </fold>

    ; <fold *vl>
        macro ivl {
                    call    inst$ivl
        }

        macro i2vl {
                    call    inst$i2vl
        }

        macro i4vl {
                    call    inst$i4vl
        }

        macro i8vl {
                    call    inst$i8vl
        }

        macro lvl {
                    call    inst$lvl
        }

        macro l2vl {
                    call    inst$l2vl
        }

        macro l4vl {
                    call    inst$l4vl
        }

        macro l8vl {
                    call    inst$l8vl
        }

        macro fvl {
                    call    inst$fvl
        }

        macro f2vl {
                    call    inst$f2vl
        }

        macro f4vl {
                    call    inst$f4vl
        }

        macro f8vl {
                    call    inst$f8vl
        }

        macro dvl {
                    call    inst$dvl
        }

        macro d2vl {
                    call    inst$d2vl
        }

        macro d4vl {
                    call    inst$d4vl
        }

        macro d8vl {
                    call    inst$d8vl
        }

        macro bvl {
                    call    inst$bvl
        }

        macro b2vl {
                    call    inst$b2vl
        }

        macro b4vl {
                    call    inst$b4vl
        }

        macro b8vl {
                    call    inst$b8vl
        }

        macro svl {
                    call    inst$svl
        }

        macro s2vl {
                    call    inst$s2vl
        }

        macro s4vl {
                    call    inst$s4vl
        }

        macro s8vl {
                    call    inst$s8vl
        }
    ; </fold>

    ; <fold *vle>
        macro ivle {
                    call    inst$ivle
        }

        macro i2vle {
                    call    inst$i2vle
        }

        macro i4vle {
                    call    inst$i4vle
        }

        macro i8vle {
                    call    inst$i8vle
        }

        macro lvle {
                    call    inst$lvle
        }

        macro l2vle {
                    call    inst$l2vle
        }

        macro l4vle {
                    call    inst$l4vle
        }

        macro l8vle {
                    call    inst$l8vle
        }

        macro fvle {
                    call    inst$fvle
        }

        macro f2vle {
                    call    inst$f2vle
        }

        macro f4vle {
                    call    inst$f4vle
        }

        macro f8vle {
                    call    inst$f8vle
        }

        macro dvle {
                    call    inst$dvle
        }

        macro d2vle {
                    call    inst$d2vle
        }

        macro d4vle {
                    call    inst$d4vle
        }

        macro d8vle {
                    call    inst$d8vle
        }

        macro bvle {
                    call    inst$bvle
        }

        macro b2vle {
                    call    inst$b2vle
        }

        macro b4vle {
                    call    inst$b4vle
        }

        macro b8vle {
                    call    inst$b8vle
        }

        macro svle {
                    call    inst$svle
        }

        macro s2vle {
                    call    inst$s2vle
        }

        macro s4vle {
                    call    inst$s4vle
        }

        macro s8vle {
                    call    inst$s8vle
        }
    ; </fold>

    ; <fold *ve>
        macro ive {
                    call    inst$ive
        }

        macro i2ve {
                    call    inst$i2ve
        }

        macro i4ve {
                    call    inst$i4ve
        }

        macro i8ve {
                    call    inst$i8ve
        }

        macro lve {
                    call    inst$lve
        }

        macro l2ve {
                    call    inst$l2ve
        }

        macro l4ve {
                    call    inst$l4ve
        }

        macro l8ve {
                    call    inst$l8ve
        }

        macro fve {
                    call    inst$fve
        }

        macro f2ve {
                    call    inst$f2ve
        }

        macro f4ve {
                    call    inst$f4ve
        }

        macro f8ve {
                    call    inst$f8ve
        }

        macro dve {
                    call    inst$dve
        }

        macro d2ve {
                    call    inst$d2ve
        }

        macro d4ve {
                    call    inst$d4ve
        }

        macro d8ve {
                    call    inst$d8ve
        }

        macro bve {
                    call    inst$bve
        }

        macro b2ve {
                    call    inst$b2ve
        }

        macro b4ve {
                    call    inst$b4ve
        }

        macro b8ve {
                    call    inst$b8ve
        }

        macro sve {
                    call    inst$sve
        }

        macro s2ve {
                    call    inst$s2ve
        }

        macro s4ve {
                    call    inst$s4ve
        }

        macro s8ve {
                    call    inst$s8ve
        }
    ; </fold>

    ; <fold *vne>
        macro ivne {
                    call    inst$ivne
        }

        macro i2vne {
                    call    inst$i2vne
        }

        macro i4vne {
                    call    inst$i4vne
        }

        macro i8vne {
                    call    inst$i8vne
        }

        macro lvne {
                    call    inst$lvne
        }

        macro l2vne {
                    call    inst$l2vne
        }

        macro l4vne {
                    call    inst$l4vne
        }

        macro l8vne {
                    call    inst$l8vne
        }

        macro fvne {
                    call    inst$fvne
        }

        macro f2vne {
                    call    inst$f2vne
        }

        macro f4vne {
                    call    inst$f4vne
        }

        macro f8vne {
                    call    inst$f8vne
        }

        macro dvne {
                    call    inst$dvne
        }

        macro d2vne {
                    call    inst$d2vne
        }

        macro d4vne {
                    call    inst$d4vne
        }

        macro d8vne {
                    call    inst$d8vne
        }

        macro bvne {
                    call    inst$bvne
        }

        macro b2vne {
                    call    inst$b2vne
        }

        macro b4vne {
                    call    inst$b4vne
        }

        macro b8vne {
                    call    inst$b8vne
        }

        macro svne {
                    call    inst$svne
        }

        macro s2vne {
                    call    inst$s2vne
        }

        macro s4vne {
                    call    inst$s4vne
        }

        macro s8vne {
                    call    inst$s8vne
        }
    ; </fold>

    ; <fold *vmuls>
        macro bvmuls {
                    call    inst$bvmuls
        }

        macro b2vmuls {
                    call    inst$b2vmuls
        }

        macro b4vmuls {
                    call    inst$b4vmuls
        }

        macro b8vmuls {
                    call    inst$b8vmuls
        }

        macro svmuls {
                    call    inst$svmuls
        }

        macro s2vmuls {
                    call    inst$s2vmuls
        }

        macro s4vmuls {
                    call    inst$s4vmuls
        }

        macro s8vmuls {
                    call    inst$s8vmuls
        }
    ; </fold>

    ; <fold *vadds>
        macro bvadds {
                    call    inst$bvadds
        }

        macro b2vadds {
                    call    inst$b2vadds
        }

        macro b4vadds {
                    call    inst$b4vadds
        }

        macro b8vadds {
                    call    inst$b8vadds
        }

        macro svadds {
                    call    inst$svadds
        }

        macro s2vadds {
                    call    inst$s2vadds
        }

        macro s4vadds {
                    call    inst$s4vadds
        }

        macro s8vadds {
                    call    inst$s8vadds
        }
    ; </fold>

    ; <fold *vsubs>
        macro bvsubs {
                    call    inst$bvsubs
        }

        macro b2vsubs {
                    call    inst$b2vsubs
        }

        macro b4vsubs {
                    call    inst$b4vsubs
        }

        macro b8vsubs {
                    call    inst$b8vsubs
        }

        macro svsubs {
                    call    inst$svsubs
        }

        macro s2vsubs {
                    call    inst$s2vsubs
        }

        macro s4vsubs {
                    call    inst$s4vsubs
        }

        macro s8vsubs {
                    call    inst$s8vsubs
        }
    ; </fold>

    ; <fold *vmulu>
        macro bvmulu {
                    call    inst$bvmulu
        }

        macro b2vmulu {
                    call    inst$b2vmulu
        }

        macro b4vmulu {
                    call    inst$b4vmulu
        }

        macro b8vmulu {
                    call    inst$b8vmulu
        }

        macro svmulu {
                    call    inst$svmulu
        }

        macro s2vmulu {
                    call    inst$s2vmulu
        }

        macro s4vmulu {
                    call    inst$s4vmulu
        }

        macro s8vmulu {
                    call    inst$s8vmulu
        }
    ; </fold>

    ; <fold *vaddu>
        macro bvaddu {
                    call    inst$bvaddu
        }

        macro b2vaddu {
                    call    inst$b2vaddu
        }

        macro b4vaddu {
                    call    inst$b4vaddu
        }

        macro b8vaddu {
                    call    inst$b8vaddu
        }

        macro svaddu {
                    call    inst$svaddu
        }

        macro s2vaddu {
                    call    inst$s2vaddu
        }

        macro s4vaddu {
                    call    inst$s4vaddu
        }

        macro s8vaddu {
                    call    inst$s8vaddu
        }
    ; </fold>

    ; <fold *vsubu>
        macro bvsubu {
                    call    inst$bvsubu
        }

        macro b2vsubu {
                    call    inst$b2vsubu
        }

        macro b4vsubu {
                    call    inst$b4vsubu
        }

        macro b8vsubu {
                    call    inst$b8vsubu
        }

        macro svsubu {
                    call    inst$svsubu
        }

        macro s2vsubu {
                    call    inst$s2vsubu
        }

        macro s4vsubu {
                    call    inst$s4vsubu
        }

        macro s8vsubu {
                    call    inst$s8vsubu
        }
    ; </fold>

    ; <fold exception handler (rax = pointer to exception instance, rcx = pointer to exception instruction)>
        macro eenter {
                    lea     rcx, [rcx-$01]
                    lea     rdx, [rbp-.size.loc]
                    call    inst$exceptionenter
        }

        macro tryblock beginLabel*, endLabel*, nextLabel* {
                    lea     rdx, [beginLabel]
                    cmp     rcx, rdx
                    jl      nextLabel
                    lea     rdx, [endLabel]
                    cmp     rcx, rdx
                    jge     nextLabel
        }

        macro catchblock classFullName*, catchBlockLabel* {
                    lea     rdx, [classFullName]
                    call    inst$exceptionisclass
                    test    edx, edx
                    jnz     catchBlockLabel
        }

        macro finallyblock finallyBlockLabel* {
                    call    inst$finallyprepare
                    call    finallyBlockLabel
                    call    inst$finallyrestore
        }

        macro eleave {
                    call    inst$exceptionleave
            .D.END:
        }
    ; </fold>
; </fold>