On x86-64 we can use 64-bit operands directly, unlike on x86-32.
Signed-off-by: Eduard - Gabriel Munteanu <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel