浏览代码

ARM: Add basic unary bytecode instructions.

Mike Pall 14 年之前
父节点
当前提交
7b0a125cf7
共有 1 个文件被更改,包括 97 次插入10 次删除
  1. 97 10
      src/buildvm_arm.dasc

+ 97 - 10
src/buildvm_arm.dasc

@@ -684,7 +684,7 @@ static void build_subroutines(BuildCtx *ctx)
   |
   |
   |.ffunc_bit_op band, and
   |.ffunc_bit_op band, and
   |.ffunc_bit_op bor, or
   |.ffunc_bit_op bor, or
-  |.ffunc_bit_op bxor, xor
+  |.ffunc_bit_op bxor, eor
   |
   |
   |.ffunc_bit bswap
   |.ffunc_bit bswap
   |  NYI
   |  NYI
@@ -850,16 +850,67 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   /* -- Unary ops --------------------------------------------------------- */
   /* -- Unary ops --------------------------------------------------------- */
 
 
   case BC_MOV:
   case BC_MOV:
-    |  NYI
+    |  // RA = dst*8, RC = src
+    |  lsl RC, RC, #3
+    |   ins_next1
+    |  ldrd CARG12, [BASE, RC]
+    |   ins_next2
+    |  strd CARG12, [BASE, RA]
+    |   ins_next3
     break;
     break;
   case BC_NOT:
   case BC_NOT:
-    |  NYI
+    |  // RA = dst*8, RC = src
+    |  add RC, BASE, RC, lsl #3
+    |   ins_next1
+    |  ldr CARG1, [RC, #4]
+    |   add RA, BASE, RA
+    |   ins_next2
+    |  cmn CARG1, #-LJ_TTRUE
+    |  mvnls CARG2, #~LJ_TFALSE
+    |  mvnhi CARG2, #~LJ_TTRUE
+    |  str CARG2, [RA, #4]
+    |   ins_next3
     break;
     break;
   case BC_UNM:
   case BC_UNM:
-    |  NYI
+    |  // RA = dst*8, RC = src
+    |  lsl RC, RC, #3
+    |  ldrd CARG12, [BASE, RC]
+    |   ins_next1
+    |   ins_next2
+    |  cmn CARG2, #-LJ_TISNUM
+    |  bne >5
+    |  rsbs CARG1, CARG1, #0
+    |  bvs >4
+    |9:
+    |  strd CARG12, [BASE, RA]
+    |   ins_next3
+    |4:
+    |  mov CARG2, #0x01e00000  // 2^31.
+    |  mov CARG1, #0
+    |  orr CARG2, CARG2, #0x40000000
+    |  b <9
+    |5:
+    |  bhi ->vmeta_unm
+    |  add CARG2, CARG2, #0x80000000
+    |  b <9
     break;
     break;
   case BC_LEN:
   case BC_LEN:
-    |  NYI
+    |  // RA = dst*8, RC = src
+    |  lsl RC, RC, #3
+    |  ldrd CARG12, [BASE, RC]
+    |  checkstr CARG2, >2
+    |  ldr CARG1, STR:CARG1->len
+    |1:
+    |  mvn CARG2, #~LJ_TISNUM
+    |   ins_next1
+    |   ins_next2
+    |  strd CARG12, [BASE, RA]
+    |   ins_next3
+    |2:
+    |  checktab CARG2, ->vmeta_len
+    |  blx extern lj_tab_len		// (GCtab *t)
+    |  // Returns uint32_t (but less than 2^31).
+    |  b <1
     break;
     break;
 
 
   /* -- Binary ops -------------------------------------------------------- */
   /* -- Binary ops -------------------------------------------------------- */
@@ -893,7 +944,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
   /* -- Constant ops ------------------------------------------------------ */
   /* -- Constant ops ------------------------------------------------------ */
 
 
   case BC_KSTR:
   case BC_KSTR:
-    |  NYI
+    |  // RA = dst*8, RC = str_const (~)
+    |  mvn RC, RC
+    |   ins_next1
+    |  ldr CARG1, [KBASE, RC, lsl #2]
+    |   ins_next2
+    |  mvn CARG2, #~LJ_TSTR
+    |  strd CARG12, [BASE, RA]
+    |   ins_next3
     break;
     break;
   case BC_KCDATA:
   case BC_KCDATA:
 #if LJ_HASFFI
 #if LJ_HASFFI
@@ -901,16 +959,45 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
 #endif
 #endif
     break;
     break;
   case BC_KSHORT:
   case BC_KSHORT:
-    |  NYI
+    |  // RA = dst*8, (RC = int16_literal)
+    |  mov CARG1, INS, asr #16			// Refetch sign-extended reg.
+    |  mvn CARG2, #~LJ_TISNUM
+    |   ins_next1
+    |   ins_next2
+    |  strd CARG12, [BASE, RA]
+    |   ins_next3
     break;
     break;
   case BC_KNUM:
   case BC_KNUM:
-    |  NYI
+    |  // RA = dst*8, RC = num_const
+    |  lsl RC, RC, #3
+    |   ins_next1
+    |  ldrd CARG12, [KBASE, RC]
+    |   ins_next2
+    |  strd CARG12, [BASE, RA]
+    |   ins_next3
     break;
     break;
   case BC_KPRI:
   case BC_KPRI:
-    |  NYI
+    |  // RA = dst*8, RC = primitive_type (~)
+    |  add RA, BASE, RA
+    |  mvn RC, RC
+    |   ins_next1
+    |   ins_next2
+    |  str RC, [RA, #4]
+    |   ins_next3
     break;
     break;
   case BC_KNIL:
   case BC_KNIL:
-    |  NYI
+    |  // RA = base*8, RC = end
+    |  add RA, BASE, RA
+    |   add RC, BASE, RC, lsl #3
+    |  mvn CARG1, #~LJ_TNIL
+    |  str CARG1, [RA, #4]
+    |   add RA, RA, #8
+    |1:
+    |  str CARG1, [RA, #4]
+    |  cmp RA, RC
+    |   add RA, RA, #8
+    |  blt <1
+    |  ins_next_
     break;
     break;
 
 
   /* -- Upvalue and function ops ------------------------------------------ */
   /* -- Upvalue and function ops ------------------------------------------ */