aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/bfp/scalar-extract-exp-8.c
blob: eedcfcdac96f6195dc492a11fd9af1d6c0cb0fab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/* { dg-do run { target { powerpc*-*-* } } } */
/* { dg-require-effective-target lp64 } */
/* { dg-require-effective-target p9vector_hw } */
/* { dg-options "-mdejagnu-cpu=power9 -save-temps" } */

#include <altivec.h>
#include <stdlib.h>

#if DEBUG
#include <stdio.h>
#endif

vector unsigned long long int
get_exponents (__ieee128 *p)
{
  __ieee128 source = *p;

  return scalar_extract_exp_to_vec (source);
}

int
main ()
{
  vector unsigned long long int result, exp_result;
  union conv128_t
   {
     __ieee128 val_ieee128;
     __int128  val_int128;
  } source;
  
#ifdef _BIG_ENDIAN
  exp_result[1] = 0x0ULL;
  exp_result[0] = 0x1234ULL;
#else
  exp_result[0] = 0x0ULL;
  exp_result[1] = 0x1234ULL;
#endif
  source.val_int128 = 0x923456789ABCDEF0ULL;
  source.val_int128 = (source.val_int128 << 64) | 0x123456789ABCDEFULL;

  result = get_exponents (&source.val_ieee128);

  if ((result[0] != exp_result[0]) || (result[1] != exp_result[1]))
#if DEBUG
    {
      printf("result[0] = 0x%llx; exp_result[0] = 0x%llx\n",
	     result[0], exp_result[0]);
      printf("result[1] = 0x%llx; exp_result[1] = 0x%llx\n",
	     result[1], exp_result[1]);
    }
#else
    abort();
#endif
  return 0;
}

/* Check that the expected extract exponent instruction is generated. */
/* { dg-final { scan-assembler-times {\mxsxexpqp\M} 1 } } */