summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgaas.c31
-rw-r--r--cgawas.c8
-rw-r--r--cgias.c18
-rw-r--r--cgiwas.c8
4 files changed, 50 insertions, 15 deletions
diff --git a/cgaas.c b/cgaas.c
index 631b27e..091dead 100644
--- a/cgaas.c
+++ b/cgaas.c
@@ -1820,14 +1820,32 @@ static void as_sbb_instruction (struct instruction *instruction)
}
}
+static void as_test_r_r (int r)
+{
+ int r_n;
+
+ r_n=reg_num (r);
+ store_c (0x48 | ((r_n & 8)>>1) | ((r_n & 8)>>3));
+ store_c (0205);
+ store_c (0300 | ((r_n & 7)<<3) | (r_n & 7));
+}
+
enum { SIZE_LONG, SIZE_WORD, SIZE_BYTE };
static void as_cmp_i_parameter (int i,struct parameter *parameter)
{
switch (parameter->parameter_type){
case P_REGISTER:
- as_i_r2 (0201,0070,0075,i,parameter->parameter_data.reg.r);
+ {
+ int r;
+
+ r=parameter->parameter_data.reg.r;
+ if (i==0)
+ as_test_r_r (r);
+ else
+ as_i_r2 (0201,0070,0075,i,r);
return;
+ }
case P_INDIRECT:
as_i_id2 (0201,0070,i,parameter->parameter_offset,parameter->parameter_data.reg.r);
return;
@@ -2938,17 +2956,8 @@ static void as_tst_instruction (struct instruction *instruction)
{
switch (instruction->instruction_parameters[0].parameter_type){
case P_REGISTER:
- {
- int r,r_n;
-
- r=instruction->instruction_parameters[0].parameter_data.reg.r;
- r_n=reg_num (r);
-
- store_c (0x48 | ((r_n & 8)>>1) | ((r_n & 8)>>3));
- store_c (0205);
- store_c (0300 | ((r_n & 7)<<3) | (r_n & 7));
+ as_test_r_r (instruction->instruction_parameters[0].parameter_data.reg.r);
break;
- }
default:
as_cmp_i_parameter (0,&instruction->instruction_parameters[0]);
break;
diff --git a/cgawas.c b/cgawas.c
index ca61f3b..eda248a 100644
--- a/cgawas.c
+++ b/cgawas.c
@@ -1451,6 +1451,14 @@ static void w_as_cmp_instruction (struct instruction *instruction,int size_flag)
parameter_0.parameter_type=P_REGISTER;
parameter_0.parameter_data.reg.r=REGISTER_O0;
}
+ case P_IMMEDIATE:
+ if (parameter_0.parameter_data.i==0 && parameter_1.parameter_type==P_REGISTER && size_flag==SIZE_LONG){
+ w_as_opcode (intel_asm ? "test" : "testl");
+ w_as_register (parameter_1.parameter_data.reg.r);
+ w_as_comma_register (parameter_1.parameter_data.reg.r);
+ w_as_newline();
+ return;
+ }
}
w_as_opcode (intel_asm ? "cmp" : "cmpl");
diff --git a/cgias.c b/cgias.c
index 835559a..725595a 100644
--- a/cgias.c
+++ b/cgias.c
@@ -1653,8 +1653,18 @@ static void as_cmp_i_parameter (int i,struct parameter *parameter)
{
switch (parameter->parameter_type){
case P_REGISTER:
- as_i_r2 (0201,0070,0075,i,parameter->parameter_data.reg.r);
+ {
+ int r;
+
+ r=parameter->parameter_data.reg.r;
+ if (i==0){
+ r=reg_num (r);
+ store_c (0205); /* test */
+ store_c (0300 | (r<<3) | r);
+ } else
+ as_i_r2 (0201,0070,0075,i,r);
return;
+ }
case P_INDIRECT:
as_i_id2 (0201,0070,i,parameter->parameter_offset,parameter->parameter_data.reg.r);
return;
@@ -4432,7 +4442,7 @@ static void as_profile_call (struct basic_block *block)
default: profile_label=profile_s_label;
}
}
- store_c (0350);
+ store_c (0350); /* call */
store_l (0);
as_branch_label (profile_label,CALL_RELOCATION);
}
@@ -4446,7 +4456,7 @@ static void as_apply_update_entry (struct basic_block *block)
as_profile_call (block);
if (block->block_n_node_arguments==-200){
- store_c (0351);
+ store_c (0351); /* jmp */
store_l (0);
as_branch_label (block->block_ea_label,JUMP_RELOCATION);
@@ -4460,7 +4470,7 @@ static void as_apply_update_entry (struct basic_block *block)
store_l (0);
as_branch_label (add_empty_node_labels[block->block_n_node_arguments+200],CALL_RELOCATION);
- store_c (0351);
+ store_c (0351); /* jmp */
store_l (0);
as_branch_label (block->block_ea_label,JUMP_RELOCATION);
}
diff --git a/cgiwas.c b/cgiwas.c
index fe96a4c..eef34df 100644
--- a/cgiwas.c
+++ b/cgiwas.c
@@ -1223,6 +1223,14 @@ static void w_as_cmp_instruction (struct instruction *instruction,int size_flag)
parameter_0.parameter_type=P_REGISTER;
parameter_0.parameter_data.reg.r=REGISTER_O0;
}
+ case P_IMMEDIATE:
+ if (parameter_0.parameter_data.i==0 && parameter_1.parameter_type==P_REGISTER && size_flag==SIZE_LONG){
+ w_as_opcode (intel_asm ? "test" : "testl");
+ w_as_register (parameter_1.parameter_data.reg.r);
+ w_as_comma_register (parameter_1.parameter_data.reg.r);
+ w_as_newline();
+ return;
+ }
}
w_as_opcode (intel_asm ? "cmp" : "cmpl");