summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2014-05-02 14:54:15 +0000
committerTim Northover <tnorthover@apple.com>2014-05-02 14:54:15 +0000
commit6f86e23c1a8375cd47b586efc001330720d24f79 (patch)
tree7aec56a544c13ea680e7637413bcdf5401edc096 /test
parentbcf15018398f0c9303d66f4dabdfdd9006555170 (diff)
downloadllvm-6f86e23c1a8375cd47b586efc001330720d24f79.tar.gz
llvm-6f86e23c1a8375cd47b586efc001330720d24f79.tar.bz2
llvm-6f86e23c1a8375cd47b586efc001330720d24f79.tar.xz
AArch64/ARM64: support indexed loads/stores on vector types.
While post-indexed LD1/ST1 instructions do exist for vector loads, this patch makes use of the more flexible addressing-modes in LDR/STR instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207838 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/CodeGen/ARM64/indexed-vector-ldst.ll402
1 files changed, 402 insertions, 0 deletions
diff --git a/test/CodeGen/ARM64/indexed-vector-ldst.ll b/test/CodeGen/ARM64/indexed-vector-ldst.ll
new file mode 100644
index 0000000000..1f510b07a1
--- /dev/null
+++ b/test/CodeGen/ARM64/indexed-vector-ldst.ll
@@ -0,0 +1,402 @@
+; RUN: llc -mtriple=arm64-apple-ios7.0 -o - %s | FileCheck %s
+
+@ptr = global i8* null
+
+define <8 x i8> @test_v8i8_pre_load(<8 x i8>* %addr) {
+; CHECK-LABEL: test_v8i8_pre_load:
+; CHECK: ldr d0, [x0, #40]!
+ %newaddr = getelementptr <8 x i8>* %addr, i32 5
+ %val = load <8 x i8>* %newaddr, align 8
+ store <8 x i8>* %newaddr, <8 x i8>** bitcast(i8** @ptr to <8 x i8>**)
+ ret <8 x i8> %val
+}
+
+define <8 x i8> @test_v8i8_post_load(<8 x i8>* %addr) {
+; CHECK-LABEL: test_v8i8_post_load:
+; CHECK: ldr d0, [x0], #40
+ %newaddr = getelementptr <8 x i8>* %addr, i32 5
+ %val = load <8 x i8>* %addr, align 8
+ store <8 x i8>* %newaddr, <8 x i8>** bitcast(i8** @ptr to <8 x i8>**)
+ ret <8 x i8> %val
+}
+
+define void @test_v8i8_pre_store(<8 x i8> %in, <8 x i8>* %addr) {
+; CHECK-LABEL: test_v8i8_pre_store:
+; CHECK: str d0, [x0, #40]!
+ %newaddr = getelementptr <8 x i8>* %addr, i32 5
+ store <8 x i8> %in, <8 x i8>* %newaddr, align 8
+ store <8 x i8>* %newaddr, <8 x i8>** bitcast(i8** @ptr to <8 x i8>**)
+ ret void
+}
+
+define void @test_v8i8_post_store(<8 x i8> %in, <8 x i8>* %addr) {
+; CHECK-LABEL: test_v8i8_post_store:
+; CHECK: str d0, [x0], #40
+ %newaddr = getelementptr <8 x i8>* %addr, i32 5
+ store <8 x i8> %in, <8 x i8>* %addr, align 8
+ store <8 x i8>* %newaddr, <8 x i8>** bitcast(i8** @ptr to <8 x i8>**)
+ ret void
+}
+
+define <4 x i16> @test_v4i16_pre_load(<4 x i16>* %addr) {
+; CHECK-LABEL: test_v4i16_pre_load:
+; CHECK: ldr d0, [x0, #40]!
+ %newaddr = getelementptr <4 x i16>* %addr, i32 5
+ %val = load <4 x i16>* %newaddr, align 8
+ store <4 x i16>* %newaddr, <4 x i16>** bitcast(i8** @ptr to <4 x i16>**)
+ ret <4 x i16> %val
+}
+
+define <4 x i16> @test_v4i16_post_load(<4 x i16>* %addr) {
+; CHECK-LABEL: test_v4i16_post_load:
+; CHECK: ldr d0, [x0], #40
+ %newaddr = getelementptr <4 x i16>* %addr, i32 5
+ %val = load <4 x i16>* %addr, align 8
+ store <4 x i16>* %newaddr, <4 x i16>** bitcast(i8** @ptr to <4 x i16>**)
+ ret <4 x i16> %val
+}
+
+define void @test_v4i16_pre_store(<4 x i16> %in, <4 x i16>* %addr) {
+; CHECK-LABEL: test_v4i16_pre_store:
+; CHECK: str d0, [x0, #40]!
+ %newaddr = getelementptr <4 x i16>* %addr, i32 5
+ store <4 x i16> %in, <4 x i16>* %newaddr, align 8
+ store <4 x i16>* %newaddr, <4 x i16>** bitcast(i8** @ptr to <4 x i16>**)
+ ret void
+}
+
+define void @test_v4i16_post_store(<4 x i16> %in, <4 x i16>* %addr) {
+; CHECK-LABEL: test_v4i16_post_store:
+; CHECK: str d0, [x0], #40
+ %newaddr = getelementptr <4 x i16>* %addr, i32 5
+ store <4 x i16> %in, <4 x i16>* %addr, align 8
+ store <4 x i16>* %newaddr, <4 x i16>** bitcast(i8** @ptr to <4 x i16>**)
+ ret void
+}
+
+define <2 x i32> @test_v2i32_pre_load(<2 x i32>* %addr) {
+; CHECK-LABEL: test_v2i32_pre_load:
+; CHECK: ldr d0, [x0, #40]!
+ %newaddr = getelementptr <2 x i32>* %addr, i32 5
+ %val = load <2 x i32>* %newaddr, align 8
+ store <2 x i32>* %newaddr, <2 x i32>** bitcast(i8** @ptr to <2 x i32>**)
+ ret <2 x i32> %val
+}
+
+define <2 x i32> @test_v2i32_post_load(<2 x i32>* %addr) {
+; CHECK-LABEL: test_v2i32_post_load:
+; CHECK: ldr d0, [x0], #40
+ %newaddr = getelementptr <2 x i32>* %addr, i32 5
+ %val = load <2 x i32>* %addr, align 8
+ store <2 x i32>* %newaddr, <2 x i32>** bitcast(i8** @ptr to <2 x i32>**)
+ ret <2 x i32> %val
+}
+
+define void @test_v2i32_pre_store(<2 x i32> %in, <2 x i32>* %addr) {
+; CHECK-LABEL: test_v2i32_pre_store:
+; CHECK: str d0, [x0, #40]!
+ %newaddr = getelementptr <2 x i32>* %addr, i32 5
+ store <2 x i32> %in, <2 x i32>* %newaddr, align 8
+ store <2 x i32>* %newaddr, <2 x i32>** bitcast(i8** @ptr to <2 x i32>**)
+ ret void
+}
+
+define void @test_v2i32_post_store(<2 x i32> %in, <2 x i32>* %addr) {
+; CHECK-LABEL: test_v2i32_post_store:
+; CHECK: str d0, [x0], #40
+ %newaddr = getelementptr <2 x i32>* %addr, i32 5
+ store <2 x i32> %in, <2 x i32>* %addr, align 8
+ store <2 x i32>* %newaddr, <2 x i32>** bitcast(i8** @ptr to <2 x i32>**)
+ ret void
+}
+
+define <2 x float> @test_v2f32_pre_load(<2 x float>* %addr) {
+; CHECK-LABEL: test_v2f32_pre_load:
+; CHECK: ldr d0, [x0, #40]!
+ %newaddr = getelementptr <2 x float>* %addr, i32 5
+ %val = load <2 x float>* %newaddr, align 8
+ store <2 x float>* %newaddr, <2 x float>** bitcast(i8** @ptr to <2 x float>**)
+ ret <2 x float> %val
+}
+
+define <2 x float> @test_v2f32_post_load(<2 x float>* %addr) {
+; CHECK-LABEL: test_v2f32_post_load:
+; CHECK: ldr d0, [x0], #40
+ %newaddr = getelementptr <2 x float>* %addr, i32 5
+ %val = load <2 x float>* %addr, align 8
+ store <2 x float>* %newaddr, <2 x float>** bitcast(i8** @ptr to <2 x float>**)
+ ret <2 x float> %val
+}
+
+define void @test_v2f32_pre_store(<2 x float> %in, <2 x float>* %addr) {
+; CHECK-LABEL: test_v2f32_pre_store:
+; CHECK: str d0, [x0, #40]!
+ %newaddr = getelementptr <2 x float>* %addr, i32 5
+ store <2 x float> %in, <2 x float>* %newaddr, align 8
+ store <2 x float>* %newaddr, <2 x float>** bitcast(i8** @ptr to <2 x float>**)
+ ret void
+}
+
+define void @test_v2f32_post_store(<2 x float> %in, <2 x float>* %addr) {
+; CHECK-LABEL: test_v2f32_post_store:
+; CHECK: str d0, [x0], #40
+ %newaddr = getelementptr <2 x float>* %addr, i32 5
+ store <2 x float> %in, <2 x float>* %addr, align 8
+ store <2 x float>* %newaddr, <2 x float>** bitcast(i8** @ptr to <2 x float>**)
+ ret void
+}
+
+define <1 x i64> @test_v1i64_pre_load(<1 x i64>* %addr) {
+; CHECK-LABEL: test_v1i64_pre_load:
+; CHECK: ldr d0, [x0, #40]!
+ %newaddr = getelementptr <1 x i64>* %addr, i32 5
+ %val = load <1 x i64>* %newaddr, align 8
+ store <1 x i64>* %newaddr, <1 x i64>** bitcast(i8** @ptr to <1 x i64>**)
+ ret <1 x i64> %val
+}
+
+define <1 x i64> @test_v1i64_post_load(<1 x i64>* %addr) {
+; CHECK-LABEL: test_v1i64_post_load:
+; CHECK: ldr d0, [x0], #40
+ %newaddr = getelementptr <1 x i64>* %addr, i32 5
+ %val = load <1 x i64>* %addr, align 8
+ store <1 x i64>* %newaddr, <1 x i64>** bitcast(i8** @ptr to <1 x i64>**)
+ ret <1 x i64> %val
+}
+
+define void @test_v1i64_pre_store(<1 x i64> %in, <1 x i64>* %addr) {
+; CHECK-LABEL: test_v1i64_pre_store:
+; CHECK: str d0, [x0, #40]!
+ %newaddr = getelementptr <1 x i64>* %addr, i32 5
+ store <1 x i64> %in, <1 x i64>* %newaddr, align 8
+ store <1 x i64>* %newaddr, <1 x i64>** bitcast(i8** @ptr to <1 x i64>**)
+ ret void
+}
+
+define void @test_v1i64_post_store(<1 x i64> %in, <1 x i64>* %addr) {
+; CHECK-LABEL: test_v1i64_post_store:
+; CHECK: str d0, [x0], #40
+ %newaddr = getelementptr <1 x i64>* %addr, i32 5
+ store <1 x i64> %in, <1 x i64>* %addr, align 8
+ store <1 x i64>* %newaddr, <1 x i64>** bitcast(i8** @ptr to <1 x i64>**)
+ ret void
+}
+
+define <16 x i8> @test_v16i8_pre_load(<16 x i8>* %addr) {
+; CHECK-LABEL: test_v16i8_pre_load:
+; CHECK: ldr q0, [x0, #80]!
+ %newaddr = getelementptr <16 x i8>* %addr, i32 5
+ %val = load <16 x i8>* %newaddr, align 8
+ store <16 x i8>* %newaddr, <16 x i8>** bitcast(i8** @ptr to <16 x i8>**)
+ ret <16 x i8> %val
+}
+
+define <16 x i8> @test_v16i8_post_load(<16 x i8>* %addr) {
+; CHECK-LABEL: test_v16i8_post_load:
+; CHECK: ldr q0, [x0], #80
+ %newaddr = getelementptr <16 x i8>* %addr, i32 5
+ %val = load <16 x i8>* %addr, align 8
+ store <16 x i8>* %newaddr, <16 x i8>** bitcast(i8** @ptr to <16 x i8>**)
+ ret <16 x i8> %val
+}
+
+define void @test_v16i8_pre_store(<16 x i8> %in, <16 x i8>* %addr) {
+; CHECK-LABEL: test_v16i8_pre_store:
+; CHECK: str q0, [x0, #80]!
+ %newaddr = getelementptr <16 x i8>* %addr, i32 5
+ store <16 x i8> %in, <16 x i8>* %newaddr, align 8
+ store <16 x i8>* %newaddr, <16 x i8>** bitcast(i8** @ptr to <16 x i8>**)
+ ret void
+}
+
+define void @test_v16i8_post_store(<16 x i8> %in, <16 x i8>* %addr) {
+; CHECK-LABEL: test_v16i8_post_store:
+; CHECK: str q0, [x0], #80
+ %newaddr = getelementptr <16 x i8>* %addr, i32 5
+ store <16 x i8> %in, <16 x i8>* %addr, align 8
+ store <16 x i8>* %newaddr, <16 x i8>** bitcast(i8** @ptr to <16 x i8>**)
+ ret void
+}
+
+define <8 x i16> @test_v8i16_pre_load(<8 x i16>* %addr) {
+; CHECK-LABEL: test_v8i16_pre_load:
+; CHECK: ldr q0, [x0, #80]!
+ %newaddr = getelementptr <8 x i16>* %addr, i32 5
+ %val = load <8 x i16>* %newaddr, align 8
+ store <8 x i16>* %newaddr, <8 x i16>** bitcast(i8** @ptr to <8 x i16>**)
+ ret <8 x i16> %val
+}
+
+define <8 x i16> @test_v8i16_post_load(<8 x i16>* %addr) {
+; CHECK-LABEL: test_v8i16_post_load:
+; CHECK: ldr q0, [x0], #80
+ %newaddr = getelementptr <8 x i16>* %addr, i32 5
+ %val = load <8 x i16>* %addr, align 8
+ store <8 x i16>* %newaddr, <8 x i16>** bitcast(i8** @ptr to <8 x i16>**)
+ ret <8 x i16> %val
+}
+
+define void @test_v8i16_pre_store(<8 x i16> %in, <8 x i16>* %addr) {
+; CHECK-LABEL: test_v8i16_pre_store:
+; CHECK: str q0, [x0, #80]!
+ %newaddr = getelementptr <8 x i16>* %addr, i32 5
+ store <8 x i16> %in, <8 x i16>* %newaddr, align 8
+ store <8 x i16>* %newaddr, <8 x i16>** bitcast(i8** @ptr to <8 x i16>**)
+ ret void
+}
+
+define void @test_v8i16_post_store(<8 x i16> %in, <8 x i16>* %addr) {
+; CHECK-LABEL: test_v8i16_post_store:
+; CHECK: str q0, [x0], #80
+ %newaddr = getelementptr <8 x i16>* %addr, i32 5
+ store <8 x i16> %in, <8 x i16>* %addr, align 8
+ store <8 x i16>* %newaddr, <8 x i16>** bitcast(i8** @ptr to <8 x i16>**)
+ ret void
+}
+
+define <4 x i32> @test_v4i32_pre_load(<4 x i32>* %addr) {
+; CHECK-LABEL: test_v4i32_pre_load:
+; CHECK: ldr q0, [x0, #80]!
+ %newaddr = getelementptr <4 x i32>* %addr, i32 5
+ %val = load <4 x i32>* %newaddr, align 8
+ store <4 x i32>* %newaddr, <4 x i32>** bitcast(i8** @ptr to <4 x i32>**)
+ ret <4 x i32> %val
+}
+
+define <4 x i32> @test_v4i32_post_load(<4 x i32>* %addr) {
+; CHECK-LABEL: test_v4i32_post_load:
+; CHECK: ldr q0, [x0], #80
+ %newaddr = getelementptr <4 x i32>* %addr, i32 5
+ %val = load <4 x i32>* %addr, align 8
+ store <4 x i32>* %newaddr, <4 x i32>** bitcast(i8** @ptr to <4 x i32>**)
+ ret <4 x i32> %val
+}
+
+define void @test_v4i32_pre_store(<4 x i32> %in, <4 x i32>* %addr) {
+; CHECK-LABEL: test_v4i32_pre_store:
+; CHECK: str q0, [x0, #80]!
+ %newaddr = getelementptr <4 x i32>* %addr, i32 5
+ store <4 x i32> %in, <4 x i32>* %newaddr, align 8
+ store <4 x i32>* %newaddr, <4 x i32>** bitcast(i8** @ptr to <4 x i32>**)
+ ret void
+}
+
+define void @test_v4i32_post_store(<4 x i32> %in, <4 x i32>* %addr) {
+; CHECK-LABEL: test_v4i32_post_store:
+; CHECK: str q0, [x0], #80
+ %newaddr = getelementptr <4 x i32>* %addr, i32 5
+ store <4 x i32> %in, <4 x i32>* %addr, align 8
+ store <4 x i32>* %newaddr, <4 x i32>** bitcast(i8** @ptr to <4 x i32>**)
+ ret void
+}
+
+
+define <4 x float> @test_v4f32_pre_load(<4 x float>* %addr) {
+; CHECK-LABEL: test_v4f32_pre_load:
+; CHECK: ldr q0, [x0, #80]!
+ %newaddr = getelementptr <4 x float>* %addr, i32 5
+ %val = load <4 x float>* %newaddr, align 8
+ store <4 x float>* %newaddr, <4 x float>** bitcast(i8** @ptr to <4 x float>**)
+ ret <4 x float> %val
+}
+
+define <4 x float> @test_v4f32_post_load(<4 x float>* %addr) {
+; CHECK-LABEL: test_v4f32_post_load:
+; CHECK: ldr q0, [x0], #80
+ %newaddr = getelementptr <4 x float>* %addr, i32 5
+ %val = load <4 x float>* %addr, align 8
+ store <4 x float>* %newaddr, <4 x float>** bitcast(i8** @ptr to <4 x float>**)
+ ret <4 x float> %val
+}
+
+define void @test_v4f32_pre_store(<4 x float> %in, <4 x float>* %addr) {
+; CHECK-LABEL: test_v4f32_pre_store:
+; CHECK: str q0, [x0, #80]!
+ %newaddr = getelementptr <4 x float>* %addr, i32 5
+ store <4 x float> %in, <4 x float>* %newaddr, align 8
+ store <4 x float>* %newaddr, <4 x float>** bitcast(i8** @ptr to <4 x float>**)
+ ret void
+}
+
+define void @test_v4f32_post_store(<4 x float> %in, <4 x float>* %addr) {
+; CHECK-LABEL: test_v4f32_post_store:
+; CHECK: str q0, [x0], #80
+ %newaddr = getelementptr <4 x float>* %addr, i32 5
+ store <4 x float> %in, <4 x float>* %addr, align 8
+ store <4 x float>* %newaddr, <4 x float>** bitcast(i8** @ptr to <4 x float>**)
+ ret void
+}
+
+
+define <2 x i64> @test_v2i64_pre_load(<2 x i64>* %addr) {
+; CHECK-LABEL: test_v2i64_pre_load:
+; CHECK: ldr q0, [x0, #80]!
+ %newaddr = getelementptr <2 x i64>* %addr, i32 5
+ %val = load <2 x i64>* %newaddr, align 8
+ store <2 x i64>* %newaddr, <2 x i64>** bitcast(i8** @ptr to <2 x i64>**)
+ ret <2 x i64> %val
+}
+
+define <2 x i64> @test_v2i64_post_load(<2 x i64>* %addr) {
+; CHECK-LABEL: test_v2i64_post_load:
+; CHECK: ldr q0, [x0], #80
+ %newaddr = getelementptr <2 x i64>* %addr, i32 5
+ %val = load <2 x i64>* %addr, align 8
+ store <2 x i64>* %newaddr, <2 x i64>** bitcast(i8** @ptr to <2 x i64>**)
+ ret <2 x i64> %val
+}
+
+define void @test_v2i64_pre_store(<2 x i64> %in, <2 x i64>* %addr) {
+; CHECK-LABEL: test_v2i64_pre_store:
+; CHECK: str q0, [x0, #80]!
+ %newaddr = getelementptr <2 x i64>* %addr, i32 5
+ store <2 x i64> %in, <2 x i64>* %newaddr, align 8
+ store <2 x i64>* %newaddr, <2 x i64>** bitcast(i8** @ptr to <2 x i64>**)
+ ret void
+}
+
+define void @test_v2i64_post_store(<2 x i64> %in, <2 x i64>* %addr) {
+; CHECK-LABEL: test_v2i64_post_store:
+; CHECK: str q0, [x0], #80
+ %newaddr = getelementptr <2 x i64>* %addr, i32 5
+ store <2 x i64> %in, <2 x i64>* %addr, align 8
+ store <2 x i64>* %newaddr, <2 x i64>** bitcast(i8** @ptr to <2 x i64>**)
+ ret void
+}
+
+
+define <2 x double> @test_v2f64_pre_load(<2 x double>* %addr) {
+; CHECK-LABEL: test_v2f64_pre_load:
+; CHECK: ldr q0, [x0, #80]!
+ %newaddr = getelementptr <2 x double>* %addr, i32 5
+ %val = load <2 x double>* %newaddr, align 8
+ store <2 x double>* %newaddr, <2 x double>** bitcast(i8** @ptr to <2 x double>**)
+ ret <2 x double> %val
+}
+
+define <2 x double> @test_v2f64_post_load(<2 x double>* %addr) {
+; CHECK-LABEL: test_v2f64_post_load:
+; CHECK: ldr q0, [x0], #80
+ %newaddr = getelementptr <2 x double>* %addr, i32 5
+ %val = load <2 x double>* %addr, align 8
+ store <2 x double>* %newaddr, <2 x double>** bitcast(i8** @ptr to <2 x double>**)
+ ret <2 x double> %val
+}
+
+define void @test_v2f64_pre_store(<2 x double> %in, <2 x double>* %addr) {
+; CHECK-LABEL: test_v2f64_pre_store:
+; CHECK: str q0, [x0, #80]!
+ %newaddr = getelementptr <2 x double>* %addr, i32 5
+ store <2 x double> %in, <2 x double>* %newaddr, align 8
+ store <2 x double>* %newaddr, <2 x double>** bitcast(i8** @ptr to <2 x double>**)
+ ret void
+}
+
+define void @test_v2f64_post_store(<2 x double> %in, <2 x double>* %addr) {
+; CHECK-LABEL: test_v2f64_post_store:
+; CHECK: str q0, [x0], #80
+ %newaddr = getelementptr <2 x double>* %addr, i32 5
+ store <2 x double> %in, <2 x double>* %addr, align 8
+ store <2 x double>* %newaddr, <2 x double>** bitcast(i8** @ptr to <2 x double>**)
+ ret void
+}