htm-nofloat-1.c: Rename to ...
2014-04-11 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * gcc.target/s390/htm-nofloat-1.c: Rename to ... * gcc.target/s390/htm-nofloat-compile-1.c: ... this one. * gcc.target/s390/htm-nofloat-2.c: Add check for htm target and rename to ... * gcc.target/s390/htm-nofloat-1.c: ... this one. * gcc.target/s390/s390.exp: Make sure the assembler supports htm instructions as well. From-SVN: r209294
This commit is contained in:
parent
d8d6ea53a7
commit
8f0ad2e592
|
@ -1,3 +1,13 @@
|
||||||
|
2014-04-11 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
|
||||||
|
|
||||||
|
* gcc.target/s390/htm-nofloat-1.c: Rename to ...
|
||||||
|
* gcc.target/s390/htm-nofloat-compile-1.c: ... this one.
|
||||||
|
* gcc.target/s390/htm-nofloat-2.c: Add check for htm target and
|
||||||
|
rename to ...
|
||||||
|
* gcc.target/s390/htm-nofloat-1.c: ... this one.
|
||||||
|
* gcc.target/s390/s390.exp: Make sure the assembler supports htm
|
||||||
|
instructions as well.
|
||||||
|
|
||||||
2014-04-11 Jakub Jelinek <jakub@redhat.com>
|
2014-04-11 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR rtl-optimization/60663
|
PR rtl-optimization/60663
|
||||||
|
|
|
@ -1,12 +1,50 @@
|
||||||
/* { dg-do compile } */
|
/* { dg-do run } */
|
||||||
/* { dg-options "-O3 -march=zEC12 -mzarch" } */
|
/* { dg-require-effective-target htm } */
|
||||||
|
/* { dg-options "-O3 -march=zEC12 -mzarch --save-temps" } */
|
||||||
|
|
||||||
int
|
/* __builtin_tbegin has to emit clobbers for all FPRs since the tbegin
|
||||||
foo ()
|
instruction does not automatically preserves them. If the
|
||||||
|
transaction body is fully contained in a function the backend tries
|
||||||
|
after reload to get rid of the FPR save/restore operations
|
||||||
|
triggered by the clobbers. This testcase failed since the backend
|
||||||
|
was able to get rid of all FPR saves/restores and since these were
|
||||||
|
the only stack operations also of the entire stack space. So even
|
||||||
|
the save/restore of the stack pointer was omitted in the end.
|
||||||
|
However, since the frame layout has been fixed before, the prologue
|
||||||
|
still generated the stack pointer decrement making foo return with
|
||||||
|
a modified stack pointer. */
|
||||||
|
|
||||||
|
void abort(void);
|
||||||
|
|
||||||
|
void __attribute__((noinline))
|
||||||
|
foo (int a)
|
||||||
{
|
{
|
||||||
__builtin_tbegin_nofloat (0);
|
if (__builtin_tbegin (0) == 0)
|
||||||
__builtin_tbegin_retry_nofloat (0, 42);
|
__builtin_tend ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __s390x__
|
||||||
|
#define GET_STACK_POINTER(SP) \
|
||||||
|
asm volatile ("stg %%r15, %0" : "=QRST" (SP));
|
||||||
|
#else
|
||||||
|
#define GET_STACK_POINTER(SP) \
|
||||||
|
asm volatile ("st %%r15, %0" : "=QR" (SP));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
unsigned long new_sp, old_sp;
|
||||||
|
|
||||||
|
GET_STACK_POINTER (old_sp);
|
||||||
|
foo(42);
|
||||||
|
GET_STACK_POINTER (new_sp);
|
||||||
|
|
||||||
|
if (old_sp != new_sp)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure no FPR saves/restores are emitted. */
|
/* Make sure no FPR saves/restores are emitted. */
|
||||||
/* { dg-final { scan-assembler-not "std" } } */
|
/* { dg-final { scan-assembler-not "\tstd\t" } } */
|
||||||
/* { dg-final { scan-assembler-not "ld" } } */
|
/* { dg-final { scan-assembler-not "\tld\t" } } */
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
/* { dg-do run } */
|
|
||||||
/* { dg-options "-O3 -mhtm -Wa,-march=zEC12,-mzarch --save-temps" } */
|
|
||||||
|
|
||||||
/* __builtin_tbegin has to emit clobbers for all FPRs since the tbegin
|
|
||||||
instruction does not automatically preserves them. If the
|
|
||||||
transaction body is fully contained in a function the backend tries
|
|
||||||
after reload to get rid of the FPR save/restore operations
|
|
||||||
triggered by the clobbers. This testcase failed since the backend
|
|
||||||
was able to get rid of all FPR saves/restores and since these were
|
|
||||||
the only stack operations also of the entire stack space. So even
|
|
||||||
the save/restore of the stack pointer was omitted in the end.
|
|
||||||
However, since the frame layout has been fixed before, the prologue
|
|
||||||
still generated the stack pointer decrement making foo return with
|
|
||||||
a modified stack pointer. */
|
|
||||||
|
|
||||||
void abort(void);
|
|
||||||
|
|
||||||
void __attribute__((noinline))
|
|
||||||
foo (int a)
|
|
||||||
{
|
|
||||||
/* This is just to prevent the tbegin code from actually being
|
|
||||||
executed. That way the test may even run on machines prior to
|
|
||||||
zEC12. */
|
|
||||||
if (a == 42)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (__builtin_tbegin (0) == 0)
|
|
||||||
__builtin_tend ();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __s390x__
|
|
||||||
#define GET_STACK_POINTER(SP) \
|
|
||||||
asm volatile ("stg %%r15, %0" : "=QRST" (SP));
|
|
||||||
#else
|
|
||||||
#define GET_STACK_POINTER(SP) \
|
|
||||||
asm volatile ("st %%r15, %0" : "=QR" (SP));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
unsigned long new_sp, old_sp;
|
|
||||||
|
|
||||||
GET_STACK_POINTER (old_sp);
|
|
||||||
foo(42);
|
|
||||||
GET_STACK_POINTER (new_sp);
|
|
||||||
|
|
||||||
if (old_sp != new_sp)
|
|
||||||
abort ();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make sure no FPR saves/restores are emitted. */
|
|
||||||
/* { dg-final { scan-assembler-not "\tstd\t" } } */
|
|
||||||
/* { dg-final { scan-assembler-not "\tld\t" } } */
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O3 -march=zEC12 -mzarch" } */
|
||||||
|
|
||||||
|
int
|
||||||
|
foo ()
|
||||||
|
{
|
||||||
|
__builtin_tbegin_nofloat (0);
|
||||||
|
__builtin_tbegin_retry_nofloat (0, 42);
|
||||||
|
}
|
||||||
|
/* Make sure no FPR saves/restores are emitted. */
|
||||||
|
/* { dg-final { scan-assembler-not "std" } } */
|
||||||
|
/* { dg-final { scan-assembler-not "ld" } } */
|
|
@ -24,17 +24,17 @@ if ![istarget s390*-*-*] then {
|
||||||
# Load support procs.
|
# Load support procs.
|
||||||
load_lib gcc-dg.exp
|
load_lib gcc-dg.exp
|
||||||
|
|
||||||
# Return 1 if htm (etnd - extract nesting depth) instructions can be
|
# Return 1 if htm (etnd - extract nesting depth) instructions are
|
||||||
# compiled.
|
# understood by the assembler and can be executed.
|
||||||
proc check_effective_target_htm { } {
|
proc check_effective_target_htm { } {
|
||||||
if { ![check_runtime s390_check_htm [subst {
|
if { ![check_runtime s390_check_htm [subst {
|
||||||
int main (void)
|
int main (void)
|
||||||
{
|
{
|
||||||
unsigned int nd = 77;
|
unsigned int nd;
|
||||||
asm (".insn rre,0xb2ec0000,%0,0" : "=d" (nd));
|
asm ("etnd %0" : "=d" (nd));
|
||||||
return nd;
|
return nd;
|
||||||
}
|
}
|
||||||
}]] } { return 0 } else { return 1 }
|
}] "-march=zEC12 -mzarch" ] } { return 0 } else { return 1 }
|
||||||
}
|
}
|
||||||
|
|
||||||
# If a testcase doesn't have special options, use these.
|
# If a testcase doesn't have special options, use these.
|
||||||
|
|
Loading…
Reference in New Issue