1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s 3 4define void @add(ptr %pa, ptr %pb, ptr %pc) { 5; CHECK-LABEL: add: 6; CHECK: # %bb.0: 7; CHECK-NEXT: pushq %rbx 8; CHECK-NEXT: .cfi_def_cfa_offset 16 9; CHECK-NEXT: .cfi_offset %rbx, -16 10; CHECK-NEXT: movq %rdx, %rbx 11; CHECK-NEXT: movzwl (%rdi), %eax 12; CHECK-NEXT: shll $16, %eax 13; CHECK-NEXT: movd %eax, %xmm1 14; CHECK-NEXT: movzwl (%rsi), %eax 15; CHECK-NEXT: shll $16, %eax 16; CHECK-NEXT: movd %eax, %xmm0 17; CHECK-NEXT: addss %xmm1, %xmm0 18; CHECK-NEXT: callq __truncsfbf2@PLT 19; CHECK-NEXT: movw %ax, (%rbx) 20; CHECK-NEXT: popq %rbx 21; CHECK-NEXT: .cfi_def_cfa_offset 8 22; CHECK-NEXT: retq 23 %a = load bfloat, ptr %pa 24 %b = load bfloat, ptr %pb 25 %add = fadd bfloat %a, %b 26 store bfloat %add, ptr %pc 27 ret void 28} 29 30define void @add_double(ptr %pa, ptr %pb, ptr %pc) { 31; CHECK-LABEL: add_double: 32; CHECK: # %bb.0: 33; CHECK-NEXT: pushq %r14 34; CHECK-NEXT: .cfi_def_cfa_offset 16 35; CHECK-NEXT: pushq %rbx 36; CHECK-NEXT: .cfi_def_cfa_offset 24 37; CHECK-NEXT: pushq %rax 38; CHECK-NEXT: .cfi_def_cfa_offset 32 39; CHECK-NEXT: .cfi_offset %rbx, -24 40; CHECK-NEXT: .cfi_offset %r14, -16 41; CHECK-NEXT: movq %rdx, %r14 42; CHECK-NEXT: movq %rsi, %rbx 43; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 44; CHECK-NEXT: callq __truncdfbf2@PLT 45; CHECK-NEXT: # kill: def $ax killed $ax def $eax 46; CHECK-NEXT: shll $16, %eax 47; CHECK-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 48; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 49; CHECK-NEXT: callq __truncdfbf2@PLT 50; CHECK-NEXT: # kill: def $ax killed $ax def $eax 51; CHECK-NEXT: shll $16, %eax 52; CHECK-NEXT: movd %eax, %xmm0 53; CHECK-NEXT: addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload 54; CHECK-NEXT: cvtss2sd %xmm0, %xmm0 55; CHECK-NEXT: movsd %xmm0, (%r14) 56; CHECK-NEXT: addq $8, %rsp 57; CHECK-NEXT: .cfi_def_cfa_offset 24 58; CHECK-NEXT: popq %rbx 59; CHECK-NEXT: .cfi_def_cfa_offset 16 60; CHECK-NEXT: popq %r14 61; CHECK-NEXT: .cfi_def_cfa_offset 8 62; CHECK-NEXT: retq 63 %la = load double, ptr %pa 64 %a = fptrunc double %la to bfloat 65 %lb = load double, ptr %pb 66 %b = fptrunc double %lb to bfloat 67 %add = fadd bfloat %a, %b 68 %dadd = fpext bfloat %add to double 69 store double %dadd, ptr %pc 70 ret void 71} 72 73define void @add_constant(ptr %pa, ptr %pc) { 74; CHECK-LABEL: add_constant: 75; CHECK: # %bb.0: 76; CHECK-NEXT: pushq %rbx 77; CHECK-NEXT: .cfi_def_cfa_offset 16 78; CHECK-NEXT: .cfi_offset %rbx, -16 79; CHECK-NEXT: movq %rsi, %rbx 80; CHECK-NEXT: movzwl (%rdi), %eax 81; CHECK-NEXT: shll $16, %eax 82; CHECK-NEXT: movd %eax, %xmm0 83; CHECK-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 84; CHECK-NEXT: callq __truncsfbf2@PLT 85; CHECK-NEXT: movw %ax, (%rbx) 86; CHECK-NEXT: popq %rbx 87; CHECK-NEXT: .cfi_def_cfa_offset 8 88; CHECK-NEXT: retq 89 %a = load bfloat, ptr %pa 90 %add = fadd bfloat %a, 1.0 91 store bfloat %add, ptr %pc 92 ret void 93} 94 95define void @store_constant(ptr %pc) { 96; CHECK-LABEL: store_constant: 97; CHECK: # %bb.0: 98; CHECK-NEXT: movw $16256, (%rdi) # imm = 0x3F80 99; CHECK-NEXT: retq 100 store bfloat 1.0, ptr %pc 101 ret void 102} 103 104define void @fold_ext_trunc(ptr %pa, ptr %pc) { 105; CHECK-LABEL: fold_ext_trunc: 106; CHECK: # %bb.0: 107; CHECK-NEXT: movzwl (%rdi), %eax 108; CHECK-NEXT: movw %ax, (%rsi) 109; CHECK-NEXT: retq 110 %a = load bfloat, ptr %pa 111 %ext = fpext bfloat %a to float 112 %trunc = fptrunc float %ext to bfloat 113 store bfloat %trunc, ptr %pc 114 ret void 115} 116