summaryrefslogtreecommitdiff
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
parentfix bugs in code generation for floating point computations for amd64 (diff)
add generating instruction for converting real to int
-rw-r--r--cgaas.c90
-rw-r--r--cgawas.c12
2 files changed, 64 insertions, 38 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");
}
}
diff --git a/cgawas.c b/cgawas.c
index eda248a..ba2d403 100644
--- a/cgawas.c
+++ b/cgawas.c
@@ -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");