| 1 | // RUN: %clang_cc1 -triple armebv7-arm-none-eabi -emit-llvm -w -o - %s | FileCheck %s |
| 2 | |
| 3 | // this tests for AAPCS section 5.4: |
| 4 | // A Composite Type not larger than 4 bytes is returned in r0. |
| 5 | // The format is as if the result had been stored in memory at a |
| 6 | // word-aligned address and then loaded into r0 with an LDR instruction |
| 7 | |
| 8 | extern union Us { short s; } us; |
| 9 | union Us callee_us() { return us; } |
| 10 | // CHECK-LABEL: callee_us() |
| 11 | // CHECK: zext i16 |
| 12 | // CHECK: shl |
| 13 | // CHECK: ret i32 |
| 14 | |
| 15 | void caller_us() { |
| 16 | us = callee_us(); |
| 17 | // CHECK-LABEL: caller_us() |
| 18 | // CHECK: call i32 |
| 19 | // CHECK: lshr i32 |
| 20 | // CHECK: trunc i32 |
| 21 | } |
| 22 | |
| 23 | extern struct Ss { short s; } ss; |
| 24 | struct Ss callee_ss() { return ss; } |
| 25 | // CHECK-LABEL: callee_ss() |
| 26 | // CHECK: zext i16 |
| 27 | // CHECK: shl |
| 28 | // CHECK: ret i32 |
| 29 | |
| 30 | void caller_ss() { |
| 31 | ss = callee_ss(); |
| 32 | // CHECK-LABEL: caller_ss() |
| 33 | // CHECK: call i32 |
| 34 | // CHECK: lshr i32 |
| 35 | // CHECK: trunc i32 |
| 36 | } |
| 37 | |
| 38 | |