brintos

brintos / llvm-project-archived public Read only

0
0
Text · 119.8 KiB · 53d44f3 Raw
1946 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown -target-feature +avx512fp16 -o - | FileCheck %s --check-prefixes=AVX3// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s --check-prefixes=X864 5// AVX-LABEL: @add_half_rr(6// AVX-NEXT:  entry:7// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 28// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 29// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 210// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 211// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 212// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 213// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 214// AVX-NEXT:    [[ADD:%.*]] = fadd half [[TMP0]], [[TMP1]]15// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 016// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 117// AVX-NEXT:    store half [[ADD]], ptr [[RETVAL_REALP]], align 218// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 219// AVX-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 220// AVX-NEXT:    ret <2 x half> [[TMP2]]21//22// X86-LABEL: @add_half_rr(23// X86-NEXT:  entry:24// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 225// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 226// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 227// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 228// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 229// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 230// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float31// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 232// X86-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float33// X86-NEXT:    [[ADD:%.*]] = fadd float [[EXT]], [[EXT1]]34// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD]] to half35// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 036// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 137// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 238// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 239// X86-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 240// X86-NEXT:    ret <2 x half> [[TMP2]]41//42_Float16 _Complex add_half_rr(_Float16 a, _Float16 b) {43  return a + b;44}45 46// AVX-LABEL: @add_half_cr(47// AVX-NEXT:  entry:48// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 249// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 250// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 251// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 252// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 253// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 054// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 255// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 156// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 257// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 258// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[A_REAL]], [[TMP0]]59// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 060// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 161// AVX-NEXT:    store half [[ADD_R]], ptr [[RETVAL_REALP]], align 262// AVX-NEXT:    store half [[A_IMAG]], ptr [[RETVAL_IMAGP]], align 263// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 264// AVX-NEXT:    ret <2 x half> [[TMP1]]65//66// X86-LABEL: @add_half_cr(67// X86-NEXT:  entry:68// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 269// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 270// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 271// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 272// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 273// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 074// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 275// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 176// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 277// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float78// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float79// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 280// X86-NEXT:    [[EXT2:%.*]] = fpext half [[TMP0]] to float81// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT2]]82// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R]] to half83// X86-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[EXT1]] to half84// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 085// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 186// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 287// X86-NEXT:    store half [[UNPROMOTION3]], ptr [[RETVAL_IMAGP]], align 288// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 289// X86-NEXT:    ret <2 x half> [[TMP1]]90//91_Float16 _Complex add_half_cr(_Float16 _Complex a, _Float16 b) {92  return a + b;93}94 95// AVX-LABEL: @add_half_rc(96// AVX-NEXT:  entry:97// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 298// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 299// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2100// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2101// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2102// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2103// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0104// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2105// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1106// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2107// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[TMP0]], [[B_REAL]]108// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0109// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1110// AVX-NEXT:    store half [[ADD_R]], ptr [[RETVAL_REALP]], align 2111// AVX-NEXT:    store half [[B_IMAG]], ptr [[RETVAL_IMAGP]], align 2112// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2113// AVX-NEXT:    ret <2 x half> [[TMP1]]114//115// X86-LABEL: @add_half_rc(116// X86-NEXT:  entry:117// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2118// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2119// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2120// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2121// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2122// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2123// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float124// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0125// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2126// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1127// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2128// X86-NEXT:    [[EXT1:%.*]] = fpext half [[B_REAL]] to float129// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_IMAG]] to float130// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT1]]131// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R]] to half132// X86-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[EXT2]] to half133// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0134// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1135// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2136// X86-NEXT:    store half [[UNPROMOTION3]], ptr [[RETVAL_IMAGP]], align 2137// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2138// X86-NEXT:    ret <2 x half> [[TMP1]]139//140_Float16 _Complex add_half_rc(_Float16 a, _Float16 _Complex b) {141  return a + b;142}143 144// AVX-LABEL: @add_half_cc(145// AVX-NEXT:  entry:146// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2147// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2148// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2149// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2150// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2151// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0152// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2153// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1154// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2155// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0156// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2157// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1158// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2159// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[A_REAL]], [[B_REAL]]160// AVX-NEXT:    [[ADD_I:%.*]] = fadd half [[A_IMAG]], [[B_IMAG]]161// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0162// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1163// AVX-NEXT:    store half [[ADD_R]], ptr [[RETVAL_REALP]], align 2164// AVX-NEXT:    store half [[ADD_I]], ptr [[RETVAL_IMAGP]], align 2165// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2166// AVX-NEXT:    ret <2 x half> [[TMP0]]167//168// X86-LABEL: @add_half_cc(169// X86-NEXT:  entry:170// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2171// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 2172// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2173// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2174// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2175// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0176// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2177// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1178// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2179// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float180// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float181// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0182// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2183// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1184// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2185// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_REAL]] to float186// X86-NEXT:    [[EXT3:%.*]] = fpext half [[B_IMAG]] to float187// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT2]]188// X86-NEXT:    [[ADD_I:%.*]] = fadd float [[EXT1]], [[EXT3]]189// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R]] to half190// X86-NEXT:    [[UNPROMOTION4:%.*]] = fptrunc float [[ADD_I]] to half191// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0192// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1193// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2194// X86-NEXT:    store half [[UNPROMOTION4]], ptr [[RETVAL_IMAGP]], align 2195// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2196// X86-NEXT:    ret <2 x half> [[TMP0]]197//198_Float16 _Complex add_half_cc(_Float16 _Complex a, _Float16 _Complex b) {199  return a + b;200}201 202// AVX-LABEL: @add2_haff_rrr(203// AVX-NEXT:  entry:204// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2205// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2206// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2207// AVX-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2208// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2209// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2210// AVX-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2211// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2212// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 2213// AVX-NEXT:    [[ADD:%.*]] = fadd half [[TMP0]], [[TMP1]]214// AVX-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 2215// AVX-NEXT:    [[ADD1:%.*]] = fadd half [[ADD]], [[TMP2]]216// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0217// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1218// AVX-NEXT:    store half [[ADD1]], ptr [[RETVAL_REALP]], align 2219// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 2220// AVX-NEXT:    [[TMP3:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2221// AVX-NEXT:    ret <2 x half> [[TMP3]]222//223// X86-LABEL: @add2_haff_rrr(224// X86-NEXT:  entry:225// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2226// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2227// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2228// X86-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2229// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2230// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2231// X86-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2232// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2233// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float234// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 2235// X86-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float236// X86-NEXT:    [[ADD:%.*]] = fadd float [[EXT]], [[EXT1]]237// X86-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 2238// X86-NEXT:    [[EXT2:%.*]] = fpext half [[TMP2]] to float239// X86-NEXT:    [[ADD3:%.*]] = fadd float [[ADD]], [[EXT2]]240// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD3]] to half241// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0242// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1243// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2244// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 2245// X86-NEXT:    [[TMP3:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2246// X86-NEXT:    ret <2 x half> [[TMP3]]247//248_Float16 _Complex add2_haff_rrr(_Float16 a, _Float16 b, _Float16 c) {249  return a + b + c;250}251 252// AVX-LABEL: @add2_haff_rcr(253// AVX-NEXT:  entry:254// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2255// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2256// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2257// AVX-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2258// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2259// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2260// AVX-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2261// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2262// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0263// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2264// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1265// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2266// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[TMP0]], [[B_REAL]]267// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 2268// AVX-NEXT:    [[ADD_R1:%.*]] = fadd half [[ADD_R]], [[TMP1]]269// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0270// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1271// AVX-NEXT:    store half [[ADD_R1]], ptr [[RETVAL_REALP]], align 2272// AVX-NEXT:    store half [[B_IMAG]], ptr [[RETVAL_IMAGP]], align 2273// AVX-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2274// AVX-NEXT:    ret <2 x half> [[TMP2]]275//276// X86-LABEL: @add2_haff_rcr(277// X86-NEXT:  entry:278// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2279// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2280// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2281// X86-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2282// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2283// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2284// X86-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2285// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2286// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float287// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0288// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2289// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1290// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2291// X86-NEXT:    [[EXT1:%.*]] = fpext half [[B_REAL]] to float292// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_IMAG]] to float293// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT1]]294// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 2295// X86-NEXT:    [[EXT3:%.*]] = fpext half [[TMP1]] to float296// X86-NEXT:    [[ADD_R4:%.*]] = fadd float [[ADD_R]], [[EXT3]]297// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R4]] to half298// X86-NEXT:    [[UNPROMOTION5:%.*]] = fptrunc float [[EXT2]] to half299// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0300// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1301// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2302// X86-NEXT:    store half [[UNPROMOTION5]], ptr [[RETVAL_IMAGP]], align 2303// X86-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2304// X86-NEXT:    ret <2 x half> [[TMP2]]305//306_Float16 _Complex add2_haff_rcr(_Float16 a, _Float16 _Complex b, _Float16 c) {307  return a + b + c;308}309 310// AVX-LABEL: @add2_haff_rcc(311// AVX-NEXT:  entry:312// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2313// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2314// AVX-NEXT:    [[C:%.*]] = alloca { half, half }, align 2315// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2316// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2317// AVX-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2318// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2319// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2320// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0321// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2322// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1323// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2324// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[TMP0]], [[B_REAL]]325// AVX-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0326// AVX-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2327// AVX-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1328// AVX-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2329// AVX-NEXT:    [[ADD_R1:%.*]] = fadd half [[ADD_R]], [[C_REAL]]330// AVX-NEXT:    [[ADD_I:%.*]] = fadd half [[B_IMAG]], [[C_IMAG]]331// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0332// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1333// AVX-NEXT:    store half [[ADD_R1]], ptr [[RETVAL_REALP]], align 2334// AVX-NEXT:    store half [[ADD_I]], ptr [[RETVAL_IMAGP]], align 2335// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2336// AVX-NEXT:    ret <2 x half> [[TMP1]]337//338// X86-LABEL: @add2_haff_rcc(339// X86-NEXT:  entry:340// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2341// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2342// X86-NEXT:    [[C:%.*]] = alloca { half, half }, align 2343// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2344// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2345// X86-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2346// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2347// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2348// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float349// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0350// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2351// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1352// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2353// X86-NEXT:    [[EXT1:%.*]] = fpext half [[B_REAL]] to float354// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_IMAG]] to float355// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT1]]356// X86-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0357// X86-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2358// X86-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1359// X86-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2360// X86-NEXT:    [[EXT3:%.*]] = fpext half [[C_REAL]] to float361// X86-NEXT:    [[EXT4:%.*]] = fpext half [[C_IMAG]] to float362// X86-NEXT:    [[ADD_R5:%.*]] = fadd float [[ADD_R]], [[EXT3]]363// X86-NEXT:    [[ADD_I:%.*]] = fadd float [[EXT2]], [[EXT4]]364// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R5]] to half365// X86-NEXT:    [[UNPROMOTION6:%.*]] = fptrunc float [[ADD_I]] to half366// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0367// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1368// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2369// X86-NEXT:    store half [[UNPROMOTION6]], ptr [[RETVAL_IMAGP]], align 2370// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2371// X86-NEXT:    ret <2 x half> [[TMP1]]372//373_Float16 _Complex add2_haff_rcc(_Float16 a, _Float16 _Complex b, _Float16 _Complex c) {374  return a + b + c;375}376 377// AVX-LABEL: @add2_haff_crr(378// AVX-NEXT:  entry:379// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2380// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2381// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2382// AVX-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2383// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2384// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2385// AVX-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2386// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0387// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2388// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1389// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2390// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 2391// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[A_REAL]], [[TMP0]]392// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 2393// AVX-NEXT:    [[ADD_R1:%.*]] = fadd half [[ADD_R]], [[TMP1]]394// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0395// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1396// AVX-NEXT:    store half [[ADD_R1]], ptr [[RETVAL_REALP]], align 2397// AVX-NEXT:    store half [[A_IMAG]], ptr [[RETVAL_IMAGP]], align 2398// AVX-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2399// AVX-NEXT:    ret <2 x half> [[TMP2]]400//401// X86-LABEL: @add2_haff_crr(402// X86-NEXT:  entry:403// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2404// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 2405// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2406// X86-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2407// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2408// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2409// X86-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2410// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0411// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2412// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1413// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2414// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float415// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float416// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 2417// X86-NEXT:    [[EXT2:%.*]] = fpext half [[TMP0]] to float418// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT2]]419// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 2420// X86-NEXT:    [[EXT3:%.*]] = fpext half [[TMP1]] to float421// X86-NEXT:    [[ADD_R4:%.*]] = fadd float [[ADD_R]], [[EXT3]]422// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R4]] to half423// X86-NEXT:    [[UNPROMOTION5:%.*]] = fptrunc float [[EXT1]] to half424// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0425// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1426// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2427// X86-NEXT:    store half [[UNPROMOTION5]], ptr [[RETVAL_IMAGP]], align 2428// X86-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2429// X86-NEXT:    ret <2 x half> [[TMP2]]430//431_Float16 _Complex add2_haff_crr(_Float16 _Complex a, _Float16 b, _Float16 c) {432  return a + b + c;433}434 435// AVX-LABEL: @add2_haff_ccr(436// AVX-NEXT:  entry:437// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2438// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2439// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2440// AVX-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2441// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2442// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2443// AVX-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2444// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0445// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2446// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1447// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2448// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0449// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2450// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1451// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2452// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[A_REAL]], [[B_REAL]]453// AVX-NEXT:    [[ADD_I:%.*]] = fadd half [[A_IMAG]], [[B_IMAG]]454// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[C_ADDR]], align 2455// AVX-NEXT:    [[ADD_R1:%.*]] = fadd half [[ADD_R]], [[TMP0]]456// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0457// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1458// AVX-NEXT:    store half [[ADD_R1]], ptr [[RETVAL_REALP]], align 2459// AVX-NEXT:    store half [[ADD_I]], ptr [[RETVAL_IMAGP]], align 2460// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2461// AVX-NEXT:    ret <2 x half> [[TMP1]]462//463// X86-LABEL: @add2_haff_ccr(464// X86-NEXT:  entry:465// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2466// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 2467// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2468// X86-NEXT:    [[C_ADDR:%.*]] = alloca half, align 2469// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2470// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2471// X86-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 2472// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0473// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2474// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1475// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2476// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float477// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float478// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0479// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2480// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1481// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2482// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_REAL]] to float483// X86-NEXT:    [[EXT3:%.*]] = fpext half [[B_IMAG]] to float484// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT2]]485// X86-NEXT:    [[ADD_I:%.*]] = fadd float [[EXT1]], [[EXT3]]486// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[C_ADDR]], align 2487// X86-NEXT:    [[EXT4:%.*]] = fpext half [[TMP0]] to float488// X86-NEXT:    [[ADD_R5:%.*]] = fadd float [[ADD_R]], [[EXT4]]489// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R5]] to half490// X86-NEXT:    [[UNPROMOTION6:%.*]] = fptrunc float [[ADD_I]] to half491// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0492// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1493// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2494// X86-NEXT:    store half [[UNPROMOTION6]], ptr [[RETVAL_IMAGP]], align 2495// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2496// X86-NEXT:    ret <2 x half> [[TMP1]]497//498_Float16 _Complex add2_haff_ccr(_Float16 _Complex a, _Float16 _Complex b, _Float16 c) {499  return a + b + c;500}501 502// AVX-LABEL: @add2_haff_crc(503// AVX-NEXT:  entry:504// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2505// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2506// AVX-NEXT:    [[C:%.*]] = alloca { half, half }, align 2507// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2508// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2509// AVX-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2510// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2511// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0512// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2513// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1514// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2515// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 2516// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[A_REAL]], [[TMP0]]517// AVX-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0518// AVX-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2519// AVX-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1520// AVX-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2521// AVX-NEXT:    [[ADD_R1:%.*]] = fadd half [[ADD_R]], [[C_REAL]]522// AVX-NEXT:    [[ADD_I:%.*]] = fadd half [[A_IMAG]], [[C_IMAG]]523// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0524// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1525// AVX-NEXT:    store half [[ADD_R1]], ptr [[RETVAL_REALP]], align 2526// AVX-NEXT:    store half [[ADD_I]], ptr [[RETVAL_IMAGP]], align 2527// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2528// AVX-NEXT:    ret <2 x half> [[TMP1]]529//530// X86-LABEL: @add2_haff_crc(531// X86-NEXT:  entry:532// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2533// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 2534// X86-NEXT:    [[C:%.*]] = alloca { half, half }, align 2535// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2536// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2537// X86-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2538// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2539// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0540// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2541// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1542// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2543// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float544// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float545// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 2546// X86-NEXT:    [[EXT2:%.*]] = fpext half [[TMP0]] to float547// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT2]]548// X86-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0549// X86-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2550// X86-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1551// X86-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2552// X86-NEXT:    [[EXT3:%.*]] = fpext half [[C_REAL]] to float553// X86-NEXT:    [[EXT4:%.*]] = fpext half [[C_IMAG]] to float554// X86-NEXT:    [[ADD_R5:%.*]] = fadd float [[ADD_R]], [[EXT3]]555// X86-NEXT:    [[ADD_I:%.*]] = fadd float [[EXT1]], [[EXT4]]556// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R5]] to half557// X86-NEXT:    [[UNPROMOTION6:%.*]] = fptrunc float [[ADD_I]] to half558// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0559// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1560// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2561// X86-NEXT:    store half [[UNPROMOTION6]], ptr [[RETVAL_IMAGP]], align 2562// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2563// X86-NEXT:    ret <2 x half> [[TMP1]]564//565_Float16 _Complex add2_haff_crc(_Float16 _Complex a, _Float16 b, _Float16 _Complex c) {566  return a + b + c;567}568 569// AVX-LABEL: @add2_haff_ccc(570// AVX-NEXT:  entry:571// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2572// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2573// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2574// AVX-NEXT:    [[C:%.*]] = alloca { half, half }, align 2575// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2576// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2577// AVX-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2578// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0579// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2580// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1581// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2582// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0583// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2584// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1585// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2586// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[A_REAL]], [[B_REAL]]587// AVX-NEXT:    [[ADD_I:%.*]] = fadd half [[A_IMAG]], [[B_IMAG]]588// AVX-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0589// AVX-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2590// AVX-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1591// AVX-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2592// AVX-NEXT:    [[ADD_R1:%.*]] = fadd half [[ADD_R]], [[C_REAL]]593// AVX-NEXT:    [[ADD_I2:%.*]] = fadd half [[ADD_I]], [[C_IMAG]]594// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0595// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1596// AVX-NEXT:    store half [[ADD_R1]], ptr [[RETVAL_REALP]], align 2597// AVX-NEXT:    store half [[ADD_I2]], ptr [[RETVAL_IMAGP]], align 2598// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2599// AVX-NEXT:    ret <2 x half> [[TMP0]]600//601// X86-LABEL: @add2_haff_ccc(602// X86-NEXT:  entry:603// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2604// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 2605// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2606// X86-NEXT:    [[C:%.*]] = alloca { half, half }, align 2607// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2608// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2609// X86-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 2610// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0611// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2612// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1613// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2614// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float615// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float616// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0617// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2618// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1619// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2620// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_REAL]] to float621// X86-NEXT:    [[EXT3:%.*]] = fpext half [[B_IMAG]] to float622// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[EXT2]]623// X86-NEXT:    [[ADD_I:%.*]] = fadd float [[EXT1]], [[EXT3]]624// X86-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 0625// X86-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 2626// X86-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 1627// X86-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 2628// X86-NEXT:    [[EXT4:%.*]] = fpext half [[C_REAL]] to float629// X86-NEXT:    [[EXT5:%.*]] = fpext half [[C_IMAG]] to float630// X86-NEXT:    [[ADD_R6:%.*]] = fadd float [[ADD_R]], [[EXT4]]631// X86-NEXT:    [[ADD_I7:%.*]] = fadd float [[ADD_I]], [[EXT5]]632// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R6]] to half633// X86-NEXT:    [[UNPROMOTION8:%.*]] = fptrunc float [[ADD_I7]] to half634// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0635// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1636// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2637// X86-NEXT:    store half [[UNPROMOTION8]], ptr [[RETVAL_IMAGP]], align 2638// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2639// X86-NEXT:    ret <2 x half> [[TMP0]]640//641_Float16 _Complex add2_haff_ccc(_Float16 _Complex a, _Float16 _Complex b, _Float16 _Complex c) {642  return a + b + c;643}644 645// AVX-LABEL: @sub_half_rr(646// AVX-NEXT:  entry:647// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2648// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2649// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2650// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2651// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2652// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2653// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 2654// AVX-NEXT:    [[SUB:%.*]] = fsub half [[TMP0]], [[TMP1]]655// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0656// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1657// AVX-NEXT:    store half [[SUB]], ptr [[RETVAL_REALP]], align 2658// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 2659// AVX-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2660// AVX-NEXT:    ret <2 x half> [[TMP2]]661//662// X86-LABEL: @sub_half_rr(663// X86-NEXT:  entry:664// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2665// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2666// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2667// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2668// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2669// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2670// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float671// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 2672// X86-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float673// X86-NEXT:    [[SUB:%.*]] = fsub float [[EXT]], [[EXT1]]674// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB]] to half675// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0676// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1677// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2678// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 2679// X86-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2680// X86-NEXT:    ret <2 x half> [[TMP2]]681//682_Float16 _Complex sub_half_rr(_Float16 a, _Float16 b) {683  return a - b;684}685 686// AVX-LABEL: @sub_half_cr(687// AVX-NEXT:  entry:688// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2689// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2690// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2691// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2692// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2693// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0694// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2695// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1696// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2697// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 2698// AVX-NEXT:    [[SUB_R:%.*]] = fsub half [[A_REAL]], [[TMP0]]699// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0700// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1701// AVX-NEXT:    store half [[SUB_R]], ptr [[RETVAL_REALP]], align 2702// AVX-NEXT:    store half [[A_IMAG]], ptr [[RETVAL_IMAGP]], align 2703// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2704// AVX-NEXT:    ret <2 x half> [[TMP1]]705//706// X86-LABEL: @sub_half_cr(707// X86-NEXT:  entry:708// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2709// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 2710// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2711// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2712// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2713// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0714// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2715// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1716// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2717// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float718// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float719// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 2720// X86-NEXT:    [[EXT2:%.*]] = fpext half [[TMP0]] to float721// X86-NEXT:    [[SUB_R:%.*]] = fsub float [[EXT]], [[EXT2]]722// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB_R]] to half723// X86-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[EXT1]] to half724// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0725// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1726// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2727// X86-NEXT:    store half [[UNPROMOTION3]], ptr [[RETVAL_IMAGP]], align 2728// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2729// X86-NEXT:    ret <2 x half> [[TMP1]]730//731_Float16 _Complex sub_half_cr(_Float16 _Complex a, _Float16 b) {732  return a - b;733}734 735// AVX-LABEL: @sub_half_rc(736// AVX-NEXT:  entry:737// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2738// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2739// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2740// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2741// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2742// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2743// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0744// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2745// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1746// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2747// AVX-NEXT:    [[SUB_R:%.*]] = fsub half [[TMP0]], [[B_REAL]]748// AVX-NEXT:    [[SUB_I:%.*]] = fneg half [[B_IMAG]]749// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0750// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1751// AVX-NEXT:    store half [[SUB_R]], ptr [[RETVAL_REALP]], align 2752// AVX-NEXT:    store half [[SUB_I]], ptr [[RETVAL_IMAGP]], align 2753// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2754// AVX-NEXT:    ret <2 x half> [[TMP1]]755//756// X86-LABEL: @sub_half_rc(757// X86-NEXT:  entry:758// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2759// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2760// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2761// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2762// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2763// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2764// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float765// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0766// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2767// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1768// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2769// X86-NEXT:    [[EXT1:%.*]] = fpext half [[B_REAL]] to float770// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_IMAG]] to float771// X86-NEXT:    [[SUB_R:%.*]] = fsub float [[EXT]], [[EXT1]]772// X86-NEXT:    [[SUB_I:%.*]] = fneg float [[EXT2]]773// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB_R]] to half774// X86-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[SUB_I]] to half775// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0776// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1777// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2778// X86-NEXT:    store half [[UNPROMOTION3]], ptr [[RETVAL_IMAGP]], align 2779// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2780// X86-NEXT:    ret <2 x half> [[TMP1]]781//782_Float16 _Complex sub_half_rc(_Float16 a, _Float16 _Complex b) {783  return a - b;784}785 786// AVX-LABEL: @sub_half_cc(787// AVX-NEXT:  entry:788// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2789// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2790// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2791// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2792// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2793// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0794// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2795// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1796// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2797// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0798// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2799// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1800// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2801// AVX-NEXT:    [[SUB_R:%.*]] = fsub half [[A_REAL]], [[B_REAL]]802// AVX-NEXT:    [[SUB_I:%.*]] = fsub half [[A_IMAG]], [[B_IMAG]]803// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0804// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1805// AVX-NEXT:    store half [[SUB_R]], ptr [[RETVAL_REALP]], align 2806// AVX-NEXT:    store half [[SUB_I]], ptr [[RETVAL_IMAGP]], align 2807// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2808// AVX-NEXT:    ret <2 x half> [[TMP0]]809//810// X86-LABEL: @sub_half_cc(811// X86-NEXT:  entry:812// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2813// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 2814// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2815// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2816// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2817// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0818// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2819// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1820// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2821// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float822// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float823// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0824// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2825// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1826// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2827// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_REAL]] to float828// X86-NEXT:    [[EXT3:%.*]] = fpext half [[B_IMAG]] to float829// X86-NEXT:    [[SUB_R:%.*]] = fsub float [[EXT]], [[EXT2]]830// X86-NEXT:    [[SUB_I:%.*]] = fsub float [[EXT1]], [[EXT3]]831// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB_R]] to half832// X86-NEXT:    [[UNPROMOTION4:%.*]] = fptrunc float [[SUB_I]] to half833// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0834// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1835// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2836// X86-NEXT:    store half [[UNPROMOTION4]], ptr [[RETVAL_IMAGP]], align 2837// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2838// X86-NEXT:    ret <2 x half> [[TMP0]]839//840_Float16 _Complex sub_half_cc(_Float16 _Complex a, _Float16 _Complex b) {841  return a - b;842}843 844// AVX-LABEL: @mul_half_rr(845// AVX-NEXT:  entry:846// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2847// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2848// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2849// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2850// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2851// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2852// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 2853// AVX-NEXT:    [[MUL:%.*]] = fmul half [[TMP0]], [[TMP1]]854// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0855// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1856// AVX-NEXT:    store half [[MUL]], ptr [[RETVAL_REALP]], align 2857// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 2858// AVX-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2859// AVX-NEXT:    ret <2 x half> [[TMP2]]860//861// X86-LABEL: @mul_half_rr(862// X86-NEXT:  entry:863// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2864// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2865// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2866// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2867// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2868// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2869// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float870// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 2871// X86-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float872// X86-NEXT:    [[MUL:%.*]] = fmul float [[EXT]], [[EXT1]]873// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[MUL]] to half874// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0875// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1876// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2877// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 2878// X86-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2879// X86-NEXT:    ret <2 x half> [[TMP2]]880//881_Float16 _Complex mul_half_rr(_Float16 a, _Float16 b) {882  return a * b;883}884 885// AVX-LABEL: @mul_half_cr(886// AVX-NEXT:  entry:887// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2888// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2889// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2890// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2891// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2892// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0893// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2894// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1895// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2896// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 2897// AVX-NEXT:    [[MUL_RL:%.*]] = fmul half [[A_REAL]], [[TMP0]]898// AVX-NEXT:    [[MUL_IL:%.*]] = fmul half [[A_IMAG]], [[TMP0]]899// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0900// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1901// AVX-NEXT:    store half [[MUL_RL]], ptr [[RETVAL_REALP]], align 2902// AVX-NEXT:    store half [[MUL_IL]], ptr [[RETVAL_IMAGP]], align 2903// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2904// AVX-NEXT:    ret <2 x half> [[TMP1]]905//906// X86-LABEL: @mul_half_cr(907// X86-NEXT:  entry:908// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2909// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 2910// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 2911// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2912// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 2913// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0914// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2915// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1916// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2917// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float918// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float919// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 2920// X86-NEXT:    [[EXT2:%.*]] = fpext half [[TMP0]] to float921// X86-NEXT:    [[MUL_RL:%.*]] = fmul float [[EXT]], [[EXT2]]922// X86-NEXT:    [[MUL_IL:%.*]] = fmul float [[EXT1]], [[EXT2]]923// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[MUL_RL]] to half924// X86-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[MUL_IL]] to half925// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0926// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1927// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2928// X86-NEXT:    store half [[UNPROMOTION3]], ptr [[RETVAL_IMAGP]], align 2929// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2930// X86-NEXT:    ret <2 x half> [[TMP1]]931//932_Float16 _Complex mul_half_cr(_Float16 _Complex a, _Float16 b) {933  return a * b;934}935 936// AVX-LABEL: @mul_half_rc(937// AVX-NEXT:  entry:938// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2939// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2940// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2941// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2942// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2943// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2944// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0945// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2946// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1947// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2948// AVX-NEXT:    [[MUL_RL:%.*]] = fmul half [[TMP0]], [[B_REAL]]949// AVX-NEXT:    [[MUL_IR:%.*]] = fmul half [[TMP0]], [[B_IMAG]]950// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0951// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1952// AVX-NEXT:    store half [[MUL_RL]], ptr [[RETVAL_REALP]], align 2953// AVX-NEXT:    store half [[MUL_IR]], ptr [[RETVAL_IMAGP]], align 2954// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2955// AVX-NEXT:    ret <2 x half> [[TMP1]]956//957// X86-LABEL: @mul_half_rc(958// X86-NEXT:  entry:959// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2960// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 2961// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 2962// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2963// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 2964// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 2965// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float966// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 0967// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 2968// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 1969// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 2970// X86-NEXT:    [[EXT1:%.*]] = fpext half [[B_REAL]] to float971// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_IMAG]] to float972// X86-NEXT:    [[MUL_RL:%.*]] = fmul float [[EXT]], [[EXT1]]973// X86-NEXT:    [[MUL_IR:%.*]] = fmul float [[EXT]], [[EXT2]]974// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[MUL_RL]] to half975// X86-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[MUL_IR]] to half976// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 0977// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 1978// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 2979// X86-NEXT:    store half [[UNPROMOTION3]], ptr [[RETVAL_IMAGP]], align 2980// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 2981// X86-NEXT:    ret <2 x half> [[TMP1]]982//983_Float16 _Complex mul_half_rc(_Float16 a, _Float16 _Complex b) {984  return a * b;985}986 987// AVX-LABEL: @mul_half_cc(988// AVX-NEXT:  entry:989// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 2990// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 2991// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 2992// AVX-NEXT:    [[COERCE:%.*]] = alloca { half, half }, align 2993// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 2994// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 2995// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 0996// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 2997// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 1998// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 2999// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 01000// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 21001// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 11002// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 21003// AVX-NEXT:    [[MUL_AC:%.*]] = fmul half [[A_REAL]], [[B_REAL]]1004// AVX-NEXT:    [[MUL_BD:%.*]] = fmul half [[A_IMAG]], [[B_IMAG]]1005// AVX-NEXT:    [[MUL_AD:%.*]] = fmul half [[A_REAL]], [[B_IMAG]]1006// AVX-NEXT:    [[MUL_BC:%.*]] = fmul half [[A_IMAG]], [[B_REAL]]1007// AVX-NEXT:    [[MUL_R:%.*]] = fsub half [[MUL_AC]], [[MUL_BD]]1008// AVX-NEXT:    [[MUL_I:%.*]] = fadd half [[MUL_AD]], [[MUL_BC]]1009// AVX-NEXT:    [[ISNAN_CMP:%.*]] = fcmp uno half [[MUL_R]], [[MUL_R]]1010// AVX-NEXT:    br i1 [[ISNAN_CMP]], label [[COMPLEX_MUL_IMAG_NAN:%.*]], label [[COMPLEX_MUL_CONT:%.*]], !prof [[PROF2:![0-9]+]]1011// AVX:       complex_mul_imag_nan:1012// AVX-NEXT:    [[ISNAN_CMP1:%.*]] = fcmp uno half [[MUL_I]], [[MUL_I]]1013// AVX-NEXT:    br i1 [[ISNAN_CMP1]], label [[COMPLEX_MUL_LIBCALL:%.*]], label [[COMPLEX_MUL_CONT]], !prof [[PROF2]]1014// AVX:       complex_mul_libcall:1015// AVX-NEXT:    [[CALL:%.*]] = call <2 x half> @__mulhc3(half noundef [[A_REAL]], half noundef [[A_IMAG]], half noundef [[B_REAL]], half noundef [[B_IMAG]]) #[[ATTR1:[0-9]+]]1016// AVX-NEXT:    store <2 x half> [[CALL]], ptr [[COERCE]], align 21017// AVX-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE]], i32 0, i32 01018// AVX-NEXT:    [[COERCE_REAL:%.*]] = load half, ptr [[COERCE_REALP]], align 21019// AVX-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE]], i32 0, i32 11020// AVX-NEXT:    [[COERCE_IMAG:%.*]] = load half, ptr [[COERCE_IMAGP]], align 21021// AVX-NEXT:    br label [[COMPLEX_MUL_CONT]]1022// AVX:       complex_mul_cont:1023// AVX-NEXT:    [[REAL_MUL_PHI:%.*]] = phi half [ [[MUL_R]], [[ENTRY:%.*]] ], [ [[MUL_R]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_REAL]], [[COMPLEX_MUL_LIBCALL]] ]1024// AVX-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi half [ [[MUL_I]], [[ENTRY]] ], [ [[MUL_I]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_IMAG]], [[COMPLEX_MUL_LIBCALL]] ]1025// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01026// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11027// AVX-NEXT:    store half [[REAL_MUL_PHI]], ptr [[RETVAL_REALP]], align 21028// AVX-NEXT:    store half [[IMAG_MUL_PHI]], ptr [[RETVAL_IMAGP]], align 21029// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21030// AVX-NEXT:    ret <2 x half> [[TMP0]]1031//1032// X86-LABEL: @mul_half_cc(1033// X86-NEXT:  entry:1034// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21035// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21036// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 21037// X86-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 41038// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21039// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 21040// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01041// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21042// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11043// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21044// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1045// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1046// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 01047// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 21048// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 11049// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 21050// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_REAL]] to float1051// X86-NEXT:    [[EXT3:%.*]] = fpext half [[B_IMAG]] to float1052// X86-NEXT:    [[MUL_AC:%.*]] = fmul float [[EXT]], [[EXT2]]1053// X86-NEXT:    [[MUL_BD:%.*]] = fmul float [[EXT1]], [[EXT3]]1054// X86-NEXT:    [[MUL_AD:%.*]] = fmul float [[EXT]], [[EXT3]]1055// X86-NEXT:    [[MUL_BC:%.*]] = fmul float [[EXT1]], [[EXT2]]1056// X86-NEXT:    [[MUL_R:%.*]] = fsub float [[MUL_AC]], [[MUL_BD]]1057// X86-NEXT:    [[MUL_I:%.*]] = fadd float [[MUL_AD]], [[MUL_BC]]1058// X86-NEXT:    [[ISNAN_CMP:%.*]] = fcmp uno float [[MUL_R]], [[MUL_R]]1059// X86-NEXT:    br i1 [[ISNAN_CMP]], label [[COMPLEX_MUL_IMAG_NAN:%.*]], label [[COMPLEX_MUL_CONT:%.*]], !prof [[PROF2:![0-9]+]]1060// X86:       complex_mul_imag_nan:1061// X86-NEXT:    [[ISNAN_CMP4:%.*]] = fcmp uno float [[MUL_I]], [[MUL_I]]1062// X86-NEXT:    br i1 [[ISNAN_CMP4]], label [[COMPLEX_MUL_LIBCALL:%.*]], label [[COMPLEX_MUL_CONT]], !prof [[PROF2]]1063// X86:       complex_mul_libcall:1064// X86-NEXT:    [[CALL:%.*]] = call <2 x float> @__mulsc3(float noundef [[EXT]], float noundef [[EXT1]], float noundef [[EXT2]], float noundef [[EXT3]]) #[[ATTR2:[0-9]+]]1065// X86-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE]], align 41066// X86-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 01067// X86-NEXT:    [[COERCE_REAL:%.*]] = load float, ptr [[COERCE_REALP]], align 41068// X86-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 11069// X86-NEXT:    [[COERCE_IMAG:%.*]] = load float, ptr [[COERCE_IMAGP]], align 41070// X86-NEXT:    br label [[COMPLEX_MUL_CONT]]1071// X86:       complex_mul_cont:1072// X86-NEXT:    [[REAL_MUL_PHI:%.*]] = phi float [ [[MUL_R]], [[ENTRY:%.*]] ], [ [[MUL_R]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_REAL]], [[COMPLEX_MUL_LIBCALL]] ]1073// X86-NEXT:    [[IMAG_MUL_PHI:%.*]] = phi float [ [[MUL_I]], [[ENTRY]] ], [ [[MUL_I]], [[COMPLEX_MUL_IMAG_NAN]] ], [ [[COERCE_IMAG]], [[COMPLEX_MUL_LIBCALL]] ]1074// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[REAL_MUL_PHI]] to half1075// X86-NEXT:    [[UNPROMOTION5:%.*]] = fptrunc float [[IMAG_MUL_PHI]] to half1076// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01077// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11078// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21079// X86-NEXT:    store half [[UNPROMOTION5]], ptr [[RETVAL_IMAGP]], align 21080// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21081// X86-NEXT:    ret <2 x half> [[TMP0]]1082//1083_Float16 _Complex mul_half_cc(_Float16 _Complex a, _Float16 _Complex b) {1084  return a * b;1085}1086// AVX-LABEL: @div_half_rr(1087// AVX-NEXT:  entry:1088// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21089// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21090// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 21091// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21092// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 21093// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21094// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 21095// AVX-NEXT:    [[DIV:%.*]] = fdiv half [[TMP0]], [[TMP1]]1096// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01097// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11098// AVX-NEXT:    store half [[DIV]], ptr [[RETVAL_REALP]], align 21099// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21100// AVX-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21101// AVX-NEXT:    ret <2 x half> [[TMP2]]1102//1103// X86-LABEL: @div_half_rr(1104// X86-NEXT:  entry:1105// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21106// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21107// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 21108// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21109// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 21110// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21111// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float1112// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[B_ADDR]], align 21113// X86-NEXT:    [[EXT1:%.*]] = fpext half [[TMP1]] to float1114// X86-NEXT:    [[DIV:%.*]] = fdiv float [[EXT]], [[EXT1]]1115// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[DIV]] to half1116// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01117// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11118// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21119// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21120// X86-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21121// X86-NEXT:    ret <2 x half> [[TMP2]]1122//1123_Float16 _Complex div_half_rr(_Float16 a, _Float16 b) {1124  return a / b;1125}1126 1127// AVX-LABEL: @div_half_cr(1128// AVX-NEXT:  entry:1129// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21130// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21131// AVX-NEXT:    [[B_ADDR:%.*]] = alloca half, align 21132// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21133// AVX-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 21134// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01135// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21136// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11137// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21138// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 21139// AVX-NEXT:    [[TMP1:%.*]] = fdiv half [[A_REAL]], [[TMP0]]1140// AVX-NEXT:    [[TMP2:%.*]] = fdiv half [[A_IMAG]], [[TMP0]]1141// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01142// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11143// AVX-NEXT:    store half [[TMP1]], ptr [[RETVAL_REALP]], align 21144// AVX-NEXT:    store half [[TMP2]], ptr [[RETVAL_IMAGP]], align 21145// AVX-NEXT:    [[TMP3:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21146// AVX-NEXT:    ret <2 x half> [[TMP3]]1147//1148// X86-LABEL: @div_half_cr(1149// X86-NEXT:  entry:1150// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21151// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21152// X86-NEXT:    [[B_ADDR:%.*]] = alloca half, align 21153// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21154// X86-NEXT:    store half [[B:%.*]], ptr [[B_ADDR]], align 21155// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01156// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21157// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11158// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21159// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1160// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1161// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[B_ADDR]], align 21162// X86-NEXT:    [[EXT2:%.*]] = fpext half [[TMP0]] to float1163// X86-NEXT:    [[TMP1:%.*]] = fdiv float [[EXT]], [[EXT2]]1164// X86-NEXT:    [[TMP2:%.*]] = fdiv float [[EXT1]], [[EXT2]]1165// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[TMP1]] to half1166// X86-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[TMP2]] to half1167// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01168// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11169// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21170// X86-NEXT:    store half [[UNPROMOTION3]], ptr [[RETVAL_IMAGP]], align 21171// X86-NEXT:    [[TMP3:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21172// X86-NEXT:    ret <2 x half> [[TMP3]]1173//1174_Float16 _Complex div_half_cr(_Float16 _Complex a, _Float16 b) {1175  return a / b;1176}1177// AVX-LABEL: @div_half_rc(1178// AVX-NEXT:  entry:1179// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21180// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 21181// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21182// AVX-NEXT:    [[COERCE:%.*]] = alloca { half, half }, align 21183// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 21184// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21185// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21186// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 01187// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 21188// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 11189// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 21190// AVX-NEXT:    [[CALL:%.*]] = call <2 x half> @__divhc3(half noundef [[TMP0]], half noundef 0xH0000, half noundef [[B_REAL]], half noundef [[B_IMAG]]) #[[ATTR1]]1191// AVX-NEXT:    store <2 x half> [[CALL]], ptr [[COERCE]], align 21192// AVX-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE]], i32 0, i32 01193// AVX-NEXT:    [[COERCE_REAL:%.*]] = load half, ptr [[COERCE_REALP]], align 21194// AVX-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE]], i32 0, i32 11195// AVX-NEXT:    [[COERCE_IMAG:%.*]] = load half, ptr [[COERCE_IMAGP]], align 21196// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01197// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11198// AVX-NEXT:    store half [[COERCE_REAL]], ptr [[RETVAL_REALP]], align 21199// AVX-NEXT:    store half [[COERCE_IMAG]], ptr [[RETVAL_IMAGP]], align 21200// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21201// AVX-NEXT:    ret <2 x half> [[TMP1]]1202//1203// X86-LABEL: @div_half_rc(1204// X86-NEXT:  entry:1205// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21206// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 21207// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21208// X86-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 41209// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 21210// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21211// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21212// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float1213// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 01214// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 21215// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 11216// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 21217// X86-NEXT:    [[EXT1:%.*]] = fpext half [[B_REAL]] to float1218// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_IMAG]] to float1219// X86-NEXT:    [[CALL:%.*]] = call <2 x float> @__divsc3(float noundef [[EXT]], float noundef 0.000000e+00, float noundef [[EXT1]], float noundef [[EXT2]]) #[[ATTR2]]1220// X86-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE]], align 41221// X86-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 01222// X86-NEXT:    [[COERCE_REAL:%.*]] = load float, ptr [[COERCE_REALP]], align 41223// X86-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 11224// X86-NEXT:    [[COERCE_IMAG:%.*]] = load float, ptr [[COERCE_IMAGP]], align 41225// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[COERCE_REAL]] to half1226// X86-NEXT:    [[UNPROMOTION3:%.*]] = fptrunc float [[COERCE_IMAG]] to half1227// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01228// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11229// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21230// X86-NEXT:    store half [[UNPROMOTION3]], ptr [[RETVAL_IMAGP]], align 21231// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21232// X86-NEXT:    ret <2 x half> [[TMP1]]1233//1234_Float16 _Complex div_half_rc(_Float16 a, _Float16 _Complex b) {1235  return a / b;1236}1237 1238// AVX-LABEL: @div_half_cc(1239// AVX-NEXT:  entry:1240// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21241// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21242// AVX-NEXT:    [[B:%.*]] = alloca { half, half }, align 21243// AVX-NEXT:    [[COERCE:%.*]] = alloca { half, half }, align 21244// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21245// AVX-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 21246// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01247// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21248// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11249// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21250// AVX-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 01251// AVX-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 21252// AVX-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 11253// AVX-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 21254// AVX-NEXT:    [[CALL:%.*]] = call <2 x half> @__divhc3(half noundef [[A_REAL]], half noundef [[A_IMAG]], half noundef [[B_REAL]], half noundef [[B_IMAG]]) #[[ATTR1]]1255// AVX-NEXT:    store <2 x half> [[CALL]], ptr [[COERCE]], align 21256// AVX-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE]], i32 0, i32 01257// AVX-NEXT:    [[COERCE_REAL:%.*]] = load half, ptr [[COERCE_REALP]], align 21258// AVX-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[COERCE]], i32 0, i32 11259// AVX-NEXT:    [[COERCE_IMAG:%.*]] = load half, ptr [[COERCE_IMAGP]], align 21260// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01261// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11262// AVX-NEXT:    store half [[COERCE_REAL]], ptr [[RETVAL_REALP]], align 21263// AVX-NEXT:    store half [[COERCE_IMAG]], ptr [[RETVAL_IMAGP]], align 21264// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21265// AVX-NEXT:    ret <2 x half> [[TMP0]]1266//1267// X86-LABEL: @div_half_cc(1268// X86-NEXT:  entry:1269// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21270// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21271// X86-NEXT:    [[B:%.*]] = alloca { half, half }, align 21272// X86-NEXT:    [[COERCE:%.*]] = alloca { float, float }, align 41273// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21274// X86-NEXT:    store <2 x half> [[B_COERCE:%.*]], ptr [[B]], align 21275// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01276// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21277// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11278// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21279// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1280// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1281// X86-NEXT:    [[B_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 01282// X86-NEXT:    [[B_REAL:%.*]] = load half, ptr [[B_REALP]], align 21283// X86-NEXT:    [[B_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[B]], i32 0, i32 11284// X86-NEXT:    [[B_IMAG:%.*]] = load half, ptr [[B_IMAGP]], align 21285// X86-NEXT:    [[EXT2:%.*]] = fpext half [[B_REAL]] to float1286// X86-NEXT:    [[EXT3:%.*]] = fpext half [[B_IMAG]] to float1287// X86-NEXT:    [[CALL:%.*]] = call <2 x float> @__divsc3(float noundef [[EXT]], float noundef [[EXT1]], float noundef [[EXT2]], float noundef [[EXT3]]) #[[ATTR2]]1288// X86-NEXT:    store <2 x float> [[CALL]], ptr [[COERCE]], align 41289// X86-NEXT:    [[COERCE_REALP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 01290// X86-NEXT:    [[COERCE_REAL:%.*]] = load float, ptr [[COERCE_REALP]], align 41291// X86-NEXT:    [[COERCE_IMAGP:%.*]] = getelementptr inbounds nuw { float, float }, ptr [[COERCE]], i32 0, i32 11292// X86-NEXT:    [[COERCE_IMAG:%.*]] = load float, ptr [[COERCE_IMAGP]], align 41293// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[COERCE_REAL]] to half1294// X86-NEXT:    [[UNPROMOTION4:%.*]] = fptrunc float [[COERCE_IMAG]] to half1295// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01296// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11297// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21298// X86-NEXT:    store half [[UNPROMOTION4]], ptr [[RETVAL_IMAGP]], align 21299// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21300// X86-NEXT:    ret <2 x half> [[TMP0]]1301//1302_Float16 _Complex div_half_cc(_Float16 _Complex a, _Float16 _Complex b) {1303  return a / b;1304}1305 1306// AVX-LABEL: @addcompound_half_rr(1307// AVX-NEXT:  entry:1308// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21309// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21310// AVX-NEXT:    [[C_ADDR:%.*]] = alloca half, align 21311// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21312// AVX-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 21313// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21314// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 21315// AVX-NEXT:    [[ADD:%.*]] = fadd half [[TMP1]], [[TMP0]]1316// AVX-NEXT:    store half [[ADD]], ptr [[C_ADDR]], align 21317// AVX-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 21318// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01319// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11320// AVX-NEXT:    store half [[TMP2]], ptr [[RETVAL_REALP]], align 21321// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21322// AVX-NEXT:    [[TMP3:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21323// AVX-NEXT:    ret <2 x half> [[TMP3]]1324//1325// X86-LABEL: @addcompound_half_rr(1326// X86-NEXT:  entry:1327// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21328// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21329// X86-NEXT:    [[C_ADDR:%.*]] = alloca half, align 21330// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21331// X86-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 21332// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21333// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float1334// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 21335// X86-NEXT:    [[CONV:%.*]] = fpext half [[TMP1]] to float1336// X86-NEXT:    [[ADD:%.*]] = fadd float [[CONV]], [[EXT]]1337// X86-NEXT:    [[CONV1:%.*]] = fptrunc float [[ADD]] to half1338// X86-NEXT:    store half [[CONV1]], ptr [[C_ADDR]], align 21339// X86-NEXT:    [[TMP2:%.*]] = load half, ptr [[C_ADDR]], align 21340// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01341// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11342// X86-NEXT:    store half [[TMP2]], ptr [[RETVAL_REALP]], align 21343// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21344// X86-NEXT:    [[TMP3:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21345// X86-NEXT:    ret <2 x half> [[TMP3]]1346//1347_Float16 _Complex addcompound_half_rr(_Float16 a, _Float16 c) {1348  c += a;1349  return c;1350}1351 1352// AVX-LABEL: @addcompound_half_cr(1353// AVX-NEXT:  entry:1354// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21355// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21356// AVX-NEXT:    [[C_ADDR:%.*]] = alloca half, align 21357// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21358// AVX-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 21359// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01360// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21361// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11362// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21363// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[C_ADDR]], align 21364// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[TMP0]], [[A_REAL]]1365// AVX-NEXT:    store half [[ADD_R]], ptr [[C_ADDR]], align 21366// AVX-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 21367// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01368// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11369// AVX-NEXT:    store half [[TMP1]], ptr [[RETVAL_REALP]], align 21370// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21371// AVX-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21372// AVX-NEXT:    ret <2 x half> [[TMP2]]1373//1374// X86-LABEL: @addcompound_half_cr(1375// X86-NEXT:  entry:1376// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21377// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21378// X86-NEXT:    [[C_ADDR:%.*]] = alloca half, align 21379// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21380// X86-NEXT:    store half [[C:%.*]], ptr [[C_ADDR]], align 21381// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01382// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21383// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11384// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21385// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1386// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1387// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[C_ADDR]], align 21388// X86-NEXT:    [[CONV:%.*]] = fpext half [[TMP0]] to float1389// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[CONV]], [[EXT]]1390// X86-NEXT:    [[CONV2:%.*]] = fptrunc float [[ADD_R]] to half1391// X86-NEXT:    store half [[CONV2]], ptr [[C_ADDR]], align 21392// X86-NEXT:    [[TMP1:%.*]] = load half, ptr [[C_ADDR]], align 21393// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01394// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11395// X86-NEXT:    store half [[TMP1]], ptr [[RETVAL_REALP]], align 21396// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21397// X86-NEXT:    [[TMP2:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21398// X86-NEXT:    ret <2 x half> [[TMP2]]1399//1400_Float16 _Complex addcompound_half_cr(_Float16 _Complex a, _Float16 c) {1401  c += a;1402  return c;1403}1404 1405// AVX-LABEL: @addcompound_half_rc(1406// AVX-NEXT:  entry:1407// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21408// AVX-NEXT:    [[C:%.*]] = alloca { half, half }, align 21409// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21410// AVX-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 21411// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21412// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21413// AVX-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01414// AVX-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 21415// AVX-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11416// AVX-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 21417// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[C_REAL]], [[TMP0]]1418// AVX-NEXT:    [[C_REALP1:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01419// AVX-NEXT:    [[C_IMAGP2:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11420// AVX-NEXT:    store half [[ADD_R]], ptr [[C_REALP1]], align 21421// AVX-NEXT:    store half [[C_IMAG]], ptr [[C_IMAGP2]], align 21422// AVX-NEXT:    [[C_REALP3:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01423// AVX-NEXT:    [[C_REAL4:%.*]] = load half, ptr [[C_REALP3]], align 21424// AVX-NEXT:    [[C_IMAGP5:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11425// AVX-NEXT:    [[C_IMAG6:%.*]] = load half, ptr [[C_IMAGP5]], align 21426// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01427// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11428// AVX-NEXT:    store half [[C_REAL4]], ptr [[RETVAL_REALP]], align 21429// AVX-NEXT:    store half [[C_IMAG6]], ptr [[RETVAL_IMAGP]], align 21430// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21431// AVX-NEXT:    ret <2 x half> [[TMP1]]1432//1433// X86-LABEL: @addcompound_half_rc(1434// X86-NEXT:  entry:1435// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21436// X86-NEXT:    [[C:%.*]] = alloca { half, half }, align 21437// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21438// X86-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 21439// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21440// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21441// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float1442// X86-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01443// X86-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 21444// X86-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11445// X86-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 21446// X86-NEXT:    [[CONV:%.*]] = fpext half [[C_REAL]] to float1447// X86-NEXT:    [[CONV1:%.*]] = fpext half [[C_IMAG]] to float1448// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[CONV]], [[EXT]]1449// X86-NEXT:    [[CONV2:%.*]] = fptrunc float [[ADD_R]] to half1450// X86-NEXT:    [[CONV3:%.*]] = fptrunc float [[CONV1]] to half1451// X86-NEXT:    [[C_REALP4:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01452// X86-NEXT:    [[C_IMAGP5:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11453// X86-NEXT:    store half [[CONV2]], ptr [[C_REALP4]], align 21454// X86-NEXT:    store half [[CONV3]], ptr [[C_IMAGP5]], align 21455// X86-NEXT:    [[C_REALP6:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01456// X86-NEXT:    [[C_REAL7:%.*]] = load half, ptr [[C_REALP6]], align 21457// X86-NEXT:    [[C_IMAGP8:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11458// X86-NEXT:    [[C_IMAG9:%.*]] = load half, ptr [[C_IMAGP8]], align 21459// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01460// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11461// X86-NEXT:    store half [[C_REAL7]], ptr [[RETVAL_REALP]], align 21462// X86-NEXT:    store half [[C_IMAG9]], ptr [[RETVAL_IMAGP]], align 21463// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21464// X86-NEXT:    ret <2 x half> [[TMP1]]1465//1466_Float16 _Complex addcompound_half_rc(_Float16 a, _Float16 _Complex c) {1467  c += a;1468  return c;1469}1470 1471// AVX-LABEL: @addcompound_half_cc(1472// AVX-NEXT:  entry:1473// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21474// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21475// AVX-NEXT:    [[C:%.*]] = alloca { half, half }, align 21476// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21477// AVX-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 21478// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01479// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21480// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11481// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21482// AVX-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01483// AVX-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 21484// AVX-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11485// AVX-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 21486// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[C_REAL]], [[A_REAL]]1487// AVX-NEXT:    [[ADD_I:%.*]] = fadd half [[C_IMAG]], [[A_IMAG]]1488// AVX-NEXT:    [[C_REALP1:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01489// AVX-NEXT:    [[C_IMAGP2:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11490// AVX-NEXT:    store half [[ADD_R]], ptr [[C_REALP1]], align 21491// AVX-NEXT:    store half [[ADD_I]], ptr [[C_IMAGP2]], align 21492// AVX-NEXT:    [[C_REALP3:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01493// AVX-NEXT:    [[C_REAL4:%.*]] = load half, ptr [[C_REALP3]], align 21494// AVX-NEXT:    [[C_IMAGP5:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11495// AVX-NEXT:    [[C_IMAG6:%.*]] = load half, ptr [[C_IMAGP5]], align 21496// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01497// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11498// AVX-NEXT:    store half [[C_REAL4]], ptr [[RETVAL_REALP]], align 21499// AVX-NEXT:    store half [[C_IMAG6]], ptr [[RETVAL_IMAGP]], align 21500// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21501// AVX-NEXT:    ret <2 x half> [[TMP0]]1502//1503// X86-LABEL: @addcompound_half_cc(1504// X86-NEXT:  entry:1505// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21506// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21507// X86-NEXT:    [[C:%.*]] = alloca { half, half }, align 21508// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21509// X86-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 21510// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01511// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21512// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11513// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21514// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1515// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1516// X86-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01517// X86-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 21518// X86-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11519// X86-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 21520// X86-NEXT:    [[CONV:%.*]] = fpext half [[C_REAL]] to float1521// X86-NEXT:    [[CONV2:%.*]] = fpext half [[C_IMAG]] to float1522// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[CONV]], [[EXT]]1523// X86-NEXT:    [[ADD_I:%.*]] = fadd float [[CONV2]], [[EXT1]]1524// X86-NEXT:    [[CONV3:%.*]] = fptrunc float [[ADD_R]] to half1525// X86-NEXT:    [[CONV4:%.*]] = fptrunc float [[ADD_I]] to half1526// X86-NEXT:    [[C_REALP5:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01527// X86-NEXT:    [[C_IMAGP6:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11528// X86-NEXT:    store half [[CONV3]], ptr [[C_REALP5]], align 21529// X86-NEXT:    store half [[CONV4]], ptr [[C_IMAGP6]], align 21530// X86-NEXT:    [[C_REALP7:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01531// X86-NEXT:    [[C_REAL8:%.*]] = load half, ptr [[C_REALP7]], align 21532// X86-NEXT:    [[C_IMAGP9:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11533// X86-NEXT:    [[C_IMAG10:%.*]] = load half, ptr [[C_IMAGP9]], align 21534// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01535// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11536// X86-NEXT:    store half [[C_REAL8]], ptr [[RETVAL_REALP]], align 21537// X86-NEXT:    store half [[C_IMAG10]], ptr [[RETVAL_IMAGP]], align 21538// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21539// X86-NEXT:    ret <2 x half> [[TMP0]]1540//1541_Float16 _Complex addcompound_half_cc(_Float16 _Complex a, _Float16 _Complex c) {1542  c += a;1543  return c;1544}1545 1546// AVX-LABEL: @MinusOp_r(1547// AVX-NEXT:  entry:1548// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21549// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21550// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21551// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21552// AVX-NEXT:    [[FNEG:%.*]] = fneg half [[TMP0]]1553// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01554// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11555// AVX-NEXT:    store half [[FNEG]], ptr [[RETVAL_REALP]], align 21556// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21557// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21558// AVX-NEXT:    ret <2 x half> [[TMP1]]1559//1560// X86-LABEL: @MinusOp_r(1561// X86-NEXT:  entry:1562// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21563// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21564// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21565// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21566// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float1567// X86-NEXT:    [[FNEG:%.*]] = fneg float [[EXT]]1568// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[FNEG]] to half1569// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01570// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11571// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21572// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21573// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21574// X86-NEXT:    ret <2 x half> [[TMP1]]1575//1576_Float16 _Complex MinusOp_r(_Float16 a) {1577  return -a;1578}1579 1580// AVX-LABEL: @MinusOp_c(1581// AVX-NEXT:  entry:1582// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21583// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21584// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21585// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01586// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21587// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11588// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21589// AVX-NEXT:    [[NEG_R:%.*]] = fneg half [[A_REAL]]1590// AVX-NEXT:    [[NEG_I:%.*]] = fneg half [[A_IMAG]]1591// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01592// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11593// AVX-NEXT:    store half [[NEG_R]], ptr [[RETVAL_REALP]], align 21594// AVX-NEXT:    store half [[NEG_I]], ptr [[RETVAL_IMAGP]], align 21595// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21596// AVX-NEXT:    ret <2 x half> [[TMP0]]1597//1598// X86-LABEL: @MinusOp_c(1599// X86-NEXT:  entry:1600// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21601// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21602// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21603// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01604// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21605// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11606// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21607// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1608// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1609// X86-NEXT:    [[NEG_R:%.*]] = fneg float [[EXT]]1610// X86-NEXT:    [[NEG_I:%.*]] = fneg float [[EXT1]]1611// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[NEG_R]] to half1612// X86-NEXT:    [[UNPROMOTION2:%.*]] = fptrunc float [[NEG_I]] to half1613// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01614// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11615// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21616// X86-NEXT:    store half [[UNPROMOTION2]], ptr [[RETVAL_IMAGP]], align 21617// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21618// X86-NEXT:    ret <2 x half> [[TMP0]]1619//1620_Float16 _Complex MinusOp_c(_Float16 _Complex a) {1621  return -a;1622}1623 1624// AVX-LABEL: @PlusOp_r(1625// AVX-NEXT:  entry:1626// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21627// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21628// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21629// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21630// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01631// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11632// AVX-NEXT:    store half [[TMP0]], ptr [[RETVAL_REALP]], align 21633// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21634// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21635// AVX-NEXT:    ret <2 x half> [[TMP1]]1636//1637// X86-LABEL: @PlusOp_r(1638// X86-NEXT:  entry:1639// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21640// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21641// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21642// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21643// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float1644// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half1645// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01646// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11647// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21648// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21649// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21650// X86-NEXT:    ret <2 x half> [[TMP1]]1651//1652_Float16 _Complex PlusOp_r(_Float16 a) {1653  return +a;1654}1655 1656// AVX-LABEL: @PlusOp_c(1657// AVX-NEXT:  entry:1658// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21659// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21660// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21661// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01662// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21663// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11664// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21665// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01666// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11667// AVX-NEXT:    store half [[A_REAL]], ptr [[RETVAL_REALP]], align 21668// AVX-NEXT:    store half [[A_IMAG]], ptr [[RETVAL_IMAGP]], align 21669// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21670// AVX-NEXT:    ret <2 x half> [[TMP0]]1671//1672// X86-LABEL: @PlusOp_c(1673// X86-NEXT:  entry:1674// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21675// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21676// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21677// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01678// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21679// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11680// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21681// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1682// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1683// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half1684// X86-NEXT:    [[UNPROMOTION2:%.*]] = fptrunc float [[EXT1]] to half1685// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01686// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11687// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21688// X86-NEXT:    store half [[UNPROMOTION2]], ptr [[RETVAL_IMAGP]], align 21689// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21690// X86-NEXT:    ret <2 x half> [[TMP0]]1691//1692_Float16 _Complex PlusOp_c(_Float16 _Complex a) {1693  return +a;1694}1695 1696// AVX-LABEL: @RealOp_r(1697// AVX-NEXT:  entry:1698// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21699// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21700// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21701// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21702// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01703// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11704// AVX-NEXT:    store half [[TMP0]], ptr [[RETVAL_REALP]], align 21705// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21706// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21707// AVX-NEXT:    ret <2 x half> [[TMP1]]1708//1709// X86-LABEL: @RealOp_r(1710// X86-NEXT:  entry:1711// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21712// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21713// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21714// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21715// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float1716// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half1717// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01718// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11719// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21720// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21721// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21722// X86-NEXT:    ret <2 x half> [[TMP1]]1723//1724_Float16 _Complex RealOp_r(_Float16 a) {1725  return +a;1726}1727 1728// AVX-LABEL: @RealOp_c(1729// AVX-NEXT:  entry:1730// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21731// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21732// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21733// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01734// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_REALP]], align 21735// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01736// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11737// AVX-NEXT:    store half [[TMP0]], ptr [[RETVAL_REALP]], align 21738// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21739// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21740// AVX-NEXT:    ret <2 x half> [[TMP1]]1741//1742// X86-LABEL: @RealOp_c(1743// X86-NEXT:  entry:1744// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21745// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21746// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21747// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01748// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21749// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1750// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half1751// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01752// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11753// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21754// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21755// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21756// X86-NEXT:    ret <2 x half> [[TMP0]]1757//1758_Float16 _Complex RealOp_c(_Float16 _Complex a) {1759  return __real a;1760}1761 1762// AVX-LABEL: @ImagOp_r(1763// AVX-NEXT:  entry:1764// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21765// AVX-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21766// AVX-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21767// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21768// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01769// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11770// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_REALP]], align 21771// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21772// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21773// AVX-NEXT:    ret <2 x half> [[TMP1]]1774//1775// X86-LABEL: @ImagOp_r(1776// X86-NEXT:  entry:1777// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21778// X86-NEXT:    [[A_ADDR:%.*]] = alloca half, align 21779// X86-NEXT:    store half [[A:%.*]], ptr [[A_ADDR]], align 21780// X86-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_ADDR]], align 21781// X86-NEXT:    [[EXT:%.*]] = fpext half [[TMP0]] to float1782// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01783// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11784// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_REALP]], align 21785// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21786// X86-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21787// X86-NEXT:    ret <2 x half> [[TMP1]]1788//1789_Float16 _Complex ImagOp_r(_Float16 a) {1790  return __imag a;1791}1792 1793// AVX-LABEL: @ImagOp_c(1794// AVX-NEXT:  entry:1795// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21796// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21797// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21798// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11799// AVX-NEXT:    [[TMP0:%.*]] = load half, ptr [[A_IMAGP]], align 21800// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01801// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11802// AVX-NEXT:    store half [[TMP0]], ptr [[RETVAL_REALP]], align 21803// AVX-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21804// AVX-NEXT:    [[TMP1:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21805// AVX-NEXT:    ret <2 x half> [[TMP1]]1806//1807// X86-LABEL: @ImagOp_c(1808// X86-NEXT:  entry:1809// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21810// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21811// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21812// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11813// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21814// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_IMAG]] to float1815// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[EXT]] to half1816// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01817// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11818// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21819// X86-NEXT:    store half 0xH0000, ptr [[RETVAL_IMAGP]], align 21820// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21821// X86-NEXT:    ret <2 x half> [[TMP0]]1822//1823_Float16 _Complex ImagOp_c(_Float16 _Complex a) {1824  return __imag a;1825}1826 1827// AVX-LABEL: @MinusOp_c_c(1828// AVX-NEXT:  entry:1829// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21830// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21831// AVX-NEXT:    [[C:%.*]] = alloca { half, half }, align 21832// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21833// AVX-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 21834// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01835// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21836// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11837// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21838// AVX-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01839// AVX-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 21840// AVX-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11841// AVX-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 21842// AVX-NEXT:    [[NEG_R:%.*]] = fneg half [[C_REAL]]1843// AVX-NEXT:    [[NEG_I:%.*]] = fneg half [[C_IMAG]]1844// AVX-NEXT:    [[ADD_R:%.*]] = fadd half [[A_REAL]], [[NEG_R]]1845// AVX-NEXT:    [[ADD_I:%.*]] = fadd half [[A_IMAG]], [[NEG_I]]1846// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01847// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11848// AVX-NEXT:    store half [[ADD_R]], ptr [[RETVAL_REALP]], align 21849// AVX-NEXT:    store half [[ADD_I]], ptr [[RETVAL_IMAGP]], align 21850// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21851// AVX-NEXT:    ret <2 x half> [[TMP0]]1852//1853// X86-LABEL: @MinusOp_c_c(1854// X86-NEXT:  entry:1855// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21856// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21857// X86-NEXT:    [[C:%.*]] = alloca { half, half }, align 21858// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21859// X86-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 21860// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01861// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21862// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11863// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21864// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1865// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1866// X86-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01867// X86-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 21868// X86-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11869// X86-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 21870// X86-NEXT:    [[EXT2:%.*]] = fpext half [[C_REAL]] to float1871// X86-NEXT:    [[EXT3:%.*]] = fpext half [[C_IMAG]] to float1872// X86-NEXT:    [[NEG_R:%.*]] = fneg float [[EXT2]]1873// X86-NEXT:    [[NEG_I:%.*]] = fneg float [[EXT3]]1874// X86-NEXT:    [[ADD_R:%.*]] = fadd float [[EXT]], [[NEG_R]]1875// X86-NEXT:    [[ADD_I:%.*]] = fadd float [[EXT1]], [[NEG_I]]1876// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[ADD_R]] to half1877// X86-NEXT:    [[UNPROMOTION4:%.*]] = fptrunc float [[ADD_I]] to half1878// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01879// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11880// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21881// X86-NEXT:    store half [[UNPROMOTION4]], ptr [[RETVAL_IMAGP]], align 21882// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21883// X86-NEXT:    ret <2 x half> [[TMP0]]1884//1885_Float16 _Complex MinusOp_c_c(_Float16 _Complex a, _Float16 _Complex c) {1886  return a + -c;1887}1888 1889// AVX-LABEL: @PlusOp_c_c(1890// AVX-NEXT:  entry:1891// AVX-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21892// AVX-NEXT:    [[A:%.*]] = alloca { half, half }, align 21893// AVX-NEXT:    [[C:%.*]] = alloca { half, half }, align 21894// AVX-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21895// AVX-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 21896// AVX-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01897// AVX-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21898// AVX-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11899// AVX-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21900// AVX-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01901// AVX-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 21902// AVX-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11903// AVX-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 21904// AVX-NEXT:    [[SUB_R:%.*]] = fsub half [[A_REAL]], [[C_REAL]]1905// AVX-NEXT:    [[SUB_I:%.*]] = fsub half [[A_IMAG]], [[C_IMAG]]1906// AVX-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01907// AVX-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11908// AVX-NEXT:    store half [[SUB_R]], ptr [[RETVAL_REALP]], align 21909// AVX-NEXT:    store half [[SUB_I]], ptr [[RETVAL_IMAGP]], align 21910// AVX-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21911// AVX-NEXT:    ret <2 x half> [[TMP0]]1912//1913// X86-LABEL: @PlusOp_c_c(1914// X86-NEXT:  entry:1915// X86-NEXT:    [[RETVAL:%.*]] = alloca { half, half }, align 21916// X86-NEXT:    [[A:%.*]] = alloca { half, half }, align 21917// X86-NEXT:    [[C:%.*]] = alloca { half, half }, align 21918// X86-NEXT:    store <2 x half> [[A_COERCE:%.*]], ptr [[A]], align 21919// X86-NEXT:    store <2 x half> [[C_COERCE:%.*]], ptr [[C]], align 21920// X86-NEXT:    [[A_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 01921// X86-NEXT:    [[A_REAL:%.*]] = load half, ptr [[A_REALP]], align 21922// X86-NEXT:    [[A_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[A]], i32 0, i32 11923// X86-NEXT:    [[A_IMAG:%.*]] = load half, ptr [[A_IMAGP]], align 21924// X86-NEXT:    [[EXT:%.*]] = fpext half [[A_REAL]] to float1925// X86-NEXT:    [[EXT1:%.*]] = fpext half [[A_IMAG]] to float1926// X86-NEXT:    [[C_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 01927// X86-NEXT:    [[C_REAL:%.*]] = load half, ptr [[C_REALP]], align 21928// X86-NEXT:    [[C_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[C]], i32 0, i32 11929// X86-NEXT:    [[C_IMAG:%.*]] = load half, ptr [[C_IMAGP]], align 21930// X86-NEXT:    [[EXT2:%.*]] = fpext half [[C_REAL]] to float1931// X86-NEXT:    [[EXT3:%.*]] = fpext half [[C_IMAG]] to float1932// X86-NEXT:    [[SUB_R:%.*]] = fsub float [[EXT]], [[EXT2]]1933// X86-NEXT:    [[SUB_I:%.*]] = fsub float [[EXT1]], [[EXT3]]1934// X86-NEXT:    [[UNPROMOTION:%.*]] = fptrunc float [[SUB_R]] to half1935// X86-NEXT:    [[UNPROMOTION4:%.*]] = fptrunc float [[SUB_I]] to half1936// X86-NEXT:    [[RETVAL_REALP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 01937// X86-NEXT:    [[RETVAL_IMAGP:%.*]] = getelementptr inbounds nuw { half, half }, ptr [[RETVAL]], i32 0, i32 11938// X86-NEXT:    store half [[UNPROMOTION]], ptr [[RETVAL_REALP]], align 21939// X86-NEXT:    store half [[UNPROMOTION4]], ptr [[RETVAL_IMAGP]], align 21940// X86-NEXT:    [[TMP0:%.*]] = load <2 x half>, ptr [[RETVAL]], align 21941// X86-NEXT:    ret <2 x half> [[TMP0]]1942//1943_Float16 _Complex PlusOp_c_c(_Float16 _Complex a, _Float16 _Complex c) {1944  return a - +c;1945}1946