88target datalayout = "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
99target triple = "avr"
1010
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(
1322; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8
1423; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
1524; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
@@ -28,8 +37,39 @@ define i32 @shl(i32 %value, i32 %amount) addrspace(1) {
2837 ret i32 %result
2938}
3039
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(
3373; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[AMOUNT:%.*]] to i8
3474; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 0
3575; CHECK-NEXT: br i1 [[TMP2]], label [[SHIFT_DONE:%.*]], label [[SHIFT_LOOP:%.*]]
@@ -48,42 +88,73 @@ define i32 @lshr(i32 %value, i32 %amount) addrspace(1) {
4888 ret i32 %result
4989}
5090
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:%.*]]
5696; 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]]
63103; 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 ]]
66106;
67- %3 = ashr i32 %0 , %1
68- ret i32 %3
107+ %result = lshr i40 %value , %amount
108+ ret i40 %result
69109}
70110
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]]
76117;
77- %result = shl i40 %value , %amount
78- ret i40 %result
118+ %result = ashr i16 %value , %amount
119+ ret i16 %result
79120}
80121
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]]
86157;
87- %result = shl i24 %value , %amount
88- ret i24 %result
158+ %result = ashr i40 %value , %amount
159+ ret i40 %result
89160}
0 commit comments