summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen/arm-be-result-return.c
diff options
context:
space:
mode:
authorChristian Pirker <cpirker@a-bix.com>2014-07-03 09:28:12 +0000
committerChristian Pirker <cpirker@a-bix.com>2014-07-03 09:28:12 +0000
commitc3d3217525d531afe3c08eca12b77144d01786b8 (patch)
tree4f43e2f4094dd84ebe06521d80f17edd54bc36c5 /clang/test/CodeGen/arm-be-result-return.c
parent6b3544eb1d109dfc5d24a3a77f5496c4a6edd341 (diff)
downloadbcm5719-llvm-c3d3217525d531afe3c08eca12b77144d01786b8.tar.gz
bcm5719-llvm-c3d3217525d531afe3c08eca12b77144d01786b8.zip
ARMEB: Fix function result return for composite types
Reviewed at http://reviews.llvm.org/D4364 llvm-svn: 212261
Diffstat (limited to 'clang/test/CodeGen/arm-be-result-return.c')
-rw-r--r--clang/test/CodeGen/arm-be-result-return.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/clang/test/CodeGen/arm-be-result-return.c b/clang/test/CodeGen/arm-be-result-return.c
new file mode 100644
index 00000000000..aadc4e18845
--- /dev/null
+++ b/clang/test/CodeGen/arm-be-result-return.c
@@ -0,0 +1,37 @@
+// RUN: %clang_cc1 -triple armebv7-arm-none-eabi -emit-llvm -w -o - %s | FileCheck %s
+
+// this tests for AAPCS section 5.4:
+// A Composite Type not larger than 4 bytes is returned in r0.
+// The format is as if the result had been stored in memory at a
+// word-aligned address and then loaded into r0 with an LDR instruction
+
+extern union Us { short s; } us;
+union Us callee_us() { return us; }
+// CHECK-LABEL: callee_us()
+// CHECK: zext i16
+// CHECK: shl
+// CHECK: ret i32
+
+void caller_us() {
+ us = callee_us();
+// CHECK-LABEL: caller_us()
+// CHECK: call i32
+// CHECK: lshr i32
+// CHECK: trunc i32
+}
+
+extern struct Ss { short s; } ss;
+struct Ss callee_ss() { return ss; }
+// CHECK-LABEL: callee_ss()
+// CHECK: zext i16
+// CHECK: shl
+// CHECK: ret i32
+
+void caller_ss() {
+ ss = callee_ss();
+// CHECK-LABEL: caller_ss()
+// CHECK: call i32
+// CHECK: lshr i32
+// CHECK: trunc i32
+}
+
OpenPOWER on IntegriCloud