public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug inline-asm/64681] New: gcc assign wrong register for arm inline assembly
@ 2015-01-20 3:23 zhongwei.yao at arm dot com
2015-01-20 9:10 ` [Bug inline-asm/64681] " schwab@linux-m68k.org
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: zhongwei.yao at arm dot com @ 2015-01-20 3:23 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64681
Bug ID: 64681
Summary: gcc assign wrong register for arm inline assembly
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: blocker
Priority: P3
Component: inline-asm
Assignee: unassigned at gcc dot gnu.org
Reporter: zhongwei.yao at arm dot com
Created attachment 34492
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34492&action=edit
all related file.
I compile following code on linux by arm-linux-androideabi-gcc (gcc version 4.9
20140827) with following command:
arm-linux-androideabi-g++ -mfloat-abi=softfp -mfpu=neon -mthumb -Wall -Wextra
-march=armv7-a --sysroot=$ndk/platforms/android-21/arch-arm -O2 -Wall main.cpp
==c code start==
#include <arm_neon.h>
int main(void) {
return 0;
}
char buffer[32];
void bar(int n) {
int j = 0;
int64x1_t s = vdup_n_s64(0);
int64x1_t onev = vdup_n_s64(1);
int64_t sum = 0;
for (j = 0; j <= n; j++) {
asm ("vsub.s64 %0, %0, d1"
: "+w" (s): : "memory");
}
sum = (int64_t)j;
sum >>= vget_lane_s64(s, 0);
if(sum >0)
s = vsub_s64(s, onev);
vst1_s64((int64_t*)buffer, s);
}
==code end==
It returns:
/tmp/ccE0j9sL.s: Assembler messages:
/tmp/ccE0j9sL.s:55: Error: invalid instruction shape -- `vsub.s64 s14,s14,d1'
I think it is the bug in gcc that assign wrong register for variable s. It
should be d14 here, while it assignes s14.
The generated assembly file is:
==asm code start==
.syntax unified
.arch armv7-a
.eabi_attribute 27, 3
.fpu neon
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 2
.eabi_attribute 34, 1
.eabi_attribute 18, 4
.thumb
.file "main.cpp"
.section .text.startup,"ax",%progbits
.align 2
.global main
.thumb
.thumb_func
.type main, %function
main:
.fnstart
.LFB1870:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
movs r0, #0
bx lr
.cantunwind
.fnend
.size main, .-main
.text
.align 2
.global _Z3bari
.thumb
.thumb_func
.type _Z3bari, %function
_Z3bari:
.fnstart
.LFB1871:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
cmp r0, #0
vmov.i32 d7, #0 @ di
push {lr}
blt .L5
adds r0, r0, #1
movs r2, #0
.L4:
adds r2, r2, #1
cmp r2, r0
#APP
@ 17 "src/main.cpp" 1
vsub.s64 s14, s14, d1
@ 0 "" 2
.thumb
bne .L4
fmrs r1, s14 @ int
asrs r3, r2, #31
rsb r0, r1, #32
subs lr, r1, #32
lsl r0, r3, r0
lsr r2, r2, r1
it pl
asrpl lr, r3, lr
orr r2, r2, r0
it pl
orrpl r2, r2, lr
asrs r3, r3, r1
cmp r2, #1
sbcs r3, r3, #0
blt .L5
vmov.i32 d16, #0xffffffff @ di
vadd.i64 d7, d7, d16
.L5:
ldr r3, .L10
.LPIC1:
add r3, pc
ldr r3, [r3]
vst1.64 {d7}, [r3:64]
ldr pc, [sp], #4
.L11:
.align 2
.L10:
.word buffer(GOT_PREL)+(.-(.LPIC1+4))
.cantunwind
.fnend
.size _Z3bari, .-_Z3bari
.global buffer
.bss
.align 3
.type buffer, %object
.size buffer, 32
buffer:
.space 32
.ident "GCC: (GNU) 4.9 20140827 (prerelease)"
.section .note.GNU-stack,"",%progbits
==asm code end==
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug inline-asm/64681] gcc assign wrong register for arm inline assembly
2015-01-20 3:23 [Bug inline-asm/64681] New: gcc assign wrong register for arm inline assembly zhongwei.yao at arm dot com
@ 2015-01-20 9:10 ` schwab@linux-m68k.org
2015-01-20 10:16 ` zhongwei.yao at arm dot com
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: schwab@linux-m68k.org @ 2015-01-20 9:10 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64681
Andreas Schwab <schwab@linux-m68k.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Severity|blocker |normal
--- Comment #1 from Andreas Schwab <schwab@linux-m68k.org> ---
You need to format the operand as %P0.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug inline-asm/64681] gcc assign wrong register for arm inline assembly
2015-01-20 3:23 [Bug inline-asm/64681] New: gcc assign wrong register for arm inline assembly zhongwei.yao at arm dot com
2015-01-20 9:10 ` [Bug inline-asm/64681] " schwab@linux-m68k.org
@ 2015-01-20 10:16 ` zhongwei.yao at arm dot com
2015-01-26 7:32 ` gccbugzilla at limegreensocks dot com
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: zhongwei.yao at arm dot com @ 2015-01-20 10:16 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64681
zhongwei.yao <zhongwei.yao at arm dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|RESOLVED |UNCONFIRMED
Resolution|INVALID |---
--- Comment #3 from zhongwei.yao <zhongwei.yao at arm dot com> ---
(In reply to Andreas Schwab from comment #1)
> You need to format the operand as %P0.
Hi, Andreas, Thanks for pointing out this. Is this syntax documented in GCC
doc?
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug inline-asm/64681] gcc assign wrong register for arm inline assembly
2015-01-20 3:23 [Bug inline-asm/64681] New: gcc assign wrong register for arm inline assembly zhongwei.yao at arm dot com
2015-01-20 9:10 ` [Bug inline-asm/64681] " schwab@linux-m68k.org
2015-01-20 10:16 ` zhongwei.yao at arm dot com
@ 2015-01-26 7:32 ` gccbugzilla at limegreensocks dot com
2015-01-26 8:18 ` [Bug inline-asm/64681] Document print modifiers for ARM ramana at gcc dot gnu.org
2015-01-26 9:02 ` zhongwei.yao at arm dot com
4 siblings, 0 replies; 6+ messages in thread
From: gccbugzilla at limegreensocks dot com @ 2015-01-26 7:32 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64681
David <gccbugzilla at limegreensocks dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |gccbugzilla@limegreensocks.
| |com
--- Comment #4 from David <gccbugzilla at limegreensocks dot com> ---
Until very recently, *none* of the modifiers were documented. In the current
docs
(https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#i386Operandmodifiers),
only the i386 modifiers are doc'ed.
That said, you can always check out the gcc source. For example:
The comments above output_asm_insn in
https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/final.c?view=co&content-type=text%2Fplain
describe some global modifiers.
For i386-specific modifiers, look above ix86_print_operand in
https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/config/i386/i386.c?view=co&content-type=text%2Fplain
For arm, look above arm_print_operand in
https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/config/arm/arm.c?view=co&content-type=text%2Fplain
Presumably there are similar sections for other configs.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug inline-asm/64681] Document print modifiers for ARM
2015-01-20 3:23 [Bug inline-asm/64681] New: gcc assign wrong register for arm inline assembly zhongwei.yao at arm dot com
` (2 preceding siblings ...)
2015-01-26 7:32 ` gccbugzilla at limegreensocks dot com
@ 2015-01-26 8:18 ` ramana at gcc dot gnu.org
2015-01-26 9:02 ` zhongwei.yao at arm dot com
4 siblings, 0 replies; 6+ messages in thread
From: ramana at gcc dot gnu.org @ 2015-01-26 8:18 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64681
Ramana Radhakrishnan <ramana at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |documentation
Target| |arm*
Status|UNCONFIRMED |NEW
Last reconfirmed| |2015-01-26
CC| |ramana at gcc dot gnu.org
Summary|gcc assign wrong register |Document print modifiers
|for arm inline assembly |for ARM
Ever confirmed|0 |1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug inline-asm/64681] Document print modifiers for ARM
2015-01-20 3:23 [Bug inline-asm/64681] New: gcc assign wrong register for arm inline assembly zhongwei.yao at arm dot com
` (3 preceding siblings ...)
2015-01-26 8:18 ` [Bug inline-asm/64681] Document print modifiers for ARM ramana at gcc dot gnu.org
@ 2015-01-26 9:02 ` zhongwei.yao at arm dot com
4 siblings, 0 replies; 6+ messages in thread
From: zhongwei.yao at arm dot com @ 2015-01-26 9:02 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64681
zhongwei.yao <zhongwei.yao at arm dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution|--- |WORKSFORME
--- Comment #5 from zhongwei.yao <zhongwei.yao at arm dot com> ---
(In reply to David from comment #4)
> Until very recently, *none* of the modifiers were documented. In the
> current docs
> (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#i386Operandmodifiers),
> only the i386 modifiers are doc'ed.
>
> That said, you can always check out the gcc source. For example:
>
> The comments above output_asm_insn in
> https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/final.c?view=co&content-
> type=text%2Fplain describe some global modifiers.
>
> For i386-specific modifiers, look above ix86_print_operand in
> https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/config/i386/i386.c?view=co&content-
> type=text%2Fplain
>
> For arm, look above arm_print_operand in
> https://gcc.gnu.org/viewcvs/gcc/trunk/gcc/config/arm/arm.c?view=co&content-
> type=text%2Fplain
>
> Presumably there are similar sections for other configs.
Thanks!
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-01-26 9:02 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-20 3:23 [Bug inline-asm/64681] New: gcc assign wrong register for arm inline assembly zhongwei.yao at arm dot com
2015-01-20 9:10 ` [Bug inline-asm/64681] " schwab@linux-m68k.org
2015-01-20 10:16 ` zhongwei.yao at arm dot com
2015-01-26 7:32 ` gccbugzilla at limegreensocks dot com
2015-01-26 8:18 ` [Bug inline-asm/64681] Document print modifiers for ARM ramana at gcc dot gnu.org
2015-01-26 9:02 ` zhongwei.yao at arm dot com
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).