aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-cmp-run.c
blob: f751ef64c563dfac0b5b4794c08cb48ba4324bd2 (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
/* { dg-do run { target lp64 } } */
/* { dg-require-effective-target vsx_hw } */
/* { dg-options "-O2 -mvsx" } */

#define DEBUG 0

/* This file just generates calls to the various builtins and verifies the
   expected number of instructions for each builtin were generated.  */

#include "vsx-vector-6-func-cmp.h"

/* Macros to check the results of the builtin tests.  */
#define FLOAT_CHECK(NAME)						  \
  f_result = vec_##NAME (f_src_a, f_src_b);				  \
  									  \
  if ((f_result[0] != f_##NAME##_expected[0])				  \
      || (f_result[1] != f_##NAME##_expected[1])			  \
      || (f_result[2] != f_##NAME##_expected[2])			  \
      || (f_result[3] != f_##NAME##_expected[3]))			  \
    {									  \
      if (DEBUG)							  \
	{								  \
	  printf("ERROR: vec_%s (float) expected value does not match\n", \
		 #NAME);						  \
	  printf("   expected[0] = 0x%x; result[0] =0x%x\n",		  \
		 f_##NAME##_expected[0], f_result[0]);			  \
	  printf("   expected[1] = 0x%x; result[1] = 0x%x\n",		  \
		 f_##NAME##_expected[1], f_result[1]);			  \
	  printf("   expected[2] = 0x%x; result[2] = 0x%x\n",		  \
		 f_##NAME##_expected[2], f_result[2]);			  \
	  printf("   expected[3] = 0x%x; result[3] = 0x%x\n",		  \
		 f_##NAME##_expected[3], f_result[3]);			  \
	}								  \
      else								  \
	abort();							  \
    }

#define DOUBLE_CHECK(NAME)						   \
  d_result = vec_##NAME (d_src_a, d_src_b);				   \
									   \
  if ((d_result[0] != d_##NAME##_expected[0])				   \
      || (d_result[1] != d_##NAME##_expected[1]))			   \
    {									   \
      if (DEBUG)							   \
	{								   \
	  printf("ERROR: vec_%s (double) expected value does not match\n", \
		 #NAME);						   \
	  printf("   expected[0] = 0x%lx; result[0] = 0x%lx\n",		   \
		 d_##NAME##_expected[0], d_result[0]);			   \
	  printf("   expected[1] = 0x%lx; result[1] = 0x%lx\n",		   \
		 d_##NAME##_expected[1], d_result[1]);			   \
	}								   \
      else								   \
	abort();							   \
    }

int
main () {
  int i;
  vector float f_src_a = { 126.0, 23.0, -338.0, 17.0};
  vector float f_src_b = { 2.00, 23.0, 1.0, 4.0};
  vector bool f_result;
  vector bool int f_cmpeq_expected = {0x0, 0xFFFFFFFF, 0x0, 0x0};
  vector bool int f_cmpgt_expected = {0xFFFFFFFF, 0x0, 0x0, 0xFFFFFFFF};
  vector bool int f_cmpge_expected = {0xFFFFFFFF, 0xFFFFFFFF, 0x0, 0xFFFFFFFF};
  vector bool int f_cmplt_expected = {0x0, 0x0, 0xFFFFFFFF, 0x0}; 
  vector bool int f_cmple_expected = {0x0, 0xFFFFFFFF, 0xFFFFFFFF, 0x0}; 

  vector double d_src_a = { 125.44, -338.56};
  vector double d_src_b = { 4.0, -338.56};
  vector bool long long d_result;
  vector bool long long d_cmpeq_expected = {0x0, 0xFFFFFFFFFFFFFFFF};
  vector bool long long d_cmpgt_expected = {0xFFFFFFFFFFFFFFFF, 0x0};
  vector bool long long d_cmpge_expected = {0xFFFFFFFFFFFFFFFF,
					    0xFFFFFFFFFFFFFFFF};
  vector bool long long d_cmplt_expected = {0x0, 0x0};
  vector bool long long d_cmple_expected = {0x0, 0xFFFFFFFFFFFFFFFF};

  FLOAT_CHECK (cmpeq)
  FLOAT_CHECK (cmpgt)
  FLOAT_CHECK (cmpge)
  FLOAT_CHECK (cmplt)
  FLOAT_CHECK (cmple)
 
  DOUBLE_CHECK (cmpeq)
  DOUBLE_CHECK (cmpgt)
  DOUBLE_CHECK (cmpge)
  DOUBLE_CHECK (cmplt)
  DOUBLE_CHECK (cmple)

  return 0;
}