[mips] Transfer kill flag to the newly created operand.
[oota-llvm.git] / test / CodeGen / Mips / mips64instrs.ll
1 ; RUN: llc -march=mips64el -mcpu=mips64 -verify-machineinstrs < %s | FileCheck %s
2
3 @gll0 = common global i64 0, align 8
4 @gll1 = common global i64 0, align 8
5
6 define i64 @f0(i64 %a0, i64 %a1) nounwind readnone {
7 entry:
8 ; CHECK: daddu
9   %add = add nsw i64 %a1, %a0
10   ret i64 %add
11 }
12
13 define i64 @f1(i64 %a0, i64 %a1) nounwind readnone {
14 entry:
15 ; CHECK: dsubu
16   %sub = sub nsw i64 %a0, %a1
17   ret i64 %sub
18 }
19
20 define i64 @f4(i64 %a0, i64 %a1) nounwind readnone {
21 entry:
22 ; CHECK: and
23   %and = and i64 %a1, %a0
24   ret i64 %and
25 }
26
27 define i64 @f5(i64 %a0, i64 %a1) nounwind readnone {
28 entry:
29 ; CHECK: or
30   %or = or i64 %a1, %a0
31   ret i64 %or
32 }
33
34 define i64 @f6(i64 %a0, i64 %a1) nounwind readnone {
35 entry:
36 ; CHECK: xor
37   %xor = xor i64 %a1, %a0
38   ret i64 %xor
39 }
40
41 define i64 @f7(i64 %a0) nounwind readnone {
42 entry:
43 ; CHECK: daddiu ${{[0-9]+}}, ${{[0-9]+}}, 20
44   %add = add nsw i64 %a0, 20
45   ret i64 %add
46 }
47
48 define i64 @f8(i64 %a0) nounwind readnone {
49 entry:
50 ; CHECK: daddiu ${{[0-9]+}}, ${{[0-9]+}}, -20
51   %sub = add nsw i64 %a0, -20
52   ret i64 %sub
53 }
54
55 define i64 @f9(i64 %a0) nounwind readnone {
56 entry:
57 ; CHECK: andi ${{[0-9]+}}, ${{[0-9]+}}, 20
58   %and = and i64 %a0, 20
59   ret i64 %and
60 }
61
62 define i64 @f10(i64 %a0) nounwind readnone {
63 entry:
64 ; CHECK: ori ${{[0-9]+}}, ${{[0-9]+}}, 20
65   %or = or i64 %a0, 20
66   ret i64 %or
67 }
68
69 define i64 @f11(i64 %a0) nounwind readnone {
70 entry:
71 ; CHECK: xori ${{[0-9]+}}, ${{[0-9]+}}, 20
72   %xor = xor i64 %a0, 20
73   ret i64 %xor
74 }
75
76 define i64 @f12(i64 %a, i64 %b) nounwind readnone {
77 entry:
78 ; CHECK: mult
79   %mul = mul nsw i64 %b, %a
80   ret i64 %mul
81 }
82
83 define i64 @f13(i64 %a, i64 %b) nounwind readnone {
84 entry:
85 ; CHECK: mult
86   %mul = mul i64 %b, %a
87   ret i64 %mul
88 }
89
90 define i64 @f14(i64 %a, i64 %b) nounwind readnone {
91 entry:
92 ; CHECK-LABEL: f14:
93 ; CHECK: ddiv $zero, ${{[0-9]+}}, $[[R0:[0-9]+]]
94 ; CHECK: teq $[[R0]], $zero, 7
95 ; CHECK: mflo
96   %0 = load i64* @gll0, align 8
97   %1 = load i64* @gll1, align 8
98   %div = sdiv i64 %0, %1
99   ret i64 %div
100 }
101
102 define i64 @f15() nounwind readnone {
103 entry:
104 ; CHECK-LABEL: f15:
105 ; CHECK: ddivu $zero, ${{[0-9]+}}, $[[R0:[0-9]+]]
106 ; CHECK: teq $[[R0]], $zero, 7
107 ; CHECK: mflo
108   %0 = load i64* @gll0, align 8
109   %1 = load i64* @gll1, align 8
110   %div = udiv i64 %0, %1
111   ret i64 %div
112 }
113
114 define i64 @f16(i64 %a, i64 %b) nounwind readnone {
115 entry:
116 ; CHECK-LABEL: f16:
117 ; CHECK: ddiv $zero, ${{[0-9]+}}, $[[R0:[0-9]+]]
118 ; CHECK: teq $[[R0]], $zero, 7
119 ; CHECK: mfhi
120   %rem = srem i64 %a, %b
121   ret i64 %rem
122 }
123
124 define i64 @f17(i64 %a, i64 %b) nounwind readnone {
125 entry:
126 ; CHECK-LABEL: f17:
127 ; CHECK: ddivu $zero, ${{[0-9]+}}, $[[R0:[0-9]+]]
128 ; CHECK: teq $[[R0]], $zero, 7
129 ; CHECK: mfhi
130   %rem = urem i64 %a, %b
131   ret i64 %rem
132 }
133
134 declare i64 @llvm.ctlz.i64(i64, i1) nounwind readnone
135
136 define i64 @f18(i64 %X) nounwind readnone {
137 entry:
138 ; CHECK: dclz $2, $4
139   %tmp1 = tail call i64 @llvm.ctlz.i64(i64 %X, i1 true)
140   ret i64 %tmp1
141 }
142
143 define i64 @f19(i64 %X) nounwind readnone {
144 entry:
145 ; CHECK: dclo $2, $4
146   %neg = xor i64 %X, -1
147   %tmp1 = tail call i64 @llvm.ctlz.i64(i64 %neg, i1 true)
148   ret i64 %tmp1
149 }
150
151 define i64 @f20(i64 %a, i64 %b) nounwind readnone {
152 entry:
153 ; CHECK: nor
154   %or = or i64 %b, %a
155   %neg = xor i64 %or, -1
156   ret i64 %neg
157 }