1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 2 // RUN: %clang_cc1 -emit-llvm -triple powerpc64-unknown-unknown \ 3 // RUN: -std=c++20 %s -o - -debug-info-kind=limited | FileCheck %s 4 // RUN: %clang_cc1 -emit-llvm -triple powerpc64le-unknown-unknown \ 5 // RUN: -std=c++20 %s -o - -debug-info-kind=limited | FileCheck %s 6 7 #include <stdarg.h> 8 9 static __ibm128 sgf; 10 __ibm128 arrgf[10]; 11 __ibm128 func1(__ibm128 arg); 12 13 class CTest { 14 __ibm128 pf; 15 static const __ibm128 scf; 16 volatile __ibm128 vf; 17 18 public: 19 CTest(__ibm128 arg) : pf(arg), vf(arg) {} 20 __ibm128 func2(__ibm128 arg) { 21 return pf + arg; 22 } 23 static __ibm128 func3(__ibm128 arg) { 24 return arg * CTest::scf; 25 } 26 }; 27 28 constexpr __ibm128 func_add(__ibm128 a, __ibm128 b) { 29 return a + b; 30 } 31 32 constinit const __ibm128 ci = func_add(1.0, 2.0); 33 __ibm128 gf = ci; 34 35 __ibm128 func_arith(__ibm128 a, __ibm128 b, __ibm128 c) { 36 __ibm128 v1 = a + b; 37 __ibm128 v2 = a - c; 38 __ibm128 v3 = v1 * c; 39 __ibm128 v4 = v2 / v3; 40 return v4; 41 } 42 43 __ibm128 func_vaarg(int n, ...) { 44 va_list ap; 45 va_start(ap, n); 46 __ibm128 r = va_arg(ap, __ibm128); 47 va_end(ap); 48 return r; 49 } 50 51 template <typename T> struct T1 { 52 T mem1; 53 }; 54 template <> struct T1<__ibm128> { 55 __ibm128 mem2; 56 }; 57 58 template <__ibm128 Q> struct T2 { 59 constexpr static __ibm128 mem = Q; 60 }; 61 62 int main(void) { 63 __ibm128 lf; 64 CTest ct(lf); 65 T1<__ibm128> tf; 66 __ibm128 lfi = tf.mem2 + func1(lf) - CTest::func3(lf); 67 } 68 69 // CHECK: %class.CTest = type { ppc_fp128, ppc_fp128 } 70 // CHECK: %struct.T1 = type { ppc_fp128 } 71 72 // CHECK: @arrgf = global [10 x ppc_fp128] zeroinitializer, align 16 73 // CHECK: @gf = global ppc_fp128 0xM40080000000000000000000000000000, align 16 74 // CHECK: @_ZN5CTest3scfE = external constant ppc_fp128, align 16 75 76 // CHECK: define dso_local ppc_fp128 @_Z10func_arithggg(ppc_fp128 %a, ppc_fp128 %b, ppc_fp128 %c) 77 // CHECK: entry: 78 // CHECK: store ppc_fp128 %a, ppc_fp128* %a.addr, align 16 79 // CHECK: store ppc_fp128 %b, ppc_fp128* %b.addr, align 16 80 // CHECK: store ppc_fp128 %c, ppc_fp128* %c.addr, align 16 81 // CHECK: %0 = load ppc_fp128, ppc_fp128* %a.addr, align 16 82 // CHECK: %1 = load ppc_fp128, ppc_fp128* %b.addr, align 16 83 // CHECK: %add = fadd ppc_fp128 %0, %1 84 // CHECK: store ppc_fp128 %add, ppc_fp128* %v1, align 16 85 // CHECK: %2 = load ppc_fp128, ppc_fp128* %a.addr, align 16 86 // CHECK: %3 = load ppc_fp128, ppc_fp128* %c.addr, align 16 87 // CHECK: %sub = fsub ppc_fp128 %2, %3 88 // CHECK: store ppc_fp128 %sub, ppc_fp128* %v2, align 16 89 // CHECK: %4 = load ppc_fp128, ppc_fp128* %v1, align 16 90 // CHECK: %5 = load ppc_fp128, ppc_fp128* %c.addr, align 16 91 // CHECK: %mul = fmul ppc_fp128 %4, %5 92 // CHECK: store ppc_fp128 %mul, ppc_fp128* %v3, align 16 93 // CHECK: %6 = load ppc_fp128, ppc_fp128* %v2, align 16 94 // CHECK: %7 = load ppc_fp128, ppc_fp128* %v3, align 16 95 // CHECK: %div = fdiv ppc_fp128 %6, %7 96 // CHECK: store ppc_fp128 %div, ppc_fp128* %v4, align 16 97 // CHECK: %8 = load ppc_fp128, ppc_fp128* %v4, align 16 98 // CHECK: ret ppc_fp128 %8 99 // CHECK: } 100 101 // CHECK: define dso_local ppc_fp128 @_Z10func_vaargiz(i32 signext %n, ...) 102 // CHECK: entry: 103 // CHECK: store i32 %n, i32* %n.addr, align 4 104 // CHECK: %ap1 = bitcast i8** %ap to i8* 105 // CHECK: call void @llvm.va_start(i8* %ap1) 106 // CHECK: %argp.cur = load i8*, i8** %ap, align 8 107 // CHECK: %argp.next = getelementptr inbounds i8, i8* %argp.cur, i64 16 108 // CHECK: store i8* %argp.next, i8** %ap, align 8 109 // CHECK: %0 = bitcast i8* %argp.cur to ppc_fp128* 110 // CHECK: %1 = load ppc_fp128, ppc_fp128* %0, align 8 111 // CHECK: store ppc_fp128 %1, ppc_fp128* %r, align 16 112 // CHECK: %ap2 = bitcast i8** %ap to i8* 113 // CHECK: call void @llvm.va_end(i8* %ap2) 114 // CHECK: %2 = load ppc_fp128, ppc_fp128* %r, align 16 115 // CHECK: ret ppc_fp128 %2 116 // CHECK: } 117 118 // CHECK: define dso_local signext i32 @main() 119 // CHECK: entry: 120 // CHECK: %0 = load ppc_fp128, ppc_fp128* %lf, align 16 121 // CHECK: call void @_ZN5CTestC1Eg(%class.CTest* nonnull align 16 dereferenceable(32) %ct, ppc_fp128 %0) 122 // CHECK: %mem2 = getelementptr inbounds %struct.T1, %struct.T1* %tf, i32 0, i32 0 123 // CHECK: %1 = load ppc_fp128, ppc_fp128* %mem2, align 16 124 // CHECK: %2 = load ppc_fp128, ppc_fp128* %lf, align 16 125 // CHECK: %call = call ppc_fp128 @_Z5func1g(ppc_fp128 %2) 126 // CHECK: %add = fadd ppc_fp128 %1, %call 127 // CHECK: %3 = load ppc_fp128, ppc_fp128* %lf, align 16 128 // CHECK: %call1 = call ppc_fp128 @_ZN5CTest5func3Eg(ppc_fp128 %3) 129 // CHECK: %sub = fsub ppc_fp128 %add, %call1 130 // CHECK: store ppc_fp128 %sub, ppc_fp128* %lfi, align 16 131 // CHECK: ret i32 0 132 // CHECK: } 133 134 // CHECK: define linkonce_odr void @_ZN5CTestC1Eg(%class.CTest* nonnull align 16 dereferenceable(32) %this, ppc_fp128 %arg) 135 // CHECK: entry: 136 // CHECK: store %class.CTest* %this, %class.CTest** %this.addr, align 8 137 // CHECK: store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16 138 // CHECK: %this1 = load %class.CTest*, %class.CTest** %this.addr, align 8 139 // CHECK: %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16 140 // CHECK: call void @_ZN5CTestC2Eg(%class.CTest* nonnull align 16 dereferenceable(32) %this1, ppc_fp128 %0) 141 // CHECK: ret void 142 // CHECK: } 143 144 // CHECK: define linkonce_odr ppc_fp128 @_ZN5CTest5func3Eg(ppc_fp128 %arg) 145 // CHECK: entry: 146 // CHECK: %arg.addr = alloca ppc_fp128, align 16 147 // CHECK: store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16 148 // CHECK: %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16 149 // CHECK: %1 = load ppc_fp128, ppc_fp128* @_ZN5CTest3scfE, align 16 150 // CHECK: %mul = fmul ppc_fp128 %0, %1 151 // CHECK: ret ppc_fp128 %mul 152 // CHECK: } 153 154 // CHECK: define linkonce_odr void @_ZN5CTestC2Eg(%class.CTest* nonnull align 16 dereferenceable(32) %this, ppc_fp128 %arg) 155 // CHECK: entry: 156 // CHECK: store %class.CTest* %this, %class.CTest** %this.addr, align 8 157 // CHECK: store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16 158 // CHECK: %this1 = load %class.CTest*, %class.CTest** %this.addr, align 8 159 // CHECK: %pf = getelementptr inbounds %class.CTest, %class.CTest* %this1, i32 0, i32 0 160 // CHECK: %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16 161 // CHECK: store ppc_fp128 %0, ppc_fp128* %pf, align 16 162 // CHECK: %vf = getelementptr inbounds %class.CTest, %class.CTest* %this1, i32 0, i32 1 163 // CHECK: %1 = load ppc_fp128, ppc_fp128* %arg.addr, align 16 164 // CHECK: store volatile ppc_fp128 %1, ppc_fp128* %vf, align 16 165 // CHECK: ret void 166 // CHECK: } 167 168 // CHECK: !6 = distinct !DIGlobalVariable(name: "gf", scope: !2, file: !7, line: {{[0-9]+}}, type: !8, isLocal: false, isDefinition: true) 169 // CHECK: !8 = !DIBasicType(name: "__ibm128", size: 128, encoding: DW_ATE_float) 170