diff options
-rw-r--r-- | cgaas.c | 31 | ||||
-rw-r--r-- | cgawas.c | 8 | ||||
-rw-r--r-- | cgias.c | 18 | ||||
-rw-r--r-- | cgiwas.c | 8 |
4 files changed, 50 insertions, 15 deletions
@@ -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; @@ -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"); @@ -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); } @@ -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"); |