aboutsummaryrefslogtreecommitdiff
path: root/src/buildvm_ppc.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildvm_ppc.dasc')
-rw-r--r--src/buildvm_ppc.dasc76
1 files changed, 63 insertions, 13 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 0bcc5ad7..1cbf3a74 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -2527,7 +2527,8 @@ static void build_subroutines(BuildCtx *ctx)
2527 |//-- FFI helper functions ----------------------------------------------- 2527 |//-- FFI helper functions -----------------------------------------------
2528 |//----------------------------------------------------------------------- 2528 |//-----------------------------------------------------------------------
2529 | 2529 |
2530 |->vm_ffi_call: 2530 |->vm_ffi_call: // Call C function via FFI.
2531 | // Caveat: needs special frame unwinding, see below.
2531#if LJ_HASFFI 2532#if LJ_HASFFI
2532 | .type CCSTATE, CCallState, CARG1 2533 | .type CCSTATE, CCallState, CARG1
2533 | lwz TMP1, CCSTATE->spadj 2534 | lwz TMP1, CCSTATE->spadj
@@ -2541,8 +2542,10 @@ static void build_subroutines(BuildCtx *ctx)
2541 | addic. CARG2, CARG2, -1 2542 | addic. CARG2, CARG2, -1
2542 | stwux sp, sp, TMP1 2543 | stwux sp, sp, TMP1
2543 | crnot 4*cr1+eq, 4*cr1+eq // For vararg calls. 2544 | crnot 4*cr1+eq, 4*cr1+eq // For vararg calls.
2544 | stw CCSTATE, -4(TMP2) 2545 | stw r14, -4(TMP2)
2545 | li TMP3, 0 2546 | li TMP3, 0
2547 | stw CCSTATE, -8(TMP2)
2548 | mr r14, TMP2
2546 | la TMP1, CCSTATE->stack 2549 | la TMP1, CCSTATE->stack
2547 | slwi CARG2, CARG2, 2 2550 | slwi CARG2, CARG2, 2
2548 | blty >2 2551 | blty >2
@@ -2574,18 +2577,20 @@ static void build_subroutines(BuildCtx *ctx)
2574 | lwz r10, CCSTATE->gpr[7] 2577 | lwz r10, CCSTATE->gpr[7]
2575 | lwz CARG1, CCSTATE->gpr[0] // Do this last, since CCSTATE is CARG1. 2578 | lwz CARG1, CCSTATE->gpr[0] // Do this last, since CCSTATE is CARG1.
2576 | bctrl 2579 | bctrl
2577 | lwz TMP2, 0(sp) 2580 | lwz CCSTATE:TMP1, -8(r14)
2578 | lwz CCSTATE:TMP1, -4(TMP2) 2581 | lwz TMP2, -4(r14)
2579 | lwz TMP0, 4(TMP2) 2582 | lwz TMP0, 4(r14)
2580 | stw CARG1, CCSTATE:TMP1->gpr[0] 2583 | stw CARG1, CCSTATE:TMP1->gpr[0]
2581 | stfd FARG1, CCSTATE:TMP1->fpr[0] 2584 | stfd FARG1, CCSTATE:TMP1->fpr[0]
2582 | stw CARG2, CCSTATE:TMP1->gpr[1] 2585 | stw CARG2, CCSTATE:TMP1->gpr[1]
2583 | mtlr TMP0 2586 | mtlr TMP0
2584 | stw CARG3, CCSTATE:TMP1->gpr[2] 2587 | stw CARG3, CCSTATE:TMP1->gpr[2]
2585 | mr sp, TMP2 2588 | mr sp, r14
2586 | stw CARG4, CCSTATE:TMP1->gpr[3] 2589 | stw CARG4, CCSTATE:TMP1->gpr[3]
2590 | mr r14, TMP2
2587 | blr 2591 | blr
2588#endif 2592#endif
2593 |// Note: vm_ffi_call must be the last function in this object file!
2589 | 2594 |
2590 |//----------------------------------------------------------------------- 2595 |//-----------------------------------------------------------------------
2591} 2596}
@@ -4665,6 +4670,7 @@ static int build_backend(BuildCtx *ctx)
4665/* Emit pseudo frame-info for all assembler functions. */ 4670/* Emit pseudo frame-info for all assembler functions. */
4666static void emit_asm_debug(BuildCtx *ctx) 4671static void emit_asm_debug(BuildCtx *ctx)
4667{ 4672{
4673 int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
4668 int i; 4674 int i;
4669 switch (ctx->mode) { 4675 switch (ctx->mode) {
4670 case BUILD_elfasm: 4676 case BUILD_elfasm:
@@ -4692,7 +4698,7 @@ static void emit_asm_debug(BuildCtx *ctx)
4692 "\t.byte 0xe\n\t.uleb128 %d\n" 4698 "\t.byte 0xe\n\t.uleb128 %d\n"
4693 "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" 4699 "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
4694 "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n", 4700 "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",
4695 (int)ctx->codesz, CFRAME_SIZE); 4701 fcofs, CFRAME_SIZE);
4696 for (i = 14; i <= 31; i++) 4702 for (i = 14; i <= 31; i++)
4697 fprintf(ctx->fp, 4703 fprintf(ctx->fp,
4698 "\t.byte %d\n\t.uleb128 %d\n" 4704 "\t.byte %d\n\t.uleb128 %d\n"
@@ -4701,6 +4707,20 @@ static void emit_asm_debug(BuildCtx *ctx)
4701 fprintf(ctx->fp, 4707 fprintf(ctx->fp,
4702 "\t.align 2\n" 4708 "\t.align 2\n"
4703 ".LEFDE0:\n\n"); 4709 ".LEFDE0:\n\n");
4710#if LJ_HASFFI
4711 fprintf(ctx->fp,
4712 ".LSFDE1:\n"
4713 "\t.long .LEFDE1-.LASFDE1\n"
4714 ".LASFDE1:\n"
4715 "\t.long .Lframe0\n"
4716 "\t.long lj_vm_ffi_call\n"
4717 "\t.long %d\n"
4718 "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
4719 "\t.byte 0x8e\n\t.uleb128 2\n"
4720 "\t.byte 0xd\n\t.uleb128 0xe\n"
4721 "\t.align 2\n"
4722 ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
4723#endif
4704 fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n"); 4724 fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");
4705 fprintf(ctx->fp, 4725 fprintf(ctx->fp,
4706 ".Lframe1:\n" 4726 ".Lframe1:\n"
@@ -4720,17 +4740,17 @@ static void emit_asm_debug(BuildCtx *ctx)
4720 "\t.align 2\n" 4740 "\t.align 2\n"
4721 ".LECIE1:\n\n"); 4741 ".LECIE1:\n\n");
4722 fprintf(ctx->fp, 4742 fprintf(ctx->fp,
4723 ".LSFDE1:\n" 4743 ".LSFDE2:\n"
4724 "\t.long .LEFDE1-.LASFDE1\n" 4744 "\t.long .LEFDE2-.LASFDE2\n"
4725 ".LASFDE1:\n" 4745 ".LASFDE2:\n"
4726 "\t.long .LASFDE1-.Lframe1\n" 4746 "\t.long .LASFDE2-.Lframe1\n"
4727 "\t.long .Lbegin-.\n" 4747 "\t.long .Lbegin-.\n"
4728 "\t.long %d\n" 4748 "\t.long %d\n"
4729 "\t.uleb128 0\n" /* augmentation length */ 4749 "\t.uleb128 0\n" /* augmentation length */
4730 "\t.byte 0xe\n\t.uleb128 %d\n" 4750 "\t.byte 0xe\n\t.uleb128 %d\n"
4731 "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n" 4751 "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
4732 "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n", 4752 "\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",
4733 (int)ctx->codesz, CFRAME_SIZE); 4753 fcofs, CFRAME_SIZE);
4734 for (i = 14; i <= 31; i++) 4754 for (i = 14; i <= 31; i++)
4735 fprintf(ctx->fp, 4755 fprintf(ctx->fp,
4736 "\t.byte %d\n\t.uleb128 %d\n" 4756 "\t.byte %d\n\t.uleb128 %d\n"
@@ -4738,7 +4758,37 @@ static void emit_asm_debug(BuildCtx *ctx)
4738 0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i)); 4758 0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));
4739 fprintf(ctx->fp, 4759 fprintf(ctx->fp,
4740 "\t.align 2\n" 4760 "\t.align 2\n"
4741 ".LEFDE1:\n\n"); 4761 ".LEFDE2:\n\n");
4762#if LJ_HASFFI
4763 fprintf(ctx->fp,
4764 ".Lframe2:\n"
4765 "\t.long .LECIE2-.LSCIE2\n"
4766 ".LSCIE2:\n"
4767 "\t.long 0\n"
4768 "\t.byte 0x1\n"
4769 "\t.string \"zR\"\n"
4770 "\t.uleb128 0x1\n"
4771 "\t.sleb128 -4\n"
4772 "\t.byte 65\n"
4773 "\t.uleb128 1\n" /* augmentation length */
4774 "\t.byte 0x1b\n" /* pcrel|sdata4 */
4775 "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"
4776 "\t.align 2\n"
4777 ".LECIE2:\n\n");
4778 fprintf(ctx->fp,
4779 ".LSFDE3:\n"
4780 "\t.long .LEFDE3-.LASFDE3\n"
4781 ".LASFDE3:\n"
4782 "\t.long .LASFDE3-.Lframe2\n"
4783 "\t.long lj_vm_ffi_call-.\n"
4784 "\t.long %d\n"
4785 "\t.uleb128 0\n" /* augmentation length */
4786 "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n"
4787 "\t.byte 0x8e\n\t.uleb128 2\n"
4788 "\t.byte 0xd\n\t.uleb128 0xe\n"
4789 "\t.align 2\n"
4790 ".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
4791#endif
4742 break; 4792 break;
4743 default: 4793 default:
4744 break; 4794 break;