@@ -926,6 +926,77 @@ define void @test_half_pow(half %a0, half %a1, ptr %p0) nounwind {
926
926
ret void
927
927
}
928
928
929
+ define void @test_half_powi (half %a0 , i32 %a1 , ptr %p0 ) nounwind {
930
+ ; F16C-LABEL: test_half_powi:
931
+ ; F16C: # %bb.0:
932
+ ; F16C-NEXT: pushq %rbx
933
+ ; F16C-NEXT: movq %rsi, %rbx
934
+ ; F16C-NEXT: vpextrw $0, %xmm0, %eax
935
+ ; F16C-NEXT: vmovd %eax, %xmm0
936
+ ; F16C-NEXT: vcvtph2ps %xmm0, %xmm0
937
+ ; F16C-NEXT: callq __powisf2@PLT
938
+ ; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0
939
+ ; F16C-NEXT: vmovd %xmm0, %eax
940
+ ; F16C-NEXT: movw %ax, (%rbx)
941
+ ; F16C-NEXT: popq %rbx
942
+ ; F16C-NEXT: retq
943
+ ;
944
+ ; FP16-LABEL: test_half_powi:
945
+ ; FP16: # %bb.0:
946
+ ; FP16-NEXT: pushq %rbx
947
+ ; FP16-NEXT: movq %rsi, %rbx
948
+ ; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0
949
+ ; FP16-NEXT: callq __powisf2@PLT
950
+ ; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0
951
+ ; FP16-NEXT: vmovsh %xmm0, (%rbx)
952
+ ; FP16-NEXT: popq %rbx
953
+ ; FP16-NEXT: retq
954
+ ;
955
+ ; X64-LABEL: test_half_powi:
956
+ ; X64: # %bb.0:
957
+ ; X64-NEXT: pushq %rbp
958
+ ; X64-NEXT: pushq %rbx
959
+ ; X64-NEXT: pushq %rax
960
+ ; X64-NEXT: movq %rsi, %rbx
961
+ ; X64-NEXT: movl %edi, %ebp
962
+ ; X64-NEXT: callq __extendhfsf2@PLT
963
+ ; X64-NEXT: movl %ebp, %edi
964
+ ; X64-NEXT: callq __powisf2@PLT
965
+ ; X64-NEXT: callq __truncsfhf2@PLT
966
+ ; X64-NEXT: pextrw $0, %xmm0, %eax
967
+ ; X64-NEXT: movw %ax, (%rbx)
968
+ ; X64-NEXT: addq $8, %rsp
969
+ ; X64-NEXT: popq %rbx
970
+ ; X64-NEXT: popq %rbp
971
+ ; X64-NEXT: retq
972
+ ;
973
+ ; X86-LABEL: test_half_powi:
974
+ ; X86: # %bb.0:
975
+ ; X86-NEXT: pushl %edi
976
+ ; X86-NEXT: pushl %esi
977
+ ; X86-NEXT: subl $20, %esp
978
+ ; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0
979
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
980
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
981
+ ; X86-NEXT: pextrw $0, %xmm0, %eax
982
+ ; X86-NEXT: movw %ax, (%esp)
983
+ ; X86-NEXT: calll __extendhfsf2
984
+ ; X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
985
+ ; X86-NEXT: fstps (%esp)
986
+ ; X86-NEXT: calll __powisf2
987
+ ; X86-NEXT: fstps (%esp)
988
+ ; X86-NEXT: calll __truncsfhf2
989
+ ; X86-NEXT: pextrw $0, %xmm0, %eax
990
+ ; X86-NEXT: movw %ax, (%esi)
991
+ ; X86-NEXT: addl $20, %esp
992
+ ; X86-NEXT: popl %esi
993
+ ; X86-NEXT: popl %edi
994
+ ; X86-NEXT: retl
995
+ %res = call half @llvm.powi.half (half %a0 , i32 %a1 )
996
+ store half %res , ptr %p0 , align 2
997
+ ret void
998
+ }
999
+
929
1000
define void @test_half_rint (half %a0 , ptr %p0 ) nounwind {
930
1001
; F16C-LABEL: test_half_rint:
931
1002
; F16C: # %bb.0:
0 commit comments