]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
PPC: Add BC_TSETM.
authorMike Pall <mike>
Wed, 15 Sep 2010 15:28:24 +0000 (17:28 +0200)
committerMike Pall <mike>
Wed, 15 Sep 2010 15:28:24 +0000 (17:28 +0200)
src/buildvm_ppc.dasc

index 3a31d86c41781a4cade5ac856d3d10aa09b0d090..28258e5e2a82532e45d6b6f119d9343a0504fab1 100644 (file)
@@ -2005,7 +2005,47 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
     break;
 
   case BC_TSETM:
-    |  NYI
+    |  // RA = base*8 (table at base-1), RD = num_const*8 (start index)
+    |  add RA, BASE, RA
+    |1:
+    |   add TMP3, KBASE, RD
+    |  lwz TAB:CARG2, -4(RA)           // Guaranteed to be a table.
+    |    addic. TMP0, MULTRES, -8
+    |   lwz TMP3, 4(TMP3)              // Integer constant is in lo-word.
+    |    srwi CARG3, TMP0, 3
+    |    beq >4                                // Nothing to copy?
+    |  add CARG3, CARG3, TMP3
+    |  lwz TMP2, TAB:CARG2->asize
+    |   slwi TMP1, TMP3, 3
+    |    lbz TMP3, TAB:CARG2->marked
+    |  cmplw CARG3, TMP2
+    |   add TMP2, RA, TMP0
+    |   lwz TMP0, TAB:CARG2->array
+    |  bgt >5
+    |   add TMP1, TMP1, TMP0
+    |    andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table)
+    |3:  // Copy result slots to table.
+    |   evldd TMP0, 0(RA)
+    |  addi RA, RA, 8
+    |  cmpw cr1, RA, TMP2
+    |   evstdd TMP0, 0(TMP1)
+    |    addi TMP1, TMP1, 8
+    |  blt cr1, <3
+    |  bne >7
+    |4:
+    |  ins_next
+    |
+    |5:  // Need to resize array part.
+    |   stw BASE, L->base
+    |  mr CARG1, L
+    |   stw PC, SAVE_PC
+    |  bl extern lj_tab_reasize                // (lua_State *L, GCtab *t, int nasize)
+    |  // Must not reallocate the stack.
+    |  b <1
+    |
+    |7:  // Possible table write barrier for any value. Skip valiswhite check.
+    |  barrierback TAB:RB, TMP3, TMP0
+    |  b <4
     break;
 
   /* -- Calls and vararg handling ----------------------------------------- */