You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
1.7 KiB
102 lines
1.7 KiB
.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
|
|
|