From 5f6ab0641baad6c7e6e933c73ffe2f513203661f Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Thu, 18 Dec 2008 15:45:45 +0000 Subject: add floordiv and mod --- cgopt.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'cgopt.c') 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(); -- cgit v1.2.3