| ; RUN: llc -mtriple=hexagon < %s | FileCheck %s |
| |
| ; This test validates the following facts for half-precision floating point |
| ; conversions. |
| ; Generate correct libcall names for conversion from fp16 to fp32. |
| ; (__extendhfsf2). |
| ; The extension from fp16 to fp64 is implicitly handled by __extendhfsf2 and convert_sf2d. |
| ; (fp16->fp32->fp64). |
| ; Generate correcct libcall names for conversion from fp32/fp64 to fp16 |
| ; (__truncsfhf2 and __truncdfhf2) |
| ; Verify that we generate loads and stores of halfword. |
| |
| ; Validate that we generate correct lib calls to convert fp16 |
| |
| ;CHECK-LABEL: @test1 |
| ;CHECK: jump __extendhfsf2 |
| ;CHECK: r0 = memuh |
| define dso_local float @test1(ptr readonly captures(none) %a) local_unnamed_addr #0 { |
| entry: |
| %0 = load i16, ptr %a, align 2 |
| %1 = bitcast i16 %0 to half |
| %2 = fpext half %1 to float |
| ret float %2 |
| } |
| |
| ;CHECK-LABEL: @test2 |
| ;CHECK: call __extendhfsf2 |
| ;CHECK: r0 = memuh |
| ;CHECK: convert_sf2d |
| define dso_local double @test2(ptr readonly captures(none) %a) local_unnamed_addr #0 { |
| entry: |
| %0 = load i16, ptr %a, align 2 |
| %1 = bitcast i16 %0 to half |
| %2 = fpext half %1 to double |
| ret double %2 |
| } |
| |
| ;CHECK-LABEL: @test3 |
| ;CHECK: call __truncsfhf2 |
| ;CHECK: memh{{.*}}= r0 |
| define dso_local void @test3(float %src, ptr captures(none) %dst) local_unnamed_addr #0 { |
| entry: |
| %0 = fptrunc float %src to half |
| %1 = bitcast half %0 to i16 |
| store i16 %1, ptr %dst, align 2 |
| ret void |
| } |
| |
| ;CHECK-LABEL: @test4 |
| ;CHECK: call __truncdfhf2 |
| ;CHECK: memh{{.*}}= r0 |
| define dso_local void @test4(double %src, ptr captures(none) %dst) local_unnamed_addr #0 { |
| entry: |
| %0 = fptrunc double %src to half |
| %1 = bitcast half %0 to i16 |
| store i16 %1, ptr %dst, align 2 |
| ret void |
| } |
| |
| ;CHECK-LABEL: @test5 |
| ;CHECK: call __extendhfsf2 |
| ;CHECK: call __extendhfsf2 |
| ;CHECK: sfadd |
| define dso_local float @test5(ptr readonly captures(none) %a, ptr readonly captures(none) %b) local_unnamed_addr #0 { |
| entry: |
| %0 = load i16, ptr %a, align 2 |
| %1 = bitcast i16 %0 to half |
| %2 = fpext half %1 to float |
| %3 = load i16, ptr %b, align 2 |
| %4 = bitcast i16 %3 to half |
| %5 = fpext half %4 to float |
| %add = fadd float %2, %5 |
| ret float %add |
| } |
| |
| attributes #0 = { nounwind readonly } |