Browse Source

implemented more opcodes

svn path=/trunk/mono/; revision=916
Dietmar Maurer 24 years ago
parent
commit
6aaad23241
6 changed files with 198 additions and 132 deletions
  1. 3 0
      mono/arch/ChangeLog
  2. 6 1
      mono/arch/x86/x86-codegen.h
  3. 3 1
      mono/jit/TODO
  4. 40 64
      mono/jit/jit.c
  5. 40 64
      mono/jit/testjit.c
  6. 106 2
      mono/jit/x86.brg

+ 3 - 0
mono/arch/ChangeLog

@@ -1,3 +1,6 @@
+2001-09-21  Dietmar Maurer  <[email protected]>
+
+	* x86/x86-codegen.h (x86_breakpoint): added.
 
 Tue Sep 18 13:23:59 CEST 2001 Paolo Molaro <[email protected]>
 

+ 6 - 1
mono/arch/x86/x86-codegen.h

@@ -1,7 +1,7 @@
 /* Copyright (C)  2000 Intel Corporation.  All rights reserved.
    Copyright (C)  2001 Ximian, Inc. 
 //
-// $Header: /home/miguel/third-conversion/public/mono/mono/arch/x86/x86-codegen.h,v 1.9 2001/09/18 07:26:43 lupus Exp $
+// $Header: /home/miguel/third-conversion/public/mono/mono/arch/x86/x86-codegen.h,v 1.10 2001/09/21 12:50:46 dietmar Exp $
 */
 
 #ifndef X86_H
@@ -236,6 +236,11 @@ typedef union {
  * TODO: memindex_emit 
  */
 
+#define x86_breakpoint(inst) \
+	do {	\
+		*(inst)++ = 0xcc;	\
+	} while (0)
+
 #define x86_prefix(inst,p) do { *(inst)++ =(unsigned char) (p); } while (0)
 
 #define x86_rdtsc(inst) \

+ 3 - 1
mono/jit/TODO

@@ -1,3 +1,5 @@
+* document the functions and variables in the JIT 
 * compute the frame size
 * implement value types
-* implement a register set for FP registers (just count register usage on x86)
+* implement a register set for FP registers (just count register usage on x86)
+

+ 40 - 64
mono/jit/jit.c

@@ -36,6 +36,25 @@ char *opcode_names [] = {
 };
 #undef OPDEF
 
+#define MAKE_CJUMP(name)                                                      \
+case CEE_##name:                                                              \
+case CEE_##name##_S:                                                          \
+{                                                                             \
+	int near_jump = *ip == CEE_##name##_S;                                \
+	++ip;                                                                 \
+	sp -= 2;                                                              \
+	t1 = ctree_new (MB_TERM_##name, 0, sp [0], sp [1]);                   \
+	if (near_jump)                                                        \
+		t1->data.i = cli_addr + 2 + (signed char) *ip;                \
+	else                                                                  \
+		t1->data.i = cli_addr + 5 + (gint32) read32 (ip);             \
+	t1->cli_addr = sp [0]->cli_addr;                                      \
+	ADD_TREE (t1);                                                        \
+	ip += near_jump ? 1: 4;		                                      \
+	break;                                                                \
+}
+
+
 /* Whether to dump the assembly code after genreating it */
 gboolean dump_asm    = FALSE;
 
@@ -487,6 +506,17 @@ mono_compile_method (MonoMethod *method)
 		guint32 cli_addr = ip - header->code;
 		switch (*ip) {
 
+		case CEE_NOP: 
+			++ip;
+			break;
+
+		case CEE_BREAK: 
+			++ip;
+			t1 = ctree_new_leaf (MB_TERM_BREAK, 0);
+			t1->cli_addr = cli_addr;
+			ADD_TREE (t1);
+			break;
+
 		case CEE_CALL: {
 			MonoMethodSignature *csig;
 			MonoMethod *cm;
@@ -692,70 +722,16 @@ mono_compile_method (MonoMethod *method)
 			ip += 4;
 			break;
 
-		case CEE_BLT:
-		case CEE_BLT_S: {
-			int near_jump = *ip == CEE_BLT_S;
-			++ip;
-			sp -= 2;
-			t1 = ctree_new (MB_TERM_BLT, 0, sp [0], sp [1]);
-			if (near_jump) 
-				t1->data.i = cli_addr + 2 + (signed char) *ip;
-			else 
-				t1->data.i = cli_addr + 5 + (gint32) read32 (ip);
-
-			t1->cli_addr = sp [0]->cli_addr;
-			ADD_TREE (t1);
-			ip += near_jump ? 1: 4;		
-			break;
-		}
-		case CEE_BNE_UN:
-		case CEE_BNE_UN_S: {
-			int near_jump = *ip == CEE_BNE_UN_S;
-			++ip;
-			sp -= 2;
-			t1 = ctree_new (MB_TERM_BNE_UN, 0, sp [0], sp [1]);
-			if (near_jump)
-				t1->data.i = cli_addr + 2 + (signed char) *ip;
-			else 
-				t1->data.i = cli_addr + 5 + (gint32) read32 (ip);
-
-			t1->cli_addr = sp [0]->cli_addr;
-			ADD_TREE (t1);
-			ip += near_jump ? 1: 4;		
-			break;
-		}
-		case CEE_BEQ:
-		case CEE_BEQ_S: {
-			int near_jump = *ip == CEE_BEQ_S;
-			++ip;
-			sp -= 2;
-			t1 = ctree_new (MB_TERM_BEQ, 0, sp [0], sp [1]);
-			if (near_jump)
-				t1->data.i = cli_addr + 2 + (signed char) *ip;
-			else 
-				t1->data.i = cli_addr + 5 + (gint32) read32 (ip);
-
-			t1->cli_addr = sp [0]->cli_addr;
-			ADD_TREE (t1);
-			ip += near_jump ? 1: 4;		
-			break;
-		}
-		case CEE_BGE:
-		case CEE_BGE_S: {
-			int near_jump = *ip == CEE_BGE_S;
-			++ip;
-			sp -= 2;
-			t1 = ctree_new (MB_TERM_BGE, 0, sp [0], sp [1]);
-			if (near_jump)
-				t1->data.i = cli_addr + 2 + (signed char) *ip;
-			else 
-				t1->data.i = cli_addr + 5 + (gint32) read32 (ip);
-
-			t1->cli_addr = sp [0]->cli_addr;
-			ADD_TREE (t1);
-			ip += near_jump ? 1: 4;		
-			break;
-		}
+		MAKE_CJUMP(BGT)
+		MAKE_CJUMP(BGT_UN)
+		MAKE_CJUMP(BLT)
+		MAKE_CJUMP(BLT_UN)
+		MAKE_CJUMP(BNE_UN)
+		MAKE_CJUMP(BEQ)
+		MAKE_CJUMP(BGE)
+		MAKE_CJUMP(BGE_UN)
+		MAKE_CJUMP(BLE)
+		MAKE_CJUMP(BLE_UN)
 
 		case CEE_BRTRUE:
 		case CEE_BRTRUE_S: {

+ 40 - 64
mono/jit/testjit.c

@@ -36,6 +36,25 @@ char *opcode_names [] = {
 };
 #undef OPDEF
 
+#define MAKE_CJUMP(name)                                                      \
+case CEE_##name:                                                              \
+case CEE_##name##_S:                                                          \
+{                                                                             \
+	int near_jump = *ip == CEE_##name##_S;                                \
+	++ip;                                                                 \
+	sp -= 2;                                                              \
+	t1 = ctree_new (MB_TERM_##name, 0, sp [0], sp [1]);                   \
+	if (near_jump)                                                        \
+		t1->data.i = cli_addr + 2 + (signed char) *ip;                \
+	else                                                                  \
+		t1->data.i = cli_addr + 5 + (gint32) read32 (ip);             \
+	t1->cli_addr = sp [0]->cli_addr;                                      \
+	ADD_TREE (t1);                                                        \
+	ip += near_jump ? 1: 4;		                                      \
+	break;                                                                \
+}
+
+
 /* Whether to dump the assembly code after genreating it */
 gboolean dump_asm    = FALSE;
 
@@ -487,6 +506,17 @@ mono_compile_method (MonoMethod *method)
 		guint32 cli_addr = ip - header->code;
 		switch (*ip) {
 
+		case CEE_NOP: 
+			++ip;
+			break;
+
+		case CEE_BREAK: 
+			++ip;
+			t1 = ctree_new_leaf (MB_TERM_BREAK, 0);
+			t1->cli_addr = cli_addr;
+			ADD_TREE (t1);
+			break;
+
 		case CEE_CALL: {
 			MonoMethodSignature *csig;
 			MonoMethod *cm;
@@ -692,70 +722,16 @@ mono_compile_method (MonoMethod *method)
 			ip += 4;
 			break;
 
-		case CEE_BLT:
-		case CEE_BLT_S: {
-			int near_jump = *ip == CEE_BLT_S;
-			++ip;
-			sp -= 2;
-			t1 = ctree_new (MB_TERM_BLT, 0, sp [0], sp [1]);
-			if (near_jump) 
-				t1->data.i = cli_addr + 2 + (signed char) *ip;
-			else 
-				t1->data.i = cli_addr + 5 + (gint32) read32 (ip);
-
-			t1->cli_addr = sp [0]->cli_addr;
-			ADD_TREE (t1);
-			ip += near_jump ? 1: 4;		
-			break;
-		}
-		case CEE_BNE_UN:
-		case CEE_BNE_UN_S: {
-			int near_jump = *ip == CEE_BNE_UN_S;
-			++ip;
-			sp -= 2;
-			t1 = ctree_new (MB_TERM_BNE_UN, 0, sp [0], sp [1]);
-			if (near_jump)
-				t1->data.i = cli_addr + 2 + (signed char) *ip;
-			else 
-				t1->data.i = cli_addr + 5 + (gint32) read32 (ip);
-
-			t1->cli_addr = sp [0]->cli_addr;
-			ADD_TREE (t1);
-			ip += near_jump ? 1: 4;		
-			break;
-		}
-		case CEE_BEQ:
-		case CEE_BEQ_S: {
-			int near_jump = *ip == CEE_BEQ_S;
-			++ip;
-			sp -= 2;
-			t1 = ctree_new (MB_TERM_BEQ, 0, sp [0], sp [1]);
-			if (near_jump)
-				t1->data.i = cli_addr + 2 + (signed char) *ip;
-			else 
-				t1->data.i = cli_addr + 5 + (gint32) read32 (ip);
-
-			t1->cli_addr = sp [0]->cli_addr;
-			ADD_TREE (t1);
-			ip += near_jump ? 1: 4;		
-			break;
-		}
-		case CEE_BGE:
-		case CEE_BGE_S: {
-			int near_jump = *ip == CEE_BGE_S;
-			++ip;
-			sp -= 2;
-			t1 = ctree_new (MB_TERM_BGE, 0, sp [0], sp [1]);
-			if (near_jump)
-				t1->data.i = cli_addr + 2 + (signed char) *ip;
-			else 
-				t1->data.i = cli_addr + 5 + (gint32) read32 (ip);
-
-			t1->cli_addr = sp [0]->cli_addr;
-			ADD_TREE (t1);
-			ip += near_jump ? 1: 4;		
-			break;
-		}
+		MAKE_CJUMP(BGT)
+		MAKE_CJUMP(BGT_UN)
+		MAKE_CJUMP(BLT)
+		MAKE_CJUMP(BLT_UN)
+		MAKE_CJUMP(BNE_UN)
+		MAKE_CJUMP(BEQ)
+		MAKE_CJUMP(BGE)
+		MAKE_CJUMP(BGE_UN)
+		MAKE_CJUMP(BLE)
+		MAKE_CJUMP(BLE_UN)
 
 		case CEE_BRTRUE:
 		case CEE_BRTRUE_S: {

+ 106 - 2
mono/jit/x86.brg

@@ -74,9 +74,9 @@ gint64 mono_lldiv  (gint64 a, gint64 b);
 
 # constatnts
 %term CONST_I4 CONST_R8
-%term LDLOC LDARG STLOC BR RET RETV ARG CALL
+%term LDLOC LDARG STLOC BR RET RETV ARG CALL BREAK
 %term ADD SUB MUL DIV
-%term BLT BEQ BGE BRTRUE BRFALSE BNE_UN
+%term BLT BLT_UN BEQ BNE_UN BRTRUE BRFALSE BGE BGE_UN  BLE BLE_UN BGT BGT_UN 
 %term CONV_I4 CONV_I1 CONV_I2 CONV_I8
 #
 # we start at stmt
@@ -289,6 +289,46 @@ stmt: BLT (reg, CONST_I4) "MB_USE_OPT1(0)" {
 	x86_branch32 (s->code, X86_CC_LT, tree->data.i - offset, TRUE); 
 }
 
+stmt: BLT_UN (reg, reg) 1 {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_reg (s->code, X86_CMP, tree->left->reg1, tree->right->reg1);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_LT, tree->data.i - offset, FALSE); 
+}
+
+stmt: BLT_UN (reg, CONST_I4) "MB_USE_OPT1(0)" {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_imm (s->code, X86_CMP, tree->left->reg1, tree->right->data.i);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_LT, tree->data.i - offset, FALSE); 
+}
+
+stmt: BGT (reg, reg) 1 {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_reg (s->code, X86_CMP, tree->left->reg1, tree->right->reg1);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_GT, tree->data.i - offset, TRUE); 
+}
+
+stmt: BGT (reg, CONST_I4) "MB_USE_OPT1(0)" {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_imm (s->code, X86_CMP, tree->left->reg1, tree->right->data.i);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_GT, tree->data.i - offset, TRUE); 
+}
+
 stmt: BEQ (reg, CONST_I4) "MB_USE_OPT1(0)" {
 	guint8 *start = s->code;
 	gint32 offset;
@@ -349,6 +389,66 @@ stmt: BGE (reg, CONST_I4) "MB_USE_OPT1(0)" {
 	x86_branch32 (s->code, X86_CC_GE, tree->data.i - offset, TRUE);
 }
 
+stmt: BGE_UN (reg, reg) 1 {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_reg (s->code, X86_CMP, tree->left->reg1, tree->right->reg1);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_GE, tree->data.i - offset, FALSE);
+}
+
+stmt: BGE_UN (reg, CONST_I4) "MB_USE_OPT1(0)" {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_imm (s->code, X86_CMP, tree->left->reg1, tree->right->data.i);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_GE, tree->data.i - offset, FALSE);
+}
+
+stmt: BLE (reg, reg) 1 {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_reg (s->code, X86_CMP, tree->left->reg1, tree->right->reg1);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_LE, tree->data.i - offset, TRUE);
+}
+
+stmt: BLE (reg, CONST_I4) "MB_USE_OPT1(0)" {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_imm (s->code, X86_CMP, tree->left->reg1, tree->right->data.i);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_LE, tree->data.i - offset, TRUE);
+}
+
+stmt: BLE_UN (reg, reg) 1 {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_reg (s->code, X86_CMP, tree->left->reg1, tree->right->reg1);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_LE, tree->data.i - offset, FALSE);
+}
+
+stmt: BLE_UN (reg, CONST_I4) "MB_USE_OPT1(0)" {
+	guint8 *start = s->code;
+	gint32 offset;
+
+	tree->is_jump = 1;
+	x86_alu_reg_imm (s->code, X86_CMP, tree->left->reg1, tree->right->data.i);
+	offset = 6 + s->code - start;
+	x86_branch32 (s->code, X86_CC_LE, tree->data.i - offset, FALSE);
+}
+
 stmt: BRTRUE (reg) {
 	guint8 *start = s->code;
 	gint32 offset;
@@ -369,6 +469,10 @@ stmt: BRFALSE (reg) {
 	x86_branch32 (s->code, X86_CC_EQ, tree->data.i - offset, TRUE);
 }
 
+stmt: BREAK {
+	x86_breakpoint (s->code);
+}
+
 stmt: RETV (reg) {
 	if (tree->left->reg1 != X86_EAX)
 		x86_mov_reg_reg (s->code, X86_EAX, tree->left->reg1, 4);