diff options
author | John van Groningen | 2003-05-14 11:38:10 +0000 |
---|---|---|
committer | John van Groningen | 2003-05-14 11:38:10 +0000 |
commit | 62bf4eaed204cb1e5ff315c8080cf747f0bc5944 (patch) | |
tree | 7601b204736acfdb33d2ea92a7faf42c5152d1ea /cgpwas.c | |
parent | optimize and immediate (diff) |
optimise division by non power of 2 on PowerPC
Diffstat (limited to 'cgpwas.c')
-rw-r--r-- | cgpwas.c | 65 |
1 files changed, 65 insertions, 0 deletions
@@ -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; } } |