blob: 2074f98cb608c2506deacb4a5c42bacf6245a8fd [file] [log] [blame]
Evan Chengc36b5b92010-06-29 05:38:36 +00001; RUN: llc < %s -march=thumb -mcpu=cortex-a8 | FileCheck %s -check-prefix=ARMv7A
2; RUN: llc < %s -march=thumb -mcpu=cortex-m3 | FileCheck %s -check-prefix=ARMv7M
Evan Chengd27c9fc2009-07-03 01:43:10 +00003
4define i32 @test1(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +00005; ARMv7A: test1
6; ARMv7A: uxtb16 r0, r0
7
8; ARMv7M: test1
Jim Grosbachf27ca422010-07-20 16:16:48 +00009; ARMv7M: bic r0, r0, #-16711936
Evan Chengd27c9fc2009-07-03 01:43:10 +000010 %tmp1 = and i32 %x, 16711935 ; <i32> [#uses=1]
11 ret i32 %tmp1
12}
13
Evan Chengc36b5b92010-06-29 05:38:36 +000014; PR7503
Evan Chengd27c9fc2009-07-03 01:43:10 +000015define i32 @test2(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +000016; ARMv7A: test2
17; ARMv7A: uxtb16 r0, r0, ror #8
18
19; ARMv7M: test2
20; ARMv7M: mov.w r1, #16711935
21; ARMv7M: and.w r0, r1, r0, lsr #8
Evan Chengd27c9fc2009-07-03 01:43:10 +000022 %tmp1 = lshr i32 %x, 8 ; <i32> [#uses=1]
23 %tmp2 = and i32 %tmp1, 16711935 ; <i32> [#uses=1]
24 ret i32 %tmp2
25}
26
27define i32 @test3(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +000028; ARMv7A: test3
29; ARMv7A: uxtb16 r0, r0, ror #8
30
31; ARMv7M: test3
32; ARMv7M: mov.w r1, #16711935
33; ARMv7M: and.w r0, r1, r0, lsr #8
Evan Chengd27c9fc2009-07-03 01:43:10 +000034 %tmp1 = lshr i32 %x, 8 ; <i32> [#uses=1]
35 %tmp2 = and i32 %tmp1, 16711935 ; <i32> [#uses=1]
36 ret i32 %tmp2
37}
38
39define i32 @test4(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +000040; ARMv7A: test4
41; ARMv7A: uxtb16 r0, r0, ror #8
42
43; ARMv7M: test4
44; ARMv7M: mov.w r1, #16711935
45; ARMv7M: and.w r0, r1, r0, lsr #8
Evan Chengd27c9fc2009-07-03 01:43:10 +000046 %tmp1 = lshr i32 %x, 8 ; <i32> [#uses=1]
47 %tmp6 = and i32 %tmp1, 16711935 ; <i32> [#uses=1]
48 ret i32 %tmp6
49}
50
51define i32 @test5(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +000052; ARMv7A: test5
53; ARMv7A: uxtb16 r0, r0, ror #8
54
55; ARMv7M: test5
56; ARMv7M: mov.w r1, #16711935
57; ARMv7M: and.w r0, r1, r0, lsr #8
Evan Chengd27c9fc2009-07-03 01:43:10 +000058 %tmp1 = lshr i32 %x, 8 ; <i32> [#uses=1]
59 %tmp2 = and i32 %tmp1, 16711935 ; <i32> [#uses=1]
60 ret i32 %tmp2
61}
62
63define i32 @test6(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +000064; ARMv7A: test6
65; ARMv7A: uxtb16 r0, r0, ror #16
66
67; ARMv7M: test6
68; ARMv7M: mov.w r1, #16711935
69; ARMv7M: and.w r0, r1, r0, ror #16
Evan Chengd27c9fc2009-07-03 01:43:10 +000070 %tmp1 = lshr i32 %x, 16 ; <i32> [#uses=1]
71 %tmp2 = and i32 %tmp1, 255 ; <i32> [#uses=1]
72 %tmp4 = shl i32 %x, 16 ; <i32> [#uses=1]
73 %tmp5 = and i32 %tmp4, 16711680 ; <i32> [#uses=1]
74 %tmp6 = or i32 %tmp2, %tmp5 ; <i32> [#uses=1]
75 ret i32 %tmp6
76}
77
78define i32 @test7(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +000079; ARMv7A: test7
80; ARMv7A: uxtb16 r0, r0, ror #16
81
82; ARMv7M: test7
83; ARMv7M: mov.w r1, #16711935
84; ARMv7M: and.w r0, r1, r0, ror #16
Evan Chengd27c9fc2009-07-03 01:43:10 +000085 %tmp1 = lshr i32 %x, 16 ; <i32> [#uses=1]
86 %tmp2 = and i32 %tmp1, 255 ; <i32> [#uses=1]
87 %tmp4 = shl i32 %x, 16 ; <i32> [#uses=1]
88 %tmp5 = and i32 %tmp4, 16711680 ; <i32> [#uses=1]
89 %tmp6 = or i32 %tmp2, %tmp5 ; <i32> [#uses=1]
90 ret i32 %tmp6
91}
92
93define i32 @test8(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +000094; ARMv7A: test8
95; ARMv7A: uxtb16 r0, r0, ror #24
96
97; ARMv7M: test8
98; ARMv7M: mov.w r1, #16711935
99; ARMv7M: and.w r0, r1, r0, ror #24
Evan Chengd27c9fc2009-07-03 01:43:10 +0000100 %tmp1 = shl i32 %x, 8 ; <i32> [#uses=1]
101 %tmp2 = and i32 %tmp1, 16711680 ; <i32> [#uses=1]
102 %tmp5 = lshr i32 %x, 24 ; <i32> [#uses=1]
103 %tmp6 = or i32 %tmp2, %tmp5 ; <i32> [#uses=1]
104 ret i32 %tmp6
105}
106
107define i32 @test9(i32 %x) {
Evan Chengc36b5b92010-06-29 05:38:36 +0000108; ARMv7A: test9
109; ARMv7A: uxtb16 r0, r0, ror #24
110
111; ARMv7M: test9
112; ARMv7M: mov.w r1, #16711935
113; ARMv7M: and.w r0, r1, r0, ror #24
Evan Chengd27c9fc2009-07-03 01:43:10 +0000114 %tmp1 = lshr i32 %x, 24 ; <i32> [#uses=1]
115 %tmp4 = shl i32 %x, 8 ; <i32> [#uses=1]
116 %tmp5 = and i32 %tmp4, 16711680 ; <i32> [#uses=1]
117 %tmp6 = or i32 %tmp5, %tmp1 ; <i32> [#uses=1]
118 ret i32 %tmp6
119}
120
121define i32 @test10(i32 %p0) {
Evan Chengc36b5b92010-06-29 05:38:36 +0000122; ARMv7A: test10
123; ARMv7A: mov.w r1, #16253176
124; ARMv7A: and.w r0, r1, r0, lsr #7
125; ARMv7A: lsrs r1, r0, #5
126; ARMv7A: uxtb16 r1, r1
127; ARMv7A: orrs r0, r1
Jim Grosbach11872852009-11-17 00:20:26 +0000128
Evan Chengc36b5b92010-06-29 05:38:36 +0000129; ARMv7M: test10
130; ARMv7M: mov.w r1, #16253176
131; ARMv7M: and.w r0, r1, r0, lsr #7
132; ARMv7M: mov.w r1, #458759
133; ARMv7M: and.w r1, r1, r0, lsr #5
134; ARMv7M: orrs r0, r1
Evan Chengd27c9fc2009-07-03 01:43:10 +0000135 %tmp1 = lshr i32 %p0, 7 ; <i32> [#uses=1]
136 %tmp2 = and i32 %tmp1, 16253176 ; <i32> [#uses=2]
137 %tmp4 = lshr i32 %tmp2, 5 ; <i32> [#uses=1]
138 %tmp5 = and i32 %tmp4, 458759 ; <i32> [#uses=1]
139 %tmp7 = or i32 %tmp5, %tmp2 ; <i32> [#uses=1]
140 ret i32 %tmp7
141}