aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJayant R Sonar <jayant.sonar@kpitcummins.com>2008-03-25 13:36:11 +0000
committerKaz Kojima <kkojima@gcc.gnu.org>2008-03-25 13:36:11 +0000
commite990551a821ea234e518ef75a380f0c0ab7af2c0 (patch)
treecdcc23b1a70ca0b9624a0b6cd457d53893a02ff6
parent561642fa67798158762265f5100e3052275fe970 (diff)
downloadgcc-e990551a821ea234e518ef75a380f0c0ab7af2c0.zip
gcc-e990551a821ea234e518ef75a380f0c0ab7af2c0.tar.gz
gcc-e990551a821ea234e518ef75a380f0c0ab7af2c0.tar.bz2
constraints.md (I28): New constraint.
* config/sh/constraints.md (I28): New constraint. * config/sh/sh.c (broken_move): Add support for movi20s. * config/sh/sh.md (movsi_ie): Add the alternative for movi20s. * gcc.target/sh/sh2a-movi20s.c: New test. Co-Authored-By: Naveen.H.S <naveen.hs@kpitcummins.com> From-SVN: r133514
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/sh/constraints.md6
-rw-r--r--gcc/config/sh/sh.c3
-rw-r--r--gcc/config/sh/sh.md10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/sh/sh2a-movi20s.c14
6 files changed, 41 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 071d094..7ca5028 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2008-03-25 Jayant Sonar <Jayant.sonar@kpitcummins.com>
+ Naveen.H.S <naveen.hs@kpitcummins.com>
+
+ * config/sh/constraints.md (I28): New constraint.
+ * config/sh/sh.c (broken_move): Add support for movi20s.
+ * config/sh/sh.md (movsi_ie): Add the alternative for
+ movi20s.
+
2008-03-25 Anil Paranjape <anil.paranjape@kpitcummins.com>
Jayant Sonar <Jayant.sonar@kpitcummins.com>
Naveen.H.S <naveen.hs@kpitcummins.com>
diff --git a/gcc/config/sh/constraints.md b/gcc/config/sh/constraints.md
index 333c5be..7509fae 100644
--- a/gcc/config/sh/constraints.md
+++ b/gcc/config/sh/constraints.md
@@ -112,6 +112,12 @@
(match_test "ival >= -524288 && ival <= 524287")
(match_test "TARGET_SH2A")))
+(define_constraint "I28"
+ "A signed 28-bit constant, as used in SH2A movi20s."
+ (and (match_code "const_int")
+ (match_test "ival >= -134217728 && ival <= 134217727")
+ (match_test "(ival & 255) == 0")
+ (match_test "TARGET_SH2A")))
(define_constraint "J16"
"0xffffffff00000000 or 0x00000000ffffffff."
(and (match_code "const_int")
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 57049ea..df959d8 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -3753,7 +3753,8 @@ broken_move (rtx insn)
&& FP_REGISTER_P (REGNO (SET_DEST (pat))))
&& ! (TARGET_SH2A
&& GET_MODE (SET_DEST (pat)) == SImode
- && satisfies_constraint_I20 (SET_SRC (pat)))
+ && (satisfies_constraint_I20 (SET_SRC (pat))
+ || satisfies_constraint_I28 (SET_SRC (pat))))
&& ! satisfies_constraint_I08 (SET_SRC (pat)))
return 1;
}
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index 6dae438..750e9d3 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -4937,9 +4937,9 @@ label:
;; TARGET_FMOVD is in effect, and mode switching is done before reload.
(define_insn "movsi_ie"
[(set (match_operand:SI 0 "general_movdst_operand"
- "=r,r,r,r,t,r,r,r,r,m,<,<,x,l,x,l,y,<,r,y,r,*f,y,*f,y")
+ "=r,r,r,r,r,t,r,r,r,r,m,<,<,x,l,x,l,y,<,r,y,r,*f,y,*f,y")
(match_operand:SI 1 "general_movsrc_operand"
- "Q,r,I08,I20,r,mr,x,l,t,r,x,l,r,r,>,>,>,y,i,r,y,y,*f,*f,y"))]
+ "Q,r,I08,I20,I28,r,mr,x,l,t,r,x,l,r,r,>,>,>,y,i,r,y,y,*f,*f,y"))]
"(TARGET_SH2E || TARGET_SH2A)
&& (register_operand (operands[0], SImode)
|| register_operand (operands[1], SImode))"
@@ -4948,6 +4948,7 @@ label:
mov %1,%0
mov %1,%0
movi20 %1,%0
+ movi20s %1,%0
cmp/pl %1
mov.l %1,%0
sts %1,%0
@@ -4969,13 +4970,14 @@ label:
flds %1,fpul
fmov %1,%0
! move optimized away"
- [(set_attr "type" "pcload_si,move,movi8,move,*,load_si,mac_gp,prget,arith,store,mac_mem,pstore,gp_mac,prset,mem_mac,pload,load,fstore,pcload_si,gp_fpul,fpul_gp,fmove,fmove,fmove,nil")
- (set_attr "late_fp_use" "*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,yes,*,*,yes,*,*,*,*")
+ [(set_attr "type" "pcload_si,move,movi8,move,move,*,load_si,mac_gp,prget,arith,store,mac_mem,pstore,gp_mac,prset,mem_mac,pload,load,fstore,pcload_si,gp_fpul,fpul_gp,fmove,fmove,fmove,nil")
+ (set_attr "late_fp_use" "*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,yes,*,*,yes,*,*,*,*")
(set_attr_alternative "length"
[(const_int 2)
(const_int 2)
(const_int 2)
(const_int 4)
+ (const_int 4)
(const_int 2)
(if_then_else
(ne (symbol_ref "TARGET_SH2A") (const_int 0))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 103aaf2..7cee930 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-03-25 Jayant Sonar <Jayant.sonar@kpitcummins.com>
+ Naveen.H.S <naveen.hs@kpitcummins.com>
+
+ * gcc.target/sh/sh2a-movi20s.c: New test.
+
2008-03-25 Anil Paranjape <anil.paranjape@kpitcummins.com>
Jayant Sonar <Jayant.sonar@kpitcummins.com>
Naveen.H.S <naveen.hs@kpitcummins.com>
diff --git a/gcc/testsuite/gcc.target/sh/sh2a-movi20s.c b/gcc/testsuite/gcc.target/sh/sh2a-movi20s.c
new file mode 100644
index 0000000..55d2f66
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sh/sh2a-movi20s.c
@@ -0,0 +1,14 @@
+/* Testcase to check generation of 'MOVI20S #imm20, Rn'. */
+/* { dg-do assemble {target sh*-*-*}} */
+/* { dg-options "-O0" } */
+/* { dg-skip-if "" { "sh*-*-*" } "*" "-m2a -m2a-nofpu -m2a-single -m2a-single-only" } */
+/* { dg-final { scan-assembler "movi20s"} } */
+
+volatile long la;
+
+void
+testfun (void)
+{
+ la = -134217728;
+ la = 134217216;
+}