Clang Project

clang_source_code/test/CodeGen/arm-be-result-return.c
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
8extern union Us { short s; } us;
9union Us callee_us() { return us; }
10// CHECK-LABEL: callee_us()
11// CHECK: zext i16
12// CHECK: shl 
13// CHECK: ret i32
14
15void 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
23extern struct Ss { short s; } ss;
24struct Ss callee_ss() { return ss; }
25// CHECK-LABEL: callee_ss()
26// CHECK: zext i16
27// CHECK: shl 
28// CHECK: ret i32
29
30void 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