aboutsummaryrefslogtreecommitdiff
path: root/src/vm_ppc.dasc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/vm_ppc.dasc69
1 files changed, 17 insertions, 52 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc
index c85f1f10..ac399900 100644
--- a/src/vm_ppc.dasc
+++ b/src/vm_ppc.dasc
@@ -293,6 +293,7 @@
293|.type NODE, Node 293|.type NODE, Node
294|.type NARGS8, int 294|.type NARGS8, int
295|.type TRACE, GCtrace 295|.type TRACE, GCtrace
296|.type SBUF, SBuf
296| 297|
297|//----------------------------------------------------------------------- 298|//-----------------------------------------------------------------------
298| 299|
@@ -2103,6 +2104,7 @@ static void build_subroutines(BuildCtx *ctx)
2103 | stp BASE, L->base 2104 | stp BASE, L->base
2104 | stw PC, SAVE_PC 2105 | stw PC, SAVE_PC
2105 | bl extern lj_str_new // (lua_State *L, char *str, size_t l) 2106 | bl extern lj_str_new // (lua_State *L, char *str, size_t l)
2107 |->fff_resstr:
2106 | // Returns GCstr *. 2108 | // Returns GCstr *.
2107 | lp BASE, L->base 2109 | lp BASE, L->base
2108 | li CARG3, LJ_TSTR 2110 | li CARG3, LJ_TSTR
@@ -2223,66 +2225,29 @@ static void build_subroutines(BuildCtx *ctx)
2223 | li CARG3, LJ_TSTR 2225 | li CARG3, LJ_TSTR
2224 | b ->fff_restv 2226 | b ->fff_restv
2225 | 2227 |
2226 |.ffunc string_reverse 2228 |.macro ffstring_op, name
2229 | .ffunc string_ .. name
2227 | ffgccheck 2230 | ffgccheck
2228 | cmplwi NARGS8:RC, 8 2231 | cmplwi NARGS8:RC, 8
2229 | lwz CARG3, 0(BASE) 2232 | lwz CARG3, 0(BASE)
2230 | lwz STR:CARG1, 4(BASE) 2233 | lwz STR:CARG2, 4(BASE)
2231 | blt ->fff_fallback 2234 | blt ->fff_fallback
2232 | checkstr CARG3 2235 | checkstr CARG3
2233 | lwz CARG2, DISPATCH_GL(tmpbuf.b)(DISPATCH) 2236 | la SBUF:CARG1, DISPATCH_GL(tmpbuf)(DISPATCH)
2234 | lwz TMP1, DISPATCH_GL(tmpbuf.e)(DISPATCH)
2235 | bne ->fff_fallback 2237 | bne ->fff_fallback
2236 | lwz CARG3, STR:CARG1->len 2238 | lwz TMP0, SBUF:CARG1->b
2237 | la CARG1, #STR(STR:CARG1) 2239 | stw L, SBUF:CARG1->L
2238 | li TMP2, 0 2240 | stp BASE, L->base
2239 | add TMP3, CARG2, CARG3 2241 | stw PC, SAVE_PC
2240 | cmplw TMP1, TMP3 2242 | stw TMP0, SBUF:CARG1->p
2241 | subi TMP3, CARG3, 1 2243 | bl extern lj_buf_putstr_ .. name
2242 | blt ->fff_fallback 2244 | bl extern lj_buf_tostr
2243 |1: // Reverse string copy. 2245 | b ->fff_resstr
2244 | cmpwi TMP3, 0
2245 | lbzx TMP1, CARG1, TMP2
2246 | blty ->fff_newstr
2247 | stbx TMP1, CARG2, TMP3
2248 | subi TMP3, TMP3, 1
2249 | addi TMP2, TMP2, 1
2250 | b <1
2251 |
2252 |.macro ffstring_case, name, lo
2253 | .ffunc name
2254 | ffgccheck
2255 | cmplwi NARGS8:RC, 8
2256 | lwz CARG3, 0(BASE)
2257 | lwz STR:CARG1, 4(BASE)
2258 | blt ->fff_fallback
2259 | checkstr CARG3
2260 | lwz CARG2, DISPATCH_GL(tmpbuf.b)(DISPATCH)
2261 | lwz TMP1, DISPATCH_GL(tmpbuf.e)(DISPATCH)
2262 | bne ->fff_fallback
2263 | lwz CARG3, STR:CARG1->len
2264 | la CARG1, #STR(STR:CARG1)
2265 | li TMP2, 0
2266 | add TMP3, CARG2, CARG3
2267 | cmplw TMP1, TMP3
2268 | blt ->fff_fallback
2269 |1: // ASCII case conversion.
2270 | cmplw TMP2, CARG3
2271 | lbzx TMP1, CARG1, TMP2
2272 | bgey ->fff_newstr
2273 | subi TMP0, TMP1, lo
2274 | xori TMP3, TMP1, 0x20
2275 | addic TMP0, TMP0, -26
2276 | subfe TMP3, TMP3, TMP3
2277 | rlwinm TMP3, TMP3, 0, 26, 26 // x &= 0x20.
2278 | xor TMP1, TMP1, TMP3
2279 | stbx TMP1, CARG2, TMP2
2280 | addi TMP2, TMP2, 1
2281 | b <1
2282 |.endmacro 2246 |.endmacro
2283 | 2247 |
2284 |ffstring_case string_lower, 65 2248 |ffstring_op reverse
2285 |ffstring_case string_upper, 97 2249 |ffstring_op lower
2250 |ffstring_op upper
2286 | 2251 |
2287 |//-- Bit library -------------------------------------------------------- 2252 |//-- Bit library --------------------------------------------------------
2288 | 2253 |