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 ----------------------------------------------------------- */ |
