brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.1 KiB · 064a85d Raw
508 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s3 4// CHECK-LABEL: @add1(5// CHECK-NEXT:  entry:6// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 27// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca half, align 28// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 29// CHECK-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 210// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 211// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float12// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 213// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float14// CHECK-NEXT:    [[ADD:%.*]] = fadd float [[EXT]], [[EXT1]]15// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD]] to half16// CHECK-NEXT:    ret half [[UNPROMOTION]]17//18_Float16 add1(_Float16 a, _Float16 b) {19  return a + b;20}21 22// CHECK-LABEL: @add2(23// CHECK-NEXT:  entry:24// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 225// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca half, align 226// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 227// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 228// CHECK-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 229// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 230// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 231// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float32// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 233// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float34// CHECK-NEXT:    [[ADD:%.*]] = fadd float [[EXT]], [[EXT1]]35// CHECK-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 236// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[TMP2]] to float37// CHECK-NEXT:    [[ADD3:%.*]] = fadd float [[ADD]], [[EXT2]]38// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD3]] to half39// CHECK-NEXT:    ret half [[UNPROMOTION]]40//41_Float16 add2(_Float16 a, _Float16 b, _Float16 c) {42  return a + b + c;43}44 45// CHECK-LABEL: @div(46// CHECK-NEXT:  entry:47// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 248// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca half, align 249// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 250// CHECK-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 251// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 252// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float53// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 254// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float55// CHECK-NEXT:    [[DIV:%.*]] = fdiv float [[EXT]], [[EXT1]]56// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[DIV]] to half57// CHECK-NEXT:    ret half [[UNPROMOTION]]58//59_Float16 div(_Float16 a, _Float16 b) {60  return a / b;61}62 63// CHECK-LABEL: @mul(64// CHECK-NEXT:  entry:65// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 266// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca half, align 267// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 268// CHECK-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 269// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 270// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float71// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 272// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float73// CHECK-NEXT:    [[MUL:%.*]] = fmul float [[EXT]], [[EXT1]]74// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[MUL]] to half75// CHECK-NEXT:    ret half [[UNPROMOTION]]76//77_Float16 mul(_Float16 a, _Float16 b) {78  return a * b;79}80 81// CHECK-LABEL: @add_and_mul1(82// CHECK-NEXT:  entry:83// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 284// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca half, align 285// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 286// CHECK-NEXT:    [[D_ADDR:%.*]] = alloca half, align 287// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 288// CHECK-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 289// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 290// CHECK-NEXT:    store half [[D:%.*]], ptr [[D_ADDR]], align 291// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 292// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float93// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 294// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float95// CHECK-NEXT:    [[MUL:%.*]] = fmul float [[EXT]], [[EXT1]]96// CHECK-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 297// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[TMP2]] to float98// CHECK-NEXT:    [[TMP3:%.*]] = load half, ptr [[D_ADDR]], align 299// CHECK-NEXT:    [[EXT3:%.*]] = fpext half [[TMP3]] to float100// CHECK-NEXT:    [[MUL4:%.*]] = fmul float [[EXT2]], [[EXT3]]101// CHECK-NEXT:    [[ADD:%.*]] = fadd float [[MUL]], [[MUL4]]102// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD]] to half103// CHECK-NEXT:    ret half [[UNPROMOTION]]104//105_Float16 add_and_mul1(_Float16 a, _Float16 b, _Float16 c, _Float16 d) {106  return a * b + c * d;107}108 109// CHECK-LABEL: @add_and_mul2(110// CHECK-NEXT:  entry:111// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2112// CHECK-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2113// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2114// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2115// CHECK-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2116// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2117// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2118// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float119// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 2120// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float121// CHECK-NEXT:    [[MUL:%.*]] = fmul float 6.000000e+00, [[EXT1]]122// CHECK-NEXT:    [[SUB:%.*]] = fsub float [[EXT]], [[MUL]]123// CHECK-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 2124// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[TMP2]] to float125// CHECK-NEXT:    [[ADD:%.*]] = fadd float [[SUB]], [[EXT2]]126// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD]] to half127// CHECK-NEXT:    ret half [[UNPROMOTION]]128//129_Float16 add_and_mul2(_Float16 a, _Float16 b, _Float16 c) {130  return (a - 6 * b) + c;131}132 133// CHECK-LABEL: @addcompound(134// CHECK-NEXT:  entry:135// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2136// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2137// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2138// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2139// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2140// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float141// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 2142// CHECK-NEXT:    [[CONV:%.*]] = fpext half [[TMP1]] to float143// CHECK-NEXT:    [[ADD:%.*]] = fadd float [[CONV]], [[EXT]]144// CHECK-NEXT:    [[CONV1:%.*]] = fptrunc float [[ADD]] to half145// CHECK-NEXT:    store half [[CONV1]], ptr [[C_ADDR]], align 2146// CHECK-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 2147// CHECK-NEXT:    ret half [[TMP2]]148//149_Float16 addcompound(_Float16 a, _Float16 c) {150  c += a;151  return c;152}153 154// CHECK-LABEL: @mulcompound_int_float16(155// CHECK-NEXT:  entry:156// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4157// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2158// CHECK-NEXT:    store i32 [[A:%.*]], ptr [[A_ADDR]], align 4159// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2160// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[C_ADDR]], align 2161// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float162// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[A_ADDR]], align 4163// CHECK-NEXT:    [[CONV:%.*]] = sitofp i32 [[TMP1]] to float164// CHECK-NEXT:    [[MUL:%.*]] = fmul float [[CONV]], [[EXT]]165// CHECK-NEXT:    [[CONV1:%.*]] = fptosi float [[MUL]] to i32166// CHECK-NEXT:    store i32 [[CONV1]], ptr [[A_ADDR]], align 4167// CHECK-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 2168// CHECK-NEXT:    ret half [[TMP2]]169//170_Float16 mulcompound_int_float16(int a, _Float16 c) {171  a *= c;172  return c;173}174 175// CHECK-LABEL: @mulcompound_float_float16c(176// CHECK-NEXT:  entry:177// CHECK-NEXT:    [[C:%.*]] = alloca { half, half }, align 2178// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca float, align 4179// CHECK-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2180// CHECK-NEXT:    store float [[A:%.*]], ptr [[A_ADDR]], align 4181// CHECK-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0182// CHECK-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2183// CHECK-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1184// CHECK-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2185// CHECK-NEXT:    [[CONV:%.*]] = fpext half [[C_REAL]] to float186// CHECK-NEXT:    [[CONV1:%.*]] = fpext half [[C_IMAG]] to float187// CHECK-NEXT:    [[TMP0:%.*]] = load float, ptr [[A_ADDR]], align 4188// CHECK-NEXT:    [[MUL_RL:%.*]] = fmul float [[TMP0]], [[CONV]]189// CHECK-NEXT:    [[MUL_IR:%.*]] = fmul float [[TMP0]], [[CONV1]]190// CHECK-NEXT:    store float [[MUL_RL]], ptr [[A_ADDR]], align 4191// CHECK-NEXT:    [[C_REALP2:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0192// CHECK-NEXT:    [[C_REAL3:%.*]] = load half, ptr [[C_REALP2]], align 2193// CHECK-NEXT:    ret half [[C_REAL3]]194//195_Float16 mulcompound_float_float16c(float a, _Float16 _Complex c) {196  a *= c;197  return c;198}199 200// CHECK-LABEL: @RealOp(201// CHECK-NEXT:  entry:202// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2203// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2204// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2205// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float206// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half207// CHECK-NEXT:    ret half [[UNPROMOTION]]208//209_Float16 RealOp(_Float16 a) {210  return __real a;211}212 213// CHECK-LABEL: @RealOp_c(214// CHECK-NEXT:  entry:215// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2216// CHECK-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2217// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0218// CHECK-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2219// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float220// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half221// CHECK-NEXT:    ret half [[UNPROMOTION]]222//223_Float16 RealOp_c(_Float16 _Complex a) {224  return __real a;225}226 227// CHECK-LABEL: @ImagOp(228// CHECK-NEXT:  entry:229// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2230// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2231// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2232// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float233// CHECK-NEXT:    ret half 0xH0000234//235_Float16 ImagOp(_Float16 a) {236  return __imag a;237}238 239// CHECK-LABEL: @ImagOp_c(240// CHECK-NEXT:  entry:241// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2242// CHECK-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2243// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1244// CHECK-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2245// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_IMAG]] to float246// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half247// CHECK-NEXT:    ret half [[UNPROMOTION]]248//249_Float16 ImagOp_c(_Float16 _Complex a) {250  return __imag a;251}252 253// CHECK-LABEL: @MinusOp_r(254// CHECK-NEXT:  entry:255// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2256// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2257// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2258// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float259// CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[EXT]]260// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[FNEG]] to half261// CHECK-NEXT:    ret half [[UNPROMOTION]]262//263_Float16 MinusOp_r(_Float16 a) {264  return -a;265}266 267// CHECK-LABEL: @MinusOp_c(268// CHECK-NEXT:  entry:269// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2270// CHECK-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2271// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0272// CHECK-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2273// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1274// CHECK-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2275// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float276// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float277// CHECK-NEXT:    [[NEG_R:%.*]] = fneg float [[EXT]]278// CHECK-NEXT:    [[NEG_I:%.*]] = fneg float [[EXT1]]279// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[NEG_R]] to half280// CHECK-NEXT:    [[UNPROMOTION2:%.*]] = fptrunc float [[NEG_I]] to half281// CHECK-NEXT:    ret half [[UNPROMOTION]]282//283_Float16 MinusOp_c(_Float16 _Complex a) {284  return -a;285}286 287// CHECK-LABEL: @PlusOp_r(288// CHECK-NEXT:  entry:289// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2290// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2291// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2292// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float293// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half294// CHECK-NEXT:    ret half [[UNPROMOTION]]295//296_Float16 PlusOp_r(_Float16 a) {297  return +a;298}299 300// CHECK-LABEL: @PlusOp_c(301// CHECK-NEXT:  entry:302// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2303// CHECK-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2304// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0305// CHECK-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2306// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1307// CHECK-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2308// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float309// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float310// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half311// CHECK-NEXT:    [[UNPROMOTION2:%.*]] = fptrunc float [[EXT1]] to half312// CHECK-NEXT:    ret half [[UNPROMOTION]]313//314_Float16 PlusOp_c(_Float16 _Complex a) {315  return +a;316}317 318// CHECK-LABEL: @MinusOp_r_r(319// CHECK-NEXT:  entry:320// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2321// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2322// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2323// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2324// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2325// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float326// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 2327// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float328// CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[EXT1]]329// CHECK-NEXT:    [[ADD:%.*]] = fadd float [[EXT]], [[FNEG]]330// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD]] to half331// CHECK-NEXT:    ret half [[UNPROMOTION]]332//333_Float16 MinusOp_r_r(_Float16 a, _Float16 c) {334  return a + -c;335}336 337// CHECK-LABEL: @MinusOp_c_r(338// CHECK-NEXT:  entry:339// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2340// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2341// CHECK-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2342// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2343// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0344// CHECK-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2345// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1346// CHECK-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2347// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float348// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float349// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[C_ADDR]], align 2350// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[TMP0]] to float351// CHECK-NEXT:    [[FNEG:%.*]] = fneg float [[EXT2]]352// CHECK-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[FNEG]]353// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R]] to half354// CHECK-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[EXT1]] to half355// CHECK-NEXT:    ret half [[UNPROMOTION]]356//357_Float16 MinusOp_c_r(_Float16 _Complex a, _Float16 c) {358  return a + -c;359}360 361// CHECK-LABEL: @MinusOp_r_c(362// CHECK-NEXT:  entry:363// CHECK-NEXT:    [[C:%.*]] = alloca { half, half }, align 2364// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2365// CHECK-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2366// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2367// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2368// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float369// CHECK-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0370// CHECK-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2371// CHECK-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1372// CHECK-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2373// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[C_REAL]] to float374// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[C_IMAG]] to float375// CHECK-NEXT:    [[NEG_R:%.*]] = fneg float [[EXT1]]376// CHECK-NEXT:    [[NEG_I:%.*]] = fneg float [[EXT2]]377// CHECK-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[NEG_R]]378// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R]] to half379// CHECK-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[NEG_I]] to half380// CHECK-NEXT:    ret half [[UNPROMOTION]]381//382_Float16 MinusOp_r_c(_Float16 a, _Float16 _Complex c) {383  return a + -c;384}385 386// CHECK-LABEL: @MinusOp_c_c(387// CHECK-NEXT:  entry:388// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2389// CHECK-NEXT:    [[C:%.*]] = alloca { half, half }, align 2390// CHECK-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2391// CHECK-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2392// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0393// CHECK-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2394// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1395// CHECK-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2396// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float397// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float398// CHECK-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0399// CHECK-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2400// CHECK-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1401// CHECK-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2402// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[C_REAL]] to float403// CHECK-NEXT:    [[EXT3:%.*]] = fpext half [[C_IMAG]] to float404// CHECK-NEXT:    [[NEG_R:%.*]] = fneg float [[EXT2]]405// CHECK-NEXT:    [[NEG_I:%.*]] = fneg float [[EXT3]]406// CHECK-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[NEG_R]]407// CHECK-NEXT:    [[ADD_I:%.*]] = fadd float [[EXT1]], [[NEG_I]]408// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R]] to half409// CHECK-NEXT:    [[UNPROMOTION4:%.*]] = fptrunc float [[ADD_I]] to half410// CHECK-NEXT:    ret half [[UNPROMOTION]]411//412_Float16 MinusOp_c_c(_Float16 _Complex a, _Float16 _Complex c) {413    return a + -c;414}415 416// CHECK-LABEL: @PlusOp_r_r(417// CHECK-NEXT:  entry:418// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2419// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2420// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2421// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2422// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2423// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float424// CHECK-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 2425// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float426// CHECK-NEXT:    [[SUB:%.*]] = fsub float [[EXT]], [[EXT1]]427// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB]] to half428// CHECK-NEXT:    ret half [[UNPROMOTION]]429//430_Float16 PlusOp_r_r(_Float16 a, _Float16 c) {431  return a - +c;432}433 434// CHECK-LABEL: @PlusOp_c_r(435// CHECK-NEXT:  entry:436// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2437// CHECK-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2438// CHECK-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2439// CHECK-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2440// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0441// CHECK-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2442// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1443// CHECK-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2444// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float445// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float446// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[C_ADDR]], align 2447// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[TMP0]] to float448// CHECK-NEXT:    [[SUB_R:%.*]] = fsub float [[EXT]], [[EXT2]]449// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB_R]] to half450// CHECK-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[EXT1]] to half451// CHECK-NEXT:    ret half [[UNPROMOTION]]452//453_Float16 PlusOp_c_r(_Float16 _Complex a, _Float16 c) {454  return a - +c;455}456 457// CHECK-LABEL: @PlusOp_r_c(458// CHECK-NEXT:  entry:459// CHECK-NEXT:    [[C:%.*]] = alloca { half, half }, align 2460// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2461// CHECK-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2462// CHECK-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2463// CHECK-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2464// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float465// CHECK-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0466// CHECK-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2467// CHECK-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1468// CHECK-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2469// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[C_REAL]] to float470// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[C_IMAG]] to float471// CHECK-NEXT:    [[SUB_R:%.*]] = fsub float [[EXT]], [[EXT1]]472// CHECK-NEXT:    [[SUB_I:%.*]] = fneg float [[EXT2]]473// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB_R]] to half474// CHECK-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[SUB_I]] to half475// CHECK-NEXT:    ret half [[UNPROMOTION]]476//477_Float16 PlusOp_r_c(_Float16 a, _Float16 _Complex c) {478  return a - +c;479}480 481// CHECK-LABEL: @PlusOp_c_c(482// CHECK-NEXT:  entry:483// CHECK-NEXT:    [[A:%.*]] = alloca { half, half }, align 2484// CHECK-NEXT:    [[C:%.*]] = alloca { half, half }, align 2485// CHECK-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2486// CHECK-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2487// CHECK-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0488// CHECK-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2489// CHECK-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1490// CHECK-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2491// CHECK-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float492// CHECK-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float493// CHECK-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0494// CHECK-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2495// CHECK-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1496// CHECK-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2497// CHECK-NEXT:    [[EXT2:%.*]] = fpext half [[C_REAL]] to float498// CHECK-NEXT:    [[EXT3:%.*]] = fpext half [[C_IMAG]] to float499// CHECK-NEXT:    [[SUB_R:%.*]] = fsub float [[EXT]], [[EXT2]]500// CHECK-NEXT:    [[SUB_I:%.*]] = fsub float [[EXT1]], [[EXT3]]501// CHECK-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB_R]] to half502// CHECK-NEXT:    [[UNPROMOTION4:%.*]] = fptrunc float [[SUB_I]] to half503// CHECK-NEXT:    ret half [[UNPROMOTION]]504//505_Float16 PlusOp_c_c(_Float16 _Complex a, _Float16 _Complex c) {506  return a - +c;507}508