forked from OSchip/llvm-project
181 lines
7.1 KiB
C++
181 lines
7.1 KiB
C++
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
|
|
// RUN: %clang_cc1 -no-opaque-pointers -emit-llvm -triple powerpc64-unknown-unknown \
|
|
// RUN: -std=c++20 %s -o - -debug-info-kind=limited | FileCheck %s
|
|
// RUN: %clang_cc1 -no-opaque-pointers -emit-llvm -triple powerpc64le-unknown-unknown \
|
|
// RUN: -std=c++20 %s -o - -debug-info-kind=limited | FileCheck %s
|
|
|
|
#include <stdarg.h>
|
|
|
|
static __ibm128 sgf;
|
|
__ibm128 arrgf[10];
|
|
__ibm128 func1(__ibm128 arg);
|
|
|
|
class CTest {
|
|
__ibm128 pf;
|
|
static const __ibm128 scf;
|
|
volatile __ibm128 vf;
|
|
|
|
public:
|
|
CTest(__ibm128 arg) : pf(arg), vf(arg) {}
|
|
__ibm128 func2(__ibm128 arg) {
|
|
return pf + arg;
|
|
}
|
|
static __ibm128 func3(__ibm128 arg) {
|
|
return arg * CTest::scf;
|
|
}
|
|
};
|
|
|
|
constexpr __ibm128 func_add(__ibm128 a, __ibm128 b) {
|
|
return a + b;
|
|
}
|
|
|
|
constinit const __ibm128 ci = func_add(1.0, 2.0);
|
|
__ibm128 gf = ci;
|
|
|
|
__ibm128 func_arith(__ibm128 a, __ibm128 b, __ibm128 c) {
|
|
__ibm128 v1 = a + b;
|
|
__ibm128 v2 = a - c;
|
|
__ibm128 v3 = v1 * c;
|
|
__ibm128 v4 = v2 / v3;
|
|
return v4;
|
|
}
|
|
|
|
__ibm128 func_vaarg(int n, ...) {
|
|
va_list ap;
|
|
va_start(ap, n);
|
|
__ibm128 r = va_arg(ap, __ibm128);
|
|
va_end(ap);
|
|
return r;
|
|
}
|
|
|
|
template <typename T> struct T1 {
|
|
T mem1;
|
|
};
|
|
template <> struct T1<__ibm128> {
|
|
__ibm128 mem2;
|
|
};
|
|
|
|
template <__ibm128 Q> struct T2 {
|
|
constexpr static __ibm128 mem = Q;
|
|
};
|
|
|
|
typedef float w128ibm __attribute__((mode(IF)));
|
|
typedef _Complex float w128ibm_c __attribute__((mode(IC)));
|
|
|
|
w128ibm icmode_self(w128ibm x) { return x; }
|
|
w128ibm_c icmode_self_complex(w128ibm_c x) { return x; }
|
|
|
|
int main(void) {
|
|
__ibm128 lf;
|
|
CTest ct(lf);
|
|
T1<__ibm128> tf;
|
|
__ibm128 lfi = tf.mem2 + func1(lf) - CTest::func3(lf);
|
|
}
|
|
|
|
// CHECK: %class.CTest = type { ppc_fp128, ppc_fp128 }
|
|
// CHECK: %struct.T1 = type { ppc_fp128 }
|
|
|
|
// CHECK: @arrgf = global [10 x ppc_fp128] zeroinitializer, align 16
|
|
// CHECK: @gf = global ppc_fp128 0xM40080000000000000000000000000000, align 16
|
|
// CHECK: @_ZN5CTest3scfE = external constant ppc_fp128, align 16
|
|
|
|
// CHECK: define dso_local noundef ppc_fp128 @_Z10func_arithggg(ppc_fp128 noundef %a, ppc_fp128 noundef %b, ppc_fp128 noundef %c)
|
|
// CHECK: entry:
|
|
// CHECK: store ppc_fp128 %a, ppc_fp128* %a.addr, align 16
|
|
// CHECK: store ppc_fp128 %b, ppc_fp128* %b.addr, align 16
|
|
// CHECK: store ppc_fp128 %c, ppc_fp128* %c.addr, align 16
|
|
// CHECK: %0 = load ppc_fp128, ppc_fp128* %a.addr, align 16
|
|
// CHECK: %1 = load ppc_fp128, ppc_fp128* %b.addr, align 16
|
|
// CHECK: %add = fadd ppc_fp128 %0, %1
|
|
// CHECK: store ppc_fp128 %add, ppc_fp128* %v1, align 16
|
|
// CHECK: %2 = load ppc_fp128, ppc_fp128* %a.addr, align 16
|
|
// CHECK: %3 = load ppc_fp128, ppc_fp128* %c.addr, align 16
|
|
// CHECK: %sub = fsub ppc_fp128 %2, %3
|
|
// CHECK: store ppc_fp128 %sub, ppc_fp128* %v2, align 16
|
|
// CHECK: %4 = load ppc_fp128, ppc_fp128* %v1, align 16
|
|
// CHECK: %5 = load ppc_fp128, ppc_fp128* %c.addr, align 16
|
|
// CHECK: %mul = fmul ppc_fp128 %4, %5
|
|
// CHECK: store ppc_fp128 %mul, ppc_fp128* %v3, align 16
|
|
// CHECK: %6 = load ppc_fp128, ppc_fp128* %v2, align 16
|
|
// CHECK: %7 = load ppc_fp128, ppc_fp128* %v3, align 16
|
|
// CHECK: %div = fdiv ppc_fp128 %6, %7
|
|
// CHECK: store ppc_fp128 %div, ppc_fp128* %v4, align 16
|
|
// CHECK: %8 = load ppc_fp128, ppc_fp128* %v4, align 16
|
|
// CHECK: ret ppc_fp128 %8
|
|
// CHECK: }
|
|
|
|
// CHECK: define dso_local noundef ppc_fp128 @_Z10func_vaargiz(i32 noundef signext %n, ...)
|
|
// CHECK: entry:
|
|
// CHECK: store i32 %n, i32* %n.addr, align 4
|
|
// CHECK: %ap1 = bitcast i8** %ap to i8*
|
|
// CHECK: call void @llvm.va_start(i8* %ap1)
|
|
// CHECK: %argp.cur = load i8*, i8** %ap, align 8
|
|
// CHECK: %argp.next = getelementptr inbounds i8, i8* %argp.cur, i64 16
|
|
// CHECK: store i8* %argp.next, i8** %ap, align 8
|
|
// CHECK: %0 = bitcast i8* %argp.cur to ppc_fp128*
|
|
// CHECK: %1 = load ppc_fp128, ppc_fp128* %0, align 8
|
|
// CHECK: store ppc_fp128 %1, ppc_fp128* %r, align 16
|
|
// CHECK: %ap2 = bitcast i8** %ap to i8*
|
|
// CHECK: call void @llvm.va_end(i8* %ap2)
|
|
// CHECK: %2 = load ppc_fp128, ppc_fp128* %r, align 16
|
|
// CHECK: ret ppc_fp128 %2
|
|
// CHECK: }
|
|
|
|
// CHECK: define dso_local noundef ppc_fp128 @_Z11icmode_selfg(ppc_fp128 noundef %x)
|
|
// CHECK: define dso_local noundef { ppc_fp128, ppc_fp128 } @_Z19icmode_self_complexCg(ppc_fp128 noundef %x.coerce0, ppc_fp128 noundef %x.coerce1)
|
|
|
|
// CHECK: define dso_local noundef signext i32 @main()
|
|
// CHECK: entry:
|
|
// CHECK: %0 = load ppc_fp128, ppc_fp128* %lf, align 16
|
|
// CHECK: call void @_ZN5CTestC1Eg(%class.CTest* noundef nonnull align 16 dereferenceable(32) %ct, ppc_fp128 noundef %0)
|
|
// CHECK: %mem2 = getelementptr inbounds %struct.T1, %struct.T1* %tf, i32 0, i32 0
|
|
// CHECK: %1 = load ppc_fp128, ppc_fp128* %mem2, align 16
|
|
// CHECK: %2 = load ppc_fp128, ppc_fp128* %lf, align 16
|
|
// CHECK: %call = call noundef ppc_fp128 @_Z5func1g(ppc_fp128 noundef %2)
|
|
// CHECK: %add = fadd ppc_fp128 %1, %call
|
|
// CHECK: %3 = load ppc_fp128, ppc_fp128* %lf, align 16
|
|
// CHECK: %call1 = call noundef ppc_fp128 @_ZN5CTest5func3Eg(ppc_fp128 noundef %3)
|
|
// CHECK: %sub = fsub ppc_fp128 %add, %call1
|
|
// CHECK: store ppc_fp128 %sub, ppc_fp128* %lfi, align 16
|
|
// CHECK: ret i32 0
|
|
// CHECK: }
|
|
|
|
// CHECK: define linkonce_odr void @_ZN5CTestC1Eg(%class.CTest* noundef nonnull align 16 dereferenceable(32) %this, ppc_fp128 noundef %arg)
|
|
// CHECK: entry:
|
|
// CHECK: store %class.CTest* %this, %class.CTest** %this.addr, align 8
|
|
// CHECK: store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16
|
|
// CHECK: %this1 = load %class.CTest*, %class.CTest** %this.addr, align 8
|
|
// CHECK: %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16
|
|
// CHECK: call void @_ZN5CTestC2Eg(%class.CTest* noundef nonnull align 16 dereferenceable(32) %this1, ppc_fp128 noundef %0)
|
|
// CHECK: ret void
|
|
// CHECK: }
|
|
|
|
// CHECK: define linkonce_odr noundef ppc_fp128 @_ZN5CTest5func3Eg(ppc_fp128 noundef %arg)
|
|
// CHECK: entry:
|
|
// CHECK: %arg.addr = alloca ppc_fp128, align 16
|
|
// CHECK: store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16
|
|
// CHECK: %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16
|
|
// CHECK: %1 = load ppc_fp128, ppc_fp128* @_ZN5CTest3scfE, align 16
|
|
// CHECK: %mul = fmul ppc_fp128 %0, %1
|
|
// CHECK: ret ppc_fp128 %mul
|
|
// CHECK: }
|
|
|
|
// CHECK: define linkonce_odr void @_ZN5CTestC2Eg(%class.CTest* noundef nonnull align 16 dereferenceable(32) %this, ppc_fp128 noundef %arg)
|
|
// CHECK: entry:
|
|
// CHECK: store %class.CTest* %this, %class.CTest** %this.addr, align 8
|
|
// CHECK: store ppc_fp128 %arg, ppc_fp128* %arg.addr, align 16
|
|
// CHECK: %this1 = load %class.CTest*, %class.CTest** %this.addr, align 8
|
|
// CHECK: %pf = getelementptr inbounds %class.CTest, %class.CTest* %this1, i32 0, i32 0
|
|
// CHECK: %0 = load ppc_fp128, ppc_fp128* %arg.addr, align 16
|
|
// CHECK: store ppc_fp128 %0, ppc_fp128* %pf, align 16
|
|
// CHECK: %vf = getelementptr inbounds %class.CTest, %class.CTest* %this1, i32 0, i32 1
|
|
// CHECK: %1 = load ppc_fp128, ppc_fp128* %arg.addr, align 16
|
|
// CHECK: store volatile ppc_fp128 %1, ppc_fp128* %vf, align 16
|
|
// CHECK: ret void
|
|
// CHECK: }
|
|
|
|
// CHECK: [[GF_TYPE:!.*]] = !DIBasicType(name: "__ibm128", size: 128, encoding: DW_ATE_float)
|
|
// CHECK: = distinct !DIGlobalVariable(name: "gf",
|
|
// CHECK-SAME: type: [[GF_TYPE]],
|
|
// CHECK-SAME: isDefinition: true)
|