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 /cgpas.c | |
parent | optimize remainder of power of 2 for ia32 (diff) |
optimize and immediate
Diffstat (limited to 'cgpas.c')
-rw-r--r-- | cgpas.c | 20 |
1 files changed, 18 insertions, 2 deletions
@@ -492,6 +492,7 @@ static unsigned char real_reg_num [32] = #define as_addze(rd,ra) store_instruction ((31<<26)|(reg_num(rd)<<21)|(reg_num(ra)<<16)|(202<<1)) #define as_and(ra,rs,rb) as_i_sab (rs,ra,rb,28) #define as_andi_(ra,rs,si) as_i_dai (28,rs,ra,si) +#define as_andis_(ra,rs,si) as_i_dai (29,rs,ra,si) #define as_b() store_instruction (18<<26) #define as_bctr() store_instruction ((19<<26)|(20<<21)|(528<<1)) #define as_bctrl() store_instruction ((19<<26)|(20<<21)|(528<<1)|1) @@ -1321,7 +1322,7 @@ static void as_rem_instruction (struct instruction *instruction) if (instruction->instruction_parameters[0].parameter_type==P_IMMEDIATE){ int i,sd_reg; - + i=instruction->instruction_parameters[0].parameter_data.i; if ((i & (i-1))==0 && i>1){ int log2i; @@ -1364,7 +1365,7 @@ static void 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; @@ -1372,6 +1373,21 @@ static void as_and_instruction (struct instruction *instruction) as_andi_ (instruction->instruction_parameters[1].parameter_data.reg.r, instruction->instruction_parameters[1].parameter_data.reg.r,i); return; + } else if (((UWORD)i)==0){ + as_andis_ ( instruction->instruction_parameters[1].parameter_data.reg.r, + instruction->instruction_parameters[1].parameter_data.reg.r, + ((unsigned int)i)>>16); + 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)); + + as_rlwinm ( instruction->instruction_parameters[1].parameter_data.reg.r, + instruction->instruction_parameters[1].parameter_data.reg.r, + 0,n_leading_0_bits,n_leading_0_bits_and_1_bits-1); + return; } else { as_lis (REGISTER_O0,(i-(WORD)i)>>16); |