summaryrefslogtreecommitdiff
path: root/cgaas.c
diff options
context:
space:
mode:
authorJohn van Groningen2006-02-24 12:40:35 +0000
committerJohn van Groningen2006-02-24 12:40:35 +0000
commit3af5ad706c94218c5a6429a14f5b1e9acd6fe5ad (patch)
tree8c827fecffd03312f71fa1d2aaed95f069a8db82 /cgaas.c
parentfix bugs in code generation for floating point computations for amd64 (diff)
add generating instruction for converting real to int
Diffstat (limited to 'cgaas.c')
-rw-r--r--cgaas.c90
1 files changed, 55 insertions, 35 deletions
diff --git a/cgaas.c b/cgaas.c
index 091dead..bd0e5c4 100644
--- a/cgaas.c
+++ b/cgaas.c
@@ -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");
}
}