1 /* Test v2sf calculations.  The nmadd and nmsub patterns need
2    -ffinite-math-only.  */
3 /* { dg-do compile } */
4 /* { dg-options "-mpaired-single -mmadd4 -mgp64 -ffinite-math-only forbid_cpu=octeon.*" } */
5 /* { dg-skip-if "nmadd and nmsub need combine" { *-*-* } { "-O0" } { "" } } */
6 /* { dg-final { scan-assembler "\tcvt.ps.s\t" } } */
7 /* { dg-final { scan-assembler "\tmov.ps\t" } } */
8 /* { dg-final { scan-assembler "\tldc1\t" } } */
9 /* { dg-final { scan-assembler "\tsdc1\t" } } */
10 /* { dg-final { scan-assembler "\tadd.ps\t" } } */
11 /* { dg-final { scan-assembler "\tsub.ps\t" } } */
12 /* { dg-final { scan-assembler "\tneg.ps\t" } } */
13 /* { dg-final { scan-assembler "\tmul.ps\t" } } */
14 /* { dg-final { scan-assembler "\tmadd.ps\t" } } */
15 /* { dg-final { scan-assembler "\tmsub.ps\t" } } */
16 /* { dg-final { scan-assembler "\tnmadd.ps\t" } } */
17 /* { dg-final { scan-assembler "\tnmsub.ps\t" } } */
18 /* { dg-final { scan-assembler "\tmov(n|z).ps\t" } } */
19 
20 typedef float v2sf __attribute__ ((vector_size(8)));
21 
22 v2sf A = {100, 200};
23 
24 /* Init from  floats */
init(float a,float b)25 NOMIPS16 v2sf init (float a, float b)
26 {
27   return (v2sf) {a, b};
28 }
29 
30 /* Move between registers */
move(v2sf a)31 NOMIPS16 v2sf move (v2sf a)
32 {
33   register v2sf b __asm__("$f0") = a;
34   register v2sf c __asm__("$f2");
35   __asm__ __volatile__ ("" : "+f" (b));
36   c = b;
37   __asm__ __volatile__ ("" : : "f" (c));
38   return a;
39 }
40 
41 /* Load from memory */
load()42 NOMIPS16 v2sf load ()
43 {
44   return A;
45 }
46 
47 /* Store to memory */
store(v2sf a)48 NOMIPS16 void store (v2sf a)
49 {
50   A = a;
51 }
52 
53 /* Add */
add(v2sf a,v2sf b)54 NOMIPS16 v2sf add (v2sf a, v2sf b)
55 {
56   return a + b;
57 }
58 
59 /* Subtract */
sub(v2sf a,v2sf b)60 NOMIPS16 v2sf sub (v2sf a, v2sf b)
61 {
62   return a - b;
63 }
64 
65 /* Negate */
neg(v2sf a)66 NOMIPS16 v2sf neg (v2sf a)
67 {
68   return - a;
69 }
70 
71 /* Multiply */
mul(v2sf a,v2sf b)72 NOMIPS16 v2sf mul (v2sf a, v2sf b)
73 {
74   return a * b;
75 }
76 
77 /* Multiply and add */
madd(v2sf a,v2sf b,v2sf c)78 NOMIPS16 v2sf madd (v2sf a, v2sf b, v2sf c)
79 {
80   return a * b + c;
81 }
82 
83 /* Multiply and subtract */
msub(v2sf a,v2sf b,v2sf c)84 NOMIPS16 v2sf msub (v2sf a, v2sf b, v2sf c)
85 {
86   return a * b - c;
87 }
88 
89 /* Negate Multiply and add */
nmadd(v2sf a,v2sf b,v2sf c)90 NOMIPS16 v2sf nmadd (v2sf a, v2sf b, v2sf c)
91 {
92   return - (a * b + c);
93 }
94 
95 /* Negate Multiply and subtract */
nmsub(v2sf a,v2sf b,v2sf c)96 NOMIPS16 v2sf nmsub (v2sf a, v2sf b, v2sf c)
97 {
98   return - (a * b - c);
99 }
100 
101 /* Conditional Move */
cond_move1(v2sf a,v2sf b,long i)102 NOMIPS16 v2sf cond_move1 (v2sf a, v2sf b, long i)
103 {
104   if (i != 0)
105     return a;
106   else
107     return b;
108 }
109 
110 /* Conditional Move */
cond_move2(v2sf a,v2sf b,int i)111 NOMIPS16 v2sf cond_move2 (v2sf a, v2sf b, int i)
112 {
113   if (i != 0)
114     return a;
115   else
116     return b;
117 }
118