From: Kaushik Phatak Date: Tue, 14 Dec 2010 07:03:36 +0000 (+0000) Subject: h8300.md (define_split): Add condition for "and with single_zero" splitter to handle... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c7e1fa82502f98b4ac9c6e576345debf6b56a654;p=gcc.git h8300.md (define_split): Add condition for "and with single_zero" splitter to handle 16-bit const operands. * config/h8300/h8300.md (define_split) : Add condition for "and with single_zero" splitter to handle 16-bit const operands. * config/h8300/h8300.md (define_split) : Add condition for "ior with single_one" splitter to handle 16-bit const operands. * config/h8300/h8300.md (define_split) : Add condition for "xor with single_one" splitter to handle 16-bit const operands. * testsuite/gcc.dg/h8300-bit-insn-ice.c: New. From-SVN: r167789 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9b20492ffa3..8d03fce20f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2010-12-14 Kaushik Phatak + + * config/h8300/h8300.md (define_split) : Add condition for + "and with single_zero" splitter to handle 16-bit const operands. + * config/h8300/h8300.md (define_split) : Add condition for + "ior with single_one" splitter to handle 16-bit const operands. + * config/h8300/h8300.md (define_split) : Add condition for + "xor with single_one" splitter to handle 16-bit const operands. + * testsuite/gcc.dg/h8300-bit-insn-ice.c: New. + 2010-12-13 Jan Hubicka PR middle-end/45388 diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md index 513ad4c3969..21ab3910256 100644 --- a/gcc/config/h8300/h8300.md +++ b/gcc/config/h8300/h8300.md @@ -1779,8 +1779,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" @@ -1910,8 +1919,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" @@ -1976,8 +1994,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" diff --git a/gcc/testsuite/gcc.dg/h8300-bit-insn-ice.c b/gcc/testsuite/gcc.dg/h8300-bit-insn-ice.c new file mode 100644 index 00000000000..442dc4bb9f2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/h8300-bit-insn-ice.c @@ -0,0 +1,39 @@ +/* { dg-skip-if "" { "h8300*-*-*" } "*" "-msx*" } */ +/* ICE for bit instruction generation using 16-bit const */ + +__extension__ struct st_mstp +{ + union + { + unsigned short WORD; + struct + { + unsigned char ACSE:1; + unsigned char _EXDMAC:1; + unsigned char _DMAC:1; + unsigned char _DTC:1; + unsigned char:2; + unsigned char _TMR23:1; + unsigned char _TMR01:1; + unsigned char:2; + unsigned char _DA:1; + unsigned char:1; + unsigned char _AD:1; + unsigned char:1; + unsigned char _TPUU:1; + unsigned char _TPUL:1; + } BIT; + } CRA; +}; +#define MSTP (*(volatile struct st_mstp *)0xFFFDC8) +#define MSTPA_EXDMA 0x4000 +#define MSTPA_AND 0xFEFF + +int +main () +{ + MSTP.CRA.WORD |= MSTPA_EXDMA; + MSTP.CRA.WORD ^= MSTPA_EXDMA; + MSTP.CRA.WORD &= MSTPA_AND; + return 0; +}