.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 #ifdef __linux__ /* We do not need executable stack. */ .section .note.GNU-stack,"",@progbits #endif