blob: 9318f2d8a6b0b593ed823964a4681c81d94f7641 [file] [log] [blame]
Krzysztof Parzyszek18484de2018-03-06 19:15:58 +00001; RUN: llc -march=hexagon -hexagon-bit=0 < %s | FileCheck %s
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +00002; Optimized bitwise operations.
3
4define i32 @my_clrbit(i32 %x) nounwind {
5entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +00006; CHECK-LABEL: my_clrbit
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +00007; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}},#31)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +00008 %x.addr = alloca i32, align 4
9 store i32 %x, i32* %x.addr, align 4
10 %0 = load i32, i32* %x.addr, align 4
11 %and = and i32 %0, 2147483647
12 ret i32 %and
13}
14
15define i64 @my_clrbit2(i64 %x) nounwind {
16entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +000017; CHECK-LABEL: my_clrbit2
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000018; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}},#31)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +000019 %x.addr = alloca i64, align 8
20 store i64 %x, i64* %x.addr, align 8
21 %0 = load i64, i64* %x.addr, align 8
22 %and = and i64 %0, -2147483649
23 ret i64 %and
24}
25
26define i64 @my_clrbit3(i64 %x) nounwind {
27entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +000028; CHECK-LABEL: my_clrbit3
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000029; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}},#31)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +000030 %x.addr = alloca i64, align 8
31 store i64 %x, i64* %x.addr, align 8
32 %0 = load i64, i64* %x.addr, align 8
33 %and = and i64 %0, 9223372036854775807
34 ret i64 %and
35}
36
37define i32 @my_clrbit4(i32 %x) nounwind {
38entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +000039; CHECK-LABEL: my_clrbit4
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000040; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}},#13)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +000041 %x.addr = alloca i32, align 4
42 store i32 %x, i32* %x.addr, align 4
43 %0 = load i32, i32* %x.addr, align 4
44 %and = and i32 %0, -8193
45 ret i32 %and
46}
47
48define i64 @my_clrbit5(i64 %x) nounwind {
49entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +000050; CHECK-LABEL: my_clrbit5
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000051; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}},#13)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +000052 %x.addr = alloca i64, align 8
53 store i64 %x, i64* %x.addr, align 8
54 %0 = load i64, i64* %x.addr, align 8
55 %and = and i64 %0, -8193
56 ret i64 %and
57}
58
59define i64 @my_clrbit6(i64 %x) nounwind {
60entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +000061; CHECK-LABEL: my_clrbit6
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000062; CHECK: r{{[0-9]+}} = clrbit(r{{[0-9]+}},#27)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +000063 %x.addr = alloca i64, align 8
64 store i64 %x, i64* %x.addr, align 8
65 %0 = load i64, i64* %x.addr, align 8
66 %and = and i64 %0, -576460752303423489
67 ret i64 %and
68}
69
70define zeroext i16 @my_setbit(i16 zeroext %crc) nounwind {
71entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +000072; CHECK-LABEL: my_setbit
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000073; CHECK: memh(r{{[0-9]+}}+#{{[0-9]+}}) = setbit(#15)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +000074 %crc.addr = alloca i16, align 2
75 store i16 %crc, i16* %crc.addr, align 2
76 %0 = load i16, i16* %crc.addr, align 2
77 %conv = zext i16 %0 to i32
78 %or = or i32 %conv, 32768
79 %conv1 = trunc i32 %or to i16
80 store i16 %conv1, i16* %crc.addr, align 2
81 %1 = load i16, i16* %crc.addr, align 2
82 ret i16 %1
83}
84
85define i32 @my_setbit2(i32 %x) nounwind {
86entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +000087; CHECK-LABEL: my_setbit2
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000088; CHECK: r{{[0-9]+}} = setbit(r{{[0-9]+}},#15)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +000089 %x.addr = alloca i32, align 4
90 store i32 %x, i32* %x.addr, align 4
91 %0 = load i32, i32* %x.addr, align 4
92 %or = or i32 %0, 32768
93 ret i32 %or
94}
95
96define i64 @my_setbit3(i64 %x) nounwind {
97entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +000098; CHECK-LABEL: my_setbit3
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +000099; CHECK: r{{[0-9]+}} = setbit(r{{[0-9]+}},#15)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +0000100 %x.addr = alloca i64, align 8
101 store i64 %x, i64* %x.addr, align 8
102 %0 = load i64, i64* %x.addr, align 8
103 %or = or i64 %0, 32768
104 ret i64 %or
105}
106
107define i32 @my_setbit4(i32 %x) nounwind {
108entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +0000109; CHECK-LABEL: my_setbit4
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +0000110; CHECK: r{{[0-9]+}} = setbit(r{{[0-9]+}},#31)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +0000111 %x.addr = alloca i32, align 4
112 store i32 %x, i32* %x.addr, align 4
113 %0 = load i32, i32* %x.addr, align 4
114 %or = or i32 %0, -2147483648
115 ret i32 %or
116}
117
118define i64 @my_setbit5(i64 %x) nounwind {
119entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +0000120; CHECK-LABEL: my_setbit5
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +0000121; CHECK: r{{[0-9]+}} = setbit(r{{[0-9]+}},#13)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +0000122 %x.addr = alloca i64, align 8
123 store i64 %x, i64* %x.addr, align 8
124 %0 = load i64, i64* %x.addr, align 8
125 %or = or i64 %0, 35184372088832
126 ret i64 %or
127}
128
129define zeroext i16 @my_togglebit(i16 zeroext %crc) nounwind {
130entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +0000131; CHECK-LABEL: my_togglebit
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +0000132; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}},#15)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +0000133 %crc.addr = alloca i16, align 2
134 store i16 %crc, i16* %crc.addr, align 2
135 %0 = load i16, i16* %crc.addr, align 2
136 %conv = zext i16 %0 to i32
137 %xor = xor i32 %conv, 32768
138 %conv1 = trunc i32 %xor to i16
139 store i16 %conv1, i16* %crc.addr, align 2
140 %1 = load i16, i16* %crc.addr, align 2
141 ret i16 %1
142}
143
144define i32 @my_togglebit2(i32 %x) nounwind {
145entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +0000146; CHECK-LABEL: my_togglebit2
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +0000147; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}},#15)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +0000148 %x.addr = alloca i32, align 4
149 store i32 %x, i32* %x.addr, align 4
150 %0 = load i32, i32* %x.addr, align 4
151 %xor = xor i32 %0, 32768
152 ret i32 %xor
153}
154
155define i64 @my_togglebit3(i64 %x) nounwind {
156entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +0000157; CHECK-LABEL: my_togglebit3
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +0000158; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}},#15)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +0000159 %x.addr = alloca i64, align 8
160 store i64 %x, i64* %x.addr, align 8
161 %0 = load i64, i64* %x.addr, align 8
162 %xor = xor i64 %0, 32768
163 ret i64 %xor
164}
165
166define i64 @my_togglebit4(i64 %x) nounwind {
167entry:
Krzysztof Parzyszekbba0bf72016-07-15 15:35:52 +0000168; CHECK-LABEL: my_togglebit4
Krzysztof Parzyszeka72fad92017-02-10 15:33:13 +0000169; CHECK: r{{[0-9]+}} = togglebit(r{{[0-9]+}},#20)
Krzysztof Parzyszekd5972bd2015-03-18 00:44:46 +0000170 %x.addr = alloca i64, align 8
171 store i64 %x, i64* %x.addr, align 8
172 %0 = load i64, i64* %x.addr, align 8
173 %xor = xor i64 %0, 4503599627370496
174 ret i64 %xor
175}