143 lines · cpp
1// RUN: %clang -std=c++11 --target=aarch64-none-elf -S -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-AARCH642 3/* Various contexts where type _Float16 can appear. */4 5 6/* Namespace */7 8namespace {9 _Float16 f1n;10// CHECK-DAG: @_ZN12_GLOBAL__N_13f1nE = internal global half 0xH0000, align 211 12 _Float16 f2n = 33.f16;13// CHECK-DAG: @_ZN12_GLOBAL__N_13f2nE = internal global half 0xH5020, align 214 15 _Float16 arr1n[10];16// CHECK-AARCH64-DAG: @_ZN12_GLOBAL__N_15arr1nE = internal global [10 x half] zeroinitializer, align 217 18 _Float16 arr2n[] = { 1.2, 3.0, 3.e4 };19// CHECK-DAG: @_ZN12_GLOBAL__N_15arr2nE = internal global [3 x half] [half 0xH3CCD, half 0xH4200, half 0xH7753], align 220 21 const volatile _Float16 func1n(const _Float16 &arg) {22 return arg + f2n + arr1n[4] - arr2n[1];23 }24}25 26 27/* File */28 29_Float16 f1f;30// CHECK-AARCH64-DAG: @f1f = dso_local global half 0xH0000, align 231 32_Float16 f2f = 32.4;33// CHECK-DAG: @f2f = dso_local global half 0xH500D, align 234 35_Float16 arr1f[10];36// CHECK-AARCH64-DAG: @arr1f = dso_local global [10 x half] zeroinitializer, align 237 38_Float16 arr2f[] = { -1.2, -3.0, -3.e4 };39// CHECK-DAG: @arr2f = dso_local global [3 x half] [half 0xHBCCD, half 0xHC200, half 0xHF753], align 240 41_Float16 func1f(_Float16 arg);42 43 44/* Class */45 46class C1 {47 _Float16 f1c;48 49 static const _Float16 f2c;50// CHECK-DAG: @_ZN2C13f2cE = external dso_local constant half, align 251 52 volatile _Float16 f3c;53 54public:55 C1(_Float16 arg) : f1c(arg), f3c(arg) { }56// Check that we mangle _Float16 to DF16_57// CHECK-DAG: define linkonce_odr dso_local void @_ZN2C1C2EDF16_(ptr{{.*}}, half{{.*}})58 59 _Float16 func1c(_Float16 arg ) {60 return f1c + arg;61 }62// CHECK-DAG: define linkonce_odr dso_local noundef half @_ZN2C16func1cEDF16_(ptr{{.*}}, half{{.*}})63 64 static _Float16 func2c(_Float16 arg) {65 return arg * C1::f2c;66 }67// CHECK-DAG: define linkonce_odr dso_local noundef half @_ZN2C16func2cEDF16_(half{{.*}})68};69 70/* Template */71 72template <class C> C func1t(C arg) {73 return arg * 2.f16;74}75// CHECK-DAG: define linkonce_odr dso_local noundef half @_Z6func1tIDF16_ET_S0_(half{{.*}})76 77template <class C> struct S1 {78 C mem1;79};80 81template <> struct S1<_Float16> {82 _Float16 mem2;83};84 85 86/* Local */87 88extern int printf (const char *__restrict __format, ...);89 90int main(void) {91 _Float16 f1l = 1e3f16;92// CHECK-DAG: store half 0xH63D0, ptr %{{.*}}, align 293 94 _Float16 f2l = -0.f16;95// CHECK-DAG: store half 0xH8000, ptr %{{.*}}, align 296 97 _Float16 f3l = 1.000976562;98// CHECK-DAG: store half 0xH3C01, ptr %{{.*}}, align 299 100 C1 c1(f1l);101// CHECK-DAG: [[F1L:%[a-z0-9]+]] = load half, ptr %{{.*}}, align 2102// CHECK-DAG: call void @_ZN2C1C2EDF16_(ptr {{[^,]*}} %{{.*}}, half noundef %{{.*}})103 104 S1<_Float16> s1 = { 132.f16 };105// CHECK-DAG: @__const.main.s1 = private unnamed_addr constant %struct.S1 { half 0xH5820 }, align 2106// CHECK-DAG: call void @llvm.memcpy.p0.p0.i64(ptr align 2 %{{.*}}, ptr align 2 @__const.main.s1, i64 2, i1 false)107 108 _Float16 f4l = func1n(f1l) + func1f(f2l) + c1.func1c(f3l) + c1.func2c(f1l) +109 func1t(f1l) + s1.mem2 - f1n + f2n;110 111 auto f5l = -1.f16, *f6l = &f2l, f7l = func1t(f3l);112// CHECK-DAG: store half 0xHBC00, ptr %{{.*}}, align 2113// CHECK-DAG: store ptr %{{.*}}, ptr %{{.*}}, align 8114 115 _Float16 f8l = f4l++;116// CHECK-DAG: %{{.*}} = load half, ptr %{{.*}}, align 2117// CHECK-DAG: [[INC:%[a-z0-9]+]] = fadd half {{.*}}, 0xH3C00118// CHECK-DAG: store half [[INC]], ptr %{{.*}}, align 2119 120 _Float16 arr1l[] = { -1.f16, -0.f16, -11.f16 };121// CHECK-DAG: @__const.main.arr1l = private unnamed_addr constant [3 x half] [half 0xHBC00, half 0xH8000, half 0xHC980], align 2122 123 float cvtf = f2n;124//CHECK-DAG: [[H2F:%[a-z0-9]+]] = fpext half {{%[0-9]+}} to float125//CHECK-DAG: store float [[H2F]], ptr %{{.*}}, align 4126 127 double cvtd = f2n;128//CHECK-DAG: [[H2D:%[a-z0-9]+]] = fpext half {{%[0-9]+}} to double129//CHECK-DAG: store double [[H2D]], ptr %{{.*}}, align 8130 131 132 long double cvtld = f2n;133//CHECK-AARCh64-DAG: [[H2LD:%[a-z0-9]+]] = fpext half {{%[0-9]+}} to fp128134//CHECK-AARCh64-DAG: store fp128 [[H2LD]], ptr %{{.*}}, align 16135 136 _Float16 f2h = 42.0f;137//CHECK-DAG: store half 0xH5140, ptr %{{.*}}, align 2138 _Float16 d2h = 42.0;139//CHECK-DAG: store half 0xH5140, ptr %{{.*}}, align 2140 _Float16 ld2h = 42.0l;141//CHECK-DAG:store half 0xH5140, ptr %{{.*}}, align 2142}143