| ### entry point code |
| .macro gdbasm_startup |
| |
| # Align the stack pointer to an 8-byte boundary. |
| lhi %r0,-8 |
| nr %r15,%r0 |
| |
| # Reserve space for the standard stack frame: |
| # back chain, and space for the callee to save its registers. |
| ahi %r15,-104 |
| |
| # Zero this frame's back chain pointer. |
| xc 0(4,%r15),0(%r15) |
| .endm |
| |
| |
| ### Call a function. |
| .macro gdbasm_call subr |
| |
| # Put the address of the constant in %r1, load the constant |
| # (SUBR's address), and jump to it. |
| bras %r1, .Lafterconst\@ |
| .long \subr |
| .Lafterconst\@: |
| l %r1,0(%r1) |
| basr %r14,%r1 |
| .endm |
| |
| |
| ### Exit with a zero status. |
| .macro gdbasm_exit0 |
| lhi %r2, 0 |
| svc 1 |
| .endm |
| |
| ### Standard subroutine prologue. |
| .macro gdbasm_enter |
| |
| # Save all the callee-saves registers. What the heck. |
| stm %r6,%r15,24(%r15) |
| |
| # Allocate the stack frame, and write the back chain pointer. |
| # Keep the original SP in %r11. |
| lr %r1,%r15 |
| ahi %r15,-96 |
| st %r1,0(%r15) |
| .endm |
| |
| |
| ### Standard subroutine epilogue. |
| .macro gdbasm_leave |
| |
| # Restore all our registers. This also pops the frame, and |
| # restores our return address. |
| lm %r6,%r15,120(%r15) |
| |
| # Jump to the return address. |
| br %r14 |
| |
| .endm |
| |
| ### Several nops. |
| .macro gdbasm_several_nops |
| lr %r0, %r0 |
| lr %r0, %r0 |
| lr %r0, %r0 |
| lr %r0, %r0 |
| .endm |
| |
| ### Declare an `int' variable. |
| .purgem gdbasm_datavar |
| .macro gdbasm_datavar name value |
| .data |
| \name: |
| .long \value |
| .endm |