Message ID | F56EA673D3E56E48804FE2B0D23EFD2D218B22C1A2@KCINPUNHJCMS01.kpit.com |
---|---|
State | New |
Headers | show |
On 10/29/10 08:17, Kaushik Phatak wrote: > Hi, > The patch below fixes an ICE caused when 16-bit constants are used > as operand 2 in logical operation. > > MSTP.CRA.WORD |= 0x40; -> This is OK > MSTP.CRA.WORD |= 0x4000; -> This generates ICE > > Operand 2 is right shifted by 8 so that it is in valid range to > perform bit-operation in QI mode. > The 'abs' is used for specific cases for constants like 0xFEFF (-257). > > Regression done for h8300-elf-* and no new regressions found. > Please comment. > > Regards, > Kaushik Phatak > www.kpitgnutools.com > > Changelog: > > 2010-10-29 Kaushik Phatak<kaushik.phatak@kpitcummins.com> > > * config/h8300/h8300.md (define_splits) : Add condition for > 16-bit const operands. A nit, be more specific about which splitters. List each one separately. You might call them "and with single_zero" "ior with single_one" and "xor with single_one" splitters or something like that. > > diff -upr trunk.orig/gcc/config/h8300/h8300.md trunk/gcc/config/h8300/h8300.md > --- trunk.orig/gcc/config/h8300/h8300.md 2010-08-26 20:55:19.000000000 +0530 > +++ trunk/gcc/config/h8300/h8300.md 2010-10-28 19:57:14.000000000 +0530 > @@ -1781,8 +1781,17 @@ > (and:QI (match_dup 1) > (match_dup 2)))] > { > - operands[0] = adjust_address (operands[0], QImode, 1); > - operands[1] = adjust_address (operands[1], QImode, 1); > + if(abs(INTVAL(operands[2]))> 0xFF) Formatting nits. You want a space after the "if" and before each open parenthesis. I'd really like to see a test included for the testsuite. OK with those changes. Jeff
diff -upr trunk.orig/gcc/config/h8300/h8300.md trunk/gcc/config/h8300/h8300.md --- trunk.orig/gcc/config/h8300/h8300.md 2010-08-26 20:55:19.000000000 +0530 +++ trunk/gcc/config/h8300/h8300.md 2010-10-28 19:57:14.000000000 +0530 @@ -1781,8 +1781,17 @@ (and:QI (match_dup 1) (match_dup 2)))] { - operands[0] = adjust_address (operands[0], QImode, 1); - operands[1] = adjust_address (operands[1], QImode, 1); + if(abs(INTVAL(operands[2])) > 0xFF) + { + operands[0] = adjust_address (operands[0], QImode, 0); + operands[1] = adjust_address (operands[1], QImode, 0); + operands[2] = GEN_INT ((INTVAL(operands[2])) >> 8); + } + else + { + operands[0] = adjust_address (operands[0], QImode, 1); + operands[1] = adjust_address (operands[1], QImode, 1); + } }) (define_insn "bclrhi_msx" @@ -1916,8 +1925,17 @@ (ior:QI (match_dup 1) (match_dup 2)))] { - operands[0] = adjust_address (operands[0], QImode, 1); - operands[1] = adjust_address (operands[1], QImode, 1); + if(abs(INTVAL(operands[2])) > 0xFF) + { + operands[0] = adjust_address (operands[0], QImode, 0); + operands[1] = adjust_address (operands[1], QImode, 0); + operands[2] = GEN_INT ((INTVAL(operands[2])) >> 8); + } + else + { + operands[0] = adjust_address (operands[0], QImode, 1); + operands[1] = adjust_address (operands[1], QImode, 1); + } }) (define_insn "bsethi_msx" @@ -1982,8 +2000,17 @@ (xor:QI (match_dup 1) (match_dup 2)))] { - operands[0] = adjust_address (operands[0], QImode, 1); - operands[1] = adjust_address (operands[1], QImode, 1); + if(abs(INTVAL(operands[2])) > 0xFF) + { + operands[0] = adjust_address (operands[0], QImode, 0); + operands[1] = adjust_address (operands[1], QImode, 0); + operands[2] = GEN_INT ((INTVAL(operands[2])) >> 8); + } + else + { + operands[0] = adjust_address (operands[0], QImode, 1); + operands[1] = adjust_address (operands[1], QImode, 1); + } }) (define_insn "bnothi_msx"