| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc -mtriple=hexagon -hexagon-bit=false < %s | FileCheck %s | |
| define bfloat @load_scalar_bf(ptr %addr) { | |
| ; CHECK-LABEL: load_scalar_bf: | |
| ; CHECK: .cfi_startproc | |
| ; CHECK-NEXT: // %bb.0: // %entry | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r0 = memuh(r0+#0) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r0 = aslh(r0) | |
| ; CHECK-NEXT: jumpr r31 | |
| ; CHECK-NEXT: } | |
| entry: | |
| %0 = load bfloat, ptr %addr, align 2 | |
| ret bfloat %0 | |
| } | |
| define void @store_scalar_bf(bfloat %v, ptr %addr) { | |
| ; CHECK-LABEL: store_scalar_bf: | |
| ; CHECK: .cfi_startproc | |
| ; CHECK-NEXT: // %bb.0: // %entry | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r0 = lsr(r0,#16) | |
| ; CHECK-NEXT: jumpr r31 | |
| ; CHECK-NEXT: memh(r1+#0) = r0.new | |
| ; CHECK-NEXT: } | |
| entry: | |
| store bfloat %v, ptr %addr, align 2 | |
| ret void | |
| } | |
| define bfloat @sum(bfloat %a, bfloat %b) #0 { | |
| ; CHECK-LABEL: sum: | |
| ; CHECK: .cfi_startproc | |
| ; CHECK-NEXT: // %bb.0: // %entry | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r1 = and(r1,##-65536) | |
| ; CHECK-NEXT: r2 = ##32768 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r3 = ##131071 | |
| ; CHECK-NEXT: r4 = ##65535 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r0 = insert(r1,#16,#0) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r0 = sfadd(r0,r1) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r1 = and(r0,r2) | |
| ; CHECK-NEXT: r3 = and(r0,r3) | |
| ; CHECK-NEXT: r5 = asrh(r0) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r1 = add(r0,r1) | |
| ; CHECK-NEXT: p0 = cmp.eq(r3,r2) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r1 = asrh(r1) | |
| ; CHECK-NEXT: if (p0) r2 = and(r5,r4) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: p0 = sfclass(r0,#16) | |
| ; CHECK-NEXT: if (!p0) r2 = and(r1,r4) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: if (p0) r2 = ##32767 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r0 = aslh(r2) | |
| ; CHECK-NEXT: jumpr r31 | |
| ; CHECK-NEXT: } | |
| entry: | |
| %add = fadd bfloat %a, %b | |
| ret bfloat %add | |
| } | |
| ; Function Attrs: noinline nounwind optnone | |
| define dso_local i32 @double_bf16(bfloat %a, bfloat %b) #0 { | |
| ; CHECK-LABEL: double_bf16: | |
| ; CHECK: .cfi_startproc | |
| ; CHECK-NEXT: // %bb.0: // %entry | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r3:2 = convert_sf2df(r0) | |
| ; CHECK-NEXT: r5:4 = convert_sf2df(r1) | |
| ; CHECK-NEXT: r29 = add(r29,#-16) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r1:0 = dfadd(r3:2,r5:4) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: memd(r29+#8) = r1:0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r2 = convert_df2sf(r1:0) | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r1 = lsr(r2,#16) | |
| ; CHECK-NEXT: r0 = and(r2,##-65536) | |
| ; CHECK-NEXT: memh(r29+#6) = r1.new | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: r0 = convert_sf2w(r0):chop | |
| ; CHECK-NEXT: jumpr r31 | |
| ; CHECK-NEXT: r29 = add(r29,#16) | |
| ; CHECK-NEXT: } | |
| entry: | |
| %c = alloca double, align 8 | |
| %d = alloca bfloat, align 2 | |
| %conv = fpext bfloat %a to double | |
| %conv1 = fpext bfloat %b to double | |
| %add = fadd double %conv, %conv1 | |
| store double %add, ptr %c, align 8 | |
| %2 = load double, ptr %c, align 8 | |
| %conv2 = fptrunc double %2 to bfloat | |
| store bfloat %conv2, ptr %d, align 2 | |
| %3 = load bfloat, ptr %d, align 2 | |
| %conv3 = fptosi bfloat %3 to i32 | |
| ret i32 %conv3 | |
| } |