diff options
Diffstat (limited to 'test/CodeGen/arm-be-result-return.c')
-rw-r--r-- | test/CodeGen/arm-be-result-return.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/test/CodeGen/arm-be-result-return.c b/test/CodeGen/arm-be-result-return.c new file mode 100644 index 0000000..aadc4e18 --- /dev/null +++ b/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 +} + |