blob: bc7bb593f95d6925ace973b314201516ad3e96d4 [file] [log] [blame]
Stefan Maksimovic76391b12017-08-11 11:03:54 +00001// REQUIRES: mips-registered-target
2// RUN: %clang --target=mips64-unknown-linux -S -mmadd4 %s -o -| FileCheck %s -check-prefix=MADD4
3// RUN: %clang --target=mips64-unknown-linux -S -mno-madd4 %s -o -| FileCheck %s -check-prefix=NOMADD4
4// RUN: %clang --target=mips64-unknown-linux -S -mmadd4 -fno-honor-nans %s -o -| FileCheck %s -check-prefix=MADD4-NONAN
5// RUN: %clang --target=mips64-unknown-linux -S -mno-madd4 -fno-honor-nans %s -o -| FileCheck %s -check-prefix=NOMADD4-NONAN
6
7float madd_s (float f, float g, float h)
8{
9 return (f * g) + h;
10}
11// MADD4: madd.s
12// NOMADD4: mul.s
13// NOMADD4: add.s
14
15float msub_s (float f, float g, float h)
16{
17 return (f * g) - h;
18}
19// MADD4: msub.s
20// NOMADD4: mul.s
21// NOMADD4: sub.s
22
23double madd_d (double f, double g, double h)
24{
25 return (f * g) + h;
26}
27// MADD4: madd.d
28// NOMADD4: mul.d
29// NOMADD4: add.d
30
31double msub_d (double f, double g, double h)
32{
33 return (f * g) - h;
34}
35// MADD4: msub.d
36// NOMADD4: mul.d
37// NOMADD4: sub.d
38
39
40float nmadd_s (float f, float g, float h)
41{
42 // FIXME: Zero has been explicitly placed to force generation of a positive
43 // zero in IR until pattern used to match this instruction is changed to
44 // comply with negative zero as well.
45 return 0-((f * g) + h);
46}
47// MADD4-NONAN: nmadd.s
48// NOMADD4-NONAN: mul.s
49// NOMADD4-NONAN: add.s
50// NOMADD4-NONAN: sub.s
51
52float nmsub_s (float f, float g, float h)
53{
54 // FIXME: Zero has been explicitly placed to force generation of a positive
55 // zero in IR until pattern used to match this instruction is changed to
56 // comply with negative zero as well.
57 return 0-((f * g) - h);
58}
59// MADD4-NONAN: nmsub.s
60// NOMADD4-NONAN: mul.s
61// NOMADD4-NONAN: sub.s
62// NOMADD4-NONAN: sub.s
63
64double nmadd_d (double f, double g, double h)
65{
66 // FIXME: Zero has been explicitly placed to force generation of a positive
67 // zero in IR until pattern used to match this instruction is changed to
68 // comply with negative zero as well.
69 return 0-((f * g) + h);
70}
71// MADD4-NONAN: nmadd.d
72// NOMADD4-NONAN: mul.d
73// NOMADD4-NONAN: add.d
74// NOMADD4-NONAN: sub.d
75
76double nmsub_d (double f, double g, double h)
77{
78 // FIXME: Zero has been explicitly placed to force generation of a positive
79 // zero in IR until pattern used to match this instruction is changed to
80 // comply with negative zero as well.
81 return 0-((f * g) - h);
82}
83// MADD4-NONAN: nmsub.d
84// NOMADD4-NONAN: mul.d
85// NOMADD4-NONAN: sub.d
86// NOMADD4-NONAN: sub.d
87