summaryrefslogtreecommitdiff
path: root/cgawas.c
diff options
context:
space:
mode:
authorJohn van Groningen2010-12-13 11:47:06 +0000
committerJohn van Groningen2010-12-13 11:47:06 +0000
commite3910aabcb617a6e1fb0e7057e2f65a9a3be2617 (patch)
tree6c1658c1168a168bab7cea06e41f8370f04c86b7 /cgawas.c
parentfix centry on 64 bit linux for the first 4 int arguments, (diff)
optimize for cpu with a 128 bit sse unit (instead of 64):
use mosvd instead of movlpd for loads and use movapd instead of movsd for register to register moves, add -sse64 option to optimize for 64 bit sse,
Diffstat (limited to 'cgawas.c')
-rw-r--r--cgawas.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/cgawas.c b/cgawas.c
index 99a27c4..b02c334 100644
--- a/cgawas.c
+++ b/cgawas.c
@@ -29,6 +29,8 @@
int intel_asm=1;
+extern int sse_128;
+
#define for_l(v,l,n) for(v=(l);v!=NULL;v=v->n)
#define IO_BUF_SIZE 8192
@@ -2638,7 +2640,7 @@ static void w_as_float_neg_instruction (struct instruction *instruction)
w_as_float_constant (label_number,instruction->instruction_parameters[0].parameter_data.r);
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (d_freg);
w_as_comma();
fprintf (assembly_file,"qword ptr i_%d",label_number);
@@ -2646,7 +2648,7 @@ static void w_as_float_neg_instruction (struct instruction *instruction)
break;
}
case P_INDIRECT:
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (d_freg);
w_as_comma();
fprintf (assembly_file,"qword ptr ");
@@ -2654,7 +2656,7 @@ static void w_as_float_neg_instruction (struct instruction *instruction)
w_as_newline();
break;
case P_INDEXED:
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (d_freg);
w_as_comma();
fprintf (assembly_file,"qword ptr ");
@@ -2663,7 +2665,7 @@ static void w_as_float_neg_instruction (struct instruction *instruction)
break;
case P_F_REGISTER:
if (instruction->instruction_parameters[0].parameter_data.reg.r!=d_freg){
- w_as_opcode ("movsd");
+ w_as_opcode (sse_128 ? "movapd" : "movsd");
w_as_fp_register (d_freg);
w_as_comma();
w_as_fp_register (instruction->instruction_parameters[0].parameter_data.reg.r);
@@ -2705,7 +2707,7 @@ static void w_as_float_abs_instruction (struct instruction *instruction)
w_as_float_constant (label_number,instruction->instruction_parameters[0].parameter_data.r);
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (d_freg);
w_as_comma();
fprintf (assembly_file,"qword ptr i_%d",label_number);
@@ -2713,7 +2715,7 @@ static void w_as_float_abs_instruction (struct instruction *instruction)
break;
}
case P_INDIRECT:
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (d_freg);
w_as_comma();
fprintf (assembly_file,"qword ptr ");
@@ -2721,7 +2723,7 @@ static void w_as_float_abs_instruction (struct instruction *instruction)
w_as_newline();
break;
case P_INDEXED:
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (d_freg);
w_as_comma();
fprintf (assembly_file,"qword ptr ");
@@ -2730,7 +2732,7 @@ static void w_as_float_abs_instruction (struct instruction *instruction)
break;
case P_F_REGISTER:
if (instruction->instruction_parameters[0].parameter_data.reg.r!=d_freg){
- w_as_opcode ("movsd");
+ w_as_opcode (sse_128 ? "movapd" : "movsd");
w_as_fp_register (d_freg);
w_as_comma();
w_as_fp_register (instruction->instruction_parameters[0].parameter_data.reg.r);
@@ -2763,13 +2765,13 @@ static void w_as_fmove_instruction (struct instruction *instruction)
case P_F_REGISTER:
switch (instruction->instruction_parameters[0].parameter_type){
case P_F_REGISTER:
- w_as_opcode ("movsd");
+ w_as_opcode (sse_128 ? "movapd" : "movsd");
w_as_fp_register (instruction->instruction_parameters[1].parameter_data.reg.r);
w_as_comma();
w_as_fp_register (instruction->instruction_parameters[0].parameter_data.reg.r);
break;
case P_INDIRECT:
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (instruction->instruction_parameters[1].parameter_data.reg.r);
w_as_comma();
if (intel_asm)
@@ -2778,7 +2780,7 @@ static void w_as_fmove_instruction (struct instruction *instruction)
instruction->instruction_parameters[0].parameter_data.reg.r);
break;
case P_INDEXED:
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (instruction->instruction_parameters[1].parameter_data.reg.r);
w_as_comma();
if (intel_asm)
@@ -2792,7 +2794,7 @@ static void w_as_fmove_instruction (struct instruction *instruction)
w_as_float_constant (label_number,instruction->instruction_parameters[0].parameter_data.r);
- w_as_opcode ("movlpd");
+ w_as_opcode (sse_128 ? "movsd" : "movlpd");
w_as_fp_register (instruction->instruction_parameters[1].parameter_data.reg.r);
w_as_comma();
if (intel_asm)