summaryrefslogtreecommitdiff
path: root/cgpwas.c
diff options
context:
space:
mode:
authorJohn van Groningen2003-05-14 11:38:10 +0000
committerJohn van Groningen2003-05-14 11:38:10 +0000
commit62bf4eaed204cb1e5ff315c8080cf747f0bc5944 (patch)
tree7601b204736acfdb33d2ea92a7faf42c5152d1ea /cgpwas.c
parentoptimize and immediate (diff)
optimise division by non power of 2 on PowerPC
Diffstat (limited to 'cgpwas.c')
-rw-r--r--cgpwas.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/cgpwas.c b/cgpwas.c
index e2e6fba..14639f5 100644
--- a/cgpwas.c
+++ b/cgpwas.c
@@ -2052,6 +2052,71 @@ static void w_as_div_instruction (struct instruction *instruction)
w_as_register_newline (sd_reg);
return;
+ } else if (i>1 || i<-1){
+ struct ms ms;
+
+ ms=magic (i);
+
+ sd_reg=instruction->instruction_parameters[1].parameter_data.reg.r;
+
+ w_as_opcode ("lis");
+ w_as_register_comma (REGISTER_O0);
+ w_as_immediate ((ms.m-(WORD)ms.m)>>16);
+ w_as_newline();
+
+ w_as_opcode ("addi");
+ w_as_register_comma (REGISTER_O0);
+ w_as_register_comma (REGISTER_O0);
+ w_as_immediate ((WORD)ms.m);
+ w_as_newline();
+
+ w_as_opcode ("mulhw");
+ w_as_register_comma (REGISTER_O0);
+ w_as_register_comma (REGISTER_O0);
+ w_as_register_newline (sd_reg);
+
+ if (i>=0){
+ if (ms.m<0){
+ w_as_opcode ("add");
+ w_as_register_comma (REGISTER_O0);
+ w_as_register_comma (REGISTER_O0);
+ w_as_register_newline (sd_reg);
+ }
+
+ w_as_opcode ("srwi");
+ w_as_register_comma (sd_reg);
+ w_as_register_comma (sd_reg);
+ w_as_immediate (31);
+ w_as_newline();
+ } else {
+ if (ms.m>=0){
+ w_as_opcode ("sub");
+ w_as_register_comma (REGISTER_O0);
+ w_as_register_comma (REGISTER_O0);
+ w_as_register_newline (sd_reg);
+ }
+
+ w_as_opcode ("srwi");
+ w_as_register_comma (sd_reg);
+ w_as_register_comma (REGISTER_O0);
+ w_as_immediate (31);
+ w_as_newline();
+ }
+
+ if (ms.s>0){
+ w_as_opcode ("srawi");
+ w_as_register_comma (REGISTER_O0);
+ w_as_register_comma (REGISTER_O0);
+ w_as_immediate (ms.s);
+ w_as_newline();
+ }
+
+ w_as_opcode ("add");
+ w_as_register_comma (sd_reg);
+ w_as_register_comma (sd_reg);
+ w_as_register_newline (REGISTER_O0);
+
+ return;
}
}