summaryrefslogtreecommitdiff
path: root/cgopt.c
diff options
context:
space:
mode:
authorJohn van Groningen2008-12-18 15:45:45 +0000
committerJohn van Groningen2008-12-18 15:45:45 +0000
commit5f6ab0641baad6c7e6e933c73ffe2f513203661f (patch)
tree559dd46159795aa0e83307606e3a64f8cd23a345 /cgopt.c
parentrename GMOD to GREM (diff)
add floordiv and mod
Diffstat (limited to 'cgopt.c')
-rw-r--r--cgopt.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/cgopt.c b/cgopt.c
index 8b8710c..f27a14f 100644
--- a/cgopt.c
+++ b/cgopt.c
@@ -422,6 +422,7 @@ IF_G_RISC (case IADDI: case ILSLI:)
IF_G_SPARC (case IADDO: case ISUBO: )
#ifdef I486
case IDIVI: case IREMI: case IREMU: case IMULUD: case IDIVDU:
+ case IFLOORDIV: case IMOD:
#endif
#if (defined (I486) && !defined (I486_USE_SCRATCH_REGISTER)) || defined (G_POWER)
case IDIVU:
@@ -680,6 +681,8 @@ static void compute_maximum_b_stack_offsets (register int b_offset)
instruction->instruction_icode!=IASR_S &&
instruction->instruction_icode!=ILSL_S &&
instruction->instruction_icode!=ILSR_S &&
+ instruction->instruction_icode!=IFLOORDIV &&
+ instruction->instruction_icode!=IMOD &&
#endif
instruction->instruction_icode!=IREM)
#ifdef M68000
@@ -918,6 +921,8 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off
instruction->instruction_icode!=IASR_S &&
instruction->instruction_icode!=ILSL_S &&
instruction->instruction_icode!=ILSR_S &&
+ instruction->instruction_icode!=IFLOORDIV &&
+ instruction->instruction_icode!=IMOD &&
instruction->instruction_icode!=IREM)
internal_error_in_function ("optimize_stack_access");
/* only first argument of mod might be register indirect */
@@ -1689,6 +1694,16 @@ IF_G_RISC (case IADDI: case ILSLI:)
use_parameter (&instruction->instruction_parameters[0]);
break;
#endif
+#ifdef I486
+ case IFLOORDIV: case IMOD:
+ define_parameter (&instruction->instruction_parameters[2]);
+ use_parameter (&instruction->instruction_parameters[1]);
+ if (instruction->instruction_arity==4)
+ define_parameter (&instruction->instruction_parameters[0]);
+ else
+ use_parameter (&instruction->instruction_parameters[0]);
+ break;
+#endif
#if 0
case IFBEQ: case IFBGE: case IFBGT: case IFBLE: case IFBLT: case IFBNE:
define_scratch_register();
@@ -4033,6 +4048,20 @@ IF_G_RISC (case IADDI: case ILSLI:)
# endif
break;
#endif
+#ifdef I486
+ case IFLOORDIV: case IMOD:
+ if (instruction->instruction_arity==4)
+ use_3_same_type_registers
+ (&instruction->instruction_parameters[0].parameter_data.reg,DEF,
+ &instruction->instruction_parameters[1].parameter_data.reg,USE_DEF,
+ &instruction->instruction_parameters[2].parameter_data.reg,DEF,D_REGISTER);
+ else
+ use_3_same_type_registers
+ (&instruction->instruction_parameters[0].parameter_data.reg,USE,
+ &instruction->instruction_parameters[1].parameter_data.reg,USE_DEF,
+ &instruction->instruction_parameters[2].parameter_data.reg,DEF,D_REGISTER);
+ break;
+#endif
#if 0
case IFBEQ: case IFBGE: case IFBGT: case IFBLE: case IFBLT: case IFBNE:
use_scratch_register();