--- Comment #3 from casmyu at gmail dot com 2009-03-10 01:23 ---
Hi:
I have changed the code as you said, but it is more error now.
1 #include stdio.h
2
3 int main()
4 {
5 char src[30] = {This is a test message.\n};
6 char dst[30];
7 int len = 25;
8
9 __asm__ __volatile__(
10 cld\n\t
11 rep movsb
12 :
13 // : (src), D(dst), c(len)
14 : +c(len), +D(dst), +S(src)
15 );
16 printf(%s\t%d\n, dst, len);
17 return 0;
18 }
[root][~]# gcc -O2 -o bugtest bugtest.c
bugtest.c: In function ¡®main¡¯:
bugtest.c:15: error: input operand constraint contains ¡®+¡¯
bugtest.c:15: error: input operand constraint contains ¡®+¡¯
bugtest.c:15: error: input operand constraint contains ¡®+¡¯
bugtest.c:9: error: input operand constraint contains ¡®+¡¯
bugtest.c:9: error: input operand constraint contains ¡®+¡¯
bugtest.c:9: error: input operand constraint contains ¡®+¡¯
Please help to re-check this issue.
Thank you!
(In reply to comment #2)
Subject: Re: Excessive optimization issue
Sent from my iPhone
On Mar 9, 2009, at 8:36 AM, rguenth at gcc dot gnu dot org
gcc-bugzi...@gcc.gnu.org
wrote:
--- Comment #1 from rguenth at gcc dot gnu dot org 2009-03-09
15:36 ---
You need to specify that the registers are clobbered by the asm.
The only
way to do that is to use output constraints (+D, +c, etc.) on
proper
temporaries.
int lent = len;
char *dstt = dst;
char *srct = src;
__asm__ __volatile__(
cld\n\t
rep movsb
: +c (lent), +D(dstt), +S(src)
);
Otherwise GCC thinks the registers still hold the original value.
Oh and mark this inline-ask as clobbering memory.
--
rguenth at gcc dot gnu dot org changed:
What|Removed |Added
---
---
--
Status|UNCONFIRMED |RESOLVED
Resolution||INVALID
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403
--
casmyu at gmail dot com changed:
What|Removed |Added
CC||casmyu at gmail dot com
Status|RESOLVED|UNCONFIRMED
Resolution|INVALID |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39403