Commit 9eb3a0dd by Naveen.H.S Committed by Kaz Kojima

invoke.texi: Document -mbitops for SH.

	* doc/invoke.texi: Document -mbitops for SH.
	* config/sh/constraints.md (K03, K12, Sbv, Sbw): New constraints.
	* config/sh/predicates.md (bitwise_memory_operand): New	predicate.
	* config/sh/sh.c (print_operand): Add %t operand code.
	* config/sh/sh.h (GO_IF_LEGITIMATE_INDEX): Add condition for SH2A.
	* config/sh/sh.md (*iorsi3_compact): Fix condition for SH2A.
	(extendqisi2_compact): Add the alternative for SH2A 4-byte mov.b.
	(extendqihi2): Likewise.
	(movqi_i): Likewise.
	(insv): Use bset, bclr and bst instructions for SH2A if	possible.
	(extv): Use bld instruction for SH2A if possible.
	(extzv): Likewise.
	(bclr_m2a, bclrmem_m2a, bset_m2a, bsetmem_m2a, bst_m2a, bld_m2a,
	bldsign_m2a, bld_reg, *bld_regqi, band_m2a, bandreg_m2a,
	bor_m2a, borreg_m2a, bxor_m2a, bxorreg_m2a): New insns.
	(bset.b, bclr.b): Define peepholes.
	* config/sh/sh.opt (mbitops): New option.

	* gcc.target/sh/sh2a-band.c: New test.
	* gcc.target/sh/sh2a-bclrmem.c: New test.
	* gcc.target/sh/sh2a-bld.c: New test.
	* gcc.target/sh/sh2a-bor.c: New test.
	* gcc.target/sh/sh2a-bsetmem.c: New test.
	* gcc.target/sh/sh2a-bxor.c: New test.

From-SVN: r133919
parent 97db009c
2008-04-04 Naveen.H.S <naveen.hs@kpitcummins.com>
* doc/invoke.texi: Document -mbitops for SH.
* config/sh/constraints.md (K03, K12, Sbv, Sbw): New constraints.
* config/sh/predicates.md (bitwise_memory_operand): New predicate.
* config/sh/sh.c (print_operand): Add %t operand code.
* config/sh/sh.h (GO_IF_LEGITIMATE_INDEX): Add condition for SH2A.
* config/sh/sh.md (*iorsi3_compact): Fix condition for SH2A.
(extendqisi2_compact): Add the alternative for SH2A 4-byte mov.b.
(extendqihi2): Likewise.
(movqi_i): Likewise.
(insv): Use bset, bclr and bst instructions for SH2A if possible.
(extv): Use bld instruction for SH2A if possible.
(extzv): Likewise.
(bclr_m2a, bclrmem_m2a, bset_m2a, bsetmem_m2a, bst_m2a, bld_m2a,
bldsign_m2a, bld_reg, *bld_regqi, band_m2a, bandreg_m2a,
bor_m2a, borreg_m2a, bxor_m2a, bxorreg_m2a): New insns.
(bset.b, bclr.b): Define peepholes.
* config/sh/sh.opt (mbitops): New option.
2008-04-04 Janis Johnson <janis187@us.ibm.com>
PR target/35620
......
......@@ -125,11 +125,21 @@
(and (match_code "const_int")
(match_test "CONST_OK_FOR_J16 (ival)")))
(define_constraint "K03"
"An unsigned 3-bit constant, as used in SH2A bclr, bset, etc."
(and (match_code "const_int")
(match_test "ival >= 0 && ival <= 7")))
(define_constraint "K08"
"An unsigned 8-bit constant, as used in and, or, etc."
(and (match_code "const_int")
(match_test "ival >= 0 && ival <= 255")))
(define_constraint "K12"
"An unsigned 8-bit constant, as used in SH2A 12-bit display."
(and (match_code "const_int")
(match_test "ival >= 0 && ival <= 4095")))
(define_constraint "K16"
"An unsigned 16-bit constant, as used in SHmedia shori."
(and (match_code "const_int")
......@@ -239,3 +249,15 @@
"@internal"
(and (match_test "memory_operand (op, GET_MODE (op))")
(match_test "GET_CODE (XEXP (op, 0)) != PLUS")))
(define_memory_constraint "Sbv"
"A memory reference, as used in SH2A bclr.b, bset.b, etc."
(and (match_test "MEM_P (op) && GET_MODE (op) == QImode")
(match_test "REG_P (XEXP (op, 0))")))
(define_memory_constraint "Sbw"
"A memory reference, as used in SH2A bclr.b, bset.b, etc."
(and (match_test "MEM_P (op) && GET_MODE (op) == QImode")
(match_test "GET_CODE (XEXP (op, 0)) == PLUS")
(match_test "REG_P (XEXP (XEXP (op, 0), 0))")
(match_test "satisfies_constraint_K12 (XEXP (XEXP (op, 0), 1))")))
......@@ -789,3 +789,19 @@
return 0;
return arith_reg_operand (op, mode);
})
(define_predicate "bitwise_memory_operand"
(match_code "mem")
{
if (GET_CODE (op) == MEM)
{
if (REG_P (XEXP (op, 0)))
return 1;
if (GET_CODE (XEXP (op, 0)) == PLUS
&& GET_CODE (XEXP (XEXP (op, 0), 0)) == REG
&& satisfies_constraint_K12 (XEXP (XEXP (op, 0), 1)))
return 1;
}
return 0;
})
......@@ -683,6 +683,7 @@ print_operand_address (FILE *stream, rtx x)
'U' Likewise for {LD,ST}{HI,LO}.
'V' print the position of a single bit set.
'W' print the position of a single bit cleared.
't' print a memory address which is a register.
'u' prints the lowest 16 bits of CONST_INT, as an unsigned value.
'o' output an operator. */
......@@ -822,6 +823,21 @@ print_operand (FILE *stream, rtx x, int code)
break;
}
break;
case 't':
gcc_assert (GET_CODE (x) == MEM);
x = XEXP (x, 0);
switch (GET_CODE (x))
{
case REG:
case SUBREG:
print_operand (stream, x, 0);
break;
default:
break;
}
break;
case 'o':
switch (GET_CODE (x))
{
......
......@@ -2449,6 +2449,12 @@ struct sh_args {
else \
break; \
} \
if (TARGET_SH2A) \
{ \
if (GET_MODE_SIZE (MODE) == 1 \
&& (unsigned) INTVAL (OP) < 4096) \
goto LABEL; \
} \
if (MODE_DISP_OK_4 ((OP), (MODE))) goto LABEL; \
if (MODE_DISP_OK_8 ((OP), (MODE))) goto LABEL; \
} \
......
......@@ -212,6 +212,10 @@ mbigtable
Target Report RejectNegative Mask(BIGTABLE)
Generate 32-bit offsets in switch tables
mbitops
Target Report RejectNegative Mask(BITOPS)
Generate bit instructions
mbranch-cost=
Target RejectNegative Joined UInteger Var(sh_branch_cost) Init(-1)
Cost to assume for a branch insn
......
......@@ -746,7 +746,7 @@ See RS/6000 and PowerPC Options.
-m5-compact -m5-compact-nofpu @gol
-mb -ml -mdalign -mrelax @gol
-mbigtable -mfmovd -mhitachi -mrenesas -mno-renesas -mnomacsave @gol
-mieee -misize -minline-ic_invalidate -mpadstruct -mspace @gol
-mieee -mbitops -misize -minline-ic_invalidate -mpadstruct -mspace @gol
-mprefergot -musermode -multcost=@var{number} -mdiv=@var{strategy} @gol
-mdivsi3_libfunc=@var{name} @gol
-madjust-unroll -mindexed-addressing -mgettrcost=@var{number} -mpt-fixed @gol
......@@ -13910,6 +13910,10 @@ linker option @option{-relax}.
Use 32-bit offsets in @code{switch} tables. The default is to use
16-bit offsets.
@item -mbitops
@opindex mbitops
Enable the use of bit manipulation instructions on SH2A.
@item -mfmovd
@opindex mfmovd
Enable the use of the instruction @code{fmovd}.
......
2008-04-04 Naveen.H.S <naveen.hs@kpitcummins.com>
* gcc.target/sh/sh2a-band.c: New test.
* gcc.target/sh/sh2a-bclrmem.c: New test.
* gcc.target/sh/sh2a-bld.c: New test.
* gcc.target/sh/sh2a-bor.c: New test.
* gcc.target/sh/sh2a-bsetmem.c: New test.
* gcc.target/sh/sh2a-bxor.c: New test.
2008-04-04 Janis Johnson <janis187@us.ibm.com>
* g++.dg/other/anon5.C: Don't depend on line number for error message.
/* Testcase to check generation of a SH2A specific instruction for
"BAND.B #imm3, @(disp12, Rn)". */
/* { dg-do assemble {target sh*-*-*}} */
/* { dg-options "-O1 -mbitops" } */
/* { dg-skip-if "" { "sh*-*-*" } "*" "-m2a -m2a-nofpu -m2a-single -m2a-single-only" } */
/* { dg-final { scan-assembler "band.b"} } */
volatile struct
{
union
{
unsigned char BYTE;
struct
{
unsigned char BIT7:1;
unsigned char BIT6:1;
unsigned char BIT5:1;
unsigned char BIT4:1;
unsigned char BIT3:1;
unsigned char BIT2:1;
unsigned char BIT1:1;
unsigned char BIT0:1;
}
BIT;
}
ICR0;
}
USRSTR;
volatile union t_IOR
{
unsigned short WORD;
struct
{
unsigned char IOR15:1;
unsigned char IOR14:1;
unsigned char IOR13:1;
unsigned char IOR12:1;
unsigned char IOR11:1;
unsigned char IOR10:1;
unsigned char IOR9:1;
unsigned char IOR8:1;
unsigned char IOR7:1;
unsigned char IOR6:1;
unsigned char IOR5:1;
unsigned char IOR4:1;
unsigned char IOR3:1;
unsigned char IOR2:1;
unsigned char IOR1:1;
unsigned char IOR0:1;
}
BIT;
}
PORT;
int
main ()
{
volatile unsigned char a;
/* Instruction generated is BAND.B #imm3, @(disp12, Rn) */
USRSTR.ICR0.BIT.BIT3 = USRSTR.ICR0.BIT.BIT4 & USRSTR.ICR0.BIT.BIT1;
USRSTR.ICR0.BIT.BIT2 = USRSTR.ICR0.BIT.BIT6 & USRSTR.ICR0.BIT.BIT6;
USRSTR.ICR0.BIT.BIT4 = USRSTR.ICR0.BIT.BIT2 & USRSTR.ICR0.BIT.BIT4;
USRSTR.ICR0.BIT.BIT6 = USRSTR.ICR0.BIT.BIT1 & USRSTR.ICR0.BIT.BIT3;
a = USRSTR.ICR0.BIT.BIT0 & USRSTR.ICR0.BIT.BIT1;
a = USRSTR.ICR0.BIT.BIT5 & USRSTR.ICR0.BIT.BIT7;
a = USRSTR.ICR0.BIT.BIT2 & USRSTR.ICR0.BIT.BIT6;
PORT.BIT.IOR13 = PORT.BIT.IOR0 & USRSTR.ICR0.BIT.BIT7;
PORT.BIT.IOR15 = PORT.BIT.IOR6 & USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR3 = PORT.BIT.IOR2 & USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR1 = PORT.BIT.IOR13 & USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR1 = PORT.BIT.IOR2 & USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR11 = PORT.BIT.IOR9 & USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR8 = PORT.BIT.IOR14 & USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR10 &= USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR1 &= USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR5 &= USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR14 &= USRSTR.ICR0.BIT.BIT4;
/* Instruction generated on using size optimization option "-Os". */
a = a & USRSTR.ICR0.BIT.BIT1;
a = a & USRSTR.ICR0.BIT.BIT4;
a = a & USRSTR.ICR0.BIT.BIT0;
return 0;
}
/* Testcase to check generation of a SH2A specific instruction
"BCLR #imm3,@(disp12,Rn)". */
/* { dg-do assemble {target sh*-*-*}} */
/* { dg-options "-O2 -mbitops" } */
/* { dg-skip-if "" { "sh*-*-*" } "*" "-m2a -m2a-nofpu -m2a-single -m2a-single-only" } */
/* { dg-final { scan-assembler "bclr"} } */
/* { dg-final { scan-assembler "bclr.b"} } */
volatile union un_paddr
{
unsigned char BYTE;
struct
{
unsigned char B15:1;
unsigned char B14:1;
unsigned char B13:1;
unsigned char B12:1;
unsigned char B11:1;
unsigned char B10:1;
unsigned char B9:1;
unsigned char B8:1;
unsigned char B7:1;
unsigned char B6:1;
unsigned char B5:1;
unsigned char B4:1;
unsigned char B3:1;
unsigned char B2:1;
unsigned char B1:1;
unsigned char B0:1;
}
BIT;
}
PADDR;
int
main ()
{
PADDR.BIT.B0 = 0;
PADDR.BIT.B3 = 0;
PADDR.BIT.B6 = 0;
PADDR.BIT.B1 &= 0;
PADDR.BIT.B4 &= 0;
PADDR.BIT.B7 &= 0;
PADDR.BIT.B10 = 0;
PADDR.BIT.B13 = 0;
PADDR.BIT.B15 = 0;
PADDR.BIT.B9 &= 0;
PADDR.BIT.B12 &= 0;
PADDR.BIT.B14 &= 0;
return 0;
}
/* A testcase to check generation of the following SH2A specific
instructions.
BLD #imm3, Rn
BLD.B #imm3, @(disp12, Rn)
*/
/* { dg-do assemble {target sh*-*-*}} */
/* { dg-options "-Os -mbitops" } */
/* { dg-skip-if "" { "sh*-*-*" } "*" "-m2a -m2a-nofpu -m2a-single -m2a-single-only" } */
/* { dg-final { scan-assembler "bld"} } */
/* { dg-final { scan-assembler "bld.b"} } */
volatile struct
{
union
{
unsigned char BYTE;
struct
{
unsigned char BIT7:1;
unsigned char BIT6:1;
unsigned char BIT5:1;
unsigned char BIT4:1;
unsigned char BIT3:1;
unsigned char BIT2:1;
unsigned char BIT1:1;
unsigned char BIT0:1;
}
BIT;
}
ICR0;
}
USRSTR;
int
main ()
{
volatile unsigned char a, b, c;
USRSTR.ICR0.BIT.BIT6 &= a;
USRSTR.ICR0.BIT.BIT5 |= b;
USRSTR.ICR0.BIT.BIT4 ^= c;
return 0;
}
/* Testcase to check generation of a SH2A specific instruction for
"BOR.B #imm3, @(disp12, Rn)". */
/* { dg-do assemble {target sh*-*-*}} */
/* { dg-options "-O1 -mbitops" } */
/* { dg-skip-if "" { "sh*-*-*" } "*" "-m2a -m2a-nofpu -m2a-single -m2a-single-only" } */
/* { dg-final { scan-assembler "bor.b"} } */
volatile struct
{
union
{
unsigned char BYTE;
struct
{
unsigned char BIT7:1;
unsigned char BIT6:1;
unsigned char BIT5:1;
unsigned char BIT4:1;
unsigned char BIT3:1;
unsigned char BIT2:1;
unsigned char BIT1:1;
unsigned char BIT0:1;
}
BIT;
}
ICR0;
}
USRSTR;
volatile union t_IOR
{
unsigned short WORD;
struct
{
unsigned char IOR15:1;
unsigned char IOR14:1;
unsigned char IOR13:1;
unsigned char IOR12:1;
unsigned char IOR11:1;
unsigned char IOR10:1;
unsigned char IOR9:1;
unsigned char IOR8:1;
unsigned char IOR7:1;
unsigned char IOR6:1;
unsigned char IOR5:1;
unsigned char IOR4:1;
unsigned char IOR3:1;
unsigned char IOR2:1;
unsigned char IOR1:1;
unsigned char IOR0:1;
}
BIT;
}
PORT;
int
main ()
{
volatile unsigned char a;
/* Instruction generated is BOR.B #imm3, @(disp12, Rn) */
USRSTR.ICR0.BIT.BIT3 = USRSTR.ICR0.BIT.BIT4 | USRSTR.ICR0.BIT.BIT1;
USRSTR.ICR0.BIT.BIT2 = USRSTR.ICR0.BIT.BIT6 | USRSTR.ICR0.BIT.BIT6;
USRSTR.ICR0.BIT.BIT4 = USRSTR.ICR0.BIT.BIT2 | USRSTR.ICR0.BIT.BIT4;
USRSTR.ICR0.BIT.BIT6 = USRSTR.ICR0.BIT.BIT1 | USRSTR.ICR0.BIT.BIT3;
a = USRSTR.ICR0.BIT.BIT0 | USRSTR.ICR0.BIT.BIT1;
a = USRSTR.ICR0.BIT.BIT5 | USRSTR.ICR0.BIT.BIT7;
a = USRSTR.ICR0.BIT.BIT2 | USRSTR.ICR0.BIT.BIT6;
PORT.BIT.IOR13 = PORT.BIT.IOR0 | USRSTR.ICR0.BIT.BIT7;
PORT.BIT.IOR15 = PORT.BIT.IOR6 | USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR3 = PORT.BIT.IOR2 | USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR1 = PORT.BIT.IOR13 | USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR1 = PORT.BIT.IOR2 | USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR11 = PORT.BIT.IOR9 | USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR8 = PORT.BIT.IOR14 | USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR10 |= USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR1 |= USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR5 |= USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR14 |= USRSTR.ICR0.BIT.BIT4;
/* Instruction generated on using size optimization option "-Os". */
a = a & USRSTR.ICR0.BIT.BIT1;
a = a & USRSTR.ICR0.BIT.BIT4;
a = a & USRSTR.ICR0.BIT.BIT0;
return 0;
}
/* Testcase to check generation of a SH2A specific instruction
"BSET #imm3,@(disp12,Rn)". */
/* { dg-do assemble {target sh*-*-*}} */
/* { dg-options "-O2 -mbitops" } */
/* { dg-skip-if "" { "sh*-*-*" } "*" "-m2a -m2a-nofpu -m2a-single -m2a-single-only" } */
/* { dg-final { scan-assembler "bset"} } */
/* { dg-final { scan-assembler "bset.b"} } */
volatile union un_paddr
{
unsigned char BYTE;
struct
{
unsigned char B15:1;
unsigned char B14:1;
unsigned char B13:1;
unsigned char B12:1;
unsigned char B11:1;
unsigned char B10:1;
unsigned char B9:1;
unsigned char B8:1;
unsigned char B7:1;
unsigned char B6:1;
unsigned char B5:1;
unsigned char B4:1;
unsigned char B3:1;
unsigned char B2:1;
unsigned char B1:1;
unsigned char B0:1;
}
BIT;
}
PADDR;
int
main ()
{
PADDR.BIT.B0 = 1;
PADDR.BIT.B3 = 1;
PADDR.BIT.B6 = 1;
PADDR.BIT.B1 |= 1;
PADDR.BIT.B4 |= 1;
PADDR.BIT.B7 |= 1;
PADDR.BIT.B10 = 1;
PADDR.BIT.B13 = 1;
PADDR.BIT.B15 = 1;
PADDR.BIT.B9 |= 1;
PADDR.BIT.B12 |= 1;
PADDR.BIT.B14 |= 1;
return 0;
}
/* Testcase to check generation of a SH2A specific instruction for
"BXOR.B #imm3, @(disp12, Rn)". */
/* { dg-do assemble {target sh*-*-*}} */
/* { dg-options "-O1 -mbitops" } */
/* { dg-skip-if "" { "sh*-*-*" } "*" "-m2a -m2a-nofpu -m2a-single -m2a-single-only" } */
/* { dg-final { scan-assembler "bxor.b"} } */
volatile struct
{
union
{
unsigned char BYTE;
struct
{
unsigned char BIT7:1;
unsigned char BIT6:1;
unsigned char BIT5:1;
unsigned char BIT4:1;
unsigned char BIT3:1;
unsigned char BIT2:1;
unsigned char BIT1:1;
unsigned char BIT0:1;
}
BIT;
}
ICR0;
}
USRSTR;
volatile union t_IOR
{
unsigned short WORD;
struct
{
unsigned char IOR15:1;
unsigned char IOR14:1;
unsigned char IOR13:1;
unsigned char IOR12:1;
unsigned char IOR11:1;
unsigned char IOR10:1;
unsigned char IOR9:1;
unsigned char IOR8:1;
unsigned char IOR7:1;
unsigned char IOR6:1;
unsigned char IOR5:1;
unsigned char IOR4:1;
unsigned char IOR3:1;
unsigned char IOR2:1;
unsigned char IOR1:1;
unsigned char IOR0:1;
}
BIT;
}
PORT;
int
main ()
{
volatile unsigned char a;
/* Instruction generated is BXOR.B #imm3, @(disp12, Rn) */
USRSTR.ICR0.BIT.BIT3 = USRSTR.ICR0.BIT.BIT4 ^ USRSTR.ICR0.BIT.BIT1;
USRSTR.ICR0.BIT.BIT2 = USRSTR.ICR0.BIT.BIT6 ^ USRSTR.ICR0.BIT.BIT6;
USRSTR.ICR0.BIT.BIT4 = USRSTR.ICR0.BIT.BIT2 ^ USRSTR.ICR0.BIT.BIT4;
USRSTR.ICR0.BIT.BIT6 = USRSTR.ICR0.BIT.BIT1 ^ USRSTR.ICR0.BIT.BIT3;
a = USRSTR.ICR0.BIT.BIT0 ^ USRSTR.ICR0.BIT.BIT1;
a = USRSTR.ICR0.BIT.BIT5 ^ USRSTR.ICR0.BIT.BIT7;
a = USRSTR.ICR0.BIT.BIT2 ^ USRSTR.ICR0.BIT.BIT6;
PORT.BIT.IOR13 = PORT.BIT.IOR0 ^ USRSTR.ICR0.BIT.BIT7;
PORT.BIT.IOR15 = PORT.BIT.IOR6 ^ USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR3 = PORT.BIT.IOR2 ^ USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR1 = PORT.BIT.IOR13 ^ USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR1 = PORT.BIT.IOR2 ^ USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR11 = PORT.BIT.IOR9 ^ USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR8 = PORT.BIT.IOR14 ^ USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR10 ^= USRSTR.ICR0.BIT.BIT1;
PORT.BIT.IOR1 ^= USRSTR.ICR0.BIT.BIT2;
PORT.BIT.IOR5 ^= USRSTR.ICR0.BIT.BIT5;
PORT.BIT.IOR14 ^= USRSTR.ICR0.BIT.BIT4;
/* Instruction generated on using size optimization option "-Os". */
a = a ^ USRSTR.ICR0.BIT.BIT1;
a = a ^ USRSTR.ICR0.BIT.BIT4;
a = a ^ USRSTR.ICR0.BIT.BIT0;
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment