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