22; RUN: llc -mtriple=armv7a < %s | FileCheck %s --check-prefix=ARM
33; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB
44; RUN: llc -mtriple=armv7m < %s | FileCheck %s --check-prefix=THUMB2
5+ ; RUN: llc -mtriple=thumbv8.1m.main < %s | FileCheck %s --check-prefix=THUMBV8
56
67define i3 @sign_i3 (i3 %a ) {
78; ARM-LABEL: sign_i3:
89; ARM: @ %bb.0:
9- ; ARM-NEXT: sbfx r1, r0, #0, #3
10- ; ARM-NEXT: mvn r0, #0
11- ; ARM-NEXT: cmn r1, #1
12- ; ARM-NEXT: movwgt r0, #1
10+ ; ARM-NEXT: lsl r0, r0, #29
11+ ; ARM-NEXT: mov r1, #1
12+ ; ARM-NEXT: orr r0, r1, r0, asr #31
1313; ARM-NEXT: bx lr
1414;
1515; THUMB-LABEL: sign_i3:
1616; THUMB: @ %bb.0:
1717; THUMB-NEXT: lsls r0, r0, #29
18- ; THUMB-NEXT: asrs r0, r0, #29
19- ; THUMB-NEXT: cmp r0, #0
20- ; THUMB-NEXT: bge .LBB0_2
21- ; THUMB-NEXT: @ %bb.1:
22- ; THUMB-NEXT: movs r0, #0
23- ; THUMB-NEXT: mvns r0, r0
24- ; THUMB-NEXT: bx lr
25- ; THUMB-NEXT: .LBB0_2:
18+ ; THUMB-NEXT: asrs r1, r0, #31
2619; THUMB-NEXT: movs r0, #1
20+ ; THUMB-NEXT: orrs r0, r1
2721; THUMB-NEXT: bx lr
2822;
2923; THUMB2-LABEL: sign_i3:
3024; THUMB2: @ %bb.0:
31- ; THUMB2-NEXT: sbfx r1, r0, #0, #3
32- ; THUMB2-NEXT: mov.w r0, #-1
33- ; THUMB2-NEXT: cmp.w r1, #-1
34- ; THUMB2-NEXT: it gt
35- ; THUMB2-NEXT: movgt r0, #1
25+ ; THUMB2-NEXT: lsls r0, r0, #29
26+ ; THUMB2-NEXT: movs r1, #1
27+ ; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
3628; THUMB2-NEXT: bx lr
29+ ;
30+ ; THUMBV8-LABEL: sign_i3:
31+ ; THUMBV8: @ %bb.0:
32+ ; THUMBV8-NEXT: lsls r0, r0, #29
33+ ; THUMBV8-NEXT: movs r1, #1
34+ ; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
35+ ; THUMBV8-NEXT: bx lr
3736 %c = icmp sgt i3 %a , -1
3837 %res = select i1 %c , i3 1 , i3 -1
3938 ret i3 %res
@@ -42,34 +41,32 @@ define i3 @sign_i3(i3 %a) {
4241define i4 @sign_i4 (i4 %a ) {
4342; ARM-LABEL: sign_i4:
4443; ARM: @ %bb.0:
45- ; ARM-NEXT: sbfx r1, r0, #0, #4
46- ; ARM-NEXT: mvn r0, #0
47- ; ARM-NEXT: cmn r1, #1
48- ; ARM-NEXT: movwgt r0, #1
44+ ; ARM-NEXT: lsl r0, r0, #28
45+ ; ARM-NEXT: mov r1, #1
46+ ; ARM-NEXT: orr r0, r1, r0, asr #31
4947; ARM-NEXT: bx lr
5048;
5149; THUMB-LABEL: sign_i4:
5250; THUMB: @ %bb.0:
5351; THUMB-NEXT: lsls r0, r0, #28
54- ; THUMB-NEXT: asrs r0, r0, #28
55- ; THUMB-NEXT: cmp r0, #0
56- ; THUMB-NEXT: bge .LBB1_2
57- ; THUMB-NEXT: @ %bb.1:
58- ; THUMB-NEXT: movs r0, #0
59- ; THUMB-NEXT: mvns r0, r0
60- ; THUMB-NEXT: bx lr
61- ; THUMB-NEXT: .LBB1_2:
52+ ; THUMB-NEXT: asrs r1, r0, #31
6253; THUMB-NEXT: movs r0, #1
54+ ; THUMB-NEXT: orrs r0, r1
6355; THUMB-NEXT: bx lr
6456;
6557; THUMB2-LABEL: sign_i4:
6658; THUMB2: @ %bb.0:
67- ; THUMB2-NEXT: sbfx r1, r0, #0, #4
68- ; THUMB2-NEXT: mov.w r0, #-1
69- ; THUMB2-NEXT: cmp.w r1, #-1
70- ; THUMB2-NEXT: it gt
71- ; THUMB2-NEXT: movgt r0, #1
59+ ; THUMB2-NEXT: lsls r0, r0, #28
60+ ; THUMB2-NEXT: movs r1, #1
61+ ; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
7262; THUMB2-NEXT: bx lr
63+ ;
64+ ; THUMBV8-LABEL: sign_i4:
65+ ; THUMBV8: @ %bb.0:
66+ ; THUMBV8-NEXT: lsls r0, r0, #28
67+ ; THUMBV8-NEXT: movs r1, #1
68+ ; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
69+ ; THUMBV8-NEXT: bx lr
7370 %c = icmp sgt i4 %a , -1
7471 %res = select i1 %c , i4 1 , i4 -1
7572 ret i4 %res
@@ -78,33 +75,32 @@ define i4 @sign_i4(i4 %a) {
7875define i8 @sign_i8 (i8 %a ) {
7976; ARM-LABEL: sign_i8:
8077; ARM: @ %bb.0:
81- ; ARM-NEXT: sxtb r1, r0
82- ; ARM-NEXT: mvn r0, #0
83- ; ARM-NEXT: cmn r1, #1
84- ; ARM-NEXT: movwgt r0, #1
78+ ; ARM-NEXT: lsl r0, r0, #24
79+ ; ARM-NEXT: mov r1, #1
80+ ; ARM-NEXT: orr r0, r1, r0, asr #31
8581; ARM-NEXT: bx lr
8682;
8783; THUMB-LABEL: sign_i8:
8884; THUMB: @ %bb.0:
89- ; THUMB-NEXT: sxtb r0, r0
90- ; THUMB-NEXT: cmp r0, #0
91- ; THUMB-NEXT: bge .LBB2_2
92- ; THUMB-NEXT: @ %bb.1:
93- ; THUMB-NEXT: movs r0, #0
94- ; THUMB-NEXT: mvns r0, r0
95- ; THUMB-NEXT: bx lr
96- ; THUMB-NEXT: .LBB2_2:
85+ ; THUMB-NEXT: lsls r0, r0, #24
86+ ; THUMB-NEXT: asrs r1, r0, #31
9787; THUMB-NEXT: movs r0, #1
88+ ; THUMB-NEXT: orrs r0, r1
9889; THUMB-NEXT: bx lr
9990;
10091; THUMB2-LABEL: sign_i8:
10192; THUMB2: @ %bb.0:
102- ; THUMB2-NEXT: sxtb r1, r0
103- ; THUMB2-NEXT: mov.w r0, #-1
104- ; THUMB2-NEXT: cmp.w r1, #-1
105- ; THUMB2-NEXT: it gt
106- ; THUMB2-NEXT: movgt r0, #1
93+ ; THUMB2-NEXT: lsls r0, r0, #24
94+ ; THUMB2-NEXT: movs r1, #1
95+ ; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
10796; THUMB2-NEXT: bx lr
97+ ;
98+ ; THUMBV8-LABEL: sign_i8:
99+ ; THUMBV8: @ %bb.0:
100+ ; THUMBV8-NEXT: lsls r0, r0, #24
101+ ; THUMBV8-NEXT: movs r1, #1
102+ ; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
103+ ; THUMBV8-NEXT: bx lr
108104 %c = icmp sgt i8 %a , -1
109105 %res = select i1 %c , i8 1 , i8 -1
110106 ret i8 %res
@@ -113,33 +109,32 @@ define i8 @sign_i8(i8 %a) {
113109define i16 @sign_i16 (i16 %a ) {
114110; ARM-LABEL: sign_i16:
115111; ARM: @ %bb.0:
116- ; ARM-NEXT: sxth r1, r0
117- ; ARM-NEXT: mvn r0, #0
118- ; ARM-NEXT: cmn r1, #1
119- ; ARM-NEXT: movwgt r0, #1
112+ ; ARM-NEXT: lsl r0, r0, #16
113+ ; ARM-NEXT: mov r1, #1
114+ ; ARM-NEXT: orr r0, r1, r0, asr #31
120115; ARM-NEXT: bx lr
121116;
122117; THUMB-LABEL: sign_i16:
123118; THUMB: @ %bb.0:
124- ; THUMB-NEXT: sxth r0, r0
125- ; THUMB-NEXT: cmp r0, #0
126- ; THUMB-NEXT: bge .LBB3_2
127- ; THUMB-NEXT: @ %bb.1:
128- ; THUMB-NEXT: movs r0, #0
129- ; THUMB-NEXT: mvns r0, r0
130- ; THUMB-NEXT: bx lr
131- ; THUMB-NEXT: .LBB3_2:
119+ ; THUMB-NEXT: lsls r0, r0, #16
120+ ; THUMB-NEXT: asrs r1, r0, #31
132121; THUMB-NEXT: movs r0, #1
122+ ; THUMB-NEXT: orrs r0, r1
133123; THUMB-NEXT: bx lr
134124;
135125; THUMB2-LABEL: sign_i16:
136126; THUMB2: @ %bb.0:
137- ; THUMB2-NEXT: sxth r1, r0
138- ; THUMB2-NEXT: mov.w r0, #-1
139- ; THUMB2-NEXT: cmp.w r1, #-1
140- ; THUMB2-NEXT: it gt
141- ; THUMB2-NEXT: movgt r0, #1
127+ ; THUMB2-NEXT: lsls r0, r0, #16
128+ ; THUMB2-NEXT: movs r1, #1
129+ ; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
142130; THUMB2-NEXT: bx lr
131+ ;
132+ ; THUMBV8-LABEL: sign_i16:
133+ ; THUMBV8: @ %bb.0:
134+ ; THUMBV8-NEXT: lsls r0, r0, #16
135+ ; THUMBV8-NEXT: movs r1, #1
136+ ; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
137+ ; THUMBV8-NEXT: bx lr
143138 %c = icmp sgt i16 %a , -1
144139 %res = select i1 %c , i16 1 , i16 -1
145140 ret i16 %res
@@ -148,32 +143,28 @@ define i16 @sign_i16(i16 %a) {
148143define i32 @sign_i32 (i32 %a ) {
149144; ARM-LABEL: sign_i32:
150145; ARM: @ %bb.0:
151- ; ARM-NEXT: mvn r1, #0
152- ; ARM-NEXT: cmn r0, #1
153- ; ARM-NEXT: movwgt r1, #1
154- ; ARM-NEXT: mov r0, r1
146+ ; ARM-NEXT: mov r1, #1
147+ ; ARM-NEXT: orr r0, r1, r0, asr #31
155148; ARM-NEXT: bx lr
156149;
157150; THUMB-LABEL: sign_i32:
158151; THUMB: @ %bb.0:
159- ; THUMB-NEXT: cmp r0, #0
160- ; THUMB-NEXT: bge .LBB4_2
161- ; THUMB-NEXT: @ %bb.1:
162- ; THUMB-NEXT: movs r0, #0
163- ; THUMB-NEXT: mvns r0, r0
164- ; THUMB-NEXT: bx lr
165- ; THUMB-NEXT: .LBB4_2:
152+ ; THUMB-NEXT: asrs r1, r0, #31
166153; THUMB-NEXT: movs r0, #1
154+ ; THUMB-NEXT: orrs r0, r1
167155; THUMB-NEXT: bx lr
168156;
169157; THUMB2-LABEL: sign_i32:
170158; THUMB2: @ %bb.0:
171- ; THUMB2-NEXT: mov.w r1, #-1
172- ; THUMB2-NEXT: cmp.w r0, #-1
173- ; THUMB2-NEXT: it gt
174- ; THUMB2-NEXT: movgt r1, #1
175- ; THUMB2-NEXT: mov r0, r1
159+ ; THUMB2-NEXT: movs r1, #1
160+ ; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
176161; THUMB2-NEXT: bx lr
162+ ;
163+ ; THUMBV8-LABEL: sign_i32:
164+ ; THUMBV8: @ %bb.0:
165+ ; THUMBV8-NEXT: movs r1, #1
166+ ; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
167+ ; THUMBV8-NEXT: bx lr
177168 %c = icmp sgt i32 %a , -1
178169 %res = select i1 %c , i32 1 , i32 -1
179170 ret i32 %res
0 commit comments