diff options
-rw-r--r-- | cgpas.c | 70 | ||||
-rw-r--r-- | cgpwas.c | 171 |
2 files changed, 158 insertions, 83 deletions
@@ -2387,17 +2387,25 @@ static void as_fmul_instruction (struct instruction *instruction) 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) - { - as_load_float_immediate (*next_instruction->instruction_parameters[0].parameter_data.r,16); - as_fmadd ( next_instruction->instruction_parameters[1].parameter_data.reg.r+14, - freg+14, - instruction->instruction_parameters[1].parameter_data.reg.r+14, - 16+14); + } 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){ + as_load_float_immediate (*next_instruction->instruction_parameters[0].parameter_data.r,16); + as_fmadd ( next_instruction->instruction_parameters[1].parameter_data.reg.r+14, + freg+14, + instruction->instruction_parameters[1].parameter_data.reg.r+14, + 16+14); - return next_instruction; - } + return next_instruction; + } else if ( next_instruction->instruction_parameters[0].parameter_type==P_INDIRECT){ + as_lfd (16+14,next_instruction->instruction_parameters[0].parameter_offset,next_instruction->instruction_parameters[0].parameter_data.reg.r); + as_fmadd ( next_instruction->instruction_parameters[1].parameter_data.reg.r+14, + freg+14, + instruction->instruction_parameters[1].parameter_data.reg.r+14, + 16+14); + + return next_instruction; + } + } } else if (next_instruction->instruction_icode==IFSUB){ if (next_instruction->instruction_parameters[0].parameter_type==P_F_REGISTER && next_instruction->instruction_parameters[0].parameter_data.reg.r!=next_instruction->instruction_parameters[1].parameter_data.reg.r) @@ -2431,9 +2439,8 @@ static void as_fmul_instruction (struct instruction *instruction) next_instruction->instruction_parameters[0].parameter_data.reg.r+14); 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) - { + } 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){ 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) as_fnmsub ( next_instruction->instruction_parameters[1].parameter_data.reg.r+14, @@ -2447,6 +2454,21 @@ static void as_fmul_instruction (struct instruction *instruction) 16+14); return next_instruction; + } else if (next_instruction->instruction_parameters[0].parameter_type==P_INDIRECT){ + as_lfd (16+14,next_instruction->instruction_parameters[0].parameter_offset,next_instruction->instruction_parameters[0].parameter_data.reg.r); + if (next_instruction->instruction_parameters[1].parameter_flags & FP_REVERSE_SUB_DIV_OPERANDS) + as_fnmsub ( next_instruction->instruction_parameters[1].parameter_data.reg.r+14, + freg+14, + instruction->instruction_parameters[1].parameter_data.reg.r+14, + 16+14); + else + as_fmsub ( next_instruction->instruction_parameters[1].parameter_data.reg.r+14, + freg+14, + instruction->instruction_parameters[1].parameter_data.reg.r+14, + 16+14); + + return next_instruction; + } } } } @@ -2540,15 +2562,19 @@ static struct instruction *as_fmove_instruction (struct instruction *instruction next_of_next_instruction->instruction_parameters[1].parameter_data.reg.r+14); 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) - { - as_load_float_immediate (*next_of_next_instruction->instruction_parameters[0].parameter_data.r,16); - as_fmadd (reg1+14,reg0+14,reg_s+14,16+14); - - 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){ + as_load_float_immediate (*next_of_next_instruction->instruction_parameters[0].parameter_data.r,16); + as_fmadd (reg1+14,reg0+14,reg_s+14,16+14); + + return next_of_next_instruction; + } else if (next_of_next_instruction->instruction_parameters[0].parameter_type==P_INDIRECT){ + as_lfd (16+14,next_of_next_instruction->instruction_parameters[0].parameter_offset,next_of_next_instruction->instruction_parameters[0].parameter_data.reg.r); + as_fmadd (reg1+14,reg0+14,reg_s+14,16+14); + + 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) @@ -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) |