| // 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 |
| } |
| |