1 ; RUN: llc -asm-verbose=false -mtriple=mipsel-linux-gnueabi < %s | FileCheck %s -check-prefix=CHECK-LIBCALL 2 3 ; CHECK-LIBCALL-LABEL: test_fadd: 4 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 5 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 6 ; CHECK-LIBCALL-DAG: add.s 7 ; CHECK-LIBCALL-DAG: %call16(__gnu_f2h_ieee) 8 define void @test_fadd(half* %p, half* %q) #0 { 9 %a = load half, half* %p, align 2 10 %b = load half, half* %q, align 2 11 %r = fadd half %a, %b 12 store half %r, half* %p 13 ret void 14 } 15 16 ; CHECK-LIBCALL-LABEL: test_fpext_float: 17 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 18 define float @test_fpext_float(half* %p) { 19 %a = load half, half* %p, align 2 20 %r = fpext half %a to float 21 ret float %r 22 } 23 24 ; CHECK-LIBCALL-LABEL: test_fpext_double: 25 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 26 ; CHECK-LIBCALL: cvt.d.s 27 define double @test_fpext_double(half* %p) { 28 %a = load half, half* %p, align 2 29 %r = fpext half %a to double 30 ret double %r 31 } 32 33 ; CHECK-LIBCALL-LABEL: test_fptrunc_float: 34 ; CHECK-LIBCALL: %call16(__gnu_f2h_ieee) 35 define void @test_fptrunc_float(float %f, half* %p) #0 { 36 %a = fptrunc float %f to half 37 store half %a, half* %p 38 ret void 39 } 40 41 ; CHECK-LIBCALL-LABEL: test_fptrunc_double: 42 ; CHECK-LIBCALL: %call16(__truncdfhf2) 43 define void @test_fptrunc_double(double %d, half* %p) #0 { 44 %a = fptrunc double %d to half 45 store half %a, half* %p 46 ret void 47 } 48 49 ; CHECK-LIBCALL-LABEL: test_vec_fpext_float: 50 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 51 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 52 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 53 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 54 define <4 x float> @test_vec_fpext_float(<4 x half>* %p) #0 { 55 %a = load <4 x half>, <4 x half>* %p, align 8 56 %b = fpext <4 x half> %a to <4 x float> 57 ret <4 x float> %b 58 } 59 60 ; This test is not robust against variations in instruction scheduling. 61 ; See the discussion in http://reviews.llvm.org/D8804 62 ; CHECK-LIBCALL-LABEL: test_vec_fpext_double: 63 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 64 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 65 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 66 ; CHECK-LIBCALL: cvt.d.s 67 ; CHECK-LIBCALL: cvt.d.s 68 ; CHECK-LIBCALL: cvt.d.s 69 ; CHECK-LIBCALL: %call16(__gnu_h2f_ieee) 70 ; CHECK-LIBCALL: cvt.d.s 71 define <4 x double> @test_vec_fpext_double(<4 x half>* %p) #0 { 72 %a = load <4 x half>, <4 x half>* %p, align 8 73 %b = fpext <4 x half> %a to <4 x double> 74 ret <4 x double> %b 75 } 76 77 ; CHECK-LIBCALL-LABEL: test_vec_fptrunc_float: 78 ; CHECK-LIBCALL: %call16(__gnu_f2h_ieee) 79 ; CHECK-LIBCALL: %call16(__gnu_f2h_ieee) 80 ; CHECK-LIBCALL: %call16(__gnu_f2h_ieee) 81 ; CHECK-LIBCALL: %call16(__gnu_f2h_ieee) 82 define void @test_vec_fptrunc_float(<4 x float> %a, <4 x half>* %p) #0 { 83 %b = fptrunc <4 x float> %a to <4 x half> 84 store <4 x half> %b, <4 x half>* %p, align 8 85 ret void 86 } 87 88 ; CHECK-LIBCALL-LABEL: test_vec_fptrunc_double: 89 ; CHECK-LIBCALL: %call16(__truncdfhf2) 90 ; CHECK-LIBCALL: %call16(__truncdfhf2) 91 ; CHECK-LIBCALL: %call16(__truncdfhf2) 92 ; CHECK-LIBCALL: %call16(__truncdfhf2) 93 define void @test_vec_fptrunc_double(<4 x double> %a, <4 x half>* %p) #0 { 94 %b = fptrunc <4 x double> %a to <4 x half> 95 store <4 x half> %b, <4 x half>* %p, align 8 96 ret void 97 } 98 99