aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/bfp/scalar-insert-exp-16.c
blob: f0e03c5173d27d3df037bfa82d7e0bddc2d95dfb (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/* { 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>

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

__ieee128
insert_exponent (vector unsigned __int128 *significand_p,
		 vector unsigned long long int *exponent_p)
{
  vector unsigned __int128 significand = *significand_p;
  vector unsigned long long int exponent = *exponent_p;

  return scalar_insert_exp (significand, exponent);
}

__ieee128
insert_exponent2 (unsigned __int128 significand,
		 unsigned long long int exponent)
{
   return scalar_insert_exp (significand, exponent);
}

int
main ()
{
  __ieee128 val_ieee128, result_ieee128, exp_result_ieee128;
  unsigned __int128 val_int128;
  unsigned long long int  val_ull;
  union conv128_t
   {
     __ieee128 val_ieee128;
     vector unsigned __int128 val_vint128;
     vector unsigned long long int  val_vull;
  } result, exp_result, significand;

  vector unsigned long long int exponent;

  /* Scalar argument test */
  val_ieee128 = 0xFEDCBA9876543210ULL;
  val_ull = 0x5678;
#ifdef _BIG_ENDIAN
  exp_result.val_vull[1] = 0xfedcba9876543210;  
  exp_result.val_vull[0] = 0x5678000000000000ULL;
#else
  exp_result.val_vull[0] = 0xfedcba9876543210;  
  exp_result.val_vull[1] = 0x5678000000000000ULL;
#endif
  result_ieee128 = insert_exponent2 (val_ieee128, val_ull);

  if (result_ieee128 != exp_result.val_ieee128)
#ifdef DEBUG
    {
      result.val_ieee128 = result_ieee128;
      printf("Scalar argument ERROR:\n");
      printf(" val_ieee128 = 0x%llx %llx\n",
	     result.val_vull[1], result.val_vull[0]);
      printf(" exp_val_ieee128 = 0x%llx %llx\n",
	     exp_result.val_vull[1], exp_result.val_vull[0]);
    }
#else
    abort ();
#endif

  /* Vector argument test */
  significand.val_vull[0] = 0xFEDCBA9876543210ULL;
  significand.val_vull[1] = 0x7FFF12345678ABCDULL;  /* positive value */

  exponent[0] = 0x5678;
  exponent[1] = 0x1234;

#ifdef _BIG_ENDIAN
  exp_result.val_vull[0] = 0xD678BA9876543210ULL;
  exp_result.val_vull[1] = 0x7FFF12345678ABCDULL;
#else
  exp_result.val_vull[0] = 0xFEDCBA9876543210ULL;
  exp_result.val_vull[1] = 0x123412345678ABCDULL;
#endif
  result.val_ieee128 = insert_exponent(&significand.val_vint128, &exponent);
  
  if (result.val_ieee128 != exp_result.val_ieee128)
#ifdef DEBUG
    {
      printf("Vector argument ERROR:\n");
      printf(" result = 0x%llx %llx\n",
	     result.val_vull[1], result.val_vull[0]);
      printf(" exp_result = 0x%llx %llx\n",
	     exp_result.val_vull[1], exp_result.val_vull[0]);
    }
#else
    abort ();
#endif

}

/* Check that the expected insert exponent instruction is generated. */
/* { dg-final { scan-assembler-times {\mxsiexpqp\M} 2 } } */