2270 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple aarch64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,CHECK-CVT3; RUN: llc < %s -mtriple aarch64-unknown-unknown -mattr=+bf16 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-SD4; RUN: llc < %s -mtriple aarch64-unknown-unknown -mattr=+bf16,+fullfp16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-GI5 6; CHECK-GI: warning: Instruction selection used fallback path for test_fadd7; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fsub8; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fmul9; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fmadd10; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fdiv11; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_frem12; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_call13; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_call_flipped14; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_tailcall_flipped15; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_select_cc16; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_select_cc_f32_f1617; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_une18; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_ueq19; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_ugt20; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_uge21; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_ult22; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_ule23; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_uno24; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_one25; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_oeq26; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_ogt27; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_oge28; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_olt29; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_ole30; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fcmp_ord31; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fccmp32; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_br_cc33; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_i3234; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_i6435; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i3236; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i6437; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i3238; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i6439; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i3240; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i6441; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i32_fadd42; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32_fadd43; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fptrunc_float44; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fptrunc_double45; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fpext_float46; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fpext_double47; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sqrt48; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_powi49; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sin50; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_cos51; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_tan52; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_acos53; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_asin54; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_atan55; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_atan256; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_cosh57; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sinh58; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_tanh59; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_pow60; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_exp61; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_exp262; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_log63; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_log1064; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_log265; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fma66; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fabs67; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_minnum68; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_maxnum69; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_copysign70; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_copysign_f3271; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_copysign_f6472; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_copysign_extended73; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_floor74; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_ceil75; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_trunc76; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_rint77; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_nearbyint78; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_round79; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_roundeven80; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_fmuladd81 82define bfloat @test_fadd(bfloat %a, bfloat %b) #0 {83; CHECK-CVT-LABEL: test_fadd:84; CHECK-CVT: // %bb.0:85; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d186; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d087; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff88; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #1689; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #1690; CHECK-CVT-NEXT: fadd s0, s0, s191; CHECK-CVT-NEXT: fmov w9, s092; CHECK-CVT-NEXT: ubfx w10, w9, #16, #193; CHECK-CVT-NEXT: add w8, w9, w894; CHECK-CVT-NEXT: add w8, w10, w895; CHECK-CVT-NEXT: lsr w8, w8, #1696; CHECK-CVT-NEXT: fmov s0, w897; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s098; CHECK-CVT-NEXT: ret99;100; CHECK-BF16-LABEL: test_fadd:101; CHECK-BF16: // %bb.0:102; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d1103; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d0104; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #16105; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #16106; CHECK-BF16-NEXT: fadd s0, s0, s1107; CHECK-BF16-NEXT: bfcvt h0, s0108; CHECK-BF16-NEXT: ret109 %r = fadd bfloat %a, %b110 ret bfloat %r111}112 113define bfloat @test_fsub(bfloat %a, bfloat %b) #0 {114; CHECK-CVT-LABEL: test_fsub:115; CHECK-CVT: // %bb.0:116; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d1117; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d0118; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff119; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #16120; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #16121; CHECK-CVT-NEXT: fsub s0, s0, s1122; CHECK-CVT-NEXT: fmov w9, s0123; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1124; CHECK-CVT-NEXT: add w8, w9, w8125; CHECK-CVT-NEXT: add w8, w10, w8126; CHECK-CVT-NEXT: lsr w8, w8, #16127; CHECK-CVT-NEXT: fmov s0, w8128; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0129; CHECK-CVT-NEXT: ret130;131; CHECK-BF16-LABEL: test_fsub:132; CHECK-BF16: // %bb.0:133; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d1134; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d0135; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #16136; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #16137; CHECK-BF16-NEXT: fsub s0, s0, s1138; CHECK-BF16-NEXT: bfcvt h0, s0139; CHECK-BF16-NEXT: ret140 %r = fsub bfloat %a, %b141 ret bfloat %r142}143 144define bfloat @test_fmul(bfloat %a, bfloat %b) #0 {145; CHECK-CVT-LABEL: test_fmul:146; CHECK-CVT: // %bb.0:147; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d1148; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d0149; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff150; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #16151; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #16152; CHECK-CVT-NEXT: fmul s0, s0, s1153; CHECK-CVT-NEXT: fmov w9, s0154; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1155; CHECK-CVT-NEXT: add w8, w9, w8156; CHECK-CVT-NEXT: add w8, w10, w8157; CHECK-CVT-NEXT: lsr w8, w8, #16158; CHECK-CVT-NEXT: fmov s0, w8159; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0160; CHECK-CVT-NEXT: ret161;162; CHECK-BF16-LABEL: test_fmul:163; CHECK-BF16: // %bb.0:164; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d1165; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d0166; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #16167; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #16168; CHECK-BF16-NEXT: fmul s0, s0, s1169; CHECK-BF16-NEXT: bfcvt h0, s0170; CHECK-BF16-NEXT: ret171 %r = fmul bfloat %a, %b172 ret bfloat %r173}174 175define bfloat @test_fmadd(bfloat %a, bfloat %b, bfloat %c) #0 {176; CHECK-CVT-LABEL: test_fmadd:177; CHECK-CVT: // %bb.0:178; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d1179; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d0180; CHECK-CVT-NEXT: mov w10, #32767 // =0x7fff181; CHECK-CVT-NEXT: // kill: def $h2 killed $h2 def $d2182; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #16183; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #16184; CHECK-CVT-NEXT: fmul s0, s0, s1185; CHECK-CVT-NEXT: shll v1.4s, v2.4h, #16186; CHECK-CVT-NEXT: fmov w8, s0187; CHECK-CVT-NEXT: ubfx w9, w8, #16, #1188; CHECK-CVT-NEXT: add w8, w8, w10189; CHECK-CVT-NEXT: add w8, w9, w8190; CHECK-CVT-NEXT: lsr w8, w8, #16191; CHECK-CVT-NEXT: fmov s0, w8192; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #16193; CHECK-CVT-NEXT: fadd s0, s0, s1194; CHECK-CVT-NEXT: fmov w8, s0195; CHECK-CVT-NEXT: ubfx w9, w8, #16, #1196; CHECK-CVT-NEXT: add w8, w8, w10197; CHECK-CVT-NEXT: add w8, w9, w8198; CHECK-CVT-NEXT: lsr w8, w8, #16199; CHECK-CVT-NEXT: fmov s0, w8200; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0201; CHECK-CVT-NEXT: ret202;203; CHECK-BF16-LABEL: test_fmadd:204; CHECK-BF16: // %bb.0:205; CHECK-BF16-NEXT: // kill: def $h2 killed $h2 def $d2206; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d1207; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d0208; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #16209; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #16210; CHECK-BF16-NEXT: shll v2.4s, v2.4h, #16211; CHECK-BF16-NEXT: fmadd s0, s0, s1, s2212; CHECK-BF16-NEXT: bfcvt h0, s0213; CHECK-BF16-NEXT: ret214 %mul = fmul fast bfloat %a, %b215 %r = fadd fast bfloat %mul, %c216 ret bfloat %r217}218 219define bfloat @test_fdiv(bfloat %a, bfloat %b) #0 {220; CHECK-CVT-LABEL: test_fdiv:221; CHECK-CVT: // %bb.0:222; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d1223; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d0224; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff225; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #16226; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #16227; CHECK-CVT-NEXT: fdiv s0, s0, s1228; CHECK-CVT-NEXT: fmov w9, s0229; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1230; CHECK-CVT-NEXT: add w8, w9, w8231; CHECK-CVT-NEXT: add w8, w10, w8232; CHECK-CVT-NEXT: lsr w8, w8, #16233; CHECK-CVT-NEXT: fmov s0, w8234; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0235; CHECK-CVT-NEXT: ret236;237; CHECK-BF16-LABEL: test_fdiv:238; CHECK-BF16: // %bb.0:239; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d1240; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d0241; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #16242; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #16243; CHECK-BF16-NEXT: fdiv s0, s0, s1244; CHECK-BF16-NEXT: bfcvt h0, s0245; CHECK-BF16-NEXT: ret246 %r = fdiv bfloat %a, %b247 ret bfloat %r248}249 250define bfloat @test_frem(bfloat %a, bfloat %b) #0 {251; CHECK-CVT-LABEL: test_frem:252; CHECK-CVT: // %bb.0:253; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill254; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d1255; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d0256; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #16257; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #16258; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q0259; CHECK-CVT-NEXT: // kill: def $s1 killed $s1 killed $q1260; CHECK-CVT-NEXT: bl fmodf261; CHECK-CVT-NEXT: fmov w9, s0262; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff263; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1264; CHECK-CVT-NEXT: add w8, w9, w8265; CHECK-CVT-NEXT: add w8, w10, w8266; CHECK-CVT-NEXT: lsr w8, w8, #16267; CHECK-CVT-NEXT: fmov s0, w8268; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0269; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload270; CHECK-CVT-NEXT: ret271;272; CHECK-BF16-LABEL: test_frem:273; CHECK-BF16: // %bb.0:274; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill275; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d1276; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d0277; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #16278; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #16279; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q0280; CHECK-BF16-NEXT: // kill: def $s1 killed $s1 killed $q1281; CHECK-BF16-NEXT: bl fmodf282; CHECK-BF16-NEXT: bfcvt h0, s0283; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload284; CHECK-BF16-NEXT: ret285 %r = frem bfloat %a, %b286 ret bfloat %r287}288 289define void @test_store(bfloat %a, ptr %b) #0 {290; CHECK-LABEL: test_store:291; CHECK: // %bb.0:292; CHECK-NEXT: str h0, [x0]293; CHECK-NEXT: ret294 store bfloat %a, ptr %b295 ret void296}297 298define bfloat @test_load(ptr %a) #0 {299; CHECK-LABEL: test_load:300; CHECK: // %bb.0:301; CHECK-NEXT: ldr h0, [x0]302; CHECK-NEXT: ret303 %r = load bfloat, ptr %a304 ret bfloat %r305}306 307declare bfloat @test_callee(bfloat %a, bfloat %b) #0308 309define bfloat @test_call(bfloat %a, bfloat %b) #0 {310; CHECK-LABEL: test_call:311; CHECK: // %bb.0:312; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill313; CHECK-NEXT: bl test_callee314; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload315; CHECK-NEXT: ret316 %r = call bfloat @test_callee(bfloat %a, bfloat %b)317 ret bfloat %r318}319 320define bfloat @test_call_flipped(bfloat %a, bfloat %b) #0 {321; CHECK-LABEL: test_call_flipped:322; CHECK: // %bb.0:323; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill324; CHECK-NEXT: fmov s2, s0325; CHECK-NEXT: fmov s0, s1326; CHECK-NEXT: fmov s1, s2327; CHECK-NEXT: bl test_callee328; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload329; CHECK-NEXT: ret330 %r = call bfloat @test_callee(bfloat %b, bfloat %a)331 ret bfloat %r332}333 334define bfloat @test_tailcall_flipped(bfloat %a, bfloat %b) #0 {335; CHECK-LABEL: test_tailcall_flipped:336; CHECK: // %bb.0:337; CHECK-NEXT: fmov s2, s0338; CHECK-NEXT: fmov s0, s1339; CHECK-NEXT: fmov s1, s2340; CHECK-NEXT: b test_callee341 %r = tail call bfloat @test_callee(bfloat %b, bfloat %a)342 ret bfloat %r343}344 345define bfloat @test_select(bfloat %a, bfloat %b, i1 zeroext %c) #0 {346; CHECK-CVT-LABEL: test_select:347; CHECK-CVT: // %bb.0:348; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0349; CHECK-CVT-NEXT: cmp w0, #0350; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1351; CHECK-CVT-NEXT: fcsel s0, s0, s1, ne352; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0353; CHECK-CVT-NEXT: ret354;355; CHECK-SD-LABEL: test_select:356; CHECK-SD: // %bb.0:357; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $s0358; CHECK-SD-NEXT: cmp w0, #0359; CHECK-SD-NEXT: // kill: def $h1 killed $h1 def $s1360; CHECK-SD-NEXT: fcsel s0, s0, s1, ne361; CHECK-SD-NEXT: // kill: def $h0 killed $h0 killed $s0362; CHECK-SD-NEXT: ret363;364; CHECK-GI-LABEL: test_select:365; CHECK-GI: // %bb.0:366; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $s0367; CHECK-GI-NEXT: // kill: def $h1 killed $h1 def $s1368; CHECK-GI-NEXT: fmov w8, s0369; CHECK-GI-NEXT: fmov w9, s1370; CHECK-GI-NEXT: tst w0, #0x1371; CHECK-GI-NEXT: csel w8, w8, w9, ne372; CHECK-GI-NEXT: fmov s0, w8373; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $s0374; CHECK-GI-NEXT: ret375 %r = select i1 %c, bfloat %a, bfloat %b376 ret bfloat %r377}378 379define bfloat @test_select_cc(bfloat %a, bfloat %b, bfloat %c, bfloat %d) #0 {380; CHECK-CVT-LABEL: test_select_cc:381; CHECK-CVT: // %bb.0:382; CHECK-CVT-NEXT: // kill: def $h3 killed $h3 def $d3383; CHECK-CVT-NEXT: // kill: def $h2 killed $h2 def $d2384; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0385; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1386; CHECK-CVT-NEXT: shll v3.4s, v3.4h, #16387; CHECK-CVT-NEXT: shll v2.4s, v2.4h, #16388; CHECK-CVT-NEXT: fcmp s2, s3389; CHECK-CVT-NEXT: fcsel s0, s0, s1, ne390; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0391; CHECK-CVT-NEXT: ret392;393; CHECK-SD-LABEL: test_select_cc:394; CHECK-SD: // %bb.0:395; CHECK-SD-NEXT: // kill: def $h3 killed $h3 def $d3396; CHECK-SD-NEXT: // kill: def $h2 killed $h2 def $d2397; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $s0398; CHECK-SD-NEXT: // kill: def $h1 killed $h1 def $s1399; CHECK-SD-NEXT: shll v3.4s, v3.4h, #16400; CHECK-SD-NEXT: shll v2.4s, v2.4h, #16401; CHECK-SD-NEXT: fcmp s2, s3402; CHECK-SD-NEXT: fcsel s0, s0, s1, ne403; CHECK-SD-NEXT: // kill: def $h0 killed $h0 killed $s0404; CHECK-SD-NEXT: ret405;406; CHECK-GI-LABEL: test_select_cc:407; CHECK-GI: // %bb.0:408; CHECK-GI-NEXT: // kill: def $h3 killed $h3 def $d3409; CHECK-GI-NEXT: // kill: def $h2 killed $h2 def $d2410; CHECK-GI-NEXT: shll v3.4s, v3.4h, #16411; CHECK-GI-NEXT: shll v2.4s, v2.4h, #16412; CHECK-GI-NEXT: fcmp s2, s3413; CHECK-GI-NEXT: fcsel h0, h0, h1, ne414; CHECK-GI-NEXT: ret415 %cc = fcmp une bfloat %c, %d416 %r = select i1 %cc, bfloat %a, bfloat %b417 ret bfloat %r418}419 420define float @test_select_cc_f32_f16(float %a, float %b, bfloat %c, bfloat %d) #0 {421; CHECK-LABEL: test_select_cc_f32_f16:422; CHECK: // %bb.0:423; CHECK-NEXT: // kill: def $h3 killed $h3 def $d3424; CHECK-NEXT: // kill: def $h2 killed $h2 def $d2425; CHECK-NEXT: shll v3.4s, v3.4h, #16426; CHECK-NEXT: shll v2.4s, v2.4h, #16427; CHECK-NEXT: fcmp s2, s3428; CHECK-NEXT: fcsel s0, s0, s1, ne429; CHECK-NEXT: ret430 %cc = fcmp une bfloat %c, %d431 %r = select i1 %cc, float %a, float %b432 ret float %r433}434 435define bfloat @test_select_cc_f16_f32(bfloat %a, bfloat %b, float %c, float %d) #0 {436; CHECK-CVT-LABEL: test_select_cc_f16_f32:437; CHECK-CVT: // %bb.0:438; CHECK-CVT-NEXT: fcmp s2, s3439; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $s0440; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $s1441; CHECK-CVT-NEXT: fcsel s0, s0, s1, ne442; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0443; CHECK-CVT-NEXT: ret444;445; CHECK-SD-LABEL: test_select_cc_f16_f32:446; CHECK-SD: // %bb.0:447; CHECK-SD-NEXT: fcmp s2, s3448; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $s0449; CHECK-SD-NEXT: // kill: def $h1 killed $h1 def $s1450; CHECK-SD-NEXT: fcsel s0, s0, s1, ne451; CHECK-SD-NEXT: // kill: def $h0 killed $h0 killed $s0452; CHECK-SD-NEXT: ret453;454; CHECK-GI-LABEL: test_select_cc_f16_f32:455; CHECK-GI: // %bb.0:456; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $s0457; CHECK-GI-NEXT: // kill: def $h1 killed $h1 def $s1458; CHECK-GI-NEXT: fcmp s2, s3459; CHECK-GI-NEXT: fmov w8, s0460; CHECK-GI-NEXT: fmov w9, s1461; CHECK-GI-NEXT: csel w8, w8, w9, ne462; CHECK-GI-NEXT: fmov s0, w8463; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $s0464; CHECK-GI-NEXT: ret465 %cc = fcmp une float %c, %d466 %r = select i1 %cc, bfloat %a, bfloat %b467 ret bfloat %r468}469 470define i1 @test_fcmp_une(bfloat %a, bfloat %b) #0 {471; CHECK-LABEL: test_fcmp_une:472; CHECK: // %bb.0:473; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1474; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0475; CHECK-NEXT: shll v1.4s, v1.4h, #16476; CHECK-NEXT: shll v0.4s, v0.4h, #16477; CHECK-NEXT: fcmp s0, s1478; CHECK-NEXT: cset w0, ne479; CHECK-NEXT: ret480 %r = fcmp une bfloat %a, %b481 ret i1 %r482}483 484define i1 @test_fcmp_ueq(bfloat %a, bfloat %b) #0 {485; CHECK-LABEL: test_fcmp_ueq:486; CHECK: // %bb.0:487; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1488; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0489; CHECK-NEXT: shll v1.4s, v1.4h, #16490; CHECK-NEXT: shll v0.4s, v0.4h, #16491; CHECK-NEXT: fcmp s0, s1492; CHECK-NEXT: cset w8, eq493; CHECK-NEXT: csinc w0, w8, wzr, vc494; CHECK-NEXT: ret495 %r = fcmp ueq bfloat %a, %b496 ret i1 %r497}498 499define i1 @test_fcmp_ugt(bfloat %a, bfloat %b) #0 {500; CHECK-LABEL: test_fcmp_ugt:501; CHECK: // %bb.0:502; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1503; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0504; CHECK-NEXT: shll v1.4s, v1.4h, #16505; CHECK-NEXT: shll v0.4s, v0.4h, #16506; CHECK-NEXT: fcmp s0, s1507; CHECK-NEXT: cset w0, hi508; CHECK-NEXT: ret509 %r = fcmp ugt bfloat %a, %b510 ret i1 %r511}512 513define i1 @test_fcmp_uge(bfloat %a, bfloat %b) #0 {514; CHECK-LABEL: test_fcmp_uge:515; CHECK: // %bb.0:516; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1517; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0518; CHECK-NEXT: shll v1.4s, v1.4h, #16519; CHECK-NEXT: shll v0.4s, v0.4h, #16520; CHECK-NEXT: fcmp s0, s1521; CHECK-NEXT: cset w0, pl522; CHECK-NEXT: ret523 %r = fcmp uge bfloat %a, %b524 ret i1 %r525}526 527define i1 @test_fcmp_ult(bfloat %a, bfloat %b) #0 {528; CHECK-LABEL: test_fcmp_ult:529; CHECK: // %bb.0:530; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1531; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0532; CHECK-NEXT: shll v1.4s, v1.4h, #16533; CHECK-NEXT: shll v0.4s, v0.4h, #16534; CHECK-NEXT: fcmp s0, s1535; CHECK-NEXT: cset w0, lt536; CHECK-NEXT: ret537 %r = fcmp ult bfloat %a, %b538 ret i1 %r539}540 541define i1 @test_fcmp_ule(bfloat %a, bfloat %b) #0 {542; CHECK-LABEL: test_fcmp_ule:543; CHECK: // %bb.0:544; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1545; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0546; CHECK-NEXT: shll v1.4s, v1.4h, #16547; CHECK-NEXT: shll v0.4s, v0.4h, #16548; CHECK-NEXT: fcmp s0, s1549; CHECK-NEXT: cset w0, le550; CHECK-NEXT: ret551 %r = fcmp ule bfloat %a, %b552 ret i1 %r553}554 555define i1 @test_fcmp_uno(bfloat %a, bfloat %b) #0 {556; CHECK-LABEL: test_fcmp_uno:557; CHECK: // %bb.0:558; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1559; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0560; CHECK-NEXT: shll v1.4s, v1.4h, #16561; CHECK-NEXT: shll v0.4s, v0.4h, #16562; CHECK-NEXT: fcmp s0, s1563; CHECK-NEXT: cset w0, vs564; CHECK-NEXT: ret565 %r = fcmp uno bfloat %a, %b566 ret i1 %r567}568 569define i1 @test_fcmp_one(bfloat %a, bfloat %b) #0 {570; CHECK-LABEL: test_fcmp_one:571; CHECK: // %bb.0:572; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1573; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0574; CHECK-NEXT: shll v1.4s, v1.4h, #16575; CHECK-NEXT: shll v0.4s, v0.4h, #16576; CHECK-NEXT: fcmp s0, s1577; CHECK-NEXT: cset w8, mi578; CHECK-NEXT: csinc w0, w8, wzr, le579; CHECK-NEXT: ret580 %r = fcmp one bfloat %a, %b581 ret i1 %r582}583 584define i1 @test_fcmp_oeq(bfloat %a, bfloat %b) #0 {585; CHECK-LABEL: test_fcmp_oeq:586; CHECK: // %bb.0:587; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1588; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0589; CHECK-NEXT: shll v1.4s, v1.4h, #16590; CHECK-NEXT: shll v0.4s, v0.4h, #16591; CHECK-NEXT: fcmp s0, s1592; CHECK-NEXT: cset w0, eq593; CHECK-NEXT: ret594 %r = fcmp oeq bfloat %a, %b595 ret i1 %r596}597 598define i1 @test_fcmp_ogt(bfloat %a, bfloat %b) #0 {599; CHECK-LABEL: test_fcmp_ogt:600; CHECK: // %bb.0:601; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1602; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0603; CHECK-NEXT: shll v1.4s, v1.4h, #16604; CHECK-NEXT: shll v0.4s, v0.4h, #16605; CHECK-NEXT: fcmp s0, s1606; CHECK-NEXT: cset w0, gt607; CHECK-NEXT: ret608 %r = fcmp ogt bfloat %a, %b609 ret i1 %r610}611 612define i1 @test_fcmp_oge(bfloat %a, bfloat %b) #0 {613; CHECK-LABEL: test_fcmp_oge:614; CHECK: // %bb.0:615; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1616; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0617; CHECK-NEXT: shll v1.4s, v1.4h, #16618; CHECK-NEXT: shll v0.4s, v0.4h, #16619; CHECK-NEXT: fcmp s0, s1620; CHECK-NEXT: cset w0, ge621; CHECK-NEXT: ret622 %r = fcmp oge bfloat %a, %b623 ret i1 %r624}625 626define i1 @test_fcmp_olt(bfloat %a, bfloat %b) #0 {627; CHECK-LABEL: test_fcmp_olt:628; CHECK: // %bb.0:629; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1630; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0631; CHECK-NEXT: shll v1.4s, v1.4h, #16632; CHECK-NEXT: shll v0.4s, v0.4h, #16633; CHECK-NEXT: fcmp s0, s1634; CHECK-NEXT: cset w0, mi635; CHECK-NEXT: ret636 %r = fcmp olt bfloat %a, %b637 ret i1 %r638}639 640define i1 @test_fcmp_ole(bfloat %a, bfloat %b) #0 {641; CHECK-LABEL: test_fcmp_ole:642; CHECK: // %bb.0:643; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1644; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0645; CHECK-NEXT: shll v1.4s, v1.4h, #16646; CHECK-NEXT: shll v0.4s, v0.4h, #16647; CHECK-NEXT: fcmp s0, s1648; CHECK-NEXT: cset w0, ls649; CHECK-NEXT: ret650 %r = fcmp ole bfloat %a, %b651 ret i1 %r652}653 654define i1 @test_fcmp_ord(bfloat %a, bfloat %b) #0 {655; CHECK-LABEL: test_fcmp_ord:656; CHECK: // %bb.0:657; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1658; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0659; CHECK-NEXT: shll v1.4s, v1.4h, #16660; CHECK-NEXT: shll v0.4s, v0.4h, #16661; CHECK-NEXT: fcmp s0, s1662; CHECK-NEXT: cset w0, vc663; CHECK-NEXT: ret664 %r = fcmp ord bfloat %a, %b665 ret i1 %r666}667 668define void @test_fccmp(bfloat %in, ptr %out) {669; CHECK-CVT-LABEL: test_fccmp:670; CHECK-CVT: // %bb.0:671; CHECK-CVT-NEXT: movi v1.2s, #69, lsl #24672; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d0673; CHECK-CVT-NEXT: shll v2.4s, v0.4h, #16674; CHECK-CVT-NEXT: adrp x8, .LCPI29_0675; CHECK-CVT-NEXT: movi v3.2s, #72, lsl #24676; CHECK-CVT-NEXT: fcmp s2, s1677; CHECK-CVT-NEXT: ldr h1, [x8, :lo12:.LCPI29_0]678; CHECK-CVT-NEXT: fccmp s2, s3, #4, mi679; CHECK-CVT-NEXT: fcsel s0, s0, s1, gt680; CHECK-CVT-NEXT: str h0, [x0]681; CHECK-CVT-NEXT: ret682;683; CHECK-SD-LABEL: test_fccmp:684; CHECK-SD: // %bb.0:685; CHECK-SD-NEXT: movi v1.2s, #69, lsl #24686; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $d0687; CHECK-SD-NEXT: shll v2.4s, v0.4h, #16688; CHECK-SD-NEXT: adrp x8, .LCPI29_0689; CHECK-SD-NEXT: movi v3.2s, #72, lsl #24690; CHECK-SD-NEXT: fcmp s2, s1691; CHECK-SD-NEXT: ldr h1, [x8, :lo12:.LCPI29_0]692; CHECK-SD-NEXT: fccmp s2, s3, #4, mi693; CHECK-SD-NEXT: fcsel s0, s0, s1, gt694; CHECK-SD-NEXT: str h0, [x0]695; CHECK-SD-NEXT: ret696;697; CHECK-GI-LABEL: test_fccmp:698; CHECK-GI: // %bb.0:699; CHECK-GI-NEXT: movi v1.2s, #69, lsl #24700; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $d0701; CHECK-GI-NEXT: shll v2.4s, v0.4h, #16702; CHECK-GI-NEXT: movi v3.2s, #72, lsl #24703; CHECK-GI-NEXT: fcmp s2, s1704; CHECK-GI-NEXT: fmov h1, #5.00000000705; CHECK-GI-NEXT: fccmp s2, s3, #4, mi706; CHECK-GI-NEXT: fcsel h0, h0, h1, gt707; CHECK-GI-NEXT: str h0, [x0]708; CHECK-GI-NEXT: ret709 %cmp1 = fcmp ogt bfloat %in, 0xR4800710 %cmp2 = fcmp olt bfloat %in, 0xR4500711 %cond = and i1 %cmp1, %cmp2712 %result = select i1 %cond, bfloat %in, bfloat 0xR4500713 store bfloat %result, ptr %out714 ret void715}716 717define void @test_br_cc(bfloat %a, bfloat %b, ptr %p1, ptr %p2) #0 {718; CHECK-LABEL: test_br_cc:719; CHECK: // %bb.0: // %common.ret720; CHECK-NEXT: // kill: def $h1 killed $h1 def $d1721; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0722; CHECK-NEXT: shll v1.4s, v1.4h, #16723; CHECK-NEXT: shll v0.4s, v0.4h, #16724; CHECK-NEXT: fcmp s0, s1725; CHECK-NEXT: csel x8, x0, x1, pl726; CHECK-NEXT: str wzr, [x8]727; CHECK-NEXT: ret728 %c = fcmp uge bfloat %a, %b729 br i1 %c, label %then, label %else730then:731 store i32 0, ptr %p1732 ret void733else:734 store i32 0, ptr %p2735 ret void736}737 738define bfloat @test_phi(ptr %p1) #0 {739; CHECK-LABEL: test_phi:740; CHECK: // %bb.0: // %entry741; CHECK-NEXT: stp d9, d8, [sp, #-32]! // 16-byte Folded Spill742; CHECK-NEXT: ldr h9, [x0]743; CHECK-NEXT: stp x30, x19, [sp, #16] // 16-byte Folded Spill744; CHECK-NEXT: mov x19, x0745; CHECK-NEXT: .LBB31_1: // %loop746; CHECK-NEXT: // =>This Inner Loop Header: Depth=1747; CHECK-NEXT: fmov s8, s9748; CHECK-NEXT: ldr h9, [x19]749; CHECK-NEXT: mov x0, x19750; CHECK-NEXT: bl test_dummy751; CHECK-NEXT: tbnz w0, #0, .LBB31_1752; CHECK-NEXT: // %bb.2: // %return753; CHECK-NEXT: ldp x30, x19, [sp, #16] // 16-byte Folded Reload754; CHECK-NEXT: fmov s0, s8755; CHECK-NEXT: ldp d9, d8, [sp], #32 // 16-byte Folded Reload756; CHECK-NEXT: ret757entry:758 %a = load bfloat, ptr %p1759 br label %loop760loop:761 %r = phi bfloat [%a, %entry], [%b, %loop]762 %b = load bfloat, ptr %p1763 %c = call i1 @test_dummy(ptr %p1)764 br i1 %c, label %loop, label %return765return:766 ret bfloat %r767}768 769declare i1 @test_dummy(ptr %p1) #0770 771define i32 @test_fptosi_i32(bfloat %a) #0 {772; CHECK-LABEL: test_fptosi_i32:773; CHECK: // %bb.0:774; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0775; CHECK-NEXT: shll v0.4s, v0.4h, #16776; CHECK-NEXT: fcvtzs w0, s0777; CHECK-NEXT: ret778 %r = fptosi bfloat %a to i32779 ret i32 %r780}781 782define i64 @test_fptosi_i64(bfloat %a) #0 {783; CHECK-LABEL: test_fptosi_i64:784; CHECK: // %bb.0:785; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0786; CHECK-NEXT: shll v0.4s, v0.4h, #16787; CHECK-NEXT: fcvtzs x0, s0788; CHECK-NEXT: ret789 %r = fptosi bfloat %a to i64790 ret i64 %r791}792 793define i32 @test_fptoui_i32(bfloat %a) #0 {794; CHECK-LABEL: test_fptoui_i32:795; CHECK: // %bb.0:796; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0797; CHECK-NEXT: shll v0.4s, v0.4h, #16798; CHECK-NEXT: fcvtzu w0, s0799; CHECK-NEXT: ret800 %r = fptoui bfloat %a to i32801 ret i32 %r802}803 804define i64 @test_fptoui_i64(bfloat %a) #0 {805; CHECK-LABEL: test_fptoui_i64:806; CHECK: // %bb.0:807; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0808; CHECK-NEXT: shll v0.4s, v0.4h, #16809; CHECK-NEXT: fcvtzu x0, s0810; CHECK-NEXT: ret811 %r = fptoui bfloat %a to i64812 ret i64 %r813}814 815define bfloat @test_uitofp_i32(i32 %a) #0 {816; CHECK-CVT-LABEL: test_uitofp_i32:817; CHECK-CVT: // %bb.0:818; CHECK-CVT-NEXT: ucvtf d0, w0819; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff820; CHECK-CVT-NEXT: fcvtxn s0, d0821; CHECK-CVT-NEXT: fmov w9, s0822; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1823; CHECK-CVT-NEXT: add w8, w9, w8824; CHECK-CVT-NEXT: add w8, w10, w8825; CHECK-CVT-NEXT: lsr w8, w8, #16826; CHECK-CVT-NEXT: fmov s0, w8827; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0828; CHECK-CVT-NEXT: ret829;830; CHECK-BF16-LABEL: test_uitofp_i32:831; CHECK-BF16: // %bb.0:832; CHECK-BF16-NEXT: ucvtf d0, w0833; CHECK-BF16-NEXT: fcvtxn s0, d0834; CHECK-BF16-NEXT: bfcvt h0, s0835; CHECK-BF16-NEXT: ret836 %r = uitofp i32 %a to bfloat837 ret bfloat %r838}839 840define bfloat @test_uitofp_i64(i64 %a) #0 {841; CHECK-CVT-LABEL: test_uitofp_i64:842; CHECK-CVT: // %bb.0:843; CHECK-CVT-NEXT: lsr x9, x0, #53844; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff845; CHECK-CVT-NEXT: cmp x9, #0846; CHECK-CVT-NEXT: and x9, x0, #0xfffffffffffff000847; CHECK-CVT-NEXT: csel x9, x9, x0, ne848; CHECK-CVT-NEXT: ucvtf d0, x9849; CHECK-CVT-NEXT: cset w9, ne850; CHECK-CVT-NEXT: tst x0, #0xfff851; CHECK-CVT-NEXT: csel w9, wzr, w9, eq852; CHECK-CVT-NEXT: fmov x10, d0853; CHECK-CVT-NEXT: orr x9, x10, x9854; CHECK-CVT-NEXT: fmov d0, x9855; CHECK-CVT-NEXT: fcvtxn s0, d0856; CHECK-CVT-NEXT: fmov w9, s0857; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1858; CHECK-CVT-NEXT: add w8, w9, w8859; CHECK-CVT-NEXT: add w8, w10, w8860; CHECK-CVT-NEXT: lsr w8, w8, #16861; CHECK-CVT-NEXT: fmov s0, w8862; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0863; CHECK-CVT-NEXT: ret864;865; CHECK-BF16-LABEL: test_uitofp_i64:866; CHECK-BF16: // %bb.0:867; CHECK-BF16-NEXT: lsr x8, x0, #53868; CHECK-BF16-NEXT: and x9, x0, #0xfffffffffffff000869; CHECK-BF16-NEXT: cmp x8, #0870; CHECK-BF16-NEXT: csel x8, x9, x0, ne871; CHECK-BF16-NEXT: ucvtf d0, x8872; CHECK-BF16-NEXT: cset w8, ne873; CHECK-BF16-NEXT: tst x0, #0xfff874; CHECK-BF16-NEXT: csel w8, wzr, w8, eq875; CHECK-BF16-NEXT: fmov x9, d0876; CHECK-BF16-NEXT: orr x8, x9, x8877; CHECK-BF16-NEXT: fmov d0, x8878; CHECK-BF16-NEXT: fcvtxn s0, d0879; CHECK-BF16-NEXT: bfcvt h0, s0880; CHECK-BF16-NEXT: ret881 %r = uitofp i64 %a to bfloat882 ret bfloat %r883}884 885define bfloat @test_sitofp_i32(i32 %a) #0 {886; CHECK-CVT-LABEL: test_sitofp_i32:887; CHECK-CVT: // %bb.0:888; CHECK-CVT-NEXT: scvtf d0, w0889; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff890; CHECK-CVT-NEXT: fcvtxn s0, d0891; CHECK-CVT-NEXT: fmov w9, s0892; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1893; CHECK-CVT-NEXT: add w8, w9, w8894; CHECK-CVT-NEXT: add w8, w10, w8895; CHECK-CVT-NEXT: lsr w8, w8, #16896; CHECK-CVT-NEXT: fmov s0, w8897; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0898; CHECK-CVT-NEXT: ret899;900; CHECK-BF16-LABEL: test_sitofp_i32:901; CHECK-BF16: // %bb.0:902; CHECK-BF16-NEXT: scvtf d0, w0903; CHECK-BF16-NEXT: fcvtxn s0, d0904; CHECK-BF16-NEXT: bfcvt h0, s0905; CHECK-BF16-NEXT: ret906 %r = sitofp i32 %a to bfloat907 ret bfloat %r908}909 910define bfloat @test_sitofp_i64(i64 %a) #0 {911; CHECK-CVT-LABEL: test_sitofp_i64:912; CHECK-CVT: // %bb.0:913; CHECK-CVT-NEXT: cmp x0, #0914; CHECK-CVT-NEXT: and x11, x0, #0x8000000000000000915; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff916; CHECK-CVT-NEXT: cneg x9, x0, mi917; CHECK-CVT-NEXT: lsr x10, x9, #53918; CHECK-CVT-NEXT: cmp x10, #0919; CHECK-CVT-NEXT: and x10, x9, #0xfffffffffffff000920; CHECK-CVT-NEXT: csel x10, x10, x9, ne921; CHECK-CVT-NEXT: scvtf d0, x10922; CHECK-CVT-NEXT: cset w10, ne923; CHECK-CVT-NEXT: tst x9, #0xfff924; CHECK-CVT-NEXT: csel w10, wzr, w10, eq925; CHECK-CVT-NEXT: fmov x9, d0926; CHECK-CVT-NEXT: orr x9, x9, x11927; CHECK-CVT-NEXT: orr x9, x9, x10928; CHECK-CVT-NEXT: fmov d0, x9929; CHECK-CVT-NEXT: fcvtxn s0, d0930; CHECK-CVT-NEXT: fmov w9, s0931; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1932; CHECK-CVT-NEXT: add w8, w9, w8933; CHECK-CVT-NEXT: add w8, w10, w8934; CHECK-CVT-NEXT: lsr w8, w8, #16935; CHECK-CVT-NEXT: fmov s0, w8936; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0937; CHECK-CVT-NEXT: ret938;939; CHECK-BF16-LABEL: test_sitofp_i64:940; CHECK-BF16: // %bb.0:941; CHECK-BF16-NEXT: cmp x0, #0942; CHECK-BF16-NEXT: cneg x8, x0, mi943; CHECK-BF16-NEXT: lsr x9, x8, #53944; CHECK-BF16-NEXT: and x10, x8, #0xfffffffffffff000945; CHECK-BF16-NEXT: cmp x9, #0946; CHECK-BF16-NEXT: csel x9, x10, x8, ne947; CHECK-BF16-NEXT: and x10, x0, #0x8000000000000000948; CHECK-BF16-NEXT: cset w11, ne949; CHECK-BF16-NEXT: scvtf d0, x9950; CHECK-BF16-NEXT: tst x8, #0xfff951; CHECK-BF16-NEXT: fmov x9, d0952; CHECK-BF16-NEXT: orr x8, x9, x10953; CHECK-BF16-NEXT: csel w9, wzr, w11, eq954; CHECK-BF16-NEXT: orr x8, x8, x9955; CHECK-BF16-NEXT: fmov d0, x8956; CHECK-BF16-NEXT: fcvtxn s0, d0957; CHECK-BF16-NEXT: bfcvt h0, s0958; CHECK-BF16-NEXT: ret959 %r = sitofp i64 %a to bfloat960 ret bfloat %r961}962 963define bfloat @test_uitofp_i32_fadd(i32 %a, bfloat %b) #0 {964; CHECK-CVT-LABEL: test_uitofp_i32_fadd:965; CHECK-CVT: // %bb.0:966; CHECK-CVT-NEXT: ucvtf d1, w0967; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff968; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d0969; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #16970; CHECK-CVT-NEXT: fcvtxn s1, d1971; CHECK-CVT-NEXT: fmov w9, s1972; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1973; CHECK-CVT-NEXT: add w9, w9, w8974; CHECK-CVT-NEXT: add w9, w10, w9975; CHECK-CVT-NEXT: lsr w9, w9, #16976; CHECK-CVT-NEXT: fmov s1, w9977; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #16978; CHECK-CVT-NEXT: fadd s0, s0, s1979; CHECK-CVT-NEXT: fmov w9, s0980; CHECK-CVT-NEXT: ubfx w10, w9, #16, #1981; CHECK-CVT-NEXT: add w8, w9, w8982; CHECK-CVT-NEXT: add w8, w10, w8983; CHECK-CVT-NEXT: lsr w8, w8, #16984; CHECK-CVT-NEXT: fmov s0, w8985; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s0986; CHECK-CVT-NEXT: ret987;988; CHECK-BF16-LABEL: test_uitofp_i32_fadd:989; CHECK-BF16: // %bb.0:990; CHECK-BF16-NEXT: ucvtf d1, w0991; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d0992; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #16993; CHECK-BF16-NEXT: fcvtxn s1, d1994; CHECK-BF16-NEXT: bfcvt h1, s1995; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #16996; CHECK-BF16-NEXT: fadd s0, s0, s1997; CHECK-BF16-NEXT: bfcvt h0, s0998; CHECK-BF16-NEXT: ret999 %c = uitofp i32 %a to bfloat1000 %r = fadd bfloat %b, %c1001 ret bfloat %r1002}1003 1004define bfloat @test_sitofp_i32_fadd(i32 %a, bfloat %b) #0 {1005; CHECK-CVT-LABEL: test_sitofp_i32_fadd:1006; CHECK-CVT: // %bb.0:1007; CHECK-CVT-NEXT: scvtf d1, w01008; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1009; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01010; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161011; CHECK-CVT-NEXT: fcvtxn s1, d11012; CHECK-CVT-NEXT: fmov w9, s11013; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11014; CHECK-CVT-NEXT: add w9, w9, w81015; CHECK-CVT-NEXT: add w9, w10, w91016; CHECK-CVT-NEXT: lsr w9, w9, #161017; CHECK-CVT-NEXT: fmov s1, w91018; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #161019; CHECK-CVT-NEXT: fadd s0, s0, s11020; CHECK-CVT-NEXT: fmov w9, s01021; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11022; CHECK-CVT-NEXT: add w8, w9, w81023; CHECK-CVT-NEXT: add w8, w10, w81024; CHECK-CVT-NEXT: lsr w8, w8, #161025; CHECK-CVT-NEXT: fmov s0, w81026; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01027; CHECK-CVT-NEXT: ret1028;1029; CHECK-BF16-LABEL: test_sitofp_i32_fadd:1030; CHECK-BF16: // %bb.0:1031; CHECK-BF16-NEXT: scvtf d1, w01032; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01033; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161034; CHECK-BF16-NEXT: fcvtxn s1, d11035; CHECK-BF16-NEXT: bfcvt h1, s11036; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #161037; CHECK-BF16-NEXT: fadd s0, s0, s11038; CHECK-BF16-NEXT: bfcvt h0, s01039; CHECK-BF16-NEXT: ret1040 %c = sitofp i32 %a to bfloat1041 %r = fadd bfloat %b, %c1042 ret bfloat %r1043}1044 1045define bfloat @test_fptrunc_float(float %a) #0 {1046; CHECK-CVT-LABEL: test_fptrunc_float:1047; CHECK-CVT: // %bb.0:1048; CHECK-CVT-NEXT: fmov w9, s01049; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1050; CHECK-CVT-NEXT: fcmp s0, s01051; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11052; CHECK-CVT-NEXT: add w8, w9, w81053; CHECK-CVT-NEXT: orr w9, w9, #0x4000001054; CHECK-CVT-NEXT: add w8, w10, w81055; CHECK-CVT-NEXT: csel w8, w9, w8, vs1056; CHECK-CVT-NEXT: lsr w8, w8, #161057; CHECK-CVT-NEXT: fmov s0, w81058; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01059; CHECK-CVT-NEXT: ret1060;1061; CHECK-BF16-LABEL: test_fptrunc_float:1062; CHECK-BF16: // %bb.0:1063; CHECK-BF16-NEXT: bfcvt h0, s01064; CHECK-BF16-NEXT: ret1065 %r = fptrunc float %a to bfloat1066 ret bfloat %r1067}1068 1069define bfloat @test_fptrunc_double(double %a) #0 {1070; CHECK-CVT-LABEL: test_fptrunc_double:1071; CHECK-CVT: // %bb.0:1072; CHECK-CVT-NEXT: fcvtxn s0, d01073; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1074; CHECK-CVT-NEXT: fmov w9, s01075; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11076; CHECK-CVT-NEXT: add w8, w9, w81077; CHECK-CVT-NEXT: add w8, w10, w81078; CHECK-CVT-NEXT: lsr w8, w8, #161079; CHECK-CVT-NEXT: fmov s0, w81080; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01081; CHECK-CVT-NEXT: ret1082;1083; CHECK-BF16-LABEL: test_fptrunc_double:1084; CHECK-BF16: // %bb.0:1085; CHECK-BF16-NEXT: fcvtxn s0, d01086; CHECK-BF16-NEXT: bfcvt h0, s01087; CHECK-BF16-NEXT: ret1088 %r = fptrunc double %a to bfloat1089 ret bfloat %r1090}1091 1092define float @test_fpext_float(bfloat %a) #0 {1093; CHECK-LABEL: test_fpext_float:1094; CHECK: // %bb.0:1095; CHECK-NEXT: // kill: def $h0 killed $h0 def $d01096; CHECK-NEXT: shll v0.4s, v0.4h, #161097; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q01098; CHECK-NEXT: ret1099 %r = fpext bfloat %a to float1100 ret float %r1101}1102 1103define double @test_fpext_double(bfloat %a) #0 {1104; CHECK-LABEL: test_fpext_double:1105; CHECK: // %bb.0:1106; CHECK-NEXT: // kill: def $h0 killed $h0 def $d01107; CHECK-NEXT: shll v0.4s, v0.4h, #161108; CHECK-NEXT: fcvt d0, s01109; CHECK-NEXT: ret1110 %r = fpext bfloat %a to double1111 ret double %r1112}1113 1114define i16 @test_bitcast_bfloattoi16(bfloat %a) #0 {1115; CHECK-LABEL: test_bitcast_bfloattoi16:1116; CHECK: // %bb.0:1117; CHECK-NEXT: // kill: def $h0 killed $h0 def $s01118; CHECK-NEXT: fmov w0, s01119; CHECK-NEXT: ret1120 %r = bitcast bfloat %a to i161121 ret i16 %r1122}1123 1124define bfloat @test_bitcast_i16tobfloat(i16 %a) #0 {1125; CHECK-LABEL: test_bitcast_i16tobfloat:1126; CHECK: // %bb.0:1127; CHECK-NEXT: fmov s0, w01128; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s01129; CHECK-NEXT: ret1130 %r = bitcast i16 %a to bfloat1131 ret bfloat %r1132}1133 1134declare bfloat @llvm.sqrt.f16(bfloat %a) #01135declare bfloat @llvm.powi.f16.i32(bfloat %a, i32 %b) #01136declare bfloat @llvm.sin.f16(bfloat %a) #01137declare bfloat @llvm.cos.f16(bfloat %a) #01138declare bfloat @llvm.tan.f16(bfloat %a) #01139declare bfloat @llvm.asin.f16(bfloat %a) #01140declare bfloat @llvm.acos.f16(bfloat %a) #01141declare bfloat @llvm.atan.f16(bfloat %a) #01142declare bfloat @llvm.atan2.f16(bfloat %a, bfloat %b) #01143declare bfloat @llvm.sinh.f16(bfloat %a) #01144declare bfloat @llvm.cosh.f16(bfloat %a) #01145declare bfloat @llvm.tanh.f16(bfloat %a) #01146declare bfloat @llvm.pow.f16(bfloat %a, bfloat %b) #01147declare bfloat @llvm.exp.f16(bfloat %a) #01148declare bfloat @llvm.exp2.f16(bfloat %a) #01149declare bfloat @llvm.log.f16(bfloat %a) #01150declare bfloat @llvm.log10.f16(bfloat %a) #01151declare bfloat @llvm.log2.f16(bfloat %a) #01152declare bfloat @llvm.fma.f16(bfloat %a, bfloat %b, bfloat %c) #01153declare bfloat @llvm.fabs.f16(bfloat %a) #01154declare bfloat @llvm.minnum.f16(bfloat %a, bfloat %b) #01155declare bfloat @llvm.maxnum.f16(bfloat %a, bfloat %b) #01156declare bfloat @llvm.copysign.f16(bfloat %a, bfloat %b) #01157declare bfloat @llvm.floor.f16(bfloat %a) #01158declare bfloat @llvm.ceil.f16(bfloat %a) #01159declare bfloat @llvm.trunc.f16(bfloat %a) #01160declare bfloat @llvm.rint.f16(bfloat %a) #01161declare bfloat @llvm.nearbyint.f16(bfloat %a) #01162declare bfloat @llvm.round.f16(bfloat %a) #01163declare bfloat @llvm.roundeven.f16(bfloat %a) #01164declare bfloat @llvm.fmuladd.f16(bfloat %a, bfloat %b, bfloat %c) #01165 1166 1167define bfloat @test_sqrt(bfloat %a) #0 {1168; CHECK-CVT-LABEL: test_sqrt:1169; CHECK-CVT: // %bb.0:1170; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01171; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1172; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161173; CHECK-CVT-NEXT: fsqrt s0, s01174; CHECK-CVT-NEXT: fmov w9, s01175; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11176; CHECK-CVT-NEXT: add w8, w9, w81177; CHECK-CVT-NEXT: add w8, w10, w81178; CHECK-CVT-NEXT: lsr w8, w8, #161179; CHECK-CVT-NEXT: fmov s0, w81180; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01181; CHECK-CVT-NEXT: ret1182;1183; CHECK-BF16-LABEL: test_sqrt:1184; CHECK-BF16: // %bb.0:1185; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01186; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161187; CHECK-BF16-NEXT: fsqrt s0, s01188; CHECK-BF16-NEXT: bfcvt h0, s01189; CHECK-BF16-NEXT: ret1190 %r = call bfloat @llvm.sqrt.f16(bfloat %a)1191 ret bfloat %r1192}1193 1194define bfloat @test_powi(bfloat %a, i32 %b) #0 {1195; CHECK-CVT-LABEL: test_powi:1196; CHECK-CVT: // %bb.0:1197; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1198; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01199; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161200; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01201; CHECK-CVT-NEXT: bl __powisf21202; CHECK-CVT-NEXT: fmov w9, s01203; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1204; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11205; CHECK-CVT-NEXT: add w8, w9, w81206; CHECK-CVT-NEXT: add w8, w10, w81207; CHECK-CVT-NEXT: lsr w8, w8, #161208; CHECK-CVT-NEXT: fmov s0, w81209; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01210; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1211; CHECK-CVT-NEXT: ret1212;1213; CHECK-BF16-LABEL: test_powi:1214; CHECK-BF16: // %bb.0:1215; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1216; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01217; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161218; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01219; CHECK-BF16-NEXT: bl __powisf21220; CHECK-BF16-NEXT: bfcvt h0, s01221; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1222; CHECK-BF16-NEXT: ret1223 %r = call bfloat @llvm.powi.f16.i32(bfloat %a, i32 %b)1224 ret bfloat %r1225}1226 1227 1228define bfloat @test_sin(bfloat %a) #0 {1229; CHECK-CVT-LABEL: test_sin:1230; CHECK-CVT: // %bb.0:1231; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1232; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01233; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161234; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01235; CHECK-CVT-NEXT: bl sinf1236; CHECK-CVT-NEXT: fmov w9, s01237; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1238; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11239; CHECK-CVT-NEXT: add w8, w9, w81240; CHECK-CVT-NEXT: add w8, w10, w81241; CHECK-CVT-NEXT: lsr w8, w8, #161242; CHECK-CVT-NEXT: fmov s0, w81243; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01244; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1245; CHECK-CVT-NEXT: ret1246;1247; CHECK-BF16-LABEL: test_sin:1248; CHECK-BF16: // %bb.0:1249; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1250; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01251; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161252; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01253; CHECK-BF16-NEXT: bl sinf1254; CHECK-BF16-NEXT: bfcvt h0, s01255; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1256; CHECK-BF16-NEXT: ret1257 %r = call bfloat @llvm.sin.f16(bfloat %a)1258 ret bfloat %r1259}1260 1261define bfloat @test_cos(bfloat %a) #0 {1262; CHECK-CVT-LABEL: test_cos:1263; CHECK-CVT: // %bb.0:1264; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1265; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01266; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161267; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01268; CHECK-CVT-NEXT: bl cosf1269; CHECK-CVT-NEXT: fmov w9, s01270; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1271; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11272; CHECK-CVT-NEXT: add w8, w9, w81273; CHECK-CVT-NEXT: add w8, w10, w81274; CHECK-CVT-NEXT: lsr w8, w8, #161275; CHECK-CVT-NEXT: fmov s0, w81276; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01277; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1278; CHECK-CVT-NEXT: ret1279;1280; CHECK-BF16-LABEL: test_cos:1281; CHECK-BF16: // %bb.0:1282; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1283; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01284; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161285; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01286; CHECK-BF16-NEXT: bl cosf1287; CHECK-BF16-NEXT: bfcvt h0, s01288; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1289; CHECK-BF16-NEXT: ret1290 %r = call bfloat @llvm.cos.f16(bfloat %a)1291 ret bfloat %r1292}1293 1294define bfloat @test_tan(bfloat %a) #0 {1295; CHECK-CVT-LABEL: test_tan:1296; CHECK-CVT: // %bb.0:1297; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1298; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01299; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161300; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01301; CHECK-CVT-NEXT: bl tanf1302; CHECK-CVT-NEXT: fmov w9, s01303; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1304; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11305; CHECK-CVT-NEXT: add w8, w9, w81306; CHECK-CVT-NEXT: add w8, w10, w81307; CHECK-CVT-NEXT: lsr w8, w8, #161308; CHECK-CVT-NEXT: fmov s0, w81309; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01310; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1311; CHECK-CVT-NEXT: ret1312;1313; CHECK-BF16-LABEL: test_tan:1314; CHECK-BF16: // %bb.0:1315; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1316; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01317; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161318; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01319; CHECK-BF16-NEXT: bl tanf1320; CHECK-BF16-NEXT: bfcvt h0, s01321; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1322; CHECK-BF16-NEXT: ret1323 %r = call bfloat @llvm.tan.f16(bfloat %a)1324 ret bfloat %r1325}1326 1327define bfloat @test_acos(bfloat %a) #0 {1328; CHECK-CVT-LABEL: test_acos:1329; CHECK-CVT: // %bb.0:1330; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1331; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01332; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161333; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01334; CHECK-CVT-NEXT: bl acosf1335; CHECK-CVT-NEXT: fmov w9, s01336; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1337; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11338; CHECK-CVT-NEXT: add w8, w9, w81339; CHECK-CVT-NEXT: add w8, w10, w81340; CHECK-CVT-NEXT: lsr w8, w8, #161341; CHECK-CVT-NEXT: fmov s0, w81342; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01343; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1344; CHECK-CVT-NEXT: ret1345;1346; CHECK-BF16-LABEL: test_acos:1347; CHECK-BF16: // %bb.0:1348; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1349; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01350; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161351; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01352; CHECK-BF16-NEXT: bl acosf1353; CHECK-BF16-NEXT: bfcvt h0, s01354; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1355; CHECK-BF16-NEXT: ret1356 %r = call bfloat @llvm.acos.f16(bfloat %a)1357 ret bfloat %r1358}1359 1360define bfloat @test_asin(bfloat %a) #0 {1361; CHECK-CVT-LABEL: test_asin:1362; CHECK-CVT: // %bb.0:1363; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1364; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01365; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161366; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01367; CHECK-CVT-NEXT: bl asinf1368; CHECK-CVT-NEXT: fmov w9, s01369; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1370; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11371; CHECK-CVT-NEXT: add w8, w9, w81372; CHECK-CVT-NEXT: add w8, w10, w81373; CHECK-CVT-NEXT: lsr w8, w8, #161374; CHECK-CVT-NEXT: fmov s0, w81375; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01376; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1377; CHECK-CVT-NEXT: ret1378;1379; CHECK-BF16-LABEL: test_asin:1380; CHECK-BF16: // %bb.0:1381; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1382; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01383; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161384; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01385; CHECK-BF16-NEXT: bl asinf1386; CHECK-BF16-NEXT: bfcvt h0, s01387; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1388; CHECK-BF16-NEXT: ret1389 %r = call bfloat @llvm.asin.f16(bfloat %a)1390 ret bfloat %r1391}1392 1393define bfloat @test_atan(bfloat %a) #0 {1394; CHECK-CVT-LABEL: test_atan:1395; CHECK-CVT: // %bb.0:1396; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1397; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01398; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161399; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01400; CHECK-CVT-NEXT: bl atanf1401; CHECK-CVT-NEXT: fmov w9, s01402; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1403; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11404; CHECK-CVT-NEXT: add w8, w9, w81405; CHECK-CVT-NEXT: add w8, w10, w81406; CHECK-CVT-NEXT: lsr w8, w8, #161407; CHECK-CVT-NEXT: fmov s0, w81408; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01409; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1410; CHECK-CVT-NEXT: ret1411;1412; CHECK-BF16-LABEL: test_atan:1413; CHECK-BF16: // %bb.0:1414; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1415; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01416; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161417; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01418; CHECK-BF16-NEXT: bl atanf1419; CHECK-BF16-NEXT: bfcvt h0, s01420; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1421; CHECK-BF16-NEXT: ret1422 %r = call bfloat @llvm.atan.f16(bfloat %a)1423 ret bfloat %r1424}1425 1426define bfloat @test_atan2(bfloat %a, bfloat %b) #0 {1427; CHECK-CVT-LABEL: test_atan2:1428; CHECK-CVT: // %bb.0:1429; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1430; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d11431; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01432; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161433; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #161434; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01435; CHECK-CVT-NEXT: // kill: def $s1 killed $s1 killed $q11436; CHECK-CVT-NEXT: bl atan2f1437; CHECK-CVT-NEXT: fmov w9, s01438; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1439; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11440; CHECK-CVT-NEXT: add w8, w9, w81441; CHECK-CVT-NEXT: add w8, w10, w81442; CHECK-CVT-NEXT: lsr w8, w8, #161443; CHECK-CVT-NEXT: fmov s0, w81444; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01445; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1446; CHECK-CVT-NEXT: ret1447;1448; CHECK-BF16-LABEL: test_atan2:1449; CHECK-BF16: // %bb.0:1450; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1451; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d11452; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01453; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161454; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #161455; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01456; CHECK-BF16-NEXT: // kill: def $s1 killed $s1 killed $q11457; CHECK-BF16-NEXT: bl atan2f1458; CHECK-BF16-NEXT: bfcvt h0, s01459; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1460; CHECK-BF16-NEXT: ret1461 %r = call bfloat @llvm.atan2.f16(bfloat %a, bfloat %b)1462 ret bfloat %r1463}1464 1465define bfloat @test_cosh(bfloat %a) #0 {1466; CHECK-CVT-LABEL: test_cosh:1467; CHECK-CVT: // %bb.0:1468; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1469; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01470; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161471; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01472; CHECK-CVT-NEXT: bl coshf1473; CHECK-CVT-NEXT: fmov w9, s01474; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1475; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11476; CHECK-CVT-NEXT: add w8, w9, w81477; CHECK-CVT-NEXT: add w8, w10, w81478; CHECK-CVT-NEXT: lsr w8, w8, #161479; CHECK-CVT-NEXT: fmov s0, w81480; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01481; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1482; CHECK-CVT-NEXT: ret1483;1484; CHECK-BF16-LABEL: test_cosh:1485; CHECK-BF16: // %bb.0:1486; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1487; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01488; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161489; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01490; CHECK-BF16-NEXT: bl coshf1491; CHECK-BF16-NEXT: bfcvt h0, s01492; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1493; CHECK-BF16-NEXT: ret1494 %r = call bfloat @llvm.cosh.f16(bfloat %a)1495 ret bfloat %r1496}1497 1498define bfloat @test_sinh(bfloat %a) #0 {1499; CHECK-CVT-LABEL: test_sinh:1500; CHECK-CVT: // %bb.0:1501; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1502; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01503; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161504; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01505; CHECK-CVT-NEXT: bl sinhf1506; CHECK-CVT-NEXT: fmov w9, s01507; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1508; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11509; CHECK-CVT-NEXT: add w8, w9, w81510; CHECK-CVT-NEXT: add w8, w10, w81511; CHECK-CVT-NEXT: lsr w8, w8, #161512; CHECK-CVT-NEXT: fmov s0, w81513; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01514; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1515; CHECK-CVT-NEXT: ret1516;1517; CHECK-BF16-LABEL: test_sinh:1518; CHECK-BF16: // %bb.0:1519; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1520; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01521; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161522; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01523; CHECK-BF16-NEXT: bl sinhf1524; CHECK-BF16-NEXT: bfcvt h0, s01525; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1526; CHECK-BF16-NEXT: ret1527 %r = call bfloat @llvm.sinh.f16(bfloat %a)1528 ret bfloat %r1529}1530 1531define bfloat @test_tanh(bfloat %a) #0 {1532; CHECK-CVT-LABEL: test_tanh:1533; CHECK-CVT: // %bb.0:1534; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1535; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01536; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161537; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01538; CHECK-CVT-NEXT: bl tanhf1539; CHECK-CVT-NEXT: fmov w9, s01540; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1541; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11542; CHECK-CVT-NEXT: add w8, w9, w81543; CHECK-CVT-NEXT: add w8, w10, w81544; CHECK-CVT-NEXT: lsr w8, w8, #161545; CHECK-CVT-NEXT: fmov s0, w81546; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01547; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1548; CHECK-CVT-NEXT: ret1549;1550; CHECK-BF16-LABEL: test_tanh:1551; CHECK-BF16: // %bb.0:1552; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1553; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01554; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161555; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01556; CHECK-BF16-NEXT: bl tanhf1557; CHECK-BF16-NEXT: bfcvt h0, s01558; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1559; CHECK-BF16-NEXT: ret1560 %r = call bfloat @llvm.tanh.f16(bfloat %a)1561 ret bfloat %r1562}1563 1564define bfloat @test_pow(bfloat %a, bfloat %b) #0 {1565; CHECK-CVT-LABEL: test_pow:1566; CHECK-CVT: // %bb.0:1567; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1568; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d11569; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01570; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161571; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #161572; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01573; CHECK-CVT-NEXT: // kill: def $s1 killed $s1 killed $q11574; CHECK-CVT-NEXT: bl powf1575; CHECK-CVT-NEXT: fmov w9, s01576; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1577; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11578; CHECK-CVT-NEXT: add w8, w9, w81579; CHECK-CVT-NEXT: add w8, w10, w81580; CHECK-CVT-NEXT: lsr w8, w8, #161581; CHECK-CVT-NEXT: fmov s0, w81582; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01583; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1584; CHECK-CVT-NEXT: ret1585;1586; CHECK-BF16-LABEL: test_pow:1587; CHECK-BF16: // %bb.0:1588; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1589; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d11590; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01591; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161592; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #161593; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01594; CHECK-BF16-NEXT: // kill: def $s1 killed $s1 killed $q11595; CHECK-BF16-NEXT: bl powf1596; CHECK-BF16-NEXT: bfcvt h0, s01597; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1598; CHECK-BF16-NEXT: ret1599 %r = call bfloat @llvm.pow.f16(bfloat %a, bfloat %b)1600 ret bfloat %r1601}1602 1603define bfloat @test_exp(bfloat %a) #0 {1604; CHECK-CVT-LABEL: test_exp:1605; CHECK-CVT: // %bb.0:1606; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1607; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01608; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161609; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01610; CHECK-CVT-NEXT: bl expf1611; CHECK-CVT-NEXT: fmov w9, s01612; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1613; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11614; CHECK-CVT-NEXT: add w8, w9, w81615; CHECK-CVT-NEXT: add w8, w10, w81616; CHECK-CVT-NEXT: lsr w8, w8, #161617; CHECK-CVT-NEXT: fmov s0, w81618; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01619; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1620; CHECK-CVT-NEXT: ret1621;1622; CHECK-BF16-LABEL: test_exp:1623; CHECK-BF16: // %bb.0:1624; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1625; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01626; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161627; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01628; CHECK-BF16-NEXT: bl expf1629; CHECK-BF16-NEXT: bfcvt h0, s01630; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1631; CHECK-BF16-NEXT: ret1632 %r = call bfloat @llvm.exp.f16(bfloat %a)1633 ret bfloat %r1634}1635 1636define bfloat @test_exp2(bfloat %a) #0 {1637; CHECK-CVT-LABEL: test_exp2:1638; CHECK-CVT: // %bb.0:1639; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1640; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01641; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161642; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01643; CHECK-CVT-NEXT: bl exp2f1644; CHECK-CVT-NEXT: fmov w9, s01645; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1646; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11647; CHECK-CVT-NEXT: add w8, w9, w81648; CHECK-CVT-NEXT: add w8, w10, w81649; CHECK-CVT-NEXT: lsr w8, w8, #161650; CHECK-CVT-NEXT: fmov s0, w81651; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01652; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1653; CHECK-CVT-NEXT: ret1654;1655; CHECK-BF16-LABEL: test_exp2:1656; CHECK-BF16: // %bb.0:1657; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1658; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01659; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161660; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01661; CHECK-BF16-NEXT: bl exp2f1662; CHECK-BF16-NEXT: bfcvt h0, s01663; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1664; CHECK-BF16-NEXT: ret1665 %r = call bfloat @llvm.exp2.f16(bfloat %a)1666 ret bfloat %r1667}1668 1669define bfloat @test_log(bfloat %a) #0 {1670; CHECK-CVT-LABEL: test_log:1671; CHECK-CVT: // %bb.0:1672; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1673; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01674; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161675; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01676; CHECK-CVT-NEXT: bl logf1677; CHECK-CVT-NEXT: fmov w9, s01678; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1679; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11680; CHECK-CVT-NEXT: add w8, w9, w81681; CHECK-CVT-NEXT: add w8, w10, w81682; CHECK-CVT-NEXT: lsr w8, w8, #161683; CHECK-CVT-NEXT: fmov s0, w81684; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01685; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1686; CHECK-CVT-NEXT: ret1687;1688; CHECK-BF16-LABEL: test_log:1689; CHECK-BF16: // %bb.0:1690; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1691; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01692; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161693; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01694; CHECK-BF16-NEXT: bl logf1695; CHECK-BF16-NEXT: bfcvt h0, s01696; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1697; CHECK-BF16-NEXT: ret1698 %r = call bfloat @llvm.log.f16(bfloat %a)1699 ret bfloat %r1700}1701 1702define bfloat @test_log10(bfloat %a) #0 {1703; CHECK-CVT-LABEL: test_log10:1704; CHECK-CVT: // %bb.0:1705; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1706; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01707; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161708; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01709; CHECK-CVT-NEXT: bl log10f1710; CHECK-CVT-NEXT: fmov w9, s01711; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1712; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11713; CHECK-CVT-NEXT: add w8, w9, w81714; CHECK-CVT-NEXT: add w8, w10, w81715; CHECK-CVT-NEXT: lsr w8, w8, #161716; CHECK-CVT-NEXT: fmov s0, w81717; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01718; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1719; CHECK-CVT-NEXT: ret1720;1721; CHECK-BF16-LABEL: test_log10:1722; CHECK-BF16: // %bb.0:1723; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1724; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01725; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161726; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01727; CHECK-BF16-NEXT: bl log10f1728; CHECK-BF16-NEXT: bfcvt h0, s01729; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1730; CHECK-BF16-NEXT: ret1731 %r = call bfloat @llvm.log10.f16(bfloat %a)1732 ret bfloat %r1733}1734 1735define bfloat @test_log2(bfloat %a) #0 {1736; CHECK-CVT-LABEL: test_log2:1737; CHECK-CVT: // %bb.0:1738; CHECK-CVT-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1739; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01740; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161741; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q01742; CHECK-CVT-NEXT: bl log2f1743; CHECK-CVT-NEXT: fmov w9, s01744; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1745; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11746; CHECK-CVT-NEXT: add w8, w9, w81747; CHECK-CVT-NEXT: add w8, w10, w81748; CHECK-CVT-NEXT: lsr w8, w8, #161749; CHECK-CVT-NEXT: fmov s0, w81750; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01751; CHECK-CVT-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1752; CHECK-CVT-NEXT: ret1753;1754; CHECK-BF16-LABEL: test_log2:1755; CHECK-BF16: // %bb.0:1756; CHECK-BF16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1757; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01758; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161759; CHECK-BF16-NEXT: // kill: def $s0 killed $s0 killed $q01760; CHECK-BF16-NEXT: bl log2f1761; CHECK-BF16-NEXT: bfcvt h0, s01762; CHECK-BF16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1763; CHECK-BF16-NEXT: ret1764 %r = call bfloat @llvm.log2.f16(bfloat %a)1765 ret bfloat %r1766}1767 1768define bfloat @test_fma(bfloat %a, bfloat %b, bfloat %c) #0 {1769; CHECK-CVT-LABEL: test_fma:1770; CHECK-CVT: // %bb.0:1771; CHECK-CVT-NEXT: // kill: def $h2 killed $h2 def $d21772; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d11773; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01774; CHECK-CVT-NEXT: mov w10, #32767 // =0x7fff1775; CHECK-CVT-NEXT: shll v2.4s, v2.4h, #161776; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #161777; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161778; CHECK-CVT-NEXT: fmadd s0, s0, s1, s21779; CHECK-CVT-NEXT: fmov w8, s01780; CHECK-CVT-NEXT: ubfx w9, w8, #16, #11781; CHECK-CVT-NEXT: add w8, w8, w101782; CHECK-CVT-NEXT: add w8, w9, w81783; CHECK-CVT-NEXT: lsr w8, w8, #161784; CHECK-CVT-NEXT: fmov s0, w81785; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01786; CHECK-CVT-NEXT: ret1787;1788; CHECK-BF16-LABEL: test_fma:1789; CHECK-BF16: // %bb.0:1790; CHECK-BF16-NEXT: // kill: def $h2 killed $h2 def $d21791; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d11792; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01793; CHECK-BF16-NEXT: shll v2.4s, v2.4h, #161794; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #161795; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161796; CHECK-BF16-NEXT: fmadd s0, s0, s1, s21797; CHECK-BF16-NEXT: bfcvt h0, s01798; CHECK-BF16-NEXT: ret1799 %r = call bfloat @llvm.fma.f16(bfloat %a, bfloat %b, bfloat %c)1800 ret bfloat %r1801}1802 1803define bfloat @test_fabs(bfloat %a) #0 {1804; CHECK-LABEL: test_fabs:1805; CHECK: // %bb.0:1806; CHECK-NEXT: // kill: def $h0 killed $h0 def $s01807; CHECK-NEXT: fmov w8, s01808; CHECK-NEXT: and w8, w8, #0x7fff1809; CHECK-NEXT: fmov s0, w81810; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s01811; CHECK-NEXT: ret1812 %r = call bfloat @llvm.fabs.f16(bfloat %a)1813 ret bfloat %r1814}1815 1816define bfloat @test_minnum(bfloat %a, bfloat %b) #0 {1817; CHECK-CVT-LABEL: test_minnum:1818; CHECK-CVT: // %bb.0:1819; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d11820; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01821; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1822; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #161823; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161824; CHECK-CVT-NEXT: fminnm s0, s0, s11825; CHECK-CVT-NEXT: fmov w9, s01826; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11827; CHECK-CVT-NEXT: add w8, w9, w81828; CHECK-CVT-NEXT: add w8, w10, w81829; CHECK-CVT-NEXT: lsr w8, w8, #161830; CHECK-CVT-NEXT: fmov s0, w81831; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01832; CHECK-CVT-NEXT: ret1833;1834; CHECK-BF16-LABEL: test_minnum:1835; CHECK-BF16: // %bb.0:1836; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d11837; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01838; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #161839; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161840; CHECK-BF16-NEXT: fminnm s0, s0, s11841; CHECK-BF16-NEXT: bfcvt h0, s01842; CHECK-BF16-NEXT: ret1843 %r = call bfloat @llvm.minnum.f16(bfloat %a, bfloat %b)1844 ret bfloat %r1845}1846 1847define bfloat @test_maxnum(bfloat %a, bfloat %b) #0 {1848; CHECK-CVT-LABEL: test_maxnum:1849; CHECK-CVT: // %bb.0:1850; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d11851; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01852; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff1853; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #161854; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161855; CHECK-CVT-NEXT: fmaxnm s0, s0, s11856; CHECK-CVT-NEXT: fmov w9, s01857; CHECK-CVT-NEXT: ubfx w10, w9, #16, #11858; CHECK-CVT-NEXT: add w8, w9, w81859; CHECK-CVT-NEXT: add w8, w10, w81860; CHECK-CVT-NEXT: lsr w8, w8, #161861; CHECK-CVT-NEXT: fmov s0, w81862; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01863; CHECK-CVT-NEXT: ret1864;1865; CHECK-BF16-LABEL: test_maxnum:1866; CHECK-BF16: // %bb.0:1867; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d11868; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d01869; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #161870; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #161871; CHECK-BF16-NEXT: fmaxnm s0, s0, s11872; CHECK-BF16-NEXT: bfcvt h0, s01873; CHECK-BF16-NEXT: ret1874 %r = call bfloat @llvm.maxnum.f16(bfloat %a, bfloat %b)1875 ret bfloat %r1876}1877 1878define bfloat @test_copysign(bfloat %a, bfloat %b) #0 {1879; CHECK-CVT-LABEL: test_copysign:1880; CHECK-CVT: // %bb.0:1881; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d11882; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01883; CHECK-CVT-NEXT: mvni v2.4s, #128, lsl #241884; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #161885; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161886; CHECK-CVT-NEXT: bif v0.16b, v1.16b, v2.16b1887; CHECK-CVT-NEXT: fmov w8, s01888; CHECK-CVT-NEXT: lsr w8, w8, #161889; CHECK-CVT-NEXT: fmov s0, w81890; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01891; CHECK-CVT-NEXT: ret1892;1893; CHECK-SD-LABEL: test_copysign:1894; CHECK-SD: // %bb.0:1895; CHECK-SD-NEXT: // kill: def $h1 killed $h1 def $d11896; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $d01897; CHECK-SD-NEXT: mvni v2.4s, #128, lsl #241898; CHECK-SD-NEXT: shll v1.4s, v1.4h, #161899; CHECK-SD-NEXT: shll v0.4s, v0.4h, #161900; CHECK-SD-NEXT: bif v0.16b, v1.16b, v2.16b1901; CHECK-SD-NEXT: bfcvt h0, s01902; CHECK-SD-NEXT: ret1903;1904; CHECK-GI-LABEL: test_copysign:1905; CHECK-GI: // %bb.0:1906; CHECK-GI-NEXT: mvni v2.8h, #128, lsl #81907; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q01908; CHECK-GI-NEXT: // kill: def $h1 killed $h1 def $q11909; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b1910; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $q01911; CHECK-GI-NEXT: ret1912 %r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %b)1913 ret bfloat %r1914}1915 1916define bfloat @test_copysign_f32(bfloat %a, float %b) #0 {1917; CHECK-CVT-LABEL: test_copysign_f32:1918; CHECK-CVT: // %bb.0:1919; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01920; CHECK-CVT-NEXT: mvni v2.4s, #128, lsl #241921; CHECK-CVT-NEXT: // kill: def $s1 killed $s1 def $q11922; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161923; CHECK-CVT-NEXT: bif v0.16b, v1.16b, v2.16b1924; CHECK-CVT-NEXT: fmov w8, s01925; CHECK-CVT-NEXT: lsr w8, w8, #161926; CHECK-CVT-NEXT: fmov s0, w81927; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01928; CHECK-CVT-NEXT: ret1929;1930; CHECK-SD-LABEL: test_copysign_f32:1931; CHECK-SD: // %bb.0:1932; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $d01933; CHECK-SD-NEXT: mvni v2.4s, #128, lsl #241934; CHECK-SD-NEXT: // kill: def $s1 killed $s1 def $q11935; CHECK-SD-NEXT: shll v0.4s, v0.4h, #161936; CHECK-SD-NEXT: bif v0.16b, v1.16b, v2.16b1937; CHECK-SD-NEXT: bfcvt h0, s01938; CHECK-SD-NEXT: ret1939;1940; CHECK-GI-LABEL: test_copysign_f32:1941; CHECK-GI: // %bb.0:1942; CHECK-GI-NEXT: bfcvt h1, s11943; CHECK-GI-NEXT: mvni v2.8h, #128, lsl #81944; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q01945; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b1946; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $q01947; CHECK-GI-NEXT: ret1948 %tb = fptrunc float %b to bfloat1949 %r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %tb)1950 ret bfloat %r1951}1952 1953define bfloat @test_copysign_f64(bfloat %a, double %b) #0 {1954; CHECK-CVT-LABEL: test_copysign_f64:1955; CHECK-CVT: // %bb.0:1956; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01957; CHECK-CVT-NEXT: fcvt s1, d11958; CHECK-CVT-NEXT: mvni v2.4s, #128, lsl #241959; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #161960; CHECK-CVT-NEXT: bif v0.16b, v1.16b, v2.16b1961; CHECK-CVT-NEXT: fmov w8, s01962; CHECK-CVT-NEXT: lsr w8, w8, #161963; CHECK-CVT-NEXT: fmov s0, w81964; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s01965; CHECK-CVT-NEXT: ret1966;1967; CHECK-SD-LABEL: test_copysign_f64:1968; CHECK-SD: // %bb.0:1969; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $d01970; CHECK-SD-NEXT: fcvt s1, d11971; CHECK-SD-NEXT: mvni v2.4s, #128, lsl #241972; CHECK-SD-NEXT: shll v0.4s, v0.4h, #161973; CHECK-SD-NEXT: bif v0.16b, v1.16b, v2.16b1974; CHECK-SD-NEXT: bfcvt h0, s01975; CHECK-SD-NEXT: ret1976;1977; CHECK-GI-LABEL: test_copysign_f64:1978; CHECK-GI: // %bb.0:1979; CHECK-GI-NEXT: fcvtxn s1, d11980; CHECK-GI-NEXT: mvni v2.8h, #128, lsl #81981; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q01982; CHECK-GI-NEXT: bfcvt h1, s11983; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b1984; CHECK-GI-NEXT: // kill: def $h0 killed $h0 killed $q01985; CHECK-GI-NEXT: ret1986 %tb = fptrunc double %b to bfloat1987 %r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %tb)1988 ret bfloat %r1989}1990 1991; away the (fpext (fp_round <result>)) here.1992 1993define float @test_copysign_extended(bfloat %a, bfloat %b) #0 {1994; CHECK-CVT-LABEL: test_copysign_extended:1995; CHECK-CVT: // %bb.0:1996; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d11997; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d01998; CHECK-CVT-NEXT: mvni v2.4s, #128, lsl #241999; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #162000; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162001; CHECK-CVT-NEXT: bif v0.16b, v1.16b, v2.16b2002; CHECK-CVT-NEXT: fmov w8, s02003; CHECK-CVT-NEXT: lsr w8, w8, #162004; CHECK-CVT-NEXT: fmov s0, w82005; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162006; CHECK-CVT-NEXT: // kill: def $s0 killed $s0 killed $q02007; CHECK-CVT-NEXT: ret2008;2009; CHECK-SD-LABEL: test_copysign_extended:2010; CHECK-SD: // %bb.0:2011; CHECK-SD-NEXT: // kill: def $h1 killed $h1 def $d12012; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $d02013; CHECK-SD-NEXT: mvni v2.4s, #128, lsl #242014; CHECK-SD-NEXT: shll v1.4s, v1.4h, #162015; CHECK-SD-NEXT: shll v0.4s, v0.4h, #162016; CHECK-SD-NEXT: bif v0.16b, v1.16b, v2.16b2017; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q02018; CHECK-SD-NEXT: ret2019;2020; CHECK-GI-LABEL: test_copysign_extended:2021; CHECK-GI: // %bb.0:2022; CHECK-GI-NEXT: mvni v2.8h, #128, lsl #82023; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q02024; CHECK-GI-NEXT: // kill: def $h1 killed $h1 def $q12025; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b2026; CHECK-GI-NEXT: shll v0.4s, v0.4h, #162027; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q02028; CHECK-GI-NEXT: ret2029 %r = call bfloat @llvm.copysign.f16(bfloat %a, bfloat %b)2030 %xr = fpext bfloat %r to float2031 ret float %xr2032}2033 2034define bfloat @test_floor(bfloat %a) #0 {2035; CHECK-CVT-LABEL: test_floor:2036; CHECK-CVT: // %bb.0:2037; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d02038; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff2039; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162040; CHECK-CVT-NEXT: frintm s0, s02041; CHECK-CVT-NEXT: fmov w9, s02042; CHECK-CVT-NEXT: ubfx w10, w9, #16, #12043; CHECK-CVT-NEXT: add w8, w9, w82044; CHECK-CVT-NEXT: add w8, w10, w82045; CHECK-CVT-NEXT: lsr w8, w8, #162046; CHECK-CVT-NEXT: fmov s0, w82047; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s02048; CHECK-CVT-NEXT: ret2049;2050; CHECK-BF16-LABEL: test_floor:2051; CHECK-BF16: // %bb.0:2052; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d02053; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162054; CHECK-BF16-NEXT: frintm s0, s02055; CHECK-BF16-NEXT: bfcvt h0, s02056; CHECK-BF16-NEXT: ret2057 %r = call bfloat @llvm.floor.f16(bfloat %a)2058 ret bfloat %r2059}2060 2061define bfloat @test_ceil(bfloat %a) #0 {2062; CHECK-CVT-LABEL: test_ceil:2063; CHECK-CVT: // %bb.0:2064; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d02065; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff2066; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162067; CHECK-CVT-NEXT: frintp s0, s02068; CHECK-CVT-NEXT: fmov w9, s02069; CHECK-CVT-NEXT: ubfx w10, w9, #16, #12070; CHECK-CVT-NEXT: add w8, w9, w82071; CHECK-CVT-NEXT: add w8, w10, w82072; CHECK-CVT-NEXT: lsr w8, w8, #162073; CHECK-CVT-NEXT: fmov s0, w82074; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s02075; CHECK-CVT-NEXT: ret2076;2077; CHECK-BF16-LABEL: test_ceil:2078; CHECK-BF16: // %bb.0:2079; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d02080; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162081; CHECK-BF16-NEXT: frintp s0, s02082; CHECK-BF16-NEXT: bfcvt h0, s02083; CHECK-BF16-NEXT: ret2084 %r = call bfloat @llvm.ceil.f16(bfloat %a)2085 ret bfloat %r2086}2087 2088define bfloat @test_trunc(bfloat %a) #0 {2089; CHECK-CVT-LABEL: test_trunc:2090; CHECK-CVT: // %bb.0:2091; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d02092; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff2093; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162094; CHECK-CVT-NEXT: frintz s0, s02095; CHECK-CVT-NEXT: fmov w9, s02096; CHECK-CVT-NEXT: ubfx w10, w9, #16, #12097; CHECK-CVT-NEXT: add w8, w9, w82098; CHECK-CVT-NEXT: add w8, w10, w82099; CHECK-CVT-NEXT: lsr w8, w8, #162100; CHECK-CVT-NEXT: fmov s0, w82101; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s02102; CHECK-CVT-NEXT: ret2103;2104; CHECK-BF16-LABEL: test_trunc:2105; CHECK-BF16: // %bb.0:2106; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d02107; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162108; CHECK-BF16-NEXT: frintz s0, s02109; CHECK-BF16-NEXT: bfcvt h0, s02110; CHECK-BF16-NEXT: ret2111 %r = call bfloat @llvm.trunc.f16(bfloat %a)2112 ret bfloat %r2113}2114 2115define bfloat @test_rint(bfloat %a) #0 {2116; CHECK-CVT-LABEL: test_rint:2117; CHECK-CVT: // %bb.0:2118; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d02119; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff2120; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162121; CHECK-CVT-NEXT: frintx s0, s02122; CHECK-CVT-NEXT: fmov w9, s02123; CHECK-CVT-NEXT: ubfx w10, w9, #16, #12124; CHECK-CVT-NEXT: add w8, w9, w82125; CHECK-CVT-NEXT: add w8, w10, w82126; CHECK-CVT-NEXT: lsr w8, w8, #162127; CHECK-CVT-NEXT: fmov s0, w82128; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s02129; CHECK-CVT-NEXT: ret2130;2131; CHECK-BF16-LABEL: test_rint:2132; CHECK-BF16: // %bb.0:2133; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d02134; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162135; CHECK-BF16-NEXT: frintx s0, s02136; CHECK-BF16-NEXT: bfcvt h0, s02137; CHECK-BF16-NEXT: ret2138 %r = call bfloat @llvm.rint.f16(bfloat %a)2139 ret bfloat %r2140}2141 2142define bfloat @test_nearbyint(bfloat %a) #0 {2143; CHECK-CVT-LABEL: test_nearbyint:2144; CHECK-CVT: // %bb.0:2145; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d02146; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff2147; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162148; CHECK-CVT-NEXT: frinti s0, s02149; CHECK-CVT-NEXT: fmov w9, s02150; CHECK-CVT-NEXT: ubfx w10, w9, #16, #12151; CHECK-CVT-NEXT: add w8, w9, w82152; CHECK-CVT-NEXT: add w8, w10, w82153; CHECK-CVT-NEXT: lsr w8, w8, #162154; CHECK-CVT-NEXT: fmov s0, w82155; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s02156; CHECK-CVT-NEXT: ret2157;2158; CHECK-BF16-LABEL: test_nearbyint:2159; CHECK-BF16: // %bb.0:2160; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d02161; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162162; CHECK-BF16-NEXT: frinti s0, s02163; CHECK-BF16-NEXT: bfcvt h0, s02164; CHECK-BF16-NEXT: ret2165 %r = call bfloat @llvm.nearbyint.f16(bfloat %a)2166 ret bfloat %r2167}2168 2169define bfloat @test_round(bfloat %a) #0 {2170; CHECK-CVT-LABEL: test_round:2171; CHECK-CVT: // %bb.0:2172; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d02173; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff2174; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162175; CHECK-CVT-NEXT: frinta s0, s02176; CHECK-CVT-NEXT: fmov w9, s02177; CHECK-CVT-NEXT: ubfx w10, w9, #16, #12178; CHECK-CVT-NEXT: add w8, w9, w82179; CHECK-CVT-NEXT: add w8, w10, w82180; CHECK-CVT-NEXT: lsr w8, w8, #162181; CHECK-CVT-NEXT: fmov s0, w82182; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s02183; CHECK-CVT-NEXT: ret2184;2185; CHECK-BF16-LABEL: test_round:2186; CHECK-BF16: // %bb.0:2187; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d02188; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162189; CHECK-BF16-NEXT: frinta s0, s02190; CHECK-BF16-NEXT: bfcvt h0, s02191; CHECK-BF16-NEXT: ret2192 %r = call bfloat @llvm.round.f16(bfloat %a)2193 ret bfloat %r2194}2195 2196define bfloat @test_roundeven(bfloat %a) #0 {2197; CHECK-CVT-LABEL: test_roundeven:2198; CHECK-CVT: // %bb.0:2199; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d02200; CHECK-CVT-NEXT: mov w8, #32767 // =0x7fff2201; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162202; CHECK-CVT-NEXT: frintn s0, s02203; CHECK-CVT-NEXT: fmov w9, s02204; CHECK-CVT-NEXT: ubfx w10, w9, #16, #12205; CHECK-CVT-NEXT: add w8, w9, w82206; CHECK-CVT-NEXT: add w8, w10, w82207; CHECK-CVT-NEXT: lsr w8, w8, #162208; CHECK-CVT-NEXT: fmov s0, w82209; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s02210; CHECK-CVT-NEXT: ret2211;2212; CHECK-BF16-LABEL: test_roundeven:2213; CHECK-BF16: // %bb.0:2214; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d02215; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162216; CHECK-BF16-NEXT: frintn s0, s02217; CHECK-BF16-NEXT: bfcvt h0, s02218; CHECK-BF16-NEXT: ret2219 %r = call bfloat @llvm.roundeven.f16(bfloat %a)2220 ret bfloat %r2221}2222 2223define bfloat @test_fmuladd(bfloat %a, bfloat %b, bfloat %c) #0 {2224; CHECK-CVT-LABEL: test_fmuladd:2225; CHECK-CVT: // %bb.0:2226; CHECK-CVT-NEXT: // kill: def $h1 killed $h1 def $d12227; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 def $d02228; CHECK-CVT-NEXT: mov w10, #32767 // =0x7fff2229; CHECK-CVT-NEXT: // kill: def $h2 killed $h2 def $d22230; CHECK-CVT-NEXT: shll v1.4s, v1.4h, #162231; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162232; CHECK-CVT-NEXT: fmul s0, s0, s12233; CHECK-CVT-NEXT: shll v1.4s, v2.4h, #162234; CHECK-CVT-NEXT: fmov w8, s02235; CHECK-CVT-NEXT: ubfx w9, w8, #16, #12236; CHECK-CVT-NEXT: add w8, w8, w102237; CHECK-CVT-NEXT: add w8, w9, w82238; CHECK-CVT-NEXT: lsr w8, w8, #162239; CHECK-CVT-NEXT: fmov s0, w82240; CHECK-CVT-NEXT: shll v0.4s, v0.4h, #162241; CHECK-CVT-NEXT: fadd s0, s0, s12242; CHECK-CVT-NEXT: fmov w8, s02243; CHECK-CVT-NEXT: ubfx w9, w8, #16, #12244; CHECK-CVT-NEXT: add w8, w8, w102245; CHECK-CVT-NEXT: add w8, w9, w82246; CHECK-CVT-NEXT: lsr w8, w8, #162247; CHECK-CVT-NEXT: fmov s0, w82248; CHECK-CVT-NEXT: // kill: def $h0 killed $h0 killed $s02249; CHECK-CVT-NEXT: ret2250;2251; CHECK-BF16-LABEL: test_fmuladd:2252; CHECK-BF16: // %bb.0:2253; CHECK-BF16-NEXT: // kill: def $h1 killed $h1 def $d12254; CHECK-BF16-NEXT: // kill: def $h0 killed $h0 def $d02255; CHECK-BF16-NEXT: // kill: def $h2 killed $h2 def $d22256; CHECK-BF16-NEXT: shll v1.4s, v1.4h, #162257; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162258; CHECK-BF16-NEXT: fmul s0, s0, s12259; CHECK-BF16-NEXT: shll v1.4s, v2.4h, #162260; CHECK-BF16-NEXT: bfcvt h0, s02261; CHECK-BF16-NEXT: shll v0.4s, v0.4h, #162262; CHECK-BF16-NEXT: fadd s0, s0, s12263; CHECK-BF16-NEXT: bfcvt h0, s02264; CHECK-BF16-NEXT: ret2265 %r = call bfloat @llvm.fmuladd.f16(bfloat %a, bfloat %b, bfloat %c)2266 ret bfloat %r2267}2268 2269attributes #0 = { nounwind }2270