1 | // 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 | |
7 | float 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 | |
15 | float 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 | |
23 | double 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 | |
31 | double 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 | |
40 | float 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 | |
52 | float 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 | |
64 | double 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 | |
76 | double 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 | |
88 | |