1 /* { dg-do compile }  */
2 /* { dg-require-effective-target arm_v8_2a_fp16_neon_ok }  */
3 /* { dg-options "-O2 -fno-fast-math" }  */
4 /* { dg-add-options arm_v8_2a_fp16_neon }  */
5 
6 /* Test instructions generated for half-precision arithmetic without
7    unsafe-math-optimizations.  */
8 
9 typedef _Float16 float16_t;
10 typedef _Float16 float16x4_t __attribute__ ((vector_size (8)));
11 typedef _Float16 float16x8_t __attribute__ ((vector_size (16)));
12 
13 typedef short int16x4_t __attribute__ ((vector_size (8)));
14 typedef short int int16x8_t  __attribute__ ((vector_size (16)));
15 
16 float16_t
fp16_abs(float16_t a)17 fp16_abs (float16_t a)
18 {
19   return __builtin_fabsf16 (a);
20 }
21 
22 #define TEST_UNOP(NAME, OPERATOR, TY)		\
23   TY test_##NAME##_##TY (TY a)			\
24   {						\
25     return OPERATOR (a);			\
26   }
27 
28 #define TEST_BINOP(NAME, OPERATOR, TY)		\
29   TY test_##NAME##_##TY (TY a, TY b)		\
30   {						\
31     return a OPERATOR b;			\
32   }
33 
34 #define TEST_CMP(NAME, OPERATOR, RTY, TY)	\
35   RTY test_##NAME##_##TY (TY a, TY b)		\
36   {						\
37     return a OPERATOR b;			\
38   }
39 
40 /* Scalars.  */
41 
42 TEST_UNOP (neg, -, float16_t)
43 TEST_UNOP (abs, fp16_abs, float16_t)
44 
45 TEST_BINOP (add, +, float16_t)
46 TEST_BINOP (sub, -, float16_t)
47 TEST_BINOP (mult, *, float16_t)
48 TEST_BINOP (div, /, float16_t)
49 
50 TEST_CMP (equal, ==, int, float16_t)
51 TEST_CMP (unequal, !=, int, float16_t)
52 TEST_CMP (lessthan, <, int, float16_t)
53 TEST_CMP (greaterthan, >, int, float16_t)
54 TEST_CMP (lessthanequal, <=, int, float16_t)
55 TEST_CMP (greaterthanqual, >=, int, float16_t)
56 
57 /* Vectors of size 4.  */
58 
59 TEST_UNOP (neg, -, float16x4_t)
60 
61 TEST_BINOP (add, +, float16x4_t)
62 TEST_BINOP (sub, -, float16x4_t)
63 TEST_BINOP (mult, *, float16x4_t)
64 TEST_BINOP (div, /, float16x4_t)
65 
66 TEST_CMP (equal, ==, int16x4_t, float16x4_t)
67 TEST_CMP (unequal, !=, int16x4_t, float16x4_t)
68 TEST_CMP (lessthan, <, int16x4_t, float16x4_t)
69 TEST_CMP (greaterthan, >, int16x4_t, float16x4_t)
70 TEST_CMP (lessthanequal, <=, int16x4_t, float16x4_t)
71 TEST_CMP (greaterthanqual, >=, int16x4_t, float16x4_t)
72 
73 /* Vectors of size 8.  */
74 
75 TEST_UNOP (neg, -, float16x8_t)
76 
77 TEST_BINOP (add, +, float16x8_t)
78 TEST_BINOP (sub, -, float16x8_t)
79 TEST_BINOP (mult, *, float16x8_t)
80 TEST_BINOP (div, /, float16x8_t)
81 
82 TEST_CMP (equal, ==, int16x8_t, float16x8_t)
83 TEST_CMP (unequal, !=, int16x8_t, float16x8_t)
84 TEST_CMP (lessthan, <, int16x8_t, float16x8_t)
85 TEST_CMP (greaterthan, >, int16x8_t, float16x8_t)
86 TEST_CMP (lessthanequal, <=, int16x8_t, float16x8_t)
87 TEST_CMP (greaterthanqual, >=, int16x8_t, float16x8_t)
88 
89 /* { dg-final { scan-assembler-times {vneg\.f16\ts[0-9]+, s[0-9]+} 1 } }  */
90 /* { dg-final { scan-assembler-times {vneg\.f16\td[0-9]+, d[0-9]+} 1 } }  */
91 /* { dg-final { scan-assembler-times {vneg\.f16\tq[0-9]+, q[0-9]+} 1 } }  */
92 /* { dg-final { scan-assembler-times {vabs\.f16\ts[0-9]+, s[0-9]+} 2 } }  */
93 
94 /* { dg-final { scan-assembler-times {vadd\.f16\ts[0-9]+, s[0-9]+, s[0-9]+} 1 } }  */
95 /* { dg-final { scan-assembler-times {vadd\.f16\td[0-9]+, d[0-9]+, d[0-9]+} 1 } }  */
96 /* { dg-final { scan-assembler-times {vadd\.f16\tq[0-9]+, q[0-9]+, q[0-9]+} 1 } }  */
97 
98 /* { dg-final { scan-assembler-times {vsub\.f16\ts[0-9]+, s[0-9]+, s[0-9]+} 1 } }  */
99 /* { dg-final { scan-assembler-times {vsub\.f16\td[0-9]+, d[0-9]+, d[0-9]+} 1 } }  */
100 /* { dg-final { scan-assembler-times {vsub\.f16\tq[0-9]+, q[0-9]+, q[0-9]+} 1 } }  */
101 
102 /* { dg-final { scan-assembler-times {vmul\.f16\ts[0-9]+, s[0-9]+, s[0-9]+} 1 } }  */
103 /* { dg-final { scan-assembler-times {vmul\.f16\td[0-9]+, d[0-9]+, d[0-9]+} 1 } }  */
104 /* { dg-final { scan-assembler-times {vmul\.f16\tq[0-9]+, q[0-9]+, q[0-9]+} 1 } }  */
105 
106 /* { dg-final { scan-assembler-times {vdiv\.f16\ts[0-9]+, s[0-9]+, s[0-9]+} 13 } }  */
107 /* { dg-final { scan-assembler-times {vcmp\.f32\ts[0-9]+, s[0-9]+} 26 } }  */
108 /* { dg-final { scan-assembler-times {vcmpe\.f32\ts[0-9]+, s[0-9]+} 52 } }  */
109 
110 /* { dg-final { scan-assembler-not {vadd\.f32} } }  */
111 /* { dg-final { scan-assembler-not {vsub\.f32} } }  */
112 /* { dg-final { scan-assembler-not {vmul\.f32} } }  */
113 /* { dg-final { scan-assembler-not {vdiv\.f32} } }  */
114 /* { dg-final { scan-assembler-not {vcmp\.f16} } }  */
115 /* { dg-final { scan-assembler-not {vcmpe\.f16} } }  */
116