| .globl func_add1, func_add1_end |
| .proc func_add1 |
| func_add1: |
| {.mib; add r8 = 1, r32 |
| nop.i 0 |
| br.ret.sptk.many rp |
| } |
| func_add1_end: |
| .endp func_add1 |
| |
| .globl func_add3, func_add3_end |
| .proc func_add3 |
| func_add3: |
| {.mmi; alloc loc0 = ar.pfs, 2, 1, 2, 0 |
| mov r2 = sp |
| add sp = -16, sp |
| } ;; |
| {.mii; ld8 r8 = [in1], 8 // load the function pointer |
| mov r3 = rp |
| mov rp = loc0 // trash rp |
| } ;; |
| {.mmi; ld8 r9 = [r8], 8 // load the entry-point |
| st8 [r2] = r3 |
| mov out0 = in0 |
| } ;; |
| {.mii; ld8 gp = [r8] // load the gp |
| mov b6 = r9 |
| mov out1 = in1 |
| } |
| {.mib; nop 0 |
| nop 0 |
| br.call.sptk rp = b6 |
| } |
| {.mmi; add r2 = 16, sp |
| ;; |
| ld8 r3 = [r2] // r3 = saved rp |
| mov ar.pfs = loc0 |
| } ;; |
| {.mii; nop 0 |
| mov rp = r3 |
| adds sp = 16, sp |
| } ;; |
| {.mib; st8 [sp] = in0 // trash rp save location |
| add r8 = 2, r8 |
| br.ret.sptk.many rp |
| } |
| func_add3_end: |
| .endp func_add3 |
| |
| .globl func_vframe, func_vframe_end |
| .proc func_vframe |
| func_vframe: |
| {.mii; alloc r16 = ar.pfs, 1, 2, 0, 0 // 0 |
| mov loc0 = rp |
| mov loc1 = sp |
| } ;; |
| {.mmi; sub sp = sp, in0 |
| st8 [loc1] = r16 |
| mov r2 = -99 // 0 |
| } ;; |
| {.mii; nop 0 |
| mov rp = r2 |
| mov ar.pfs = r0 |
| } |
| {.mib; mov r16 = r2 |
| tbit.nz p6, p0 = in0, 4 |
| (p6) br.cond.sptk.many .exit |
| } ;; |
| {.mmi; ld8 r16 = [loc1] |
| ;; |
| mov r3 = loc0 // 8 move saved rp to r3 |
| mov ar.pfs = r16 |
| } ;; |
| {.mmi; mov sp = loc1 // 10 |
| st8 [loc1] = r0 // trash saved pfs |
| mov loc0 = r2 |
| } ;; |
| {.mib; mov r8 = 10 |
| mov rp = r3 |
| br.ret.sptk.many rp |
| } |
| .exit: |
| {.mmi; ld8 r16 = [loc1] |
| ;; |
| sub sp = 32, sp |
| mov ar.pfs = r16 |
| } ;; |
| {.mmi; mov sp = loc1 |
| st8 [loc1] = r0 // trash saved pfs |
| mov rp = loc0 |
| } |
| {.mib; nop 0 |
| mov r8 = 4 |
| br.ret.sptk.many rp |
| } |
| func_vframe_end: |
| .endp func_vframe |