File: ibm128-declarations.cpp

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (178 lines) | stat: -rw-r--r-- 7,309 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
// 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: !6 = distinct !DIGlobalVariable(name: "gf", scope: !2, file: !7, line: {{[0-9]+}}, type: !8, isLocal: false, isDefinition: true)
// CHECK: !8 = !DIBasicType(name: "__ibm128", size: 128, encoding: DW_ATE_float)