summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgpas.c70
-rw-r--r--cgpwas.c171
2 files changed, 158 insertions, 83 deletions
diff --git a/cgpas.c b/cgpas.c
index 6b1b636..4717f5a 100644
--- a/cgpas.c
+++ b/cgpas.c
@@ -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)
diff --git a/cgpwas.c b/cgpwas.c
index 918fd77..8924761 100644
--- a/cgpwas.c
+++ b/cgpwas.c
@@ -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 (&parameter_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 (&parameter_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 (&parameter_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 (&parameter_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 (&parameter_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 (&parameter_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 (&parameter_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 (&parameter_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)