Skip to content

Commit 80246e0

Browse files
author
v01dxyz
committed
[X86][LegalizeDAG] FPOWI: promote f16 operand
1 parent 2847020 commit 80246e0

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
614614
setOperationAction(ISD::FTAN, VT, Action);
615615
setOperationAction(ISD::FSQRT, VT, Action);
616616
setOperationAction(ISD::FPOW, VT, Action);
617+
setOperationAction(ISD::FPOWI, VT, Action);
617618
setOperationAction(ISD::FLOG, VT, Action);
618619
setOperationAction(ISD::FLOG2, VT, Action);
619620
setOperationAction(ISD::FLOG10, VT, Action);

llvm/test/CodeGen/X86/fp16-libcalls.ll

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,73 @@ define void @test_half_pow(half %a0, half %a1, ptr %p0) nounwind {
259259
ret void
260260
}
261261

262+
define half @test_half_powi(half %a0, i32 %a1) {
263+
; F16C-LABEL: test_half_powi:
264+
; F16C: # %bb.0:
265+
; F16C-NEXT: pushq %rax
266+
; F16C-NEXT: .cfi_def_cfa_offset 16
267+
; F16C-NEXT: vpextrw $0, %xmm0, %eax
268+
; F16C-NEXT: vmovd %eax, %xmm0
269+
; F16C-NEXT: vcvtph2ps %xmm0, %xmm0
270+
; F16C-NEXT: callq __powisf2@PLT
271+
; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0
272+
; F16C-NEXT: vmovd %xmm0, %eax
273+
; F16C-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0
274+
; F16C-NEXT: popq %rax
275+
; F16C-NEXT: .cfi_def_cfa_offset 8
276+
; F16C-NEXT: retq
277+
;
278+
; FP16-LABEL: test_half_powi:
279+
; FP16: # %bb.0:
280+
; FP16-NEXT: pushq %rax
281+
; FP16-NEXT: .cfi_def_cfa_offset 16
282+
; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0
283+
; FP16-NEXT: callq __powisf2@PLT
284+
; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0
285+
; FP16-NEXT: popq %rax
286+
; FP16-NEXT: .cfi_def_cfa_offset 8
287+
; FP16-NEXT: retq
288+
;
289+
; X64-LABEL: test_half_powi:
290+
; X64: # %bb.0:
291+
; X64-NEXT: pushq %rbx
292+
; X64-NEXT: .cfi_def_cfa_offset 16
293+
; X64-NEXT: .cfi_offset %rbx, -16
294+
; X64-NEXT: movl %edi, %ebx
295+
; X64-NEXT: callq __extendhfsf2@PLT
296+
; X64-NEXT: movl %ebx, %edi
297+
; X64-NEXT: callq __powisf2@PLT
298+
; X64-NEXT: callq __truncsfhf2@PLT
299+
; X64-NEXT: popq %rbx
300+
; X64-NEXT: .cfi_def_cfa_offset 8
301+
; X64-NEXT: retq
302+
;
303+
; X86-LABEL: test_half_powi:
304+
; X86: # %bb.0:
305+
; X86-NEXT: pushl %esi
306+
; X86-NEXT: .cfi_def_cfa_offset 8
307+
; X86-NEXT: subl $8, %esp
308+
; X86-NEXT: .cfi_def_cfa_offset 16
309+
; X86-NEXT: .cfi_offset %esi, -8
310+
; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0
311+
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
312+
; X86-NEXT: pextrw $0, %xmm0, %eax
313+
; X86-NEXT: movw %ax, (%esp)
314+
; X86-NEXT: calll __extendhfsf2
315+
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
316+
; X86-NEXT: fstps (%esp)
317+
; X86-NEXT: calll __powisf2
318+
; X86-NEXT: fstps (%esp)
319+
; X86-NEXT: calll __truncsfhf2
320+
; X86-NEXT: addl $8, %esp
321+
; X86-NEXT: .cfi_def_cfa_offset 8
322+
; X86-NEXT: popl %esi
323+
; X86-NEXT: .cfi_def_cfa_offset 4
324+
; X86-NEXT: retl
325+
%res = call half @llvm.powi(half %a0, i32 %a1)
326+
ret half %res
327+
}
328+
262329
define void @test_half_sin(half %a0, ptr %p0) nounwind {
263330
; F16C-LABEL: test_half_sin:
264331
; F16C: # %bb.0:

0 commit comments

Comments
 (0)