|
From: <sv...@va...> - 2006-05-22 13:04:54
|
Author: sewardj
Date: 2006-05-22 14:04:42 +0100 (Mon, 22 May 2006)
New Revision: 5921
Log:
Rewrite inline asm for ppc32/64-linux to make them gcc-4.1.0 proof.
Thanks to David Woodhouse for pointing me in the right direction.
Modified:
trunk/coregrind/m_debuglog.c
Modified: trunk/coregrind/m_debuglog.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_debuglog.c 2006-05-22 11:20:15 UTC (rev 5920)
+++ trunk/coregrind/m_debuglog.c 2006-05-22 13:04:42 UTC (rev 5921)
@@ -134,32 +134,42 @@
=20
static UInt local_sys_write_stderr ( HChar* buf, Int n )
{
- UInt __res;
+ Int block[2];
+ block[0] =3D (Int)buf;
+ block[1] =3D n;
__asm__ volatile (
- "li %%r0,4\n\t" /* set %r0 =3D __NR_write */
- "li %%r3,2\n\t" /* set %r3 =3D stderr */
- "mr %%r4,%1\n\t" /* set %r4 =3D buf */
- "mr %%r5,%2\n\t" /* set %r5 =3D n */
- "sc\n\t" /* write(stderr, buf, n) */
- "mr %0,%%r3\n" /* set __res =3D r3 */
- : "=3Dmr" (__res)
- : "g" (buf), "g" (n)
- : "r0", "r3", "r4", "r5" );
- if (__res < 0)
- __res =3D -1;
- return __res;
+ "addi 1,1,-256\n\t"
+ "mr 5,%0\n\t" /* r5 =3D &block[0] */
+ "stw 5,0(1)\n\t" /* stash on stack */
+ "li 0,4\n\t" /* set %r0 =3D __NR_write (=3D=3D 4) */
+ "li 3,2\n\t" /* set %r3 =3D stderr */
+ "lwz 4,0(5)\n\t" /* set %r4 =3D buf */
+ "lwz 5,4(5)\n\t" /* set %r5 =3D n */
+ "sc\n\t" /* write(stderr, buf, n) */
+ "lwz 5,0(1)\n\t"
+ "addi 1,1,256\n\t"
+ "stw 3,0(5)\n" /* block[0] =3D result */
+ :
+ : "b" (block)
+ : "cc","memory","cr0","ctr",
+ "r0","r2","r3","r4","r5","r6","r7","r8","r9","r10","r11","r12"
+ );
+ if (block[0] < 0)
+ block[0] =3D -1;
+ return (UInt)block[0];
}
=20
static UInt local_sys_getpid ( void )
{
- UInt __res;
- __asm__ volatile (
- "li %%r0,20\n" /* set %r0 =3D __NR_getpid */
- "\tsc\n" /* getpid() */
- "\tmr %0,%%r3\n" /* set __res =3D r3 */
- : "=3Dmr" (__res)
- :
- : "r0" );
+ register UInt __res __asm__ ("r3");
+ __asm__ volatile (=20
+ "li 0, %1\n\t"
+ "sc"
+ : "=3D&r" (__res)
+ : "i" (20) /* =3D=3D __NR_getpid */
+ : "cc","memory","cr0","ctr",
+ "r0","r2","r4","r5","r6","r7","r8","r9","r10","r11","r12"
+ );
return __res;
}
=20
@@ -167,33 +177,43 @@
=20
static UInt local_sys_write_stderr ( HChar* buf, Int n )
{
- UInt __res;
+ Long block[2];
+ block[0] =3D (Long)buf;
+ block[1] =3D (Long)n;
__asm__ volatile (
- "li %%r0,4\n\t" /* set %r0 =3D __NR_write */
- "li %%r3,2\n\t" /* set %r3 =3D stderr */
- "mr %%r4,%1\n\t" /* set %r4 =3D buf */
- "mr %%r5,%2\n\t" /* set %r5 =3D n */
- "sc\n\t" /* write(stderr, buf, n) */
- "mr %0,%%r3\n" /* set __res =3D r3 */
- : "=3Dmr" (__res)
- : "g" (buf), "g" (n)
- : "r0", "r3", "r4", "r5" );
- if (__res < 0)
- __res =3D -1;
- return __res;
+ "addi 1,1,-256\n\t"
+ "mr 5,%0\n\t" /* r5 =3D &block[0] */
+ "std 5,0(1)\n\t" /* stash on stack */
+ "li 0,4\n\t" /* set %r0 =3D __NR_write (=3D=3D 4) */
+ "li 3,2\n\t" /* set %r3 =3D stderr */
+ "ld 4,0(5)\n\t" /* set %r4 =3D buf */
+ "ld 5,8(5)\n\t" /* set %r5 =3D n */
+ "sc\n\t" /* write(stderr, buf, n) */
+ "ld 5,0(1)\n\t"
+ "addi 1,1,256\n\t"
+ "std 3,0(5)\n" /* block[0] =3D result */
+ :
+ : "b" (block)
+ : "cc","memory","cr0","ctr",
+ "r0","r2","r3","r4","r5","r6","r7","r8","r9","r10","r11","r12"
+ );
+ if (block[0] < 0)
+ block[0] =3D -1;
+ return (UInt)(Int)block[0];
}
=20
static UInt local_sys_getpid ( void )
{
- UInt __res;
- __asm__ volatile (
- "li %%r0,20\n" /* set %r0 =3D __NR_getpid */
- "\tsc\n" /* getpid() */
- "\tmr %0,%%r3\n" /* set __res =3D r3 */
- : "=3Dmr" (__res)
- :
- : "r0" );
- return __res;
+ register ULong __res __asm__ ("r3");
+ __asm__ volatile (=20
+ "li 0, %1\n\t"
+ "sc"
+ : "=3D&r" (__res)
+ : "i" (20) /* =3D=3D __NR_getpid */
+ : "cc","memory","cr0","ctr",
+ "r0","r2","r4","r5","r6","r7","r8","r9","r10","r11","r12"
+ );
+ return (UInt)__res;
}
=20
#else
|