blob: d7f6308ac0b00f6378c660a4aa3d57bcc651649c [file] [log] [blame]
Daniel Sandersb282f1f2014-04-09 09:56:43 +00001; Check that madd.[ds], msub.[ds], nmadd.[ds], and nmsub.[ds] are supported
2; correctly.
3; The spec for nmadd.[ds], and nmsub.[ds] does not state that they obey the
4; the Has2008 and ABS2008 configuration bits which govern the conformance to
5; IEEE 754 (1985) and IEEE 754 (2008). These instructions are therefore only
6; available when -enable-no-nans-fp-math is given.
7
Petar Jovanovic64fb7a82017-06-06 15:33:01 +00008; RUN: llc < %s -march=mipsel -mcpu=mips32 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,32-NOMADD,32-NONAN-NOMADD
Daniel Sanders0d972702016-06-24 12:23:17 +00009; RUN: llc < %s -march=mipsel -mcpu=mips32r2 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,32R2,32R2-NONAN
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000010; RUN: llc < %s -march=mipsel -mcpu=mips32r6 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,32R6-NOMADD,32R6-NONAN-NOMADD
Daniel Sanders0d972702016-06-24 12:23:17 +000011; RUN: llc < %s -march=mips64el -mcpu=mips64 -target-abi=n64 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,64,64-NONAN
12; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,64R2,64R2-NONAN
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000013; RUN: llc < %s -march=mips64el -mcpu=mips64r6 -target-abi=n64 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NONAN-NOMADD
14; RUN: llc < %s -march=mipsel -mcpu=mips32 | FileCheck %s -check-prefixes=ALL,32-NOMADD,32-NAN-NOMADD
Daniel Sanders0d972702016-06-24 12:23:17 +000015; RUN: llc < %s -march=mipsel -mcpu=mips32r2 | FileCheck %s -check-prefixes=ALL,32R2,32R2-NAN
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000016; RUN: llc < %s -march=mipsel -mcpu=mips32r6 | FileCheck %s -check-prefixes=ALL,32R6-NOMADD,32R6-NAN-NOMADD
Daniel Sanders0d972702016-06-24 12:23:17 +000017; RUN: llc < %s -march=mips64el -mcpu=mips64 -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64,64-NAN
18; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64R2,64R2-NAN
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000019; RUN: llc < %s -march=mips64el -mcpu=mips64r6 -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NAN-NOMADD
20
21; Check that madd.[ds], msub.[ds], nmadd.[ds], and nmsub.[ds] are not generated
22; when +nomadd attribute is specified.
23; Output for mips32 and mips64r6 reused since aforementioned instructions are
24; not generated in those cases.
25; RUN: llc < %s -march=mipsel -mcpu=mips32r2 -enable-no-nans-fp-math -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,32-NOMADD,32-NONAN-NOMADD
26; RUN: llc < %s -march=mips64el -mcpu=mips64 -target-abi=n64 -enable-no-nans-fp-math -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NONAN-NOMADD
27; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 -enable-no-nans-fp-math -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NONAN-NOMADD
28; RUN: llc < %s -march=mipsel -mcpu=mips32r2 -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,32-NOMADD,32-NAN-NOMADD
29; RUN: llc < %s -march=mips64el -mcpu=mips64 -target-abi=n64 -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NAN-NOMADD
30; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NAN-NOMADD
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +000031
32define float @FOO0float(float %a, float %b, float %c) nounwind readnone {
33entry:
Daniel Sandersded02af2014-06-12 11:04:18 +000034; ALL-LABEL: FOO0float:
35
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000036; 32-NOMADD-DAG: mtc1 $6, $[[T0:f[0-9]+]]
37; 32-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f14
38; 32-NOMADD-DAG: add.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
39; 32-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
40; 32-NOMADD-DAG: add.s $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +000041
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000042; 32R2: mtc1 $6, $[[T0:f[0-9]+]]
43; 32R2: madd.s $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
44; 32R2: mtc1 $zero, $[[T2:f[0-9]+]]
45; 32R2: add.s $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +000046
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000047; 32R6-NOMADD-DAG: mtc1 $6, $[[T0:f[0-9]+]]
48; 32R6-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f14
49; 32R6-NOMADD-DAG: add.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
50; 32R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
51; 32R6-NOMADD-DAG: add.s $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +000052
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000053; 64-DAG: madd.s $[[T0:f[0-9]+]], $f14, $f12, $f13
54; 64-DAG: mtc1 $zero, $[[T1:f[0-9]+]]
55; 64-DAG: add.s $f0, $[[T0]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +000056
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000057; 64R2: madd.s $[[T0:f[0-9]+]], $f14, $f12, $f13
58; 64R2: mtc1 $zero, $[[T1:f[0-9]+]]
59; 64R2: add.s $f0, $[[T0]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +000060
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000061; 64R6-NOMADD-DAG: mul.s $[[T0:f[0-9]+]], $f12, $f13
62; 64R6-NOMADD-DAG: add.s $[[T1:f[0-9]+]], $[[T0]], $f14
63; 64R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
64; 64R6-NOMADD-DAG: add.s $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +000065
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +000066 %mul = fmul float %a, %b
67 %add = fadd float %mul, %c
68 %add1 = fadd float %add, 0.000000e+00
69 ret float %add1
70}
71
72define float @FOO1float(float %a, float %b, float %c) nounwind readnone {
73entry:
Daniel Sandersded02af2014-06-12 11:04:18 +000074; ALL-LABEL: FOO1float:
75
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000076; 32-NOMADD-DAG: mtc1 $6, $[[T0:f[0-9]+]]
77; 32-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f14
78; 32-NOMADD-DAG: sub.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
79; 32-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
80; 32-NOMADD-DAG: add.s $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +000081
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000082; 32R2: mtc1 $6, $[[T0:f[0-9]+]]
83; 32R2: msub.s $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
84; 32R2: mtc1 $zero, $[[T2:f[0-9]+]]
85; 32R2: add.s $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +000086
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000087; 32R6-NOMADD-DAG: mtc1 $6, $[[T0:f[0-9]+]]
88; 32R6-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f14
89; 32R6-NOMADD-DAG: sub.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
90; 32R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
91; 32R6-NOMADD-DAG: add.s $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +000092
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000093; 64-DAG: msub.s $[[T0:f[0-9]+]], $f14, $f12, $f13
94; 64-DAG: mtc1 $zero, $[[T1:f[0-9]+]]
95; 64-DAG: add.s $f0, $[[T0]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +000096
Petar Jovanovic64fb7a82017-06-06 15:33:01 +000097; 64R2: msub.s $[[T0:f[0-9]+]], $f14, $f12, $f13
98; 64R2: mtc1 $zero, $[[T1:f[0-9]+]]
99; 64R2: add.s $f0, $[[T0]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000100
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000101; 64R6-NOMADD-DAG: mul.s $[[T0:f[0-9]+]], $f12, $f13
102; 64R6-NOMADD-DAG: sub.s $[[T1:f[0-9]+]], $[[T0]], $f14
103; 64R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
104; 64R6-NOMADD-DAG: add.s $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000105
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +0000106 %mul = fmul float %a, %b
107 %sub = fsub float %mul, %c
108 %add = fadd float %sub, 0.000000e+00
109 ret float %add
110}
111
112define float @FOO2float(float %a, float %b, float %c) nounwind readnone {
113entry:
Daniel Sandersded02af2014-06-12 11:04:18 +0000114; ALL-LABEL: FOO2float:
115
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000116; 32-NOMADD-DAG: mtc1 $6, $[[T0:f[0-9]+]]
117; 32-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f14
118; 32-NOMADD-DAG: add.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
119; 32-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
120; 32-NOMADD-DAG: sub.s $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000121
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000122; 32R2-NONAN: mtc1 $6, $[[T0:f[0-9]+]]
123; 32R2-NONAN: nmadd.s $f0, $[[T0]], $f12, $f14
Daniel Sandersded02af2014-06-12 11:04:18 +0000124
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000125; 32R2-NAN: mtc1 $6, $[[T0:f[0-9]+]]
126; 32R2-NAN: madd.s $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
127; 32R2-NAN: mtc1 $zero, $[[T2:f[0-9]+]]
128; 32R2-NAN: sub.s $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000129
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000130; 32R6-NOMADD-DAG: mtc1 $6, $[[T0:f[0-9]+]]
131; 32R6-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f14
132; 32R6-NOMADD-DAG: add.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
133; 32R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
134; 32R6-NOMADD-DAG: sub.s $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000135
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000136; 64-NONAN: nmadd.s $f0, $f14, $f12, $f13
Vladimir Medicbcb74672015-02-25 15:24:37 +0000137
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000138; 64-NAN: madd.s $[[T0:f[0-9]+]], $f14, $f12, $f13
139; 64-NAN: mtc1 $zero, $[[T1:f[0-9]+]]
140; 64-NAN: sub.s $f0, $[[T1]], $[[T0]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000141
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000142; 64R2-NONAN: nmadd.s $f0, $f14, $f12, $f13
Daniel Sandersded02af2014-06-12 11:04:18 +0000143
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000144; 64R2-NAN: madd.s $[[T0:f[0-9]+]], $f14, $f12, $f13
145; 64R2-NAN: mtc1 $zero, $[[T1:f[0-9]+]]
146; 64R2-NAN: sub.s $f0, $[[T1]], $[[T0]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000147
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000148; 64R6-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f13
149; 64R6-NOMADD-DAG: add.s $[[T2:f[0-9]+]], $[[T1]], $f14
150; 64R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
151; 64R6-NOMADD-DAG: sub.s $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000152
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +0000153 %mul = fmul float %a, %b
154 %add = fadd float %mul, %c
155 %sub = fsub float 0.000000e+00, %add
156 ret float %sub
157}
158
159define float @FOO3float(float %a, float %b, float %c) nounwind readnone {
160entry:
Daniel Sandersded02af2014-06-12 11:04:18 +0000161; ALL-LABEL: FOO3float:
162
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000163; 32-NOMADD-DAG: mtc1 $6, $[[T0:f[0-9]+]]
164; 32-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f14
165; 32-NOMADD-DAG: sub.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
166; 32-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
167; 32-NOMADD-DAG: sub.s $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000168
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000169; 32R2-NONAN: mtc1 $6, $[[T0:f[0-9]+]]
170; 32R2-NONAN: nmsub.s $f0, $[[T0]], $f12, $f14
Daniel Sandersded02af2014-06-12 11:04:18 +0000171
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000172; 32R2-NAN: mtc1 $6, $[[T0:f[0-9]+]]
173; 32R2-NAN: msub.s $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
174; 32R2-NAN: mtc1 $zero, $[[T2:f[0-9]+]]
175; 32R2-NAN: sub.s $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000176
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000177; 64-NAN: msub.s $[[T0:f[0-9]+]], $f14, $f12, $f13
178; 64-NAN: mtc1 $zero, $[[T1:f[0-9]+]]
179; 64-NAN: sub.s $f0, $[[T1]], $[[T0]]
Vladimir Medicbcb74672015-02-25 15:24:37 +0000180
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000181; 64-NONAN: nmsub.s $f0, $f14, $f12, $f13
Daniel Sandersded02af2014-06-12 11:04:18 +0000182
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000183; 64R2-NAN: msub.s $[[T0:f[0-9]+]], $f14, $f12, $f13
184; 64R2-NAN: mtc1 $zero, $[[T1:f[0-9]+]]
185; 64R2-NAN: sub.s $f0, $[[T1]], $[[T0]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000186
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000187; 64R6-NOMADD-DAG: mul.s $[[T1:f[0-9]+]], $f12, $f13
188; 64R6-NOMADD-DAG: sub.s $[[T2:f[0-9]+]], $[[T1]], $f14
189; 64R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
190; 64R6-NOMADD-DAG: sub.s $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000191
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +0000192 %mul = fmul float %a, %b
193 %sub = fsub float %mul, %c
194 %sub1 = fsub float 0.000000e+00, %sub
195 ret float %sub1
196}
197
198define double @FOO10double(double %a, double %b, double %c) nounwind readnone {
199entry:
Daniel Sandersded02af2014-06-12 11:04:18 +0000200; ALL-LABEL: FOO10double:
201
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000202; 32-NOMADD-DAG: ldc1 $[[T0:f[0-9]+]], 16($sp)
203; 32-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f14
204; 32-NOMADD-DAG: add.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
205; 32-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
206; 32-NOMADD-DAG: add.d $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000207
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000208; 32R2: ldc1 $[[T0:f[0-9]+]], 16($sp)
209; 32R2: madd.d $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
210; 32R2: mtc1 $zero, $[[T2:f[0-9]+]]
211; 32R2: mthc1 $zero, $[[T2]]
212; 32R2: add.d $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000213
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000214; 32R6-NOMADD-DAG: ldc1 $[[T0:f[0-9]+]], 16($sp)
215; 32R6-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f14
216; 32R6-NOMADD-DAG: add.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
217; 32R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
218; 32R6-NOMADD-DAG: add.d $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000219
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000220; 64-DAG: madd.d $[[T0:f[0-9]+]], $f14, $f12, $f13
221; 64-DAG: mtc1 $zero, $[[T1:f[0-9]+]]
222; 64-DAG: add.d $f0, $[[T0]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000223
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000224; 64R2: madd.d $[[T0:f[0-9]+]], $f14, $f12, $f13
225; 64R2: mtc1 $zero, $[[T1:f[0-9]+]]
226; 64R2: add.d $f0, $[[T0]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000227
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000228; 64R6-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f13
229; 64R6-NOMADD-DAG: add.d $[[T2:f[0-9]+]], $[[T1]], $f14
230; 64R6-NOMADD-DAG: dmtc1 $zero, $[[T2:f[0-9]+]]
231; 64R6-NOMADD-DAG: add.d $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000232
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +0000233 %mul = fmul double %a, %b
234 %add = fadd double %mul, %c
235 %add1 = fadd double %add, 0.000000e+00
236 ret double %add1
237}
238
239define double @FOO11double(double %a, double %b, double %c) nounwind readnone {
240entry:
Daniel Sandersded02af2014-06-12 11:04:18 +0000241; ALL-LABEL: FOO11double:
242
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000243; 32-NOMADD-DAG: ldc1 $[[T0:f[0-9]+]], 16($sp)
244; 32-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f14
245; 32-NOMADD-DAG: sub.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
246; 32-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
247; 32-NOMADD-DAG: add.d $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000248
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000249; 32R2: ldc1 $[[T0:f[0-9]+]], 16($sp)
250; 32R2: msub.d $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
251; 32R2: mtc1 $zero, $[[T2:f[0-9]+]]
252; 32R2: mthc1 $zero, $[[T2]]
253; 32R2: add.d $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000254
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000255; 32R6-NOMADD-DAG: ldc1 $[[T0:f[0-9]+]], 16($sp)
256; 32R6-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f14
257; 32R6-NOMADD-DAG: sub.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
258; 32R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
259; 32R6-NOMADD-DAG: add.d $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000260
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000261; 64-DAG: msub.d $[[T0:f[0-9]+]], $f14, $f12, $f13
262; 64-DAG: mtc1 $zero, $[[T1:f[0-9]+]]
263; 64-DAG: add.d $f0, $[[T0]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000264
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000265; 64R2: msub.d $[[T0:f[0-9]+]], $f14, $f12, $f13
266; 64R2: mtc1 $zero, $[[T1:f[0-9]+]]
267; 64R2: add.d $f0, $[[T0]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000268
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000269; 64R6-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f13
270; 64R6-NOMADD-DAG: sub.d $[[T2:f[0-9]+]], $[[T1]], $f14
271; 64R6-NOMADD-DAG: dmtc1 $zero, $[[T2:f[0-9]+]]
272; 64R6-NOMADD-DAG: add.d $f0, $[[T1]], $[[T2]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000273
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +0000274 %mul = fmul double %a, %b
275 %sub = fsub double %mul, %c
276 %add = fadd double %sub, 0.000000e+00
277 ret double %add
278}
279
280define double @FOO12double(double %a, double %b, double %c) nounwind readnone {
281entry:
Daniel Sandersded02af2014-06-12 11:04:18 +0000282; ALL-LABEL: FOO12double:
283
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000284; 32-NOMADD-DAG: ldc1 $[[T0:f[0-9]+]], 16($sp)
285; 32-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f14
286; 32-NOMADD-DAG: add.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
287; 32-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
288; 32-NOMADD-DAG: sub.d $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000289
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000290; 32R2-NONAN: ldc1 $[[T0:f[0-9]+]], 16($sp)
291; 32R2-NONAN: nmadd.d $f0, $[[T0]], $f12, $f14
Daniel Sandersded02af2014-06-12 11:04:18 +0000292
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000293; 32R2-NAN: ldc1 $[[T0:f[0-9]+]], 16($sp)
294; 32R2-NAN: madd.d $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
295; 32R2-NAN: mtc1 $zero, $[[T2:f[0-9]+]]
296; 32R2-NAN: mthc1 $zero, $[[T2]]
297; 32R2-NAN: sub.d $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000298
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000299; 32R6-NOMADD-DAG: ldc1 $[[T0:f[0-9]+]], 16($sp)
300; 32R6-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f14
301; 32R6-NOMADD-DAG: add.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
302; 32R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
303; 32R6-NOMADD-DAG: sub.d $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000304
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000305; 64-NONAN: nmadd.d $f0, $f14, $f12, $f13
Vladimir Medicbcb74672015-02-25 15:24:37 +0000306
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000307; 64-NAN: madd.d $[[T0:f[0-9]+]], $f14, $f12, $f13
308; 64-NAN: mtc1 $zero, $[[T1:f[0-9]+]]
309; 64-NAN: sub.d $f0, $[[T1]], $[[T0]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000310
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000311; 64R2-NONAN: nmadd.d $f0, $f14, $f12, $f13
Daniel Sandersded02af2014-06-12 11:04:18 +0000312
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000313; 64R2-NAN: madd.d $[[T0:f[0-9]+]], $f14, $f12, $f13
314; 64R2-NAN: mtc1 $zero, $[[T1:f[0-9]+]]
315; 64R2-NAN: sub.d $f0, $[[T1]], $[[T0]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000316
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000317; 64R6-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f13
318; 64R6-NOMADD-DAG: add.d $[[T2:f[0-9]+]], $[[T1]], $f14
319; 64R6-NOMADD-DAG: dmtc1 $zero, $[[T2:f[0-9]+]]
320; 64R6-NOMADD-DAG: sub.d $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000321
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +0000322 %mul = fmul double %a, %b
323 %add = fadd double %mul, %c
324 %sub = fsub double 0.000000e+00, %add
325 ret double %sub
326}
327
328define double @FOO13double(double %a, double %b, double %c) nounwind readnone {
329entry:
Daniel Sandersded02af2014-06-12 11:04:18 +0000330; ALL-LABEL: FOO13double:
331
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000332; 32-NOMADD-DAG: ldc1 $[[T0:f[0-9]+]], 16($sp)
333; 32-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f14
334; 32-NOMADD-DAG: sub.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
335; 32-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
336; 32-NOMADD-DAG: sub.d $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000337
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000338; 32R2-NONAN: ldc1 $[[T0:f[0-9]+]], 16($sp)
339; 32R2-NONAN: nmsub.d $f0, $[[T0]], $f12, $f14
Daniel Sandersded02af2014-06-12 11:04:18 +0000340
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000341; 32R2-NAN: ldc1 $[[T0:f[0-9]+]], 16($sp)
342; 32R2-NAN: msub.d $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
343; 32R2-NAN: mtc1 $zero, $[[T2:f[0-9]+]]
344; 32R2-NAN: mthc1 $zero, $[[T2]]
345; 32R2-NAN: sub.d $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000346
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000347; 32R6-NOMADD-DAG: ldc1 $[[T0:f[0-9]+]], 16($sp)
348; 32R6-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f14
349; 32R6-NOMADD-DAG: sub.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
350; 32R6-NOMADD-DAG: mtc1 $zero, $[[T2:f[0-9]+]]
351; 32R6-NOMADD-DAG: sub.d $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000352
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000353; 64-NONAN: nmsub.d $f0, $f14, $f12, $f13
Vladimir Medicbcb74672015-02-25 15:24:37 +0000354
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000355; 64-NAN: msub.d $[[T0:f[0-9]+]], $f14, $f12, $f13
356; 64-NAN: mtc1 $zero, $[[T1:f[0-9]+]]
357; 64-NAN: sub.d $f0, $[[T1]], $[[T0]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000358
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000359; 64R2-NONAN: nmsub.d $f0, $f14, $f12, $f13
Daniel Sandersded02af2014-06-12 11:04:18 +0000360
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000361; 64R2-NAN: msub.d $[[T0:f[0-9]+]], $f14, $f12, $f13
362; 64R2-NAN: mtc1 $zero, $[[T1:f[0-9]+]]
363; 64R2-NAN: sub.d $f0, $[[T1]], $[[T0]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000364
Petar Jovanovic64fb7a82017-06-06 15:33:01 +0000365; 64R6-NOMADD-DAG: mul.d $[[T1:f[0-9]+]], $f12, $f13
366; 64R6-NOMADD-DAG: sub.d $[[T2:f[0-9]+]], $[[T1]], $f14
367; 64R6-NOMADD-DAG: dmtc1 $zero, $[[T2:f[0-9]+]]
368; 64R6-NOMADD-DAG: sub.d $f0, $[[T2]], $[[T1]]
Daniel Sandersded02af2014-06-12 11:04:18 +0000369
Akira Hatanaka60f7a8e2012-02-25 00:21:52 +0000370 %mul = fmul double %a, %b
371 %sub = fsub double %mul, %c
372 %sub1 = fsub double 0.000000e+00, %sub
373 ret double %sub1
374}