[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / mulfix_combine.ll
blob81a0135ceaaea4a7f57b126c2d29d240d93b0349
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-linux -o - | FileCheck %s
4 declare i32 @llvm.smul.fix.i32(i32, i32, i32 immarg)
5 declare i32 @llvm.umul.fix.i32(i32, i32, i32 immarg)
6 declare i32 @llvm.smul.fix.sat.i32(i32, i32, i32 immarg)
7 declare i32 @llvm.umul.fix.sat.i32(i32, i32, i32 immarg)
9 declare <4 x i32> @llvm.smul.fix.v4i32(<4 x i32>, <4 x i32>, i32 immarg)
10 declare <4 x i32> @llvm.umul.fix.v4i32(<4 x i32>, <4 x i32>, i32 immarg)
11 declare <4 x i32> @llvm.smul.fix.sat.v4i32(<4 x i32>, <4 x i32>, i32 immarg)
12 declare <4 x i32> @llvm.umul.fix.sat.v4i32(<4 x i32>, <4 x i32>, i32 immarg)
14 define i32 @smulfix_undef(i32 %y) nounwind {
15 ; CHECK-LABEL: smulfix_undef:
16 ; CHECK:       # %bb.0:
17 ; CHECK-NEXT:    xorl %eax, %eax
18 ; CHECK-NEXT:    retq
19   %tmp = call i32 @llvm.smul.fix.i32(i32 undef, i32 %y, i32 2)
20   ret i32 %tmp
23 define i32 @smulfix_zero(i32 %y) nounwind {
24 ; CHECK-LABEL: smulfix_zero:
25 ; CHECK:       # %bb.0:
26 ; CHECK-NEXT:    xorl %eax, %eax
27 ; CHECK-NEXT:    retq
28   %tmp = call i32 @llvm.smul.fix.i32(i32 0, i32 %y, i32 2)
29   ret i32 %tmp
32 define i32 @umulfix_undef(i32 %y) nounwind {
33 ; CHECK-LABEL: umulfix_undef:
34 ; CHECK:       # %bb.0:
35 ; CHECK-NEXT:    xorl %eax, %eax
36 ; CHECK-NEXT:    retq
37   %tmp = call i32 @llvm.umul.fix.i32(i32 undef, i32 %y, i32 2)
38   ret i32 %tmp
41 define i32 @umulfix_zero(i32 %y) nounwind {
42 ; CHECK-LABEL: umulfix_zero:
43 ; CHECK:       # %bb.0:
44 ; CHECK-NEXT:    xorl %eax, %eax
45 ; CHECK-NEXT:    retq
46   %tmp = call i32 @llvm.umul.fix.i32(i32 0, i32 %y, i32 2)
47   ret i32 %tmp
50 define i32 @smulfixsat_undef(i32 %y) nounwind {
51 ; CHECK-LABEL: smulfixsat_undef:
52 ; CHECK:       # %bb.0:
53 ; CHECK-NEXT:    xorl %eax, %eax
54 ; CHECK-NEXT:    retq
55   %tmp = call i32 @llvm.smul.fix.sat.i32(i32 undef, i32 %y, i32 2)
56   ret i32 %tmp
59 define i32 @smulfixsat_zero(i32 %y) nounwind {
60 ; CHECK-LABEL: smulfixsat_zero:
61 ; CHECK:       # %bb.0:
62 ; CHECK-NEXT:    xorl %eax, %eax
63 ; CHECK-NEXT:    retq
64   %tmp = call i32 @llvm.smul.fix.sat.i32(i32 0, i32 %y, i32 2)
65   ret i32 %tmp
68 define i32 @umulfixsat_undef(i32 %y) nounwind {
69 ; CHECK-LABEL: umulfixsat_undef:
70 ; CHECK:       # %bb.0:
71 ; CHECK-NEXT:    xorl %eax, %eax
72 ; CHECK-NEXT:    retq
73   %tmp = call i32 @llvm.umul.fix.sat.i32(i32 undef, i32 %y, i32 2)
74   ret i32 %tmp
77 define i32 @umulfixsat_zero(i32 %y) nounwind {
78 ; CHECK-LABEL: umulfixsat_zero:
79 ; CHECK:       # %bb.0:
80 ; CHECK-NEXT:    xorl %eax, %eax
81 ; CHECK-NEXT:    retq
82   %tmp = call i32 @llvm.umul.fix.sat.i32(i32 0, i32 %y, i32 2)
83   ret i32 %tmp
86 define <4 x i32> @vec_smulfix_undef(<4 x i32> %y) nounwind {
87 ; CHECK-LABEL: vec_smulfix_undef:
88 ; CHECK:       # %bb.0:
89 ; CHECK-NEXT:    xorps %xmm0, %xmm0
90 ; CHECK-NEXT:    retq
91   %tmp = call <4 x i32> @llvm.smul.fix.v4i32(<4 x i32> undef, <4 x i32> %y, i32 2)
92   ret <4 x i32> %tmp
95 define <4 x i32> @vec_smulfix_zero(<4 x i32> %y) nounwind {
96 ; CHECK-LABEL: vec_smulfix_zero:
97 ; CHECK:       # %bb.0:
98 ; CHECK-NEXT:    xorps %xmm0, %xmm0
99 ; CHECK-NEXT:    retq
100   %tmp = call <4 x i32> @llvm.smul.fix.v4i32(<4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> %y, i32 2)
101   ret <4 x i32> %tmp
104 define <4 x i32> @vec_umulfix_undef(<4 x i32> %y) nounwind {
105 ; CHECK-LABEL: vec_umulfix_undef:
106 ; CHECK:       # %bb.0:
107 ; CHECK-NEXT:    xorps %xmm0, %xmm0
108 ; CHECK-NEXT:    retq
109   %tmp = call <4 x i32> @llvm.umul.fix.v4i32(<4 x i32> undef, <4 x i32> %y, i32 2)
110   ret <4 x i32> %tmp
113 define <4 x i32> @vec_umulfix_zero(<4 x i32> %y) nounwind {
114 ; CHECK-LABEL: vec_umulfix_zero:
115 ; CHECK:       # %bb.0:
116 ; CHECK-NEXT:    xorps %xmm0, %xmm0
117 ; CHECK-NEXT:    retq
118   %tmp = call <4 x i32> @llvm.umul.fix.v4i32(<4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> %y, i32 2)
119   ret <4 x i32> %tmp
122 define <4 x i32> @vec_smulfixsat_undef(<4 x i32> %y) nounwind {
123 ; CHECK-LABEL: vec_smulfixsat_undef:
124 ; CHECK:       # %bb.0:
125 ; CHECK-NEXT:    xorps %xmm0, %xmm0
126 ; CHECK-NEXT:    retq
127   %tmp = call <4 x i32> @llvm.smul.fix.sat.v4i32(<4 x i32> undef, <4 x i32> %y, i32 2)
128   ret <4 x i32> %tmp
131 define <4 x i32> @vec_smulfixsat_zero(<4 x i32> %y) nounwind {
132 ; CHECK-LABEL: vec_smulfixsat_zero:
133 ; CHECK:       # %bb.0:
134 ; CHECK-NEXT:    xorps %xmm0, %xmm0
135 ; CHECK-NEXT:    retq
136   %tmp = call <4 x i32> @llvm.smul.fix.sat.v4i32(<4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> %y, i32 2)
137   ret <4 x i32> %tmp
140 define <4 x i32> @vec_umulfixsat_undef(<4 x i32> %y) nounwind {
141 ; CHECK-LABEL: vec_umulfixsat_undef:
142 ; CHECK:       # %bb.0:
143 ; CHECK-NEXT:    xorps %xmm0, %xmm0
144 ; CHECK-NEXT:    retq
145   %tmp = call <4 x i32> @llvm.umul.fix.sat.v4i32(<4 x i32> undef, <4 x i32> %y, i32 2)
146   ret <4 x i32> %tmp
149 define <4 x i32> @vec_umulfixsat_zero(<4 x i32> %y) nounwind {
150 ; CHECK-LABEL: vec_umulfixsat_zero:
151 ; CHECK:       # %bb.0:
152 ; CHECK-NEXT:    xorps %xmm0, %xmm0
153 ; CHECK-NEXT:    retq
154   %tmp = call <4 x i32> @llvm.umul.fix.sat.v4i32(<4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> %y, i32 2)
155   ret <4 x i32> %tmp