x86_64-arguments.c revision 55a759b8bb52e9d74c92e17543780751c5e5c5ec
1d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar// RUN: clang-cc -triple x86_64-unknown-unknown -emit-llvm -o %t %s &&
2644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar// RUN: grep 'define signext i8 @f0()' %t &&
3644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar// RUN: grep 'define signext i16 @f1()' %t &&
4644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar// RUN: grep 'define i32 @f2()' %t &&
5644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar// RUN: grep 'define float @f3()' %t &&
6644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar// RUN: grep 'define double @f4()' %t &&
7644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar// RUN: grep 'define x86_fp80 @f5()' %t &&
8730f909e146b0ac5dbcf9b8be65cb8f82c68d883Anders Carlsson// RUN: grep 'define void @f6(i8 signext %a0, i16 signext %a1, i32 %a2, i64 %a3, i8\* %a4)' %t &&
9100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar// RUN: grep 'define void @f7(i32 %a0)' %t &&
108d5053c8642db9cdf37d3cf56e712f24b8d57b1fDaniel Dunbar// RUN: grep '.0 = type { i64, double }' %t &&
11100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar// RUN: grep 'define .0 @f8_1()' %t &&
128236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar// RUN: grep 'define void @f8_2(.0)' %t &&
13644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
14644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarchar f0(void) {
15c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
16644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
17644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
18644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarshort f1(void) {
19c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
20644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
21644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
22644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarint f2(void) {
23c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
24644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
25644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
26644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarfloat f3(void) {
27c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
28644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
29644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
30644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbardouble f4(void) {
31c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
32644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
33644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
34644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarlong double f5(void) {
35c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
36644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
37644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
38644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarvoid f6(char a0, short a1, int a2, long long a3, void *a4) {
39644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
40730f909e146b0ac5dbcf9b8be65cb8f82c68d883Anders Carlsson
41730f909e146b0ac5dbcf9b8be65cb8f82c68d883Anders Carlssontypedef enum { A, B, C } E;
42730f909e146b0ac5dbcf9b8be65cb8f82c68d883Anders Carlsson
43730f909e146b0ac5dbcf9b8be65cb8f82c68d883Anders Carlssonvoid f7(E a0) {
444b87142aba52c76ff9ed7c9c2fe0067bd935a2f4Mike Stump}
45100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar
46100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar// Test merging/passing of upper eightbyte with X87 class.
47100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbarunion u8 {
48100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  long double a;
49100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  int b;
50100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar};
51c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpunion u8 f8_1() { while (1) {} }
52100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbarvoid f8_2(union u8 a0) {}
538236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar
548236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar// RUN: grep 'define i64 @f9()' %t &&
55c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpstruct s9 { int a; int b; int : 0; } f9(void) { while (1) {} }
568236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar
578236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar// RUN: grep 'define void @f10(i64)' %t &&
588236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbarstruct s10 { int a; int b; int : 0; };
598236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbarvoid f10(struct s10 a0) {}
608236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar
6120e95c5eb400c864bbd4421624fdf7b25ce70f56Daniel Dunbar// RUN: grep 'define void @f11(.union.anon. noalias sret .agg.result)' %t &&
62c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpunion { long double a; float b; } f11() { while (1) {} }
6320e95c5eb400c864bbd4421624fdf7b25ce70f56Daniel Dunbar
647ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar// RUN: grep 'define i64 @f12_0()' %t &&
657ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar// RUN: grep 'define void @f12_1(i64)' %t &&
667ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbarstruct s12 { int a __attribute__((aligned(16))); };
67c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpstruct s12 f12_0(void) { while (1) {} }
687ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbarvoid f12_1(struct s12 a0) {}
697ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar
703a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar// Check that sret parameter is accounted for when checking available integer
713a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar// registers.
723a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar// RUN: grep 'define void @f13(.struct.s13_0. noalias sret .agg.result, i32 .a, i32 .b, i32 .c, i32 .d, .struct.s13_1. byval .e, i32 .f)' %t &&
733a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar
743a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbarstruct s13_0 { long long f0[3]; };
7555a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarstruct s13_1 { long long f0[2]; };
763a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbarstruct s13_0 f13(int a, int b, int c, int d,
7755a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbar                 struct s13_1 e, int f) { while (1) {} }
783a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar
7986e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar// RUN: grep 'define void @f14(.*, i8 signext .X)' %t &&
8086e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbarvoid f14(int a, int b, int c, int d, int e, int f,
8186e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar         char X) {}
8286e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar// RUN: grep 'define void @f15(.*, i8\* .X)' %t &&
8386e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbarvoid f15(int a, int b, int c, int d, int e, int f,
8486e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar         void *X) {}
8586e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar// RUN: grep 'define void @f16(.*, float .X)' %t &&
8686e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbarvoid f16(float a, float b, float c, float d, float e, float f, float g, float h,
8786e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar         float X) {}
8886e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar// RUN: grep 'define void @f17(.*, x86_fp80 .X)' %t &&
8986e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbarvoid f17(float a, float b, float c, float d, float e, float f, float g, float h,
9086e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar         long double X) {}
9186e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar
92fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar// Check for valid coercion.
9355a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbar// RUN: grep '.. = bitcast i64. .* to .struct.f18_s0.' %t &&
9455a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbar// RUN: grep '.. = load .struct.f18_s0. .., align 1' %t &&
9555a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbar// RUN: grep 'store .struct.f18_s0 .., .struct.f18_s0. .f18_arg1' %t &&
9655a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarstruct f18_s0 { int f0; };
9755a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarvoid f18(int a, struct f18_s0 f18_arg1) { while (1) {} }
98fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar
998236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar// RUN: true
100