summaryrefslogtreecommitdiff
path: root/cgpwas.c
diff options
context:
space:
mode:
authorJohn van Groningen2003-05-13 14:49:37 +0000
committerJohn van Groningen2003-05-13 14:49:37 +0000
commit65ffe63ccd4e5257d2e0e6a5d48799c690ebebe5 (patch)
treecd02de2a69bc5712e476efff9547b2f77fb905b5 /cgpwas.c
parentoptimize remainder of power of 2 for ia32 (diff)
optimize and immediate
Diffstat (limited to 'cgpwas.c')
-rw-r--r--cgpwas.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/cgpwas.c b/cgpwas.c
index 23f7add..e2e6fba 100644
--- a/cgpwas.c
+++ b/cgpwas.c
@@ -995,19 +995,43 @@ static void w_as_and_instruction (struct instruction *instruction)
int reg;
if (instruction->instruction_parameters[0].parameter_type==P_IMMEDIATE){
- int i;
+ int i,i2;
i=instruction->instruction_parameters[0].parameter_data.i;
if (i==(UWORD)i){
w_as_opcode ("andi.");
-
w_as_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r);
w_as_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r);
w_as_immediate (i);
w_as_newline();
return;
+ } else if (((UWORD)i)==0){
+ w_as_opcode ("andis.");
+ w_as_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r);
+ w_as_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r);
+ w_as_immediate (((unsigned int)i)>>16);
+ w_as_newline();
+
+ return;
+ } else if (i2=i | (i-1),(i2 & (i2+1))==0){
+ int n_leading_0_bits,n_leading_0_bits_and_1_bits;
+
+ n_leading_0_bits = __cntlzw (i);
+ n_leading_0_bits_and_1_bits = __cntlzw (i ^ ((unsigned)0xffffffffu>>(unsigned)n_leading_0_bits));
+
+ w_as_opcode ("rlwinm");
+ w_as_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r);
+ w_as_register_comma (instruction->instruction_parameters[1].parameter_data.reg.r);
+ w_as_immediate (0);
+ w_as_comma();
+ w_as_immediate (n_leading_0_bits);
+ w_as_comma();
+ w_as_immediate (n_leading_0_bits_and_1_bits-1);
+ w_as_newline();
+
+ return;
} else {
w_as_opcode ("lis");
w_as_register_comma (REGISTER_O0);
@@ -1908,7 +1932,7 @@ static void w_as_seto_condition_instruction (struct instruction *instruction)
static void w_as_rem_instruction (struct instruction *instruction)
{
int reg;
-
+
if (instruction->instruction_parameters[0].parameter_type==P_IMMEDIATE){
int i,sd_reg;