diff options
author | John van Groningen | 2005-04-14 10:38:57 +0000 |
---|---|---|
committer | John van Groningen | 2005-04-14 10:38:57 +0000 |
commit | 98276ba53d987a569a87f55e4441934e92ce74b5 (patch) | |
tree | 7b63233e173e58405fda8f8a8b1d018b7bc8c193 /cgpwas.c | |
parent | add Makefiles for MacOS X (diff) |
use fmadd also when add uses indirect load
Diffstat (limited to 'cgpwas.c')
-rw-r--r-- | cgpwas.c | 171 |
1 files changed, 110 insertions, 61 deletions
@@ -2537,12 +2537,10 @@ static struct instruction *w_as_fmul_instruction (struct instruction *instructio w_as_opcode ("fmadd"); - w_as_parameter (&next_instruction->instruction_parameters[1]); - w_as_comma(); + w_as_fp_register_comma (next_instruction->instruction_parameters[1].parameter_data.reg.r); w_as_parameter (¶meter_0); w_as_comma(); - w_as_parameter (&instruction->instruction_parameters[1]); - w_as_comma(); + w_as_fp_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r); w_as_parameter (&next_instruction->instruction_parameters[1]); w_as_newline(); @@ -2554,38 +2552,54 @@ static struct instruction *w_as_fmul_instruction (struct instruction *instructio w_as_opcode ("fmadd"); - w_as_parameter (&next_instruction->instruction_parameters[1]); - w_as_comma(); + w_as_fp_register_comma (next_instruction->instruction_parameters[1].parameter_data.reg.r); w_as_parameter (¶meter_0); w_as_comma(); - w_as_parameter (&instruction->instruction_parameters[1]); - w_as_comma(); + w_as_fp_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r); w_as_parameter (&next_instruction->instruction_parameters[0]); w_as_newline(); return next_instruction; } - } else if ( next_instruction->instruction_parameters[0].parameter_type==P_F_IMMEDIATE && - next_instruction->instruction_parameters[1].parameter_data.reg.r==instruction->instruction_parameters[1].parameter_data.reg.r) - { - struct parameter parameter_0; + } else if (next_instruction->instruction_parameters[1].parameter_data.reg.r==instruction->instruction_parameters[1].parameter_data.reg.r){ + if (next_instruction->instruction_parameters[0].parameter_type==P_F_IMMEDIATE){ + struct parameter parameter_0; - parameter_0=w_as_float_parameter (instruction->instruction_parameters[0]); + parameter_0=w_as_float_parameter (instruction->instruction_parameters[0]); - w_as_load_float_immediate (*next_instruction->instruction_parameters[0].parameter_data.r,16); + w_as_load_float_immediate (*next_instruction->instruction_parameters[0].parameter_data.r,16); - w_as_opcode ("fmadd"); + w_as_opcode ("fmadd"); - w_as_parameter (&next_instruction->instruction_parameters[1]); - w_as_comma(); - w_as_parameter (¶meter_0); - w_as_comma(); - w_as_parameter (&instruction->instruction_parameters[1]); - w_as_comma(); - w_as_fp_register (16); - w_as_newline(); - - return next_instruction; + w_as_fp_register_comma (next_instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_parameter (¶meter_0); + w_as_comma(); + w_as_fp_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_fp_register (16); + w_as_newline(); + + return next_instruction; + } else if ( next_instruction->instruction_parameters[0].parameter_type==P_INDIRECT){ + struct parameter parameter_0; + + parameter_0=w_as_float_parameter (instruction->instruction_parameters[0]); + + w_as_opcode ("lfd"); + w_as_fp_register_comma (16); + w_as_indirect (next_instruction->instruction_parameters[0].parameter_offset,next_instruction->instruction_parameters[0].parameter_data.reg.r); + w_as_newline(); + + w_as_opcode ("fmadd"); + + w_as_fp_register_comma (next_instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_parameter (¶meter_0); + w_as_comma(); + w_as_fp_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_fp_register (16); + w_as_newline(); + + return next_instruction; + } } } else if (next_instruction->instruction_icode==IFSUB){ if (next_instruction->instruction_parameters[0].parameter_type==P_F_REGISTER && @@ -2634,30 +2648,51 @@ static struct instruction *w_as_fmul_instruction (struct instruction *instructio return next_instruction; } - } else if ( next_instruction->instruction_parameters[0].parameter_type==P_F_IMMEDIATE && - next_instruction->instruction_parameters[1].parameter_data.reg.r==instruction->instruction_parameters[1].parameter_data.reg.r) - { - struct parameter parameter_0; + } else if (next_instruction->instruction_parameters[1].parameter_data.reg.r==instruction->instruction_parameters[1].parameter_data.reg.r){ + if (next_instruction->instruction_parameters[0].parameter_type==P_F_IMMEDIATE){ + struct parameter parameter_0; - parameter_0=w_as_float_parameter (instruction->instruction_parameters[0]); + parameter_0=w_as_float_parameter (instruction->instruction_parameters[0]); - w_as_load_float_immediate (*next_instruction->instruction_parameters[0].parameter_data.r,16); + w_as_load_float_immediate (*next_instruction->instruction_parameters[0].parameter_data.r,16); - if (next_instruction->instruction_parameters[1].parameter_flags & FP_REVERSE_SUB_DIV_OPERANDS) - w_as_opcode ("fnmsub"); - else - w_as_opcode ("fmsub"); + if (next_instruction->instruction_parameters[1].parameter_flags & FP_REVERSE_SUB_DIV_OPERANDS) + w_as_opcode ("fnmsub"); + else + w_as_opcode ("fmsub"); - w_as_parameter (&next_instruction->instruction_parameters[1]); - w_as_comma(); - w_as_parameter (¶meter_0); - w_as_comma(); - w_as_parameter (&instruction->instruction_parameters[1]); - w_as_comma(); - w_as_fp_register (16); - w_as_newline(); - - return next_instruction; + w_as_fp_register_comma (next_instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_parameter (¶meter_0); + w_as_comma(); + w_as_fp_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_fp_register (16); + w_as_newline(); + + return next_instruction; + } else if (next_instruction->instruction_parameters[0].parameter_type==P_INDIRECT){ + struct parameter parameter_0; + + parameter_0=w_as_float_parameter (instruction->instruction_parameters[0]); + + w_as_opcode ("lfd"); + w_as_fp_register_comma (16); + w_as_indirect (next_instruction->instruction_parameters[0].parameter_offset,next_instruction->instruction_parameters[0].parameter_data.reg.r); + w_as_newline(); + + if (next_instruction->instruction_parameters[1].parameter_flags & FP_REVERSE_SUB_DIV_OPERANDS) + w_as_opcode ("fnmsub"); + else + w_as_opcode ("fmsub"); + + w_as_fp_register_comma (next_instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_parameter (¶meter_0); + w_as_comma(); + w_as_fp_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r); + w_as_fp_register (16); + w_as_newline(); + + return next_instruction; + } } } @@ -2749,22 +2784,36 @@ static struct instruction *w_as_fmove_instruction (struct instruction *instructi w_as_newline(); return next_of_next_instruction; - } else if ( next_of_next_instruction->instruction_parameters[0].parameter_type==P_F_IMMEDIATE && - next_of_next_instruction->instruction_parameters[1].parameter_data.reg.r==reg1) - { - w_as_load_float_immediate (*next_of_next_instruction->instruction_parameters[0].parameter_data.r,16); - - w_as_opcode ("fmadd"); - - w_as_fp_register (reg1); - w_as_comma(); - w_as_fp_register_comma (reg0); - w_as_fp_register_comma (reg_s); - w_as_fp_register (16); - w_as_newline(); - - return next_of_next_instruction; - } + } else if (next_of_next_instruction->instruction_parameters[1].parameter_data.reg.r==reg1){ + if (next_of_next_instruction->instruction_parameters[0].parameter_type==P_F_IMMEDIATE){ + w_as_load_float_immediate (*next_of_next_instruction->instruction_parameters[0].parameter_data.r,16); + + w_as_opcode ("fmadd"); + + w_as_fp_register_comma (reg1); + w_as_fp_register_comma (reg0); + w_as_fp_register_comma (reg_s); + w_as_fp_register (16); + w_as_newline(); + + return next_of_next_instruction; + } else if ( next_of_next_instruction->instruction_parameters[0].parameter_type==P_INDIRECT){ + w_as_opcode ("lfd"); + w_as_fp_register_comma (16); + w_as_indirect (next_of_next_instruction->instruction_parameters[0].parameter_offset,next_of_next_instruction->instruction_parameters[0].parameter_data.reg.r); + w_as_newline(); + + w_as_opcode ("fmadd"); + + w_as_fp_register_comma (reg1); + w_as_fp_register_comma (reg0); + w_as_fp_register_comma (reg_s); + w_as_fp_register (16); + w_as_newline(); + + return next_of_next_instruction; + } + } } else if (next_of_next_instruction->instruction_icode==IFSUB && next_of_next_instruction->instruction_parameters[0].parameter_type==P_F_REGISTER && next_of_next_instruction->instruction_parameters[0].parameter_data.reg.r!=next_of_next_instruction->instruction_parameters[1].parameter_data.reg.r) |