1; RUN: llc < %s -mtriple armv8a--none-eabi -mattr=+fullfp16 | FileCheck %s
2
3define void @load_zero(half* %in, half* %out) {
4entry:
5; CHECK-LABEL: load_zero:
6; CHECK: vldr.16 {{s[0-9]+}}, [r0]
7  %arrayidx = getelementptr inbounds half, half* %in, i32 0
8  %load = load half, half* %arrayidx, align 2
9  store half %load, half* %out
10  ret void
11}
12
13define void @load_255(half* %in, half* %out) {
14entry:
15; CHECK-LABEL: load_255:
16; CHECK: vldr.16 {{s[0-9]+}}, [r0, #510]
17  %arrayidx = getelementptr inbounds half, half* %in, i32 255
18  %load = load half, half* %arrayidx, align 2
19  store half %load, half* %out
20  ret void
21}
22
23define void @load_256(half* %in, half* %out) {
24entry:
25; CHECK-LABEL: load_256:
26; CHECK: add     [[ADDR:r[0-9]+]], r0, #512
27; CHECK: vldr.16 {{s[0-9]+}}, [[[ADDR]]]
28  %arrayidx = getelementptr inbounds half, half* %in, i32 256
29  %load = load half, half* %arrayidx, align 2
30  store half %load, half* %out
31  ret void
32}
33
34define void @load_neg_255(half* %in, half* %out) {
35entry:
36; CHECK-LABEL: load_neg_255:
37; CHECK: vldr.16 {{s[0-9]+}}, [r0, #-510]
38  %arrayidx = getelementptr inbounds half, half* %in, i32 -255
39  %load = load half, half* %arrayidx, align 2
40  store half %load, half* %out
41  ret void
42}
43
44define void @load_neg_256(half* %in, half* %out) {
45entry:
46; CHECK-LABEL: load_neg_256:
47; CHECK: sub     [[ADDR:r[0-9]+]], r0, #512
48; CHECK: vldr.16 {{s[0-9]+}}, [[[ADDR]]]
49  %arrayidx = getelementptr inbounds half, half* %in, i32 -256
50  %load = load half, half* %arrayidx, align 2
51  store half %load, half* %out
52  ret void
53}
54
55define void @store_zero(half* %in, half* %out) {
56entry:
57; CHECK-LABEL: store_zero:
58  %load = load half, half* %in, align 2
59; CHECK: vstr.16 {{s[0-9]+}}, [r1]
60  %arrayidx = getelementptr inbounds half, half* %out, i32 0
61  store half %load, half* %arrayidx
62  ret void
63}
64
65define void @store_255(half* %in, half* %out) {
66entry:
67; CHECK-LABEL: store_255:
68  %load = load half, half* %in, align 2
69; CHECK: vstr.16 {{s[0-9]+}}, [r1, #510]
70  %arrayidx = getelementptr inbounds half, half* %out, i32 255
71  store half %load, half* %arrayidx
72  ret void
73}
74
75define void @store_256(half* %in, half* %out) {
76entry:
77; CHECK-LABEL: store_256:
78  %load = load half, half* %in, align 2
79; CHECK: add     [[ADDR:r[0-9]+]], r1, #512
80; CHECK: vstr.16 {{s[0-9]+}}, [[[ADDR]]]
81  %arrayidx = getelementptr inbounds half, half* %out, i32 256
82  store half %load, half* %arrayidx
83  ret void
84}
85
86define void @store_neg_255(half* %in, half* %out) {
87entry:
88; CHECK-LABEL: store_neg_255:
89  %load = load half, half* %in, align 2
90; CHECK: vstr.16 {{s[0-9]+}}, [r1, #-510]
91  %arrayidx = getelementptr inbounds half, half* %out, i32 -255
92  store half %load, half* %arrayidx
93  ret void
94}
95
96define void @store_neg_256(half* %in, half* %out) {
97entry:
98; CHECK-LABEL: store_neg_256:
99  %load = load half, half* %in, align 2
100; CHECK: sub     [[ADDR:r[0-9]+]], r1, #512
101; CHECK: vstr.16 {{s[0-9]+}}, [[[ADDR]]]
102  %arrayidx = getelementptr inbounds half, half* %out, i32 -256
103  store half %load, half* %arrayidx
104  ret void
105}
106