Add support for using MVN to materialize negative constants.
[oota-llvm.git] / test / CodeGen / ARM / fast-isel-ldrh-strh-arm.ll
1 ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
2 ; rdar://10418009
3
4 ; TODO: We currently don't support ldrh/strh for negative offsets.  Likely a 
5 ; rare case, but possibly worth pursuing.  Comments above the test case show
6 ; what could be selected.
7
8 ; ldrh r0, [r0, #-16]
9 define zeroext i16 @t1(i16* nocapture %a) nounwind uwtable readonly ssp {
10 entry:
11 ; ARM: t1
12   %add.ptr = getelementptr inbounds i16* %a, i64 -8
13   %0 = load i16* %add.ptr, align 2
14 ; ARM: mvn r{{[1-9]}}, #15
15 ; ARM: add r0, r0, r{{[1-9]}}
16 ; ARM: ldrh r0, [r0]
17   ret i16 %0
18 }
19
20 ; ldrh r0, [r0, #-32]
21 define zeroext i16 @t2(i16* nocapture %a) nounwind uwtable readonly ssp {
22 entry:
23 ; ARM: t2
24   %add.ptr = getelementptr inbounds i16* %a, i64 -16
25   %0 = load i16* %add.ptr, align 2
26 ; ARM: mvn r{{[1-9]}}, #31
27 ; ARM: add r0, r0, r{{[1-9]}}
28 ; ARM: ldrh r0, [r0]
29   ret i16 %0
30 }
31
32 ; ldrh r0, [r0, #-254]
33 define zeroext i16 @t3(i16* nocapture %a) nounwind uwtable readonly ssp {
34 entry:
35 ; ARM: t3
36   %add.ptr = getelementptr inbounds i16* %a, i64 -127
37   %0 = load i16* %add.ptr, align 2
38 ; ARM: mvn r{{[1-9]}}, #253
39 ; ARM: add r0, r0, r{{[1-9]}}
40 ; ARM: ldrh r0, [r0]
41   ret i16 %0
42 }
43
44 ; mvn r1, #255
45 ; ldrh r0, [r0, r1]
46 define zeroext i16 @t4(i16* nocapture %a) nounwind uwtable readonly ssp {
47 entry:
48 ; ARM: t4
49   %add.ptr = getelementptr inbounds i16* %a, i64 -128
50   %0 = load i16* %add.ptr, align 2
51 ; ARM: mvn r{{[1-9]}}, #255
52 ; ARM: add r0, r0, r{{[1-9]}}
53 ; ARM: ldrh r0, [r0]
54   ret i16 %0
55 }
56
57 define zeroext i16 @t5(i16* nocapture %a) nounwind uwtable readonly ssp {
58 entry:
59 ; ARM: t5
60   %add.ptr = getelementptr inbounds i16* %a, i64 8
61   %0 = load i16* %add.ptr, align 2
62 ; ARM: ldrh r0, [r0, #16]
63   ret i16 %0
64 }
65
66 define zeroext i16 @t6(i16* nocapture %a) nounwind uwtable readonly ssp {
67 entry:
68 ; ARM: t6
69   %add.ptr = getelementptr inbounds i16* %a, i64 16
70   %0 = load i16* %add.ptr, align 2
71 ; ARM: ldrh r0, [r0, #32]
72   ret i16 %0
73 }
74
75 define zeroext i16 @t7(i16* nocapture %a) nounwind uwtable readonly ssp {
76 entry:
77 ; ARM: t7
78   %add.ptr = getelementptr inbounds i16* %a, i64 127
79   %0 = load i16* %add.ptr, align 2
80 ; ARM: ldrh r0, [r0, #254]
81   ret i16 %0
82 }
83
84 define zeroext i16 @t8(i16* nocapture %a) nounwind uwtable readonly ssp {
85 entry:
86 ; ARM: t8
87   %add.ptr = getelementptr inbounds i16* %a, i64 128
88   %0 = load i16* %add.ptr, align 2
89 ; ARM: add r0, r0, #256
90 ; ARM: ldrh r0, [r0]
91   ret i16 %0
92 }
93
94 ; strh r1, [r0, #-16]
95 define void @t9(i16* nocapture %a) nounwind uwtable ssp {
96 entry:
97 ; ARM: t9
98   %add.ptr = getelementptr inbounds i16* %a, i64 -8
99   store i16 0, i16* %add.ptr, align 2
100 ; ARM: mvn r{{[1-9]}}, #15
101 ; ARM: add r0, r0, r{{[1-9]}}
102 ; ARM: strh r{{[1-9]}}, [r0]
103   ret void
104 }
105
106 ; mvn r1, #255
107 ; strh r2, [r0, r1]
108 define void @t10(i16* nocapture %a) nounwind uwtable ssp {
109 entry:
110 ; ARM: t10
111   %add.ptr = getelementptr inbounds i16* %a, i64 -128
112   store i16 0, i16* %add.ptr, align 2
113 ; ARM: mvn r{{[1-9]}}, #255
114 ; ARM: add r0, r0, r{{[1-9]}}
115 ; ARM: strh r{{[1-9]}}, [r0]
116   ret void
117 }
118
119 define void @t11(i16* nocapture %a) nounwind uwtable ssp {
120 entry:
121 ; ARM: t11
122   %add.ptr = getelementptr inbounds i16* %a, i64 8
123   store i16 0, i16* %add.ptr, align 2
124 ; ARM strh r{{[1-9]}}, [r0, #16]
125   ret void
126 }
127
128 ; mov r1, #256
129 ; strh r2, [r0, r1]
130 define void @t12(i16* nocapture %a) nounwind uwtable ssp {
131 entry:
132 ; ARM: t12
133   %add.ptr = getelementptr inbounds i16* %a, i64 128
134   store i16 0, i16* %add.ptr, align 2
135 ; ARM: add r0, r0, #256
136 ; ARM: strh r{{[1-9]}}, [r0]
137   ret void
138 }