• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -mtriple=arm-eabi -mcpu=generic %s -o /dev/null
2; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s
3; RUN: llc -mtriple=thumb--none-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s
4
5@x = weak global i16 0          ; <i16*> [#uses=1]
6@y = weak global i16 0          ; <i16*> [#uses=0]
7
8define i32 @f1(i32 %y) {
9; CHECK-LABEL: f1:
10; CHECK: smulbt
11        %tmp = load i16, i16* @x             ; <i16> [#uses=1]
12        %tmp1 = add i16 %tmp, 2         ; <i16> [#uses=1]
13        %tmp2 = sext i16 %tmp1 to i32           ; <i32> [#uses=1]
14        %tmp3 = ashr i32 %y, 16         ; <i32> [#uses=1]
15        %tmp4 = mul i32 %tmp2, %tmp3            ; <i32> [#uses=1]
16        ret i32 %tmp4
17}
18
19define i32 @f2(i32 %x, i32 %y) {
20; CHECK-LABEL: f2:
21; CHECK: smultt
22        %tmp1 = ashr i32 %x, 16         ; <i32> [#uses=1]
23        %tmp3 = ashr i32 %y, 16         ; <i32> [#uses=1]
24        %tmp4 = mul i32 %tmp3, %tmp1            ; <i32> [#uses=1]
25        ret i32 %tmp4
26}
27
28define i32 @f3(i32 %a, i16 %x, i32 %y) {
29; CHECK-LABEL: f3:
30; CHECK: smlabt
31        %tmp = sext i16 %x to i32               ; <i32> [#uses=1]
32        %tmp2 = ashr i32 %y, 16         ; <i32> [#uses=1]
33        %tmp3 = mul i32 %tmp2, %tmp             ; <i32> [#uses=1]
34        %tmp5 = add i32 %tmp3, %a               ; <i32> [#uses=1]
35        ret i32 %tmp5
36}
37
38define i32 @f4(i32 %a, i32 %x, i32 %y) {
39; CHECK-LABEL: f4:
40; CHECK: smlatt
41        %tmp1 = ashr i32 %x, 16
42        %tmp3 = ashr i32 %y, 16
43        %tmp4 = mul i32 %tmp3, %tmp1
44        %tmp5 = add i32 %tmp4, %a
45        ret i32 %tmp5
46}
47
48define i32 @f5(i32 %a, i16 %x, i16 %y) {
49; CHECK-LABEL: f5:
50; CHECK: smlabb
51        %tmp1 = sext i16 %x to i32
52        %tmp3 = sext i16 %y to i32
53        %tmp4 = mul i32 %tmp3, %tmp1
54        %tmp5 = add i32 %tmp4, %a
55        ret i32 %tmp5
56}
57
58define i32 @f6(i32 %a, i16 %x, i32 %y) {
59; CHECK-LABEL: f6:
60; CHECK: smlabt
61        %tmp1 = sext i16 %x to i32
62        %tmp3 = ashr i32 %y, 16
63        %tmp4 = mul i32 %tmp3, %tmp1
64        %tmp5 = add i32 %tmp4, %a
65        ret i32 %tmp5
66}
67
68define i32 @f7(i32 %a, i32 %b, i32 %c) {
69; CHECK-LABEL: f7:
70; CHECK: smlawb
71        %shl = shl i32 %b, 16
72        %shr = ashr exact i32 %shl, 16
73        %conv = sext i32 %a to i64
74        %conv2 = sext i32 %shr to i64
75        %mul = mul nsw i64 %conv2, %conv
76        %shr49 = lshr i64 %mul, 16
77        %conv5 = trunc i64 %shr49 to i32
78        %add = add nsw i32 %conv5, %c
79        ret i32 %add
80}
81
82define i32 @f8(i32 %a, i16 signext %b, i32 %c) {
83; CHECK-LABEL: f8:
84; CHECK: smlawb
85        %conv = sext i32 %a to i64
86        %conv1 = sext i16 %b to i64
87        %mul = mul nsw i64 %conv1, %conv
88        %shr5 = lshr i64 %mul, 16
89        %conv2 = trunc i64 %shr5 to i32
90        %add = add nsw i32 %conv2, %c
91        ret i32 %add
92}
93
94define i32 @f9(i32 %a, i32 %b, i32 %c) {
95; CHECK-LABEL: f9:
96; CHECK: smlawt
97        %conv = sext i32 %a to i64
98        %shr = ashr i32 %b, 16
99        %conv1 = sext i32 %shr to i64
100        %mul = mul nsw i64 %conv1, %conv
101        %shr26 = lshr i64 %mul, 16
102        %conv3 = trunc i64 %shr26 to i32
103        %add = add nsw i32 %conv3, %c
104        ret i32 %add
105}
106
107define i32 @f10(i32 %a, i32 %b, i32 %c) {
108; CHECK-LABEL: f10:
109; CHECK: smulwb
110        %shl = shl i32 %b, 16
111        %shr = ashr exact i32 %shl, 16
112        %conv = sext i32 %a to i64
113        %conv2 = sext i32 %shr to i64
114        %mul = mul nsw i64 %conv2, %conv
115        %shr37 = lshr i64 %mul, 16
116        %conv4 = trunc i64 %shr37 to i32
117        ret i32 %conv4
118}
119
120define i32 @f11(i32 %a, i16 signext %b, i32 %c) {
121; CHECK-LABEL: f11:
122; CHECK: smulwb
123        %conv = sext i32 %a to i64
124        %conv1 = sext i16 %b to i64
125        %mul = mul nsw i64 %conv1, %conv
126        %shr4 = lshr i64 %mul, 16
127        %conv2 = trunc i64 %shr4 to i32
128        ret i32 %conv2
129}
130
131define i32 @f12(i32 %a, i32 %b, i32 %c) {
132; CHECK-LABEL: f12:
133; CHECK: smulwt
134        %conv = sext i32 %a to i64
135        %shr = ashr i32 %b, 16
136        %conv1 = sext i32 %shr to i64
137        %mul = mul nsw i64 %conv1, %conv
138        %shr25 = lshr i64 %mul, 16
139        %conv3 = trunc i64 %shr25 to i32
140        ret i32 %conv3
141}
142