Browse code

bytecode: Implement load/store.

Török Edvin authored on 2009/08/22 17:35:04
Showing 3 changed files
... ...
@@ -1116,6 +1116,7 @@ static int cli_bytecode_prepare_interpreter(struct cli_bc *bc)
1116 1116
 		case OP_ICMP_SLT:
1117 1117
 		case OP_ICMP_SLE:
1118 1118
 		case OP_COPY:
1119
+		case OP_STORE:
1119 1120
 		    MAP(inst->u.binop[0]);
1120 1121
 		    MAP(inst->u.binop[1]);
1121 1122
 		    break;
... ...
@@ -1175,6 +1176,9 @@ static int cli_bytecode_prepare_interpreter(struct cli_bc *bc)
1175 1175
 		    }
1176 1176
 		    break;
1177 1177
 		}
1178
+		case OP_LOAD:
1179
+		    MAP(inst->u.unaryop);
1180
+		    break;
1178 1181
 		default:
1179 1182
 		    cli_dbgmsg("Unhandled opcode: %d\n", inst->opcode);
1180 1183
 		    return CL_EBYTECODE;
... ...
@@ -251,6 +251,10 @@ static always_inline struct stack_entry *pop_stack(struct stack *stack,
251 251
     CHECK_EQ((p)&7, 0);\
252 252
     TRACE_W(x, p, 64);\
253 253
     *(uint64_t*)&values[p] = x
254
+#define WRITEP(x, p) CHECK_GT(func->numBytes, p+PSIZE-1);\
255
+    CHECK_EQ((p)&(PSIZE-1), 0);\
256
+    TRACE_W(x, p, PSIZE*8);\
257
+    *(void**)&values[p] = x
254 258
 
255 259
 #define READ1(x, p) CHECK_GT(func->numBytes, p);\
256 260
     x = (*(uint8_t*)&values[p])&1;\
... ...
@@ -270,6 +274,11 @@ static always_inline struct stack_entry *pop_stack(struct stack *stack,
270 270
     CHECK_EQ((p)&7, 0);\
271 271
     x = *(uint64_t*)&values[p];\
272 272
     TRACE_R(x)
273
+#define PSIZE sizeof(void*)
274
+#define READP(x, p) CHECK_GT(func->numBytes, p+PSIZE-1);\
275
+    CHECK_EQ((p)&(PSIZE-1), 0);\
276
+    x = *(void**)&values[p];\
277
+    TRACE_R(x)
273 278
 
274 279
 #define READOLD8(x, p) CHECK_GT(func->numBytes, p);\
275 280
     x = *(uint8_t*)&old_values[p];\
... ...
@@ -680,6 +689,82 @@ int cli_vm_execute(const struct cli_bc *bc, struct cli_bc_ctx *ctx, const struct
680 680
 		break;
681 681
 	    }
682 682
 
683
+	    case OP_LOAD*5:
684
+	    case OP_LOAD*5+1:
685
+	    {
686
+		uint8_t *ptr;
687
+		READP(ptr, inst->u.unaryop);
688
+		WRITE8(inst->dest, (*ptr));
689
+		break;
690
+	    }
691
+	    case OP_LOAD*5+2:
692
+	    {
693
+		const union unaligned_16 *ptr;
694
+		READP(ptr, inst->u.unaryop);
695
+		WRITE16(inst->dest, (ptr->una_u16));
696
+		break;
697
+	    }
698
+	    case OP_LOAD*5+3:
699
+	    {
700
+		const union unaligned_32 *ptr;
701
+		READP(ptr, inst->u.unaryop);
702
+		WRITE32(inst->dest, (ptr->una_u32));
703
+		break;
704
+	    }
705
+	    case OP_LOAD*5+4:
706
+	    {
707
+		const union unaligned_64 *ptr;
708
+		READP(ptr, inst->u.unaryop);
709
+		WRITE64(inst->dest, (ptr->una_u64));
710
+		break;
711
+	    }
712
+
713
+	    case OP_STORE*5:
714
+	    {
715
+		uint8_t *ptr;
716
+		uint8_t v;
717
+		READP(ptr, BINOP(0));
718
+		READ1(v, BINOP(1));
719
+		*ptr = v;
720
+		break;
721
+	    }
722
+	    case OP_STORE*5+1:
723
+	    {
724
+		uint8_t *ptr;
725
+		uint8_t v;
726
+		READP(ptr, BINOP(0));
727
+		READ8(v, BINOP(1));
728
+		*ptr = v;
729
+		break;
730
+	    }
731
+	    case OP_STORE*5+2:
732
+	    {
733
+		union unaligned_16 *ptr;
734
+		uint16_t v;
735
+		READP(ptr, BINOP(0));
736
+		READ16(v, BINOP(1));
737
+		ptr->una_s16 = v;
738
+		break;
739
+	    }
740
+	    case OP_STORE*5+3:
741
+	    {
742
+		union unaligned_32 *ptr;
743
+		uint32_t v;
744
+		READP(ptr, BINOP(0));
745
+		READ32(v, BINOP(1));
746
+		ptr->una_u32 = v;
747
+		break;
748
+	    }
749
+	    case OP_STORE*5+4:
750
+	    {
751
+		union unaligned_64 *ptr;
752
+		uint64_t v;
753
+		READP(ptr, BINOP(0));
754
+		READ64(v, BINOP(1));
755
+		ptr->una_u64 = v;
756
+		break;
757
+	    }
758
+
683 759
 	    default:
684 760
 		cli_errmsg("Opcode %u of type %u is not implemented yet!\n",
685 761
 			   inst->interp_op/5, inst->interp_op%5);
... ...
@@ -229,6 +229,20 @@ extern int have_rar;
229 229
 		     (((v) & 0xff00000000000000ULL) >> 56))
230 230
 
231 231
 
232
+union unaligned_64 {
233
+	uint64_t una_u64;
234
+	int64_t una_s64;
235
+} __attribute__((packed));
236
+
237
+union unaligned_32 {
238
+	uint32_t una_u32;
239
+	int32_t una_s32;
240
+} __attribute__((packed));
241
+
242
+union unaligned_16 {
243
+	uint16_t una_u16;
244
+	int16_t una_s16;
245
+} __attribute__((packed));
232 246
 #if WORDS_BIGENDIAN == 0
233 247
 
234 248
 #ifndef HAVE_ATTRIB_PACKED 
... ...
@@ -241,14 +255,6 @@ extern int have_rar;
241 241
 #pragma pack 1
242 242
 #endif
243 243
 
244
-union unaligned_32 {
245
-	uint32_t una_u32;
246
-	int32_t una_s32;
247
-} __attribute__((packed));
248
-
249
-union unaligned_16 {
250
-	int16_t una_s16;
251
-} __attribute__((packed));
252 244
 
253 245
 #ifdef HAVE_PRAGMA_PACK
254 246
 #pragma pack()