8
8
target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
9
9
target triple = "avr"
10
10
11
- define i32 @shl (i32 %value , i32 %amount ) addrspace (1 ) {
12
- ; CHECK-LABEL: @shl(
11
+ define i16 @shl16 (i16 %value , i16 %amount ) addrspace (1 ) {
12
+ ; CHECK-LABEL: @shl16(
13
+ ; CHECK-NEXT: [[RESULT:%.*]] = shl i16 [[VALUE:%.*]], [[AMOUNT:%.*]]
14
+ ; CHECK-NEXT: ret i16 [[RESULT]]
15
+ ;
16
+ %result = shl i16 %value , %amount
17
+ ret i16 %result
18
+ }
19
+
20
+ define i32 @shl32 (i32 %value , i32 %amount ) addrspace (1 ) {
21
+ ; CHECK-LABEL: @shl32(
13
22
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8
14
23
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
15
24
; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
@@ -28,8 +37,39 @@ define i32 @shl(i32 %value, i32 %amount) addrspace(1) {
28
37
ret i32 %result
29
38
}
30
39
31
- define i32 @lshr (i32 %value , i32 %amount ) addrspace (1 ) {
32
- ; CHECK-LABEL: @lshr(
40
+ define i40 @shl40 (i40 %value , i40 %amount ) addrspace (1 ) {
41
+ ; CHECK-LABEL: @shl40(
42
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i8
43
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
44
+ ; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
45
+ ; CHECK: shift.loop:
46
+ ; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
47
+ ; CHECK-NEXT: [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
48
+ ; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 1
49
+ ; CHECK-NEXT: [[TMP6]] = shl i40 [[TMP4]], 1
50
+ ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
51
+ ; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
52
+ ; CHECK: shift.done:
53
+ ; CHECK-NEXT: [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
54
+ ; CHECK-NEXT: ret i40 [[TMP8]]
55
+ ;
56
+ %result = shl i40 %value , %amount
57
+ ret i40 %result
58
+ }
59
+
60
+ ; ------------------------------------------------------------------------------
61
+
62
+ define i16 @lshr16 (i16 %value , i16 %amount ) addrspace (1 ) {
63
+ ; CHECK-LABEL: @lshr16(
64
+ ; CHECK-NEXT: [[RESULT:%.*]] = lshr i16 [[VALUE:%.*]], [[AMOUNT:%.*]]
65
+ ; CHECK-NEXT: ret i16 [[RESULT]]
66
+ ;
67
+ %result = lshr i16 %value , %amount
68
+ ret i16 %result
69
+ }
70
+
71
+ define i32 @lshr32 (i32 %value , i32 %amount ) addrspace (1 ) {
72
+ ; CHECK-LABEL: @lshr32(
33
73
; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8
34
74
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
35
75
; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
@@ -48,42 +88,73 @@ define i32 @lshr(i32 %value, i32 %amount) addrspace(1) {
48
88
ret i32 %result
49
89
}
50
90
51
- define i32 @ashr ( i32 %0 , i32 %1 ) addrspace (1 ) {
52
- ; CHECK-LABEL: @ashr (
53
- ; CHECK-NEXT: [[TMP3 :%.*]] = trunc i32 [[TMP1 :%.*]] to i8
54
- ; CHECK-NEXT: [[TMP4 :%.*]] = icmp eq i8 [[TMP3 ]], 0
55
- ; CHECK-NEXT: br i1 [[TMP4 ]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
91
+ define i40 @lshr40 ( i40 %value , i40 %amount ) addrspace (1 ) {
92
+ ; CHECK-LABEL: @lshr40 (
93
+ ; CHECK-NEXT: [[TMP1 :%.*]] = trunc i40 [[AMOUNT :%.*]] to i8
94
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp eq i8 [[TMP1 ]], 0
95
+ ; CHECK-NEXT: br i1 [[TMP2 ]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
56
96
; CHECK: shift.loop:
57
- ; CHECK-NEXT: [[TMP5 :%.*]] = phi i8 [ [[TMP3 ]], [[TMP2 :%.*]] ], [ [[TMP7 :%.*]], [[SHIFT_LOOP]] ]
58
- ; CHECK-NEXT: [[TMP6 :%.*]] = phi i32 [ [[TMP0 :%.*]], [[TMP2 ]] ], [ [[TMP8 :%.*]], [[SHIFT_LOOP]] ]
59
- ; CHECK-NEXT: [[TMP7 ]] = sub i8 [[TMP5 ]], 1
60
- ; CHECK-NEXT: [[TMP8 ]] = ashr i32 [[TMP6 ]], 1
61
- ; CHECK-NEXT: [[TMP9 :%.*]] = icmp eq i8 [[TMP7 ]], 0
62
- ; CHECK-NEXT: br i1 [[TMP9 ]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
97
+ ; CHECK-NEXT: [[TMP3 :%.*]] = phi i8 [ [[TMP1 ]], [[TMP0 :%.*]] ], [ [[TMP5 :%.*]], [[SHIFT_LOOP]] ]
98
+ ; CHECK-NEXT: [[TMP4 :%.*]] = phi i40 [ [[VALUE :%.*]], [[TMP0 ]] ], [ [[TMP6 :%.*]], [[SHIFT_LOOP]] ]
99
+ ; CHECK-NEXT: [[TMP5 ]] = sub i8 [[TMP3 ]], 1
100
+ ; CHECK-NEXT: [[TMP6 ]] = lshr i40 [[TMP4 ]], 1
101
+ ; CHECK-NEXT: [[TMP7 :%.*]] = icmp eq i8 [[TMP5 ]], 0
102
+ ; CHECK-NEXT: br i1 [[TMP7 ]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
63
103
; CHECK: shift.done:
64
- ; CHECK-NEXT: [[TMP10 :%.*]] = phi i32 [ [[TMP0 ]], [[TMP2 ]] ], [ [[TMP8 ]], [[SHIFT_LOOP]] ]
65
- ; CHECK-NEXT: ret i32 [[TMP10 ]]
104
+ ; CHECK-NEXT: [[TMP8 :%.*]] = phi i40 [ [[VALUE ]], [[TMP0 ]] ], [ [[TMP6 ]], [[SHIFT_LOOP]] ]
105
+ ; CHECK-NEXT: ret i40 [[TMP8 ]]
66
106
;
67
- %3 = ashr i32 %0 , %1
68
- ret i32 %3
107
+ %result = lshr i40 %value , %amount
108
+ ret i40 %result
69
109
}
70
110
71
- ; This function is not modified because it is not an i32.
72
- define i40 @shl40 (i40 %value , i40 %amount ) addrspace (1 ) {
73
- ; CHECK-LABEL: @shl40(
74
- ; CHECK-NEXT: [[RESULT:%.*]] = shl i40 [[VALUE:%.*]], [[AMOUNT:%.*]]
75
- ; CHECK-NEXT: ret i40 [[RESULT]]
111
+ ; ------------------------------------------------------------------------------
112
+
113
+ define i16 @ashr16 (i16 %value , i16 %amount ) addrspace (1 ) {
114
+ ; CHECK-LABEL: @ashr16(
115
+ ; CHECK-NEXT: [[RESULT:%.*]] = ashr i16 [[VALUE:%.*]], [[AMOUNT:%.*]]
116
+ ; CHECK-NEXT: ret i16 [[RESULT]]
76
117
;
77
- %result = shl i40 %value , %amount
78
- ret i40 %result
118
+ %result = ashr i16 %value , %amount
119
+ ret i16 %result
79
120
}
80
121
81
- ; This function isn't either, although perhaps it should.
82
- define i24 @shl24 (i24 %value , i24 %amount ) addrspace (1 ) {
83
- ; CHECK-LABEL: @shl24(
84
- ; CHECK-NEXT: [[RESULT:%.*]] = shl i24 [[VALUE:%.*]], [[AMOUNT:%.*]]
85
- ; CHECK-NEXT: ret i24 [[RESULT]]
122
+ define i32 @ashr32 (i32 %value , i32 %amount ) addrspace (1 ) {
123
+ ; CHECK-LABEL: @ashr32(
124
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8
125
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
126
+ ; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
127
+ ; CHECK: shift.loop:
128
+ ; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
129
+ ; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
130
+ ; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 1
131
+ ; CHECK-NEXT: [[TMP6]] = ashr i32 [[TMP4]], 1
132
+ ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
133
+ ; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
134
+ ; CHECK: shift.done:
135
+ ; CHECK-NEXT: [[TMP8:%.*]] = phi i32 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
136
+ ; CHECK-NEXT: ret i32 [[TMP8]]
137
+ ;
138
+ %result = ashr i32 %value , %amount
139
+ ret i32 %result
140
+ }
141
+
142
+ define i40 @ashr40 (i40 %value , i40 %amount ) addrspace (1 ) {
143
+ ; CHECK-LABEL: @ashr40(
144
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i40 [[AMOUNT:%.*]] to i8
145
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
146
+ ; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
147
+ ; CHECK: shift.loop:
148
+ ; CHECK-NEXT: [[TMP3:%.*]] = phi i8 [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[SHIFT_LOOP]] ]
149
+ ; CHECK-NEXT: [[TMP4:%.*]] = phi i40 [ [[VALUE:%.*]], [[TMP0]] ], [ [[TMP6:%.*]], [[SHIFT_LOOP]] ]
150
+ ; CHECK-NEXT: [[TMP5]] = sub i8 [[TMP3]], 1
151
+ ; CHECK-NEXT: [[TMP6]] = ashr i40 [[TMP4]], 1
152
+ ; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP5]], 0
153
+ ; CHECK-NEXT: br i1 [[TMP7]], label [[SHIFT_DONE]], label [[SHIFT_LOOP]]
154
+ ; CHECK: shift.done:
155
+ ; CHECK-NEXT: [[TMP8:%.*]] = phi i40 [ [[VALUE]], [[TMP0]] ], [ [[TMP6]], [[SHIFT_LOOP]] ]
156
+ ; CHECK-NEXT: ret i40 [[TMP8]]
86
157
;
87
- %result = shl i24 %value , %amount
88
- ret i24 %result
158
+ %result = ashr i40 %value , %amount
159
+ ret i40 %result
89
160
}
0 commit comments