diff options
Diffstat (limited to 'gcc/testsuite/gcc.apple/asm-block-2.c')
-rw-r--r-- | gcc/testsuite/gcc.apple/asm-block-2.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.apple/asm-block-2.c b/gcc/testsuite/gcc.apple/asm-block-2.c new file mode 100644 index 00000000000..586f2c73357 --- /dev/null +++ b/gcc/testsuite/gcc.apple/asm-block-2.c @@ -0,0 +1,88 @@ +/* APPLE LOCAL file CW asm blocks */ +/* Test structure refs in asm-syntax blocks within functions. */ + +/* { dg-do run { target powerpc*-*-* } } */ +/* { dg-options "-fasm-blocks -O2" } */ + +void abort(void); + + +typedef struct astruct { + int arr[40]; + char charfield; + int fieldx; + int fieldy; +} atypedef; + +union aunion { + int field1; + int field2; +}; + +int fun1 (struct astruct *x) +{ + int loc; + asm { + lwz loc, astruct.fieldx(x) + addi loc, loc, 42 + stw loc, astruct.fieldx+4(x) + } + return loc; +} + +int fun2 (atypedef *x) +{ + int loc; + + asm { + lwz loc, atypedef.fieldx(r3) + addi loc, loc, 43 + stw loc, 4 + astruct.fieldx(x) + } + return loc; +} + +int fun3(int arg) +{ + int loc; + + asm { + mr loc, r3 + addi loc, loc, aunion.field1 + } + return loc; +} + +int fun4 (struct astruct *arg) +{ + int loc; + asm { + lbz loc, arg->charfield + addi loc, loc, 1 + } + return loc; +} + +struct astruct glob; +union uglob; + +int +main () +{ + glob.charfield = 'b'; + glob.fieldx = 22; + if (fun1 (&glob) != 64) + abort (); + if (glob.fieldy != 64) + abort (); + if (fun2 (&glob) != 65) + abort (); + if (glob.fieldy != 65) + abort (); + if (fun3 (89) != 89) + abort (); + if (fun4 (&glob) != 'c') + abort (); + return 0; +} + |