Make ARM and Thumb2 32-bit immediate materialization into a single 32-bit pseudo
[oota-llvm.git] / test / CodeGen / Thumb2 / thumb2-mov2.ll
1 ; RUN: llc < %s -march=thumb -mattr=+thumb2 | FileCheck %s
2
3 define i32 @t2MOVTi16_ok_1(i32 %a) {
4 ; CHECK: t2MOVTi16_ok_1:
5 ; CHECK:      movs r1, #0
6 ; CHECK-NEXT: movt r1, #1234
7 ; CHECK:      movw r1, #65535
8 ; CHECK-NEXT: movt r1, #1234
9     %1 = and i32 %a, 65535
10     %2 = shl i32 1234, 16
11     %3 = or  i32 %1, %2
12
13     ret i32 %3
14 }
15
16 define i32 @t2MOVTi16_test_1(i32 %a) {
17 ; CHECK: t2MOVTi16_test_1:
18 ; CHECK:      movs r1, #0
19 ; CHECK-NEXT: movt r1, #1234
20 ; CHECK:      movw r1, #65535
21 ; CHECK-NEXT: movt r1, #1234
22     %1 = shl i32  255,   8
23     %2 = shl i32 1234,   8
24     %3 = or  i32   %1, 255  ; This give us 0xFFFF in %3
25     %4 = shl i32   %2,   8  ; This gives us (1234 << 16) in %4
26     %5 = and i32   %a,  %3
27     %6 = or  i32   %4,  %5
28
29     ret i32 %6
30 }
31
32 define i32 @t2MOVTi16_test_2(i32 %a) {
33 ; CHECK: t2MOVTi16_test_2:
34 ; CHECK:      movs r1, #0
35 ; CHECK-NEXT: movt r1, #1234
36 ; CHECK:      movw r1, #65535
37 ; CHECK-NEXT: movt r1, #1234
38     %1 = shl i32  255,   8
39     %2 = shl i32 1234,   8
40     %3 = or  i32   %1, 255  ; This give us 0xFFFF in %3
41     %4 = shl i32   %2,   6
42     %5 = and i32   %a,  %3
43     %6 = shl i32   %4,   2  ; This gives us (1234 << 16) in %6
44     %7 = or  i32   %5,  %6
45
46     ret i32 %7
47 }
48
49 define i32 @t2MOVTi16_test_3(i32 %a) {
50 ; CHECK: t2MOVTi16_test_3:
51 ; CHECK:      movs r1, #0
52 ; CHECK-NEXT: movt r1, #1234
53 ; CHECK:      movw r1, #65535
54 ; CHECK-NEXT: movt r1, #1234
55     %1 = shl i32  255,   8
56     %2 = shl i32 1234,   8
57     %3 = or  i32   %1, 255  ; This give us 0xFFFF in %3
58     %4 = shl i32   %2,   6
59     %5 = and i32   %a,  %3
60     %6 = shl i32   %4,   2  ; This gives us (1234 << 16) in %6
61     %7 = lshr i32  %6,   6
62     %8 = shl i32   %7,   6
63     %9 = or  i32   %5,  %8
64
65     ret i32 %9
66 }
67
68 define i32 @t2MOVTi16_test_nomatch_1(i32 %a) {
69 ; CHECK: t2MOVTi16_test_nomatch_1:
70 ; CHECK:      movw r1, #16384
71 ; CHECK-NEXT: movt r1, #154
72 ; CHECK:      movw r1, #65535
73 ; CHECK-NEXT: movt r1, #154
74     %1 = shl i32  255,   8
75     %2 = shl i32 1234,   8
76     %3 = or  i32   %1, 255  ; This give us 0xFFFF in %3
77     %4 = shl i32   %2,   6
78     %5 = and i32   %a,  %3
79     %6 = shl i32   %4,   2  ; This gives us (1234 << 16) in %6
80     %7 = lshr i32  %6,   3
81     %8 = or  i32   %5,  %7
82     ret i32 %8
83 }
84
85