diff options
author | John van Groningen | 2006-02-24 12:40:35 +0000 |
---|---|---|
committer | John van Groningen | 2006-02-24 12:40:35 +0000 |
commit | 3af5ad706c94218c5a6429a14f5b1e9acd6fe5ad (patch) | |
tree | 8c827fecffd03312f71fa1d2aaed95f069a8db82 | |
parent | fix bugs in code generation for floating point computations for amd64 (diff) |
add generating instruction for converting real to int
-rw-r--r-- | cgaas.c | 90 | ||||
-rw-r--r-- | cgawas.c | 12 |
2 files changed, 64 insertions, 38 deletions
@@ -3566,49 +3566,69 @@ void store_descriptor_string_in_data_section (char *string,int length,LABEL *str static void as_fmovel_instruction (struct instruction *instruction) { - int d_freg; - - d_freg=instruction->instruction_parameters[1].parameter_data.reg.r; - - switch (instruction->instruction_parameters[0].parameter_type){ - case P_REGISTER: - { - int reg1_n; + if (instruction->instruction_parameters[0].parameter_type==P_F_REGISTER){ + if (instruction->instruction_parameters[1].parameter_type==P_REGISTER){ + int s_freg,reg1_n; - reg1_n=reg_num (instruction->instruction_parameters[0].parameter_data.reg.r); + s_freg=instruction->instruction_parameters[0].parameter_data.reg.r; + reg1_n=reg_num (instruction->instruction_parameters[1].parameter_data.reg.r); + + /* cvtsd2si */ store_c (0xf2); - store_c (0x48 | ((d_freg & 8)>>1) | ((reg1_n & 8)>>3)); + store_c (0x48 | ((s_freg & 8)>>1) | ((reg1_n & 8)>>3)); store_c (0x0f); - store_c (0x2a); - store_c (0xc0 | ((d_freg & 7)<<3) | (reg1_n & 7)); + store_c (0x2d); + store_c (0xc0 | ((s_freg & 7)<<3) | (reg1_n & 7)); + } else + internal_error_in_function ("as_fmovel_instruction"); + } else { + int d_freg; - break; - } - case P_INDIRECT: - as_f_id_rexaw (0xf2,0x2a,instruction->instruction_parameters[0].parameter_offset, - instruction->instruction_parameters[0].parameter_data.reg.r,d_freg); - break; - case P_INDEXED: - as_f_x_rexaw (0xf2,0x2a,instruction->instruction_parameters[0].parameter_offset, - instruction->instruction_parameters[0].parameter_data.ir,d_freg); - break; - case P_IMMEDIATE: - { - LABEL *new_label; - - new_label=allocate_memory_from_heap (sizeof (struct label)); - - new_label->label_flags=DATA_LABEL; + d_freg=instruction->instruction_parameters[1].parameter_data.reg.r; + + switch (instruction->instruction_parameters[0].parameter_type){ + case P_REGISTER: + { + int reg1_n; + + reg1_n=reg_num (instruction->instruction_parameters[0].parameter_data.reg.r); + + /* cvtsi2sd */ + + store_c (0xf2); + store_c (0x48 | ((d_freg & 8)>>1) | ((reg1_n & 8)>>3)); + store_c (0x0f); + store_c (0x2a); + store_c (0xc0 | ((d_freg & 7)<<3) | (reg1_n & 7)); + + break; + } + case P_INDIRECT: + as_f_id_rexaw (0xf2,0x2a,instruction->instruction_parameters[0].parameter_offset, + instruction->instruction_parameters[0].parameter_data.reg.r,d_freg); + break; + case P_INDEXED: + as_f_x_rexaw (0xf2,0x2a,instruction->instruction_parameters[0].parameter_offset, + instruction->instruction_parameters[0].parameter_data.ir,d_freg); + break; + case P_IMMEDIATE: + { + LABEL *new_label; + + new_label=allocate_memory_from_heap (sizeof (struct label)); - define_data_label (new_label); - store_long_word_in_data_section (instruction->instruction_parameters[0].parameter_data.i); + new_label->label_flags=DATA_LABEL; + + define_data_label (new_label); + store_long_word_in_data_section (instruction->instruction_parameters[0].parameter_data.i); - as_f_a_rexaw (0xf2,0x2a,new_label,d_freg); - break; + as_f_a_rexaw (0xf2,0x2a,new_label,d_freg); + break; + } + default: + internal_error_in_function ("as_fmovel_instruction"); } - default: - internal_error_in_function ("as_fmovel_instruction"); } } @@ -2682,9 +2682,15 @@ static int int_to_real_scratch_imported=0; static void w_as_fmovel_instruction (struct instruction *instruction) { - if (instruction->instruction_parameters[0].parameter_type==P_F_REGISTER) - internal_error_in_function ("w_as_fmovel_instruction"); - else { + if (instruction->instruction_parameters[0].parameter_type==P_F_REGISTER){ + if (instruction->instruction_parameters[1].parameter_type==P_REGISTER){ + w_as_opcode ("cvtsd2si"); + w_as_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_fp_register (instruction->instruction_parameters[0].parameter_data.reg.r); + w_as_newline(); + } else + internal_error_in_function ("w_as_fmovel_instruction"); + } else { switch (instruction->instruction_parameters[0].parameter_type){ case P_REGISTER: w_as_opcode ("cvtsi2sd"); |