| .global dumpregs |
| .global myfunc |
| .type dumpregs,%function |
| .type myfunc,%function |
| |
| #ifdef __LP64__ |
| #define PTR_REG(n) x##n |
| #else |
| #define PTR_REG(n) w##n |
| #endif |
| |
| dumpregs: |
| myfunc: |
| mov x16, sp |
| mov x17, sp |
| sub sp, sp, 368 // 352 for registers and 16 for old sp and lr |
| |
| sub x17, x17, 8 |
| st4 { v4.h, v5.h, v6.h, v7.h }[0], [x17] //344 |
| sub x17, x17, 8 |
| st4 { v0.h, v1.h, v2.h, v3.h }[0], [x17] //336 |
| |
| stp x8, x9, [x17, #-16]! //320 |
| |
| stp q6, q7, [x17, #-32]! //288 |
| stp q4, q5, [x17, #-32]! //256 |
| stp q2, q3, [x17, #-32]! //224 |
| stp q0, q1, [x17, #-32]! //192 |
| |
| stp x6, x7, [x17, #-16]! //176 |
| stp x4, x5, [x17, #-16]! //160 |
| stp x2, x3, [x17, #-16]! //144 |
| stp x0, x1, [x17, #-16]! //128 |
| |
| stp w6, w7, [x17, #-8]! //120 |
| stp w4, w5, [x17, #-8]! //112 |
| stp w2, w3, [x17, #-8]! //104 |
| stp w0, w1, [x17, #-8]! // 96 |
| |
| stp s6, s7, [x17, #-8]! // 88 |
| stp s4, s5, [x17, #-8]! // 80 |
| stp s2, s3, [x17, #-8]! // 72 |
| stp s0, s1, [x17, #-8]! // 64 |
| |
| stp d6, d7, [x17, #-16]! // 48 |
| stp d4, d5, [x17, #-16]! // 32 |
| stp d2, d3, [x17, #-16]! // 16 |
| stp d0, d1, [x17, #-16]! // 0 |
| |
| add x0, sp, #16 |
| stp x16, x30, [x17, #-16]! |
| |
| adrp x9, which_kind_of_test // determine the type of test |
| add x9, x9, :lo12:which_kind_of_test |
| ldr w9, [x9, #0] |
| cmp w9, #1 |
| bgt LABEL_TEST_FUNC_RETURN |
| bl testfunc // parameter passing test or va_arg code gen test |
| b LABEL_RET |
| LABEL_TEST_FUNC_RETURN: |
| adrp x9, testfunc_ptr |
| add x9, x9, :lo12:testfunc_ptr |
| ldr PTR_REG(9), [x9, #0] |
| blr x9 // function return value test |
| adrp x9, saved_return_address |
| add x9, x9, :lo12:saved_return_address |
| ldr x9, [x9, #0] |
| str x9, [sp, #8] // Update the copy of LR reg saved on stack |
| LABEL_RET: |
| ldp x0, x30, [sp] |
| mov sp, x0 |
| ret |
| |
| .weak testfunc |
| .weak testfunc_ptr |
| .weak saved_return_address |