aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_ppc.dasc63
1 files changed, 62 insertions, 1 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 6081e2a2..3a31d86c 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -2102,7 +2102,68 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
2102 break; 2102 break;
2103 2103
2104 case BC_VARG: 2104 case BC_VARG:
2105 | NYI 2105 | // RA = base*8, RB = (nresults+1)*8, RC = numparams*8
2106 | lwz TMP0, FRAME_PC(BASE)
2107 | add RC, BASE, RC
2108 | add RA, BASE, RA
2109 | addi RC, RC, FRAME_VARG
2110 | add TMP2, RA, RB
2111 | subi TMP3, BASE, 8 // TMP3 = vtop
2112 | sub RC, RC, TMP0 // RC = vbase
2113 | // Note: RC may now be even _above_ BASE if nargs was < numparams.
2114 | cmplwi cr1, RB, 0
2115 | sub. TMP1, TMP3, RC
2116 | beq cr1, >5 // Copy all varargs?
2117 | subi TMP2, TMP2, 16
2118 | ble >2 // No vararg slots?
2119 |1: // Copy vararg slots to destination slots.
2120 | evldd TMP0, 0(RC)
2121 | addi RC, RC, 8
2122 | evstdd TMP0, 0(RA)
2123 | cmplw RA, TMP2
2124 | cmplw cr1, RC, TMP3
2125 | bge >3 // All destination slots filled?
2126 | addi RA, RA, 8
2127 | blt cr1, <1 // More vararg slots?
2128 |2: // Fill up remainder with nil.
2129 | evstdd TISNIL, 0(RA)
2130 | cmplw RA, TMP2
2131 | addi RA, RA, 8
2132 | blt <2
2133 |3:
2134 | ins_next
2135 |
2136 |5: // Copy all varargs.
2137 | lwz TMP0, L->maxstack
2138 | li MULTRES, 8 // MULTRES = (0+1)*8
2139 | ble <3 // No vararg slots?
2140 | add TMP2, RA, TMP1
2141 | cmplw TMP2, TMP0
2142 | addi MULTRES, TMP1, 8
2143 | bgt >7
2144 |6:
2145 | evldd TMP0, 0(RC)
2146 | addi RC, RC, 8
2147 | evstdd TMP0, 0(RA)
2148 | cmplw RC, TMP3
2149 | addi RA, RA, 8
2150 | blt <6 // More vararg slots?
2151 | b <3
2152 |
2153 |7: // Grow stack for varargs.
2154 | mr CARG1, L
2155 | stw RA, L->top
2156 | sub SAVE0, RC, BASE // Need delta, because BASE may change.
2157 | stw BASE, L->base
2158 | sub RA, RA, BASE
2159 | stw PC, SAVE_PC
2160 | srwi CARG2, TMP1, 3
2161 | bl extern lj_state_growstack // (lua_State *L, int n)
2162 | lwz BASE, L->base
2163 | add RA, BASE, RA
2164 | add RC, BASE, SAVE0
2165 | subi TMP3, BASE, 8
2166 | b <6
2106 break; 2167 break;
2107 2168
2108 /* -- Returns ----------------------------------------------------------- */ 2169 /* -- Returns ----------------------------------------------------------- */