]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
PPC: Add table constructors.
authorMike Pall <mike>
Mon, 6 Sep 2010 13:20:58 +0000 (15:20 +0200)
committerMike Pall <mike>
Mon, 6 Sep 2010 13:20:58 +0000 (15:20 +0200)
src/buildvm_ppc.dasc

index 76d54f42043337d291bb01fbc852f9e1ad94ac36..6989c447b29e286780bbdcbbf1a75e259febad46 100644 (file)
@@ -1230,10 +1230,41 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   /* -- Table ops --------------------------------------------------------- */
 
   case BC_TNEW:
-    |  NYI
-    break;
   case BC_TDUP:
-    |  NYI
+    |  // RA = dst*8, RD = (hbits|asize)*8 | tab_const*8 (~)
+    |  lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH)
+    |   mr CARG1, L
+    |  lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH)
+    |   stw BASE, L->base
+    |  cmplw TMP0, TMP1
+    |   stw PC, SAVE_PC
+    |  bge >5
+    |1:
+    if (op == BC_TNEW) {
+      |  rlwinm CARG2, RD, 29, 21, 31
+      |  rlwinm CARG3, RD, 18, 27, 31
+      |  cmpwi CARG2, 0x7ff
+      |   li TMP1, 0x801
+      |  iseleq CARG2, TMP1, CARG2
+      |  bl extern lj_tab_new  // (lua_State *L, int32_t asize, uint32_t hbits)
+      |  // Returns Table *.
+    } else {
+      |  srwi TMP1, RD, 1
+      |  subfic TMP1, TMP1, -4
+      |  lwzx CARG2, KBASE, TMP1               // KBASE-4-tab_const*4
+      |  bl extern lj_tab_dup  // (lua_State *L, Table *kt)
+      |  // Returns Table *.
+    }
+    |  lwz BASE, L->base
+    |  evmergelo TAB:CRET1, TISTAB, TAB:CRET1
+    |  evstddx TAB:CRET1, BASE, RA
+    |  ins_next
+    |5:
+    |  mr SAVE0, RD
+    |  bl extern lj_gc_step_fixtop  // (lua_State *L)
+    |  mr RD, SAVE0
+    |  mr CARG1, L
+    |  b <1
     break;
 
   case BC_GGET: