diff options
author | Mike Pall <mike> | 2010-09-15 17:27:17 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-15 17:27:17 +0200 |
commit | 028a65a597ef764d0ceb8a1dc17f0da5476d7eae (patch) | |
tree | 4880697f389f16db38664dedb7b69b508dbb15bc /src | |
parent | 44702720c577d80c75e90c030af30557aa430e5c (diff) | |
download | luajit-028a65a597ef764d0ceb8a1dc17f0da5476d7eae.tar.gz luajit-028a65a597ef764d0ceb8a1dc17f0da5476d7eae.tar.bz2 luajit-028a65a597ef764d0ceb8a1dc17f0da5476d7eae.zip |
PPC: Add BC_VARG.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 63 |
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 ----------------------------------------------------------- */ |