public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A
@ 2011-10-20 20:48 oleg.endo@t-online.de
2011-10-21 0:25 ` [Bug target/50814] " kkojima at gcc dot gnu.org
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: oleg.endo@t-online.de @ 2011-10-20 20:48 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50814
Bug #: 50814
Summary: SH Target: SHAD / SHLD instructions not used on SH2A
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: target
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: oleg.endo@t-online.de
CC: kkojima@gcc.gnu.org
Target: sh2a-*-*
Although there are some insns (e.g. ashlsi3_sh2a) that are supposed to handle
dynamic shifts on SH2A, somehow the dynamic shift instructions SHAD and SHLD
are never generated, no matter what the shift amount is.
int x_shad_right (int y)
{
return y >> 15;
}
mov.l .L6,r1
sts.l pr,@-r15
jsr @r1
nop
mov r4,r0
lds.l @r15+,pr
rts/n
.align 2
.L6:
.long ___ashiftrt_r4_15
int x_shad_left (int y)
{
return y << 15;
}
mov r4,r0
shll8 r0
shlr r0
rts
shll8 r0
Using built-in specs.
COLLECT_GCC=sh-elf-gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/sh-elf/4.7.0/lto-wrapper
Target: sh-elf
Configured with: ../gcc-trunk/configure --target=sh-elf --prefix=/usr/local
--enable-languages=c,c++ --enable-multilib --disable-libssp --disable-nls
--disable-werror --enable-lto --with-newlib --with-gnu-as --with-gnu-ld
--with-system-zlib
Thread model: single
gcc version 4.7.0 20111020 (experimental) (GCC)
It is also not clear to me why SH2A seems to require different handling for
dynamic shifts than SH3 or SH4...
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug target/50814] SH Target: SHAD / SHLD instructions not used on SH2A
2011-10-20 20:48 [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A oleg.endo@t-online.de
@ 2011-10-21 0:25 ` kkojima at gcc dot gnu.org
2011-11-28 0:20 ` oleg.endo@t-online.de
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: kkojima at gcc dot gnu.org @ 2011-10-21 0:25 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50814
--- Comment #1 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-10-21 00:24:36 UTC ---
(In reply to comment #0)
> It is also not clear to me why SH2A seems to require different handling for
> dynamic shifts than SH3 or SH4...
Will be slightly different because sh2a's shad&shld are 4-byte
insns. Perhaps something like below will work, though I don't
test it at all.
diff -up ORIG/gcc/config/sh/sh.h gcc/config/sh/sh.h
--- ORIG/gcc/config/sh/sh.h 2011-04-23 09:43:19.000000000 +0900
+++ gcc/config/sh/sh.h 2011-10-21 08:15:25.000000000 +0900
@@ -2371,7 +2371,8 @@ extern int current_function_interrupt;
#define ACCUMULATE_OUTGOING_ARGS TARGET_ACCUMULATE_OUTGOING_ARGS
#define SH_DYNAMIC_SHIFT_COST \
- (TARGET_HARD_SH4 ? 1 : TARGET_SH3 ? (optimize_size ? 1 : 2) : 20)
+ (TARGET_HARD_SH4 ? 1 : TARGET_SH3 ? (optimize_size ? 1 : 2) \
+ : TARGET_SH2A ? 2 : 20)
#define NUM_MODES_FOR_MODE_SWITCHING { FP_MODE_NONE }
diff -up ORIG/gcc/config/sh/sh.c gcc/config/sh/sh.c
--- ORIG/gcc/config/sh/sh.c 2011-07-29 09:31:42.000000000 +0900
+++ gcc/config/sh/sh.c 2011-10-21 09:03:36.000000000 +0900
@@ -3246,7 +3246,7 @@ expand_ashiftrt (rtx *operands)
char func[18];
int value;
- if (TARGET_SH3)
+ if (TARGET_SH3 || TARGET_SH2A)
{
if (!CONST_INT_P (operands[2]))
{
diff -up ORIG/gcc/config/sh/sh.md gcc/config/sh/sh.md
--- ORIG/gcc/config/sh/sh.md 2011-08-02 09:47:17.000000000 +0900
+++ gcc/config/sh/sh.md 2011-10-21 08:58:49.000000000 +0900
@@ -3424,15 +3424,6 @@ label:
;;
;; shift left
-(define_insn "ashlsi3_sh2a"
- [(set (match_operand:SI 0 "arith_reg_dest" "=r")
- (ashift:SI (match_operand:SI 1 "arith_reg_operand" "0")
- (match_operand:SI 2 "arith_reg_operand" "r")))]
- "TARGET_SH2A"
- "shad %2,%0"
- [(set_attr "type" "arith")
- (set_attr "length" "4")])
-
;; This pattern is used by init_expmed for computing the costs of shift
;; insns.
@@ -3441,14 +3432,14 @@ label:
(ashift:SI (match_operand:SI 1 "arith_reg_operand" "0,0,0,0")
(match_operand:SI 2 "nonmemory_operand" "r,M,P27,?ri")))
(clobber (match_scratch:SI 3 "=X,X,X,&r"))]
- "TARGET_SH3
+ "(TARGET_SH3 || TARGET_SH2A)
|| (TARGET_SH1 && satisfies_constraint_P27 (operands[2]))"
"@
shld %2,%0
add %0,%0
shll%O2 %0
#"
- "TARGET_SH3
+ "(TARGET_SH3 || TARGET_SH2A)
&& reload_completed
&& CONST_INT_P (operands[2])
&& ! satisfies_constraint_P27 (operands[2])"
@@ -3457,7 +3448,11 @@ label:
[(set (match_dup 0) (ashift:SI (match_dup 1) (match_dup 3)))
(clobber (match_dup 4))])]
"operands[4] = gen_rtx_SCRATCH (SImode);"
- [(set_attr "length" "*,*,*,4")
+ [(set_attr_alternative "length"
+ [(if_then_else
+ (ne (symbol_ref "TARGET_SH2A") (const_int 0))
+ (const_int 4) (const_int 2))
+ (const_int 2) (const_int 2) (const_int 4)])
(set_attr "type" "dyn_shift,arith,arith,arith")])
(define_insn "ashlhi3_k"
@@ -3584,15 +3579,6 @@ label:
; arithmetic shift right
;
-(define_insn "ashrsi3_sh2a"
- [(set (match_operand:SI 0 "arith_reg_dest" "=r")
- (ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
- (neg:SI (match_operand:SI 2 "arith_reg_operand" "r"))))]
- "TARGET_SH2A"
- "shad %2,%0"
- [(set_attr "type" "dyn_shift")
- (set_attr "length" "4")])
-
(define_insn "ashrsi3_k"
[(set (match_operand:SI 0 "arith_reg_dest" "=r")
(ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
@@ -3687,9 +3673,13 @@ label:
[(set (match_operand:SI 0 "arith_reg_dest" "=r")
(ashiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
(neg:SI (match_operand:SI 2 "arith_reg_operand" "r"))))]
- "TARGET_SH3"
+ "TARGET_SH3 || TARGET_SH2A"
"shad %2,%0"
- [(set_attr "type" "dyn_shift")])
+ [(set_attr_alternative "length"
+ [(if_then_else
+ (ne (symbol_ref "TARGET_SH2A") (const_int 0))
+ (const_int 4) (const_int 2))])
+ (set_attr "type" "dyn_shift")])
(define_insn "ashrsi3_n"
[(set (reg:SI R4_REG)
@@ -3735,22 +3725,17 @@ label:
;; logical shift right
-(define_insn "lshrsi3_sh2a"
- [(set (match_operand:SI 0 "arith_reg_dest" "=r")
- (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
- (neg:SI (match_operand:SI 2 "arith_reg_operand" "r"))))]
- "TARGET_SH2A"
- "shld %2,%0"
- [(set_attr "type" "dyn_shift")
- (set_attr "length" "4")])
-
(define_insn "lshrsi3_d"
[(set (match_operand:SI 0 "arith_reg_dest" "=r")
(lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
(neg:SI (match_operand:SI 2 "arith_reg_operand" "r"))))]
- "TARGET_SH3"
+ "TARGET_SH3 || TARGET_SH2A"
"shld %2,%0"
- [(set_attr "type" "dyn_shift")])
+ [(set_attr "type" "dyn_shift")
+ (set_attr_alternative "length"
+ [(if_then_else
+ (ne (symbol_ref "TARGET_SH2A") (const_int 0))
+ (const_int 4) (const_int 2))])])
;; Only the single bit shift clobbers the T bit.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug target/50814] SH Target: SHAD / SHLD instructions not used on SH2A
2011-10-20 20:48 [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A oleg.endo@t-online.de
2011-10-21 0:25 ` [Bug target/50814] " kkojima at gcc dot gnu.org
@ 2011-11-28 0:20 ` oleg.endo@t-online.de
2011-11-28 1:06 ` kkojima at gcc dot gnu.org
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: oleg.endo@t-online.de @ 2011-11-28 0:20 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50814
--- Comment #2 from Oleg Endo <oleg.endo@t-online.de> 2011-11-27 22:38:34 UTC ---
(In reply to comment #1)
> Will be slightly different because sh2a's shad&shld are 4-byte
> insns. Perhaps something like below will work, though I don't
> test it at all.
>
According to the SW manual document rej09b0051_sh2a.pdf the SHAD and SHLD insns
have the same 2-byte format as on SH3:
SHAD Rm, Rn: 0100nnnnmmmm1100
SHLD Rm, Rn: 0100nnnnmmmm1101
Am I missing something there?
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug target/50814] SH Target: SHAD / SHLD instructions not used on SH2A
2011-10-20 20:48 [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A oleg.endo@t-online.de
2011-10-21 0:25 ` [Bug target/50814] " kkojima at gcc dot gnu.org
2011-11-28 0:20 ` oleg.endo@t-online.de
@ 2011-11-28 1:06 ` kkojima at gcc dot gnu.org
2011-11-28 6:45 ` kkojima at gcc dot gnu.org
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: kkojima at gcc dot gnu.org @ 2011-11-28 1:06 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50814
--- Comment #3 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-11-28 00:09:17 UTC ---
(In reply to comment #2)
> According to the SW manual document rej09b0051_sh2a.pdf the SHAD and SHLD insns
> have the same 2-byte format as on SH3:
>
> SHAD Rm, Rn: 0100nnnnmmmm1100
> SHLD Rm, Rn: 0100nnnnmmmm1101
>
> Am I missing something there?
Ugh. You are right. I thought so from sh2a support was introduced
at r85286.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug target/50814] SH Target: SHAD / SHLD instructions not used on SH2A
2011-10-20 20:48 [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A oleg.endo@t-online.de
` (2 preceding siblings ...)
2011-11-28 1:06 ` kkojima at gcc dot gnu.org
@ 2011-11-28 6:45 ` kkojima at gcc dot gnu.org
2011-11-28 13:58 ` kkojima at gcc dot gnu.org
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: kkojima at gcc dot gnu.org @ 2011-11-28 6:45 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50814
--- Comment #4 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-11-28 04:31:51 UTC ---
Created attachment 25927
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25927
A patch
I'm testing the attached patch.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug target/50814] SH Target: SHAD / SHLD instructions not used on SH2A
2011-10-20 20:48 [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A oleg.endo@t-online.de
` (3 preceding siblings ...)
2011-11-28 6:45 ` kkojima at gcc dot gnu.org
@ 2011-11-28 13:58 ` kkojima at gcc dot gnu.org
2011-12-01 23:02 ` kkojima at gcc dot gnu.org
2011-12-02 23:43 ` kkojima at gcc dot gnu.org
6 siblings, 0 replies; 8+ messages in thread
From: kkojima at gcc dot gnu.org @ 2011-11-28 13:58 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50814
--- Comment #5 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-11-28 13:43:16 UTC ---
BTW, when regtesting, I've found that there are many ICEs at -O0.
A typical one is gcc.c-torture/compile/20000923-1.c with -m2a -O0:
...: error: insn does not satisfy its constraints:
(insn 142 34 35 (set (mem/c:SI (plus:SI (reg/f:SI 14 r14)
(const_int 36 [0x24])) [0 %sfp+-16 S4 A32])
(reg:SI 150 fpul)) ... {movsi_ie}
(nil))
...: internal compiler error: in extract_constrain_insn_cached, at recog.c:2052
which is solved by the hunk in the patch against PR50751
--- gcc/config/sh/sh.c.orig 2011-11-28 10:03:04.000000000 +0900
+++ gcc/config/sh/sh.c 2011-11-28 15:09:01.000000000 +0900
@@ -12432,6 +12432,10 @@ sh_secondary_reload (bool in_p, rtx x, r
if (rclass != GENERAL_REGS && REG_P (x)
&& TARGET_REGISTER_P (REGNO (x)))
return GENERAL_REGS;
+ /* If here fall back to loading FPUL register through general regs.
+ Happens when FPUL has to be loaded from a reg allocated on the stack. */
+ if (rclass == FPUL_REGS && !REG_P (x))
+ return GENERAL_REGS;
return NO_REGS;
}
Oleg, it seems that this is the right patch for an independent issue
described in your comment. Could you please file it to the bugzilla
and propose that patch to the gcc-patch list?
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug target/50814] SH Target: SHAD / SHLD instructions not used on SH2A
2011-10-20 20:48 [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A oleg.endo@t-online.de
` (4 preceding siblings ...)
2011-11-28 13:58 ` kkojima at gcc dot gnu.org
@ 2011-12-01 23:02 ` kkojima at gcc dot gnu.org
2011-12-02 23:43 ` kkojima at gcc dot gnu.org
6 siblings, 0 replies; 8+ messages in thread
From: kkojima at gcc dot gnu.org @ 2011-12-01 23:02 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50814
--- Comment #6 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-12-01 23:02:08 UTC ---
Author: kkojima
Date: Thu Dec 1 23:01:58 2011
New Revision: 181896
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=181896
Log:
PR target/50814.
* config/sh/sh.c (expand_ashiftrt): Handle TARGET_SH2A same as
TARGET_SH3.
(shl_sext_kind): Likewise.
* config/sh/sh.h (SH_DYNAMIC_SHIFT_COST): Likewise.
* config/sh/sh.md (ashlsi3_sh2a, ashrsi3_sh2a, lshrsi3_sh2a):
Remove.
(ashlsi3_std): Handle TARGET_SH2A same as TARGET_SH3.
(ashlsi3): Likewise.
(ashrsi3_d): Likewise.
(lshrsi3_d): Likewise.
(lshrsi3): Likewise.
Modified:
trunk/gcc/ChangeLog
trunk/gcc/config/sh/sh.c
trunk/gcc/config/sh/sh.h
trunk/gcc/config/sh/sh.md
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Bug target/50814] SH Target: SHAD / SHLD instructions not used on SH2A
2011-10-20 20:48 [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A oleg.endo@t-online.de
` (5 preceding siblings ...)
2011-12-01 23:02 ` kkojima at gcc dot gnu.org
@ 2011-12-02 23:43 ` kkojima at gcc dot gnu.org
6 siblings, 0 replies; 8+ messages in thread
From: kkojima at gcc dot gnu.org @ 2011-12-02 23:43 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50814
Kazumoto Kojima <kkojima at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution| |FIXED
--- Comment #7 from Kazumoto Kojima <kkojima at gcc dot gnu.org> 2011-12-02 23:42:56 UTC ---
Fixed on trunk.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2011-12-02 23:43 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-20 20:48 [Bug target/50814] New: SH Target: SHAD / SHLD instructions not used on SH2A oleg.endo@t-online.de
2011-10-21 0:25 ` [Bug target/50814] " kkojima at gcc dot gnu.org
2011-11-28 0:20 ` oleg.endo@t-online.de
2011-11-28 1:06 ` kkojima at gcc dot gnu.org
2011-11-28 6:45 ` kkojima at gcc dot gnu.org
2011-11-28 13:58 ` kkojima at gcc dot gnu.org
2011-12-01 23:02 ` kkojima at gcc dot gnu.org
2011-12-02 23:43 ` kkojima at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).