On x86-64 we can use 64-bit operands directly, unlike on x86-32.

Signed-off-by: Eduard - Gabriel Munteanu <eduard.munte...@linux360.ro>
---
 arch/x86/insn-selector.brg |  201 ++++++++++++++------------------------------
 1 files changed, 64 insertions(+), 137 deletions(-)

diff --git a/arch/x86/insn-selector.brg b/arch/x86/insn-selector.brg
index 29a044b..1848748 100644
--- a/arch/x86/insn-selector.brg
+++ b/arch/x86/insn-selector.brg
@@ -284,103 +284,47 @@ reg:   EXPR_TEMPORARY 0
 
 reg:   OP_ADD(reg, EXPR_LOCAL) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
        binop_reg_local_low(state, s, tree, INSN_ADD_MEMBASE_REG);
-
-       if (expr->vm_type == J_LONG) {
-               binop_reg_local_high(state, s, tree, INSN_ADC_MEMBASE_REG);
-       }
+       binop_reg_local_high(state, s, tree, INSN_ADC_MEMBASE_REG);
 }
 
 reg:   OP_ADD(reg, EXPR_VALUE) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
        binop_reg_value_low(state, s, tree, INSN_ADD_IMM_REG);
-
-       if (expr->vm_type == J_LONG) {
-               binop_reg_value_high(state, s, tree, INSN_ADC_IMM_REG);
-       }
+       binop_reg_value_high(state, s, tree, INSN_ADC_IMM_REG);
 }
 
 reg:   OP_ADD(reg, reg) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
-       state->reg1 = state->left->reg1;
        binop_reg_reg_low(state, s, tree, INSN_ADD_REG_REG);
-
-       if (expr->vm_type == J_LONG) {
-               state->reg2 = state->left->reg2;
-               binop_reg_reg_high(state, s, tree, INSN_ADC_REG_REG);
-       }
+       binop_reg_reg_high(state, s, tree, INSN_ADC_REG_REG);
 }
 
 freg:  OP_FADD(freg, freg) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
-       state->reg1 = state->left->reg1;
        binop_reg_reg_low(state, s, tree, INSN_FADD_REG_REG);
 }
 
 reg:   OP_SUB(reg, EXPR_LOCAL) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
        binop_reg_local_low(state, s, tree, INSN_SUB_MEMBASE_REG);
-
-       if (expr->vm_type == J_LONG) {
-               binop_reg_local_high(state, s, tree, INSN_SBB_MEMBASE_REG);
-       }
+       binop_reg_local_high(state, s, tree, INSN_SBB_MEMBASE_REG);
 }
 
 reg:   OP_SUB(reg, EXPR_VALUE) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
        binop_reg_value_low(state, s, tree, INSN_SUB_IMM_REG);
-
-       if (expr->vm_type == J_LONG) {
-               binop_reg_value_high(state, s, tree, INSN_SBB_IMM_REG);
-       }
+       binop_reg_value_high(state, s, tree, INSN_SBB_IMM_REG);
 }
 
 reg:   OP_SUB(reg, reg) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
-       state->reg1 = state->left->reg1;
        binop_reg_reg_low(state, s, tree, INSN_SUB_REG_REG);
-
-       if (expr->vm_type == J_LONG) {
-               state->reg2 = state->left->reg2;
-               binop_reg_reg_high(state, s, tree, INSN_SBB_REG_REG);
-       }
+       binop_reg_reg_high(state, s, tree, INSN_SBB_REG_REG);
 }
 
 freg:  OP_FSUB(freg, freg) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
-       state->reg1 = state->left->reg1;
        binop_reg_reg_low(state, s, tree, INSN_FSUB_REG_REG);
 }
 
@@ -623,89 +567,38 @@ reg:      OP_USHR_64(reg, reg) 1
 
 reg:   OP_OR(reg, EXPR_LOCAL) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
-       state->reg1 = state->left->reg1;
-
        binop_reg_local_low(state, s, tree, INSN_OR_MEMBASE_REG);
-
-       if (expr->vm_type == J_LONG) {
-               state->reg2 = state->left->reg2;
-               binop_reg_local_high(state, s, tree, INSN_OR_MEMBASE_REG);
-       }
+       binop_reg_local_high(state, s, tree, INSN_OR_MEMBASE_REG);
 }
 
 reg:   OP_OR(reg, reg) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
-       state->reg1 = state->left->reg1;
        binop_reg_reg_low(state, s, tree, INSN_OR_REG_REG);
-
-       if (expr->vm_type == J_LONG) {
-               state->reg2 = state->left->reg2;
-               binop_reg_reg_high(state, s, tree, INSN_OR_REG_REG);
-       }
+       binop_reg_reg_high(state, s, tree, INSN_OR_REG_REG);
 }
 
 reg:   OP_AND(reg, EXPR_LOCAL) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
        binop_reg_local_low(state, s, tree, INSN_AND_MEMBASE_REG);
-
-       if (expr->vm_type == J_LONG) {
-               binop_reg_local_high(state, s, tree, INSN_AND_MEMBASE_REG);
-       }
+       binop_reg_local_high(state, s, tree, INSN_AND_MEMBASE_REG);
 }
 
 reg:   OP_AND(reg, reg) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
-       state->reg1 = state->left->reg1;
        binop_reg_reg_low(state, s, tree, INSN_AND_REG_REG);
-
-       if (expr->vm_type == J_LONG) {
-               state->reg2 = state->left->reg2;
-               binop_reg_reg_high(state, s, tree, INSN_AND_REG_REG);
-       }
+       binop_reg_reg_high(state, s, tree, INSN_AND_REG_REG);
 }
 
 reg:   OP_XOR(reg, EXPR_LOCAL) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
        binop_reg_local_low(state, s, tree, INSN_XOR_MEMBASE_REG);
-
-       if (expr->vm_type == J_LONG) {
-               binop_reg_local_high(state, s, tree, INSN_XOR_MEMBASE_REG);
-       }
+       binop_reg_local_high(state, s, tree, INSN_XOR_MEMBASE_REG);
 }
 
 reg:   OP_XOR(reg, reg) 1
 {
-       struct expression *expr;
-
-       expr = to_expr(tree);
-
-       state->reg1 = state->left->reg1;
        binop_reg_reg_low(state, s, tree, INSN_XOR_REG_REG);
-
-       if (expr->vm_type == J_LONG) {
-               state->reg2 = state->left->reg2;
-               binop_reg_reg_high(state, s, tree, INSN_XOR_REG_REG);
-       }
+       binop_reg_reg_high(state, s, tree, INSN_XOR_REG_REG);
 }
 
 reg:   EXPR_INVOKE(arg) 1
@@ -1891,14 +1784,6 @@ static void binop_reg_local_low(struct _MBState *state, 
struct basic_block *bb,
        __binop_reg_local(state, bb, tree, insn_type, state->left->reg1, 0);
 }
 
-static void binop_reg_local_high(struct _MBState *state, struct basic_block 
*bb,
-                           struct tree_node *tree, enum insn_type insn_type)
-{
-       state->reg2 = state->left->reg2;
-
-       __binop_reg_local(state, bb, tree, insn_type, state->left->reg2, 4);
-}
-
 static void binop_reg_value_low(struct _MBState *state, struct basic_block *bb,
                                struct tree_node *tree, enum insn_type 
insn_type)
 {
@@ -1912,40 +1797,82 @@ static void binop_reg_value_low(struct _MBState *state, 
struct basic_block *bb,
        select_insn(bb, tree, imm_reg_insn(insn_type, right->value & ~0UL, 
state->reg1));
 }
 
+static void binop_reg_reg_low(struct _MBState *state, struct basic_block *bb,
+                         struct tree_node *tree, enum insn_type insn_type)
+{
+       struct var_info *src, *dst;
+
+       src = state->right->reg1;
+       dst = state->left->reg1;
+
+       state->reg1 = dst;
+
+       select_insn(bb, tree, reg_reg_insn(insn_type, src, dst));
+}
+
+#ifdef CONFIG_X86_32
+static void binop_reg_local_high(struct _MBState *state, struct basic_block 
*bb,
+                           struct tree_node *tree, enum insn_type insn_type)
+{
+       struct expression *expr = to_expr(tree);
+
+       if (expr->vm_type != J_LONG)
+               return;
+
+       state->reg2 = state->left->reg2;
+
+       __binop_reg_local(state, bb, tree, insn_type, state->left->reg2, 4);
+}
+
 static void binop_reg_value_high(struct _MBState *state, struct basic_block 
*bb,
                                struct tree_node *tree, enum insn_type 
insn_type)
 {
        struct expression *expr, *right;
 
+       expr = to_expr(tree);
+
+       if (expr->vm_type != J_LONG)
+               return;
+
        state->reg2 = state->left->reg2;
 
-       expr = to_expr(tree);
        right = to_expr(expr->binary_right);
 
        select_insn(bb, tree, imm_reg_insn(insn_type, right->value >> 32, 
state->reg2));
 }
 
-static void binop_reg_reg_low(struct _MBState *state, struct basic_block *bb,
+static void binop_reg_reg_high(struct _MBState *state, struct basic_block *bb,
                          struct tree_node *tree, enum insn_type insn_type)
 {
        struct var_info *src, *dst;
+       struct expression *expr = to_expr(tree);
 
-       src = state->right->reg1;
-       dst = state->left->reg1;
+       if (expr->vm_type != J_LONG)
+               return;
+
+       src = state->right->reg2;
+       dst = state->left->reg2;
+
+       state->reg2 = dst;
 
        select_insn(bb, tree, reg_reg_insn(insn_type, src, dst));
 }
+#else /* CONFIG_X86_32 */
+static void binop_reg_local_high(struct _MBState *state, struct basic_block 
*bb,
+                           struct tree_node *tree, enum insn_type insn_type)
+{
+}
+
+static void binop_reg_value_high(struct _MBState *state, struct basic_block 
*bb,
+                               struct tree_node *tree, enum insn_type 
insn_type)
+{
+}
 
 static void binop_reg_reg_high(struct _MBState *state, struct basic_block *bb,
                          struct tree_node *tree, enum insn_type insn_type)
 {
-       struct var_info *src, *dst;
-
-       src = state->right->reg2;
-       dst = state->left->reg2;
-
-       select_insn(bb, tree, reg_reg_insn(insn_type, src, dst));
 }
+#endif /* CONFIG_X86_32 */
 
 static void shift_reg_local(struct _MBState *state, struct basic_block *bb,
                            struct tree_node *tree, enum insn_type insn_type)
-- 
1.6.0.6


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to