diff options
author | John van Groningen | 2003-05-13 14:49:37 +0000 |
---|---|---|
committer | John van Groningen | 2003-05-13 14:49:37 +0000 |
commit | 65ffe63ccd4e5257d2e0e6a5d48799c690ebebe5 (patch) | |
tree | cd02de2a69bc5712e476efff9547b2f77fb905b5 /cgpwas.c | |
parent | optimize remainder of power of 2 for ia32 (diff) |
optimize and immediate
Diffstat (limited to 'cgpwas.c')
-rw-r--r-- | cgpwas.c | 30 |
1 files changed, 27 insertions, 3 deletions
@@ -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; |