Patchwork [:,H8300] Minor bug fix for bit instructions

login
register
mail settings
Submitter Kaushik Phatak
Date Oct. 29, 2010, 2:17 p.m.
Message ID <F56EA673D3E56E48804FE2B0D23EFD2D218B22C1A2@KCINPUNHJCMS01.kpit.com>
Download mbox | patch
Permalink /patch/69591/
State New
Headers show

Comments

Kaushik Phatak - Oct. 29, 2010, 2:17 p.m.
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.
Jeff Law - Nov. 2, 2010, 3:51 a.m.
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

Patch

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"