forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			38 lines
		
	
	
		
			883 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			883 B
		
	
	
	
		
			C
		
	
	
	
| // 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
 | |
| }
 | |
| 
 |