1; RUN: llc -march=mips < %s | FileCheck %s -check-prefix=32
2; RUN: llc -march=mips -mattr=dsp < %s | FileCheck %s -check-prefix=DSP
3; RUN: llc -march=mips -mcpu=mips16 < %s
4
5; 32: madd ${{[0-9]+}}
6; DSP: madd $ac
7define i64 @madd1(i32 %a, i32 %b, i32 %c) nounwind readnone {
8entry:
9  %conv = sext i32 %a to i64
10  %conv2 = sext i32 %b to i64
11  %mul = mul nsw i64 %conv2, %conv
12  %conv4 = sext i32 %c to i64
13  %add = add nsw i64 %mul, %conv4
14  ret i64 %add
15}
16
17; 32: maddu ${{[0-9]+}}
18; DSP: maddu $ac
19define i64 @madd2(i32 %a, i32 %b, i32 %c) nounwind readnone {
20entry:
21  %conv = zext i32 %a to i64
22  %conv2 = zext i32 %b to i64
23  %mul = mul nsw i64 %conv2, %conv
24  %conv4 = zext i32 %c to i64
25  %add = add nsw i64 %mul, %conv4
26  ret i64 %add
27}
28
29; 32: madd ${{[0-9]+}}
30; DSP: madd $ac
31define i64 @madd3(i32 %a, i32 %b, i64 %c) nounwind readnone {
32entry:
33  %conv = sext i32 %a to i64
34  %conv2 = sext i32 %b to i64
35  %mul = mul nsw i64 %conv2, %conv
36  %add = add nsw i64 %mul, %c
37  ret i64 %add
38}
39
40; 32: msub ${{[0-9]+}}
41; DSP: msub $ac
42define i64 @msub1(i32 %a, i32 %b, i32 %c) nounwind readnone {
43entry:
44  %conv = sext i32 %c to i64
45  %conv2 = sext i32 %a to i64
46  %conv4 = sext i32 %b to i64
47  %mul = mul nsw i64 %conv4, %conv2
48  %sub = sub nsw i64 %conv, %mul
49  ret i64 %sub
50}
51
52; 32: msubu ${{[0-9]+}}
53; DSP: msubu $ac
54define i64 @msub2(i32 %a, i32 %b, i32 %c) nounwind readnone {
55entry:
56  %conv = zext i32 %c to i64
57  %conv2 = zext i32 %a to i64
58  %conv4 = zext i32 %b to i64
59  %mul = mul nsw i64 %conv4, %conv2
60  %sub = sub nsw i64 %conv, %mul
61  ret i64 %sub
62}
63
64; 32: msub ${{[0-9]+}}
65; DSP: msub $ac
66define i64 @msub3(i32 %a, i32 %b, i64 %c) nounwind readnone {
67entry:
68  %conv = sext i32 %a to i64
69  %conv3 = sext i32 %b to i64
70  %mul = mul nsw i64 %conv3, %conv
71  %sub = sub nsw i64 %c, %mul
72  ret i64 %sub
73}
74