Type: refactor
Change-Id: I2acbd864186c1d7694701c047ba72f58750a8558
Signed-off-by: Damjan Marion <damarion@cisco.com>
/* Save SP after return. */
leaq 8(%rsp), %rdx
movq %rdx, 8*6(%rdi)
/* Save SP after return. */
leaq 8(%rsp), %rdx
movq %rdx, 8*6(%rdi)
/* Save PC we are returning to from stack frame. */
movq 0(%rsp), %rax
movq %rax, 8*7(%rdi)
/* Save PC we are returning to from stack frame. */
movq 0(%rsp), %rax
movq %rax, 8*7(%rdi)
/* Give back user's return value. */
movq %rsi, %rax
ret
/* Give back user's return value. */
movq %rsi, %rax
ret
.global cdecl(clib_longjmp)
.align 4
#ifndef __APPLE__
.type cdecl(clib_longjmp), @function
#endif
.global cdecl(clib_longjmp)
.align 4
#ifndef __APPLE__
.type cdecl(clib_longjmp), @function
#endif
/* Restore regs. */
movq 8*0(%rdi), %rbx
movq 8*1(%rdi), %rbp
/* Restore regs. */
movq 8*0(%rdi), %rbx
movq 8*1(%rdi), %rbp
movq 8*5(%rdi), %r15
movq 8*6(%rdi), %rsp
movq 8*7(%rdi), %rdx
movq 8*5(%rdi), %r15
movq 8*6(%rdi), %rsp
movq 8*7(%rdi), %rdx
/* Give back user's return value. */
movq %rsi, %rax
/* Give back user's return value. */
movq %rsi, %rax
.global cdecl(clib_calljmp)
.align 4
#ifndef __APPLE__
.global cdecl(clib_calljmp)
.align 4
#ifndef __APPLE__
movq %rdx, %rax
andq $0xf, %rax
subq %rax, %rdx
movq %rdx, %rax
andq $0xf, %rax
subq %rax, %rdx
/* Get return address. */
pop %rax
/* Get return address. */
pop %rax
/* Switch to new stack. */
xchgq %rsp, %rdx
/* Switch to new stack. */
xchgq %rsp, %rdx
/* Save return address on new stack. */
push %rax
/* Save return address on new stack. */
push %rax
/* Save old stack pointer on new stack. */
push %rdx
/* Save old stack pointer on new stack. */
push %rdx
/* Get function. */
movq %rdi, %rdx
/* Get function. */
movq %rdi, %rdx
/* Move argument into place. */
movq %rsi, %rdi
/* Move argument into place. */
movq %rsi, %rdi
/* Away we go. */
callq *%rdx
/* Away we go. */
callq *%rdx
/* Switch back to old stack. */
movq 8(%rsp), %rdx
movq 0(%rsp), %rcx
xchgq %rcx, %rsp
/* Switch back to old stack. */
movq 8(%rsp), %rdx
movq 0(%rsp), %rcx
xchgq %rcx, %rsp
/* Return to caller. */
jmpq *%rdx
/* Return to caller. */
jmpq *%rdx
.type cdecl(clib_setjmp), @function
cdecl(clib_setjmp):
movl 4(%esp), %ecx
.type cdecl(clib_setjmp), @function
cdecl(clib_setjmp):
movl 4(%esp), %ecx
movl %ebp, 4*0(%ecx)
movl %ebx, 4*1(%ecx)
movl %edi, 4*2(%ecx)
movl %ebp, 4*0(%ecx)
movl %ebx, 4*1(%ecx)
movl %edi, 4*2(%ecx)
/* Save SP after return. */
leal 4(%esp), %edx
movl %edx, 4*4(%ecx)
/* Save SP after return. */
leal 4(%esp), %edx
movl %edx, 4*4(%ecx)
/* Save PC we are returning to from stack frame. */
movl 0(%esp), %eax
movl %eax, 4*5(%ecx)
/* Save PC we are returning to from stack frame. */
movl 0(%esp), %eax
movl %eax, 4*5(%ecx)
/* Give back user's return value. */
movl 8(%esp), %eax
ret
/* Give back user's return value. */
movl 8(%esp), %eax
ret
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), @function
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), @function
/* Give back user's return value. */
movl 8(%esp), %eax
/* Give back user's return value. */
movl 8(%esp), %eax
/* Restore regs. */
movl 4*0(%ecx), %ebp
movl 4*1(%ecx), %ebx
/* Restore regs. */
movl 4*0(%ecx), %ebp
movl 4*1(%ecx), %ebx
movl 4*3(%ecx), %esi
movl 4*4(%ecx), %esp
movl 4*5(%ecx), %edx
movl 4*3(%ecx), %esi
movl 4*4(%ecx), %esp
movl 4*5(%ecx), %edx
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), @function
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), @function
/* Get new stack pointer. */
movl 12(%esp), %edx
/* Get new stack pointer. */
movl 12(%esp), %edx
/* Switch stacks. */
xchgl %esp, %edx
/* Switch stacks. */
xchgl %esp, %edx
/* Save old stack pointer on new stack. */
sub $8, %esp
movl %edx, 4(%esp)
/* Save old stack pointer on new stack. */
sub $8, %esp
movl %edx, 4(%esp)
/* Put function argument in stack frame. */
movl 8(%edx), %eax
movl %eax, 0(%esp)
/* Put function argument in stack frame. */
movl 8(%edx), %eax
movl %eax, 0(%esp)
/* Get function. */
movl 4(%edx), %eax
/* Get function. */
movl 4(%edx), %eax
/* Away we go. */
call *%eax
/* Away we go. */
call *%eax
/* Switch back to old stack. */
movl 4(%esp), %edx
xchgl %edx, %esp
/* Switch back to old stack. */
movl 4(%esp), %edx
xchgl %edx, %esp
/* Return to caller. */
ret
/* Return to caller. */
ret
#elif defined(__powerpc64__)
#elif defined(__powerpc64__)
.text
#define _prologue(n) \
.text
#define _prologue(n) \
#define _foreach_20_31 \
_ (20, 0) _ (21, 1) _ (22, 2) _ (23, 3) _ (24, 4) _ (25, 5) \
_ (26, 6) _ (27, 7) _ (28, 8) _ (29, 9) _ (30, 10) _ (31, 11)
#define _foreach_20_31 \
_ (20, 0) _ (21, 1) _ (22, 2) _ (23, 3) _ (24, 4) _ (25, 5) \
_ (26, 6) _ (27, 7) _ (28, 8) _ (29, 9) _ (30, 10) _ (31, 11)
#ifdef __ALTIVEC__
#define CLIB_POWERPC_ALTIVEC_N_REGS 12
#else
#ifdef __ALTIVEC__
#define CLIB_POWERPC_ALTIVEC_N_REGS 12
#else
std 0, 8*3(3)
mfspr 0, 256
stw 0, 8*4(3)
std 0, 8*3(3)
mfspr 0, 256
stw 0, 8*4(3)
-#define _(a,b) std a, 8*((b) + 4 + 18*0)(3) ;
+#define _(a,b) std a, 8*((b) + 4 + 18*0)(3) ;
-#define _(a,b) stfd a, 8*((b) + 4 + 18*1)(3) ;
+#define _(a,b) stfd a, 8*((b) + 4 + 18*1)(3) ;
_foreach_20_31
#undef _
#endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */
_foreach_20_31
#undef _
#endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */
/* Return value. */
mr 3, 4
/* Return value. */
mr 3, 4
_prologue (cdecl(clib_longjmp))
ld 0, 8*0(3)
mtlr 0
_prologue (cdecl(clib_longjmp))
ld 0, 8*0(3)
mtlr 0
mtcrf 0xff, 0
lwz 0, 8*3(3)
mtspr 256, 0
mtcrf 0xff, 0
lwz 0, 8*3(3)
mtspr 256, 0
-#define _(a,b) ld a, 8*((b) + 4 + 18*0)(3) ;
+#define _(a,b) ld a, 8*((b) + 4 + 18*0)(3) ;
-#define _(a,b) lfd a, 8*((b) + 4 + 18*1)(3) ;
+#define _(a,b) lfd a, 8*((b) + 4 + 18*1)(3) ;
#if CLIB_POWERPC_ALTIVEC_N_REGS > 0
/* vrs 20 - 31 */
li 5, 8*(4 + 18*2)
#if CLIB_POWERPC_ALTIVEC_N_REGS > 0
/* vrs 20 - 31 */
li 5, 8*(4 + 18*2)
_foreach_20_31
#undef _
#endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */
_foreach_20_31
#undef _
#endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */
/* Return value. */
mr 3, 4
/* Return value. */
mr 3, 4
blr
.globl cdecl(clib_calljmp)
blr
.globl cdecl(clib_calljmp)
.long 0
.byte 0,0,0,1,128,0,0,0
.size cdecl(clib_calljmp),.-.L.cdecl(clib_calljmp)
.long 0
.byte 0,0,0,1,128,0,0,0
.size cdecl(clib_calljmp),.-.L.cdecl(clib_calljmp)
#elif defined(__powerpc__)
#elif defined(__powerpc__)
#define _foreach_14_31 \
_ (14, 0) _ (15, 1) _ (16, 2) _ (17, 3) _ (18, 4) _ (19, 5) \
_ (20, 6) _ (21, 7) _ (22, 8) _ (23, 9) _ (24, 10) _ (25, 11) \
#define _foreach_14_31 \
_ (14, 0) _ (15, 1) _ (16, 2) _ (17, 3) _ (18, 4) _ (19, 5) \
_ (20, 6) _ (21, 7) _ (22, 8) _ (23, 9) _ (24, 10) _ (25, 11) \
#define _foreach_20_31 \
_ (20, 0) _ (21, 1) _ (22, 2) _ (23, 3) _ (24, 4) _ (25, 5) \
_ (26, 6) _ (27, 7) _ (28, 8) _ (29, 9) _ (30, 10) _ (31, 11)
#define _foreach_20_31 \
_ (20, 0) _ (21, 1) _ (22, 2) _ (23, 3) _ (24, 4) _ (25, 5) \
_ (26, 6) _ (27, 7) _ (28, 8) _ (29, 9) _ (30, 10) _ (31, 11)
#ifdef __ALTIVEC__
#define CLIB_POWERPC_ALTIVEC_N_REGS 12
#else
#ifdef __ALTIVEC__
#define CLIB_POWERPC_ALTIVEC_N_REGS 12
#else
mfspr 0, 256
#endif
stw 0, 4*3(3)
mfspr 0, 256
#endif
stw 0, 4*3(3)
#if CLIB_POWERPC_ALTIVEC_N_REGS > 0
li 5, 4*4
#define _(a,b) stvx a, 3, 5 ; addi 5, 5, 16 ;
_foreach_20_31
#undef _
#endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */
#if CLIB_POWERPC_ALTIVEC_N_REGS > 0
li 5, 4*4
#define _(a,b) stvx a, 3, 5 ; addi 5, 5, 16 ;
_foreach_20_31
#undef _
#endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */
-#define _(a,b) stw a, 4*(1*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 0*18)(3) ;
+#define _(a,b) stw a, 4*(1*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 0*18)(3) ;
/* fp 14 - 31 */
#define _(a,b) stfd a, 4*(2*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 1*18)(3) ;
_foreach_14_31
/* fp 14 - 31 */
#define _(a,b) stfd a, 4*(2*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 1*18)(3) ;
_foreach_14_31
/* Return value. */
mr 3, 4
/* Return value. */
mr 3, 4
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), @function
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), @function
lwz 0, 4*0(3)
mtlr 0
lwz 1, 4*1(3)
lwz 0, 4*0(3)
mtlr 0
lwz 1, 4*1(3)
#if CLIB_POWERPC_ALTIVEC_N_REGS > 0
mtspr 256, 0
#endif
#if CLIB_POWERPC_ALTIVEC_N_REGS > 0
mtspr 256, 0
#endif
#if CLIB_POWERPC_ALTIVEC_N_REGS > 0
li 5, 4*4
#define _(a,b) lvx a, 3, 5 ; addi 5, 5, 16 ;
_foreach_20_31
#undef _
#endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */
#if CLIB_POWERPC_ALTIVEC_N_REGS > 0
li 5, 4*4
#define _(a,b) lvx a, 3, 5 ; addi 5, 5, 16 ;
_foreach_20_31
#undef _
#endif /* CLIB_POWERPC_ALTIVEC_N_REGS > 0 */
/* gp 14 - 31 */
#define _(a,b) lwz a, 4*(1*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 0*18)(3) ;
_foreach_14_31
#undef _
/* gp 14 - 31 */
#define _(a,b) lwz a, 4*(1*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 0*18)(3) ;
_foreach_14_31
#undef _
/* fp 14 - 31 */
#define _(a,b) lfd a, 4*(2*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 1*18)(3) ;
_foreach_14_31
/* fp 14 - 31 */
#define _(a,b) lfd a, 4*(2*(b) + 4 + 4*CLIB_POWERPC_ALTIVEC_N_REGS + 1*18)(3) ;
_foreach_14_31
/* Return value. */
mr 3, 4
/* Return value. */
mr 3, 4
blr
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), @function
blr
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), @function
/* Make sure stack is 16 byte aligned. */
andi. 0, 5, 0xf
sub 5, 5, 0
addi 5, 5, -16
/* Make sure stack is 16 byte aligned. */
andi. 0, 5, 0xf
sub 5, 5, 0
addi 5, 5, -16
/* Save old stack/link pointer on new stack. */
stw 1, 0(5)
mflr 0
stw 0, 4(5)
/* Save old stack/link pointer on new stack. */
stw 1, 0(5)
mflr 0
stw 0, 4(5)
/* account for (sp, lr) tuple, and keep aligned */
addi 5, 5, -16
/* account for (sp, lr) tuple, and keep aligned */
addi 5, 5, -16
/* Switch stacks. */
mr 1, 5
/* Switch stacks. */
mr 1, 5
/* Move argument into place. */
mtctr 3
mr 3, 4
/* Move argument into place. */
mtctr 3
mr 3, 4
/* back to our synthetic frame */
addi 1,1,16
/* back to our synthetic frame */
addi 1,1,16
/* Switch back to old stack. */
lwz 0, 4(1)
mtlr 0
lwz 0, 0(1)
mr 1, 0
/* Switch back to old stack. */
lwz 0, 4(1)
mtlr 0
lwz 0, 0(1)
mr 1, 0
/* Return to caller. */
blr
/* Return to caller. */
blr
.global cdecl(clib_setjmp)
.align 4
.type cdecl(clib_setjmp), %function
.global cdecl(clib_setjmp)
.align 4
.type cdecl(clib_setjmp), %function
/* Save integer registers */
stmia ip!, {v1-v6, sl, fp, sp, lr}
/* Save integer registers */
stmia ip!, {v1-v6, sl, fp, sp, lr}
#ifdef __IWMMXT__
/* Save the call-preserved iWMMXt registers. */
wstrd wr10, [ip], #8
#ifdef __IWMMXT__
/* Save the call-preserved iWMMXt registers. */
wstrd wr10, [ip], #8
/* Give back user's return value. */
mov r0, r1
bx lr
/* Give back user's return value. */
mov r0, r1
bx lr
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), %function
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), %function
mov ip, r0 /* jmp buffer */
/* Restore integer registers. */
ldmia ip!, {v1-v6, sl, fp, sp, lr}
mov ip, r0 /* jmp buffer */
/* Restore integer registers. */
ldmia ip!, {v1-v6, sl, fp, sp, lr}
#ifdef __IWMMXT__
/* Save the call-preserved iWMMXt registers. */
wldrd wr10, [ip], #8
#ifdef __IWMMXT__
/* Save the call-preserved iWMMXt registers. */
wldrd wr10, [ip], #8
wldrd wr14, [ip], #8
wldrd wr15, [ip], #8
#endif
wldrd wr14, [ip], #8
wldrd wr15, [ip], #8
#endif
/* Give back user's return value. */
mov r0, r1
bx lr
/* Give back user's return value. */
mov r0, r1
bx lr
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), %function
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), %function
/* Make sure stack is 8 byte aligned. */
bic r2, r2, #7
/* Make sure stack is 8 byte aligned. */
bic r2, r2, #7
/* Allocate space for stack/link pointer on new stack. */
/* Allocate space for stack/link pointer on new stack. */
/* Save old stack/link pointer on new stack. */
str sp, [r2, #0]
str lr, [r2, #4]
/* Save old stack/link pointer on new stack. */
str sp, [r2, #0]
str lr, [r2, #4]
/* Switch stacks. */
mov sp, r2
/* Switch stacks. */
mov sp, r2
/* Save function to call. */
mov ip, r0
/* Save function to call. */
mov ip, r0
/* Move argument into place. */
mov r0, r1
/* Move argument into place. */
mov r0, r1
/* Switch back to old stack. */
ldr lr, [sp, #4]
ldr ip, [sp, #0]
mov sp, ip
/* Switch back to old stack. */
ldr lr, [sp, #4]
ldr ip, [sp, #0]
mov sp, ip
/* Return to caller. */
bx lr
/* Return to caller. */
bx lr
#elif defined(__xtensa__)
#elif defined(__xtensa__)
/* FIXME implement if needed. */
.global cdecl(clib_setjmp)
.align 4
/* FIXME implement if needed. */
.global cdecl(clib_setjmp)
.align 4
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), @function
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), @function
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), %function
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), %function
#elif defined(__TMS320C6X__)
#elif defined(__TMS320C6X__)
/* FIXME implement if needed. */
.global cdecl(clib_setjmp)
.align 4
/* FIXME implement if needed. */
.global cdecl(clib_setjmp)
.align 4
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), @function
.global cdecl(clib_longjmp)
.align 4
.type cdecl(clib_longjmp), @function
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), %function
.global cdecl(clib_calljmp)
.align 4
.type cdecl(clib_calljmp), %function
#elif defined(_mips) && __mips == 64
.global cdecl(clib_setjmp)
#elif defined(_mips) && __mips == 64
.global cdecl(clib_setjmp)
mov x0, x1
// switch stacks
mov x4, sp
mov x0, x1
// switch stacks
mov x4, sp
// space for saved sp, lr on new stack
sub x2, x2, #16
mov sp, x2
// space for saved sp, lr on new stack
sub x2, x2, #16
mov sp, x2
// save old sp and link register on new stack
str x4, [sp]
str x30,[sp,#8]
// save old sp and link register on new stack
str x4, [sp]
str x30,[sp,#8]
// restore old sp and link register
mov x4, sp
// restore old sp and link register
mov x4, sp
ldr x3, [x4]
ldr x30,[x4, #8]
mov sp, x3
ldr x3, [x4]
ldr x30,[x4, #8]
mov sp, x3
.size cdecl(clib_calljmp), .-cdecl(clib_calljmp)
#else
#error "unknown machine"
.size cdecl(clib_calljmp), .-cdecl(clib_calljmp)
#else
#error "unknown machine"
#ifndef __APPLE__
.section .note.GNU-stack,"",%progbits
#ifndef __APPLE__
.section .note.GNU-stack,"",%progbits