view gcc/testsuite/g++.dg/eh/o32-fp.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

// Test whether call saved float are restored properly for O32 ABI
// { dg-do run { target { { { mips*-*-linux* } && hard_float } && { ! mips64 } } } }
// { dg-options "-O2" }

void __attribute__((noinline))
bar (void)
{
  throw 1;
}

void __attribute__((noinline))
foo (void)
{
  register double f20 __asm__ ("f20") = 0.0;
  register double f22 __asm__ ("f22") = 0.0;
  register double f24 __asm__ ("f24") = 0.0;
  register double f26 __asm__ ("f26") = 0.0;
  register double f28 __asm__ ("f28") = 0.0;
  register double f30 __asm__ ("f30") = 0.0;
  __asm__ __volatile__("":"+f"(f20),"+f"(f22),"+f"(f24),"+f"(f26),"+f"(f30));
  bar ();
}

int
main (void)
{
  register double f20 __asm__ ("f20") = 12.0;
  register double f22 __asm__ ("f22") = 13.0;
  register double f24 __asm__ ("f24") = 14.0;
  register double f26 __asm__ ("f26") = 15.0;
  register double f28 __asm__ ("f28") = 16.0;
  register double f30 __asm__ ("f30") = 17.0;

  try
    {
      foo ();
    }
  catch (...)
    {
      __asm__ ("":"+f"(f20),"+f"(f22),"+f"(f24),"+f"(f26),"+f"(f30));
    }

  if (f20 != 12.0 || f22 != 13.0 || f24 != 14.0
      || f26 != 15.0 || f28 != 16.0 || f30 != 17.0)
    __builtin_abort ();
  return 0;
}