[llvm] 5815dfe - [X86] promote f16 `frexp` (#208530)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 9 12:48:45 PDT 2026


Author: Folkert de Vries
Date: 2026-07-09T21:48:40+02:00
New Revision: 5815dfe402a8a6b1e39edb8524fbe4d0eb885feb

URL: https://github.com/llvm/llvm-project/commit/5815dfe402a8a6b1e39edb8524fbe4d0eb885feb
DIFF: https://github.com/llvm/llvm-project/commit/5815dfe402a8a6b1e39edb8524fbe4d0eb885feb.diff

LOG: [X86] promote f16 `frexp` (#208530)

follow-up to https://github.com/llvm/llvm-project/pull/208462

Using the libcall reduces code size, gives identical output for the full
f16 range, and is apparently quite a bit faster

```
direct f16: 2.067486000 s for 1000 full-range iterations
via f32:    0.714443000 s for 1000 full-range iterations
```

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86ISelLowering.cpp
    llvm/test/CodeGen/X86/float-to-arbitrary-fp.ll
    llvm/test/CodeGen/X86/llvm.frexp.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index cfbaca6059c42..46edb6c001955 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -645,6 +645,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
     setOperationAction(ISD::FROUNDEVEN, VT, Action);
     setOperationAction(ISD::FTRUNC, VT, Action);
     setOperationAction(ISD::FLDEXP, VT, Action);
+    setOperationAction(ISD::FFREXP, VT, Action);
     setOperationAction(ISD::FSINCOSPI, VT, Action);
   };
 

diff  --git a/llvm/test/CodeGen/X86/float-to-arbitrary-fp.ll b/llvm/test/CodeGen/X86/float-to-arbitrary-fp.ll
index 1cdccaf110d30..8076f0a11762c 100644
--- a/llvm/test/CodeGen/X86/float-to-arbitrary-fp.ll
+++ b/llvm/test/CodeGen/X86/float-to-arbitrary-fp.ll
@@ -1858,215 +1858,182 @@ define <2 x i8> @to_f8e4m3fn_v2f16(<2 x half> %x) {
 ; CHECK-NEXT:    .cfi_def_cfa_offset 48
 ; CHECK-NEXT:    pushq %rbx
 ; CHECK-NEXT:    .cfi_def_cfa_offset 56
-; CHECK-NEXT:    subq $72, %rsp
-; CHECK-NEXT:    .cfi_def_cfa_offset 128
+; CHECK-NEXT:    subq $88, %rsp
+; CHECK-NEXT:    .cfi_def_cfa_offset 144
 ; CHECK-NEXT:    .cfi_offset %rbx, -56
 ; CHECK-NEXT:    .cfi_offset %r12, -48
 ; CHECK-NEXT:    .cfi_offset %r13, -40
 ; CHECK-NEXT:    .cfi_offset %r14, -32
 ; CHECK-NEXT:    .cfi_offset %r15, -24
 ; CHECK-NEXT:    .cfi_offset %rbp, -16
-; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
 ; CHECK-NEXT:    callq __extendhfsf2 at PLT
-; CHECK-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
+; CHECK-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
+; CHECK-NEXT:    callq frexpf at PLT
+; CHECK-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; CHECK-NEXT:    movl $2, %ebx
+; CHECK-NEXT:    movl $2, %ebp
+; CHECK-NEXT:    subl %eax, %ebp
+; CHECK-NEXT:    cmpw $15, %bp
+; CHECK-NEXT:    movl $15, %eax
+; CHECK-NEXT:    cmovael %eax, %ebp
+; CHECK-NEXT:    cmpw $1, %bp
+; CHECK-NEXT:    movl %ebp, %r14d
+; CHECK-NEXT:    adcl $-1, %r14d
 ; CHECK-NEXT:    callq __truncsfhf2 at PLT
-; CHECK-NEXT:    pextrw $0, %xmm0, %r12d
-; CHECK-NEXT:    movl %r12d, %eax
-; CHECK-NEXT:    andl $31744, %eax # imm = 0x7C00
+; CHECK-NEXT:    pextrw $0, %xmm0, %r13d
+; CHECK-NEXT:    movl %r13d, %eax
+; CHECK-NEXT:    andl $1023, %eax # imm = 0x3FF
+; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; CHECK-NEXT:    leal 1024(%rax), %edi
+; CHECK-NEXT:    movl %edi, %eax
+; CHECK-NEXT:    movl %r14d, %ecx
+; CHECK-NEXT:    shrl %cl, %eax
+; CHECK-NEXT:    movl $1, %r15d
+; CHECK-NEXT:    movl $1, %edx
+; CHECK-NEXT:    shll %cl, %edx
+; CHECK-NEXT:    decl %edx
+; CHECK-NEXT:    xorl %esi, %esi
+; CHECK-NEXT:    movl %edi, %r14d
+; CHECK-NEXT:    testw %dx, %r14w
+; CHECK-NEXT:    setne %sil
+; CHECK-NEXT:    movl %ebp, %ecx
+; CHECK-NEXT:    shrl %cl, %r14d
+; CHECK-NEXT:    movl %r14d, %r12d
+; CHECK-NEXT:    andl $1, %r12d
+; CHECK-NEXT:    orl %esi, %r12d
+; CHECK-NEXT:    andl %eax, %r12d
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    cmpw $1, %bp
 ; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; CHECK-NEXT:    pextrw $0, %xmm0, %r15d
-; CHECK-NEXT:    movl %r15d, %ecx
-; CHECK-NEXT:    andl $32767, %ecx # imm = 0x7FFF
-; CHECK-NEXT:    cmpl $1024, %ecx # imm = 0x400
-; CHECK-NEXT:    cmovael %r15d, %r12d
-; CHECK-NEXT:    cmovael %ecx, %eax
-; CHECK-NEXT:    shrl $10, %eax
-; CHECK-NEXT:    leal -12(%rax), %edx
-; CHECK-NEXT:    cmpl $1024, %ecx # imm = 0x400
 ; CHECK-NEXT:    psrld $16, %xmm0
 ; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; CHECK-NEXT:    cmovael %eax, %edx
-; CHECK-NEXT:    addl $-14, %edx
-; CHECK-NEXT:    andl $33791, %r12d # imm = 0x83FF
-; CHECK-NEXT:    orl $14336, %r12d # imm = 0x3800
-; CHECK-NEXT:    addl $-31744, %ecx # imm = 0x8400
-; CHECK-NEXT:    movzwl %cx, %eax
-; CHECK-NEXT:    xorl %ecx, %ecx
-; CHECK-NEXT:    cmpl $33792, %eax # imm = 0x8400
-; CHECK-NEXT:    cmovbel %ecx, %edx
-; CHECK-NEXT:    movq %rdx, %r14
-; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; CHECK-NEXT:    cmovbel %r15d, %r12d
+; CHECK-NEXT:    cmovbl %eax, %r12d
 ; CHECK-NEXT:    callq __extendhfsf2 at PLT
-; CHECK-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
+; CHECK-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
+; CHECK-NEXT:    callq frexpf at PLT
+; CHECK-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; CHECK-NEXT:    subl %eax, %ebx
+; CHECK-NEXT:    cmpw $15, %bx
+; CHECK-NEXT:    movl $15, %eax
+; CHECK-NEXT:    cmovael %eax, %ebx
+; CHECK-NEXT:    cmpw $1, %bx
+; CHECK-NEXT:    movl %ebx, %ebp
+; CHECK-NEXT:    adcl $-1, %ebp
 ; CHECK-NEXT:    callq __truncsfhf2 at PLT
-; CHECK-NEXT:    pextrw $0, %xmm0, %ebp
-; CHECK-NEXT:    movl %ebp, %eax
-; CHECK-NEXT:    andl $31744, %eax # imm = 0x7C00
-; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; CHECK-NEXT:    pextrw $0, %xmm0, %ebx
-; CHECK-NEXT:    movl %ebx, %r9d
-; CHECK-NEXT:    andl $32767, %r9d # imm = 0x7FFF
-; CHECK-NEXT:    cmpl $1024, %r9d # imm = 0x400
-; CHECK-NEXT:    cmovael %ebx, %ebp
-; CHECK-NEXT:    cmovael %r9d, %eax
-; CHECK-NEXT:    shrl $10, %eax
-; CHECK-NEXT:    leal -12(%rax), %esi
-; CHECK-NEXT:    cmpl $1024, %r9d # imm = 0x400
-; CHECK-NEXT:    cmovael %eax, %esi
-; CHECK-NEXT:    movl $2, %eax
-; CHECK-NEXT:    movl $2, %edx
-; CHECK-NEXT:    subl %r14d, %edx
-; CHECK-NEXT:    cmpw $15, %dx
-; CHECK-NEXT:    movl $15, %r13d
-; CHECK-NEXT:    cmovael %r13d, %edx
-; CHECK-NEXT:    cmpw $1, %dx
-; CHECK-NEXT:    movl %edx, %ecx
-; CHECK-NEXT:    adcl $-1, %ecx
-; CHECK-NEXT:    movl %r12d, %r10d
-; CHECK-NEXT:    andl $1023, %r10d # imm = 0x3FF
-; CHECK-NEXT:    leal 1024(%r10), %edi
-; CHECK-NEXT:    movl %edi, %r14d
-; CHECK-NEXT:    shrl %cl, %r14d
-; CHECK-NEXT:    movl $1, %r8d
-; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
-; CHECK-NEXT:    shll %cl, %r8d
-; CHECK-NEXT:    decl %r8d
-; CHECK-NEXT:    xorl %r11d, %r11d
-; CHECK-NEXT:    testw %r8w, %di
-; CHECK-NEXT:    setne %r11b
-; CHECK-NEXT:    movl %edx, %ecx
-; CHECK-NEXT:    shrl %cl, %edi
-; CHECK-NEXT:    movl %edi, %r8d
-; CHECK-NEXT:    andl $1, %r8d
-; CHECK-NEXT:    orl %r11d, %r8d
-; CHECK-NEXT:    movl $1, %r11d
-; CHECK-NEXT:    andl %r14d, %r8d
-; CHECK-NEXT:    cmpw $1, %dx
-; CHECK-NEXT:    movl $0, %edx
-; CHECK-NEXT:    cmovbl %edx, %r8d
-; CHECK-NEXT:    addl $-14, %esi
-; CHECK-NEXT:    andl $33791, %ebp # imm = 0x83FF
-; CHECK-NEXT:    orl $14336, %ebp # imm = 0x3800
-; CHECK-NEXT:    addl $-31744, %r9d # imm = 0x8400
-; CHECK-NEXT:    movzwl %r9w, %ecx
-; CHECK-NEXT:    cmpl $33792, %ecx # imm = 0x8400
-; CHECK-NEXT:    cmovbel %edx, %esi
-; CHECK-NEXT:    movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; CHECK-NEXT:    cmovbel %ebx, %ebp
-; CHECK-NEXT:    subl %esi, %eax
-; CHECK-NEXT:    cmpw $15, %ax
-; CHECK-NEXT:    cmovael %r13d, %eax
-; CHECK-NEXT:    cmpw $1, %ax
-; CHECK-NEXT:    movl %eax, %ecx
-; CHECK-NEXT:    adcl $-1, %ecx
-; CHECK-NEXT:    movl %ebp, %edx
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax
+; CHECK-NEXT:    movl %eax, %edx
 ; CHECK-NEXT:    andl $1023, %edx # imm = 0x3FF
-; CHECK-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; CHECK-NEXT:    leal 1024(%rdx), %r13d
-; CHECK-NEXT:    movl %r13d, %edx
-; CHECK-NEXT:    shrl %cl, %edx
-; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
-; CHECK-NEXT:    shll %cl, %r11d
-; CHECK-NEXT:    decl %r11d
-; CHECK-NEXT:    xorl %r9d, %r9d
-; CHECK-NEXT:    testw %r11w, %r13w
-; CHECK-NEXT:    setne %r9b
-; CHECK-NEXT:    movl %eax, %ecx
-; CHECK-NEXT:    shrl %cl, %r13d
-; CHECK-NEXT:    movl %r13d, %r14d
-; CHECK-NEXT:    andl $1, %r14d
-; CHECK-NEXT:    orl %r9d, %r14d
-; CHECK-NEXT:    andl %edx, %r14d
-; CHECK-NEXT:    cmpw $1, %ax
-; CHECK-NEXT:    movl $0, %ecx
-; CHECK-NEXT:    cmovbl %ecx, %r14d
-; CHECK-NEXT:    addl %edi, %r8d
-; CHECK-NEXT:    xorl %eax, %eax
-; CHECK-NEXT:    cmpw $8, %r8w
-; CHECK-NEXT:    cmovgel %ecx, %r8d
-; CHECK-NEXT:    movl $0, %esi
-; CHECK-NEXT:    setge %al
-; CHECK-NEXT:    shrl $8, %r15d
-; CHECK-NEXT:    andl $128, %r15d
-; CHECK-NEXT:    leal (%r15,%rax,8), %eax
-; CHECK-NEXT:    orl %r8d, %eax
-; CHECK-NEXT:    shrl $7, %r10d
-; CHECK-NEXT:    movl %r10d, %ecx
+; CHECK-NEXT:    leal 1024(%rdx), %esi
+; CHECK-NEXT:    movl %esi, %edi
+; CHECK-NEXT:    movl %ebp, %ecx
+; CHECK-NEXT:    shrl %cl, %edi
+; CHECK-NEXT:    shll %cl, %r15d
+; CHECK-NEXT:    decl %r15d
+; CHECK-NEXT:    xorl %r8d, %r8d
+; CHECK-NEXT:    testw %r15w, %si
+; CHECK-NEXT:    setne %r8b
+; CHECK-NEXT:    movl %ebx, %ecx
+; CHECK-NEXT:    shrl %cl, %esi
+; CHECK-NEXT:    movl %esi, %ecx
 ; CHECK-NEXT:    andl $1, %ecx
-; CHECK-NEXT:    xorl %edx, %edx
-; CHECK-NEXT:    testb $63, %r12b
-; CHECK-NEXT:    setne %dl
-; CHECK-NEXT:    orl %ecx, %edx
-; CHECK-NEXT:    shrl $6, %r12d
-; CHECK-NEXT:    andl %edx, %r12d
-; CHECK-NEXT:    addl %r10d, %r12d
-; CHECK-NEXT:    xorl %ecx, %ecx
+; CHECK-NEXT:    orl %r8d, %ecx
+; CHECK-NEXT:    andl %edi, %ecx
+; CHECK-NEXT:    cmpw $1, %bx
+; CHECK-NEXT:    movl $0, %r8d
+; CHECK-NEXT:    cmovbl %r8d, %ecx
+; CHECK-NEXT:    addl %r14d, %r12d
+; CHECK-NEXT:    xorl %edi, %edi
 ; CHECK-NEXT:    cmpw $8, %r12w
-; CHECK-NEXT:    cmovgel %esi, %r12d
-; CHECK-NEXT:    setge %cl
-; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
-; CHECK-NEXT:    leal (%rsi,%rcx), %edx
-; CHECK-NEXT:    leal 48(,%rdx,8), %edx
-; CHECK-NEXT:    orl %r15d, %r12d
-; CHECK-NEXT:    orl %edx, %r12d
-; CHECK-NEXT:    leal 6(%rsi,%rcx), %ecx
-; CHECK-NEXT:    testw %cx, %cx
-; CHECK-NEXT:    cmovlel %eax, %r12d
-; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; CHECK-NEXT:    callq __extendhfsf2 at PLT
-; CHECK-NEXT:    xorps %xmm1, %xmm1
-; CHECK-NEXT:    ucomiss %xmm1, %xmm0
-; CHECK-NEXT:    cmovnel %r12d, %r15d
-; CHECK-NEXT:    cmovpl %r12d, %r15d
-; CHECK-NEXT:    movl $127, %r12d
-; CHECK-NEXT:    cmovpl %r12d, %r15d
-; CHECK-NEXT:    movzbl %r15b, %r15d
-; CHECK-NEXT:    addl %r13d, %r14d
-; CHECK-NEXT:    xorl %eax, %eax
-; CHECK-NEXT:    cmpw $8, %r14w
-; CHECK-NEXT:    movl $0, %edi
-; CHECK-NEXT:    cmovgel %edi, %r14d
-; CHECK-NEXT:    setge %al
-; CHECK-NEXT:    shrl $8, %ebx
-; CHECK-NEXT:    andl $128, %ebx
-; CHECK-NEXT:    leal (%rbx,%rax,8), %eax
-; CHECK-NEXT:    orl %r14d, %eax
-; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
+; CHECK-NEXT:    cmovgel %r8d, %r12d
+; CHECK-NEXT:    movl $0, %r11d
+; CHECK-NEXT:    setge %dil
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; CHECK-NEXT:    pextrw $0, %xmm0, %r8d
+; CHECK-NEXT:    shrl $8, %r8d
+; CHECK-NEXT:    andl $128, %r8d
+; CHECK-NEXT:    leal (%r8,%rdi,8), %edi
+; CHECK-NEXT:    orl %r12d, %edi
+; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
+; CHECK-NEXT:    shrl $7, %r10d
+; CHECK-NEXT:    movl %r10d, %r9d
+; CHECK-NEXT:    movq %r10, %rbx
+; CHECK-NEXT:    andl $1, %r9d
+; CHECK-NEXT:    xorl %r10d, %r10d
+; CHECK-NEXT:    testb $63, %r13b
+; CHECK-NEXT:    setne %r10b
+; CHECK-NEXT:    orl %r9d, %r10d
+; CHECK-NEXT:    shrl $6, %r13d
+; CHECK-NEXT:    andl %r10d, %r13d
+; CHECK-NEXT:    addl %ebx, %r13d
+; CHECK-NEXT:    xorl %r9d, %r9d
+; CHECK-NEXT:    cmpw $8, %r13w
+; CHECK-NEXT:    cmovgel %r11d, %r13d
+; CHECK-NEXT:    setge %r9b
+; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
+; CHECK-NEXT:    leal (%rbx,%r9), %r10d
+; CHECK-NEXT:    leal 48(,%r10,8), %r10d
+; CHECK-NEXT:    orl %r8d, %r13d
+; CHECK-NEXT:    orl %r10d, %r13d
+; CHECK-NEXT:    leal 6(%rbx,%r9), %r9d
+; CHECK-NEXT:    testw %r9w, %r9w
+; CHECK-NEXT:    cmovlel %edi, %r13d
+; CHECK-NEXT:    pxor %xmm0, %xmm0
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload
+; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero
+; CHECK-NEXT:    ucomiss %xmm0, %xmm1
+; CHECK-NEXT:    cmovnel %r13d, %r8d
+; CHECK-NEXT:    cmovpl %r13d, %r8d
+; CHECK-NEXT:    movl $127, %edi
+; CHECK-NEXT:    cmovpl %edi, %r8d
+; CHECK-NEXT:    movzbl %r8b, %r8d
+; CHECK-NEXT:    addl %esi, %ecx
+; CHECK-NEXT:    xorl %r9d, %r9d
+; CHECK-NEXT:    cmpw $8, %cx
+; CHECK-NEXT:    cmovgel %r11d, %ecx
+; CHECK-NEXT:    setge %r9b
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; CHECK-NEXT:    pextrw $0, %xmm1, %esi
+; CHECK-NEXT:    shrl $8, %esi
+; CHECK-NEXT:    andl $128, %esi
+; CHECK-NEXT:    leal (%rsi,%r9,8), %r9d
+; CHECK-NEXT:    orl %ecx, %r9d
 ; CHECK-NEXT:    shrl $7, %edx
 ; CHECK-NEXT:    movl %edx, %ecx
-; CHECK-NEXT:    movq %rdx, %rsi
 ; CHECK-NEXT:    andl $1, %ecx
-; CHECK-NEXT:    xorl %edx, %edx
-; CHECK-NEXT:    testb $63, %bpl
-; CHECK-NEXT:    setne %dl
-; CHECK-NEXT:    orl %ecx, %edx
-; CHECK-NEXT:    shrl $6, %ebp
-; CHECK-NEXT:    andl %edx, %ebp
-; CHECK-NEXT:    addl %esi, %ebp
+; CHECK-NEXT:    xorl %r10d, %r10d
+; CHECK-NEXT:    testb $63, %al
+; CHECK-NEXT:    setne %r10b
+; CHECK-NEXT:    orl %ecx, %r10d
+; CHECK-NEXT:    shrl $6, %eax
+; CHECK-NEXT:    andl %r10d, %eax
+; CHECK-NEXT:    addl %edx, %eax
 ; CHECK-NEXT:    xorl %ecx, %ecx
-; CHECK-NEXT:    cmpw $8, %bp
-; CHECK-NEXT:    cmovgel %edi, %ebp
+; CHECK-NEXT:    cmpw $8, %ax
+; CHECK-NEXT:    cmovgel %r11d, %eax
 ; CHECK-NEXT:    setge %cl
-; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
-; CHECK-NEXT:    leal (%rsi,%rcx), %edx
+; CHECK-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
+; CHECK-NEXT:    leal (%r10,%rcx), %edx
 ; CHECK-NEXT:    leal 48(,%rdx,8), %edx
-; CHECK-NEXT:    orl %ebx, %ebp
-; CHECK-NEXT:    orl %edx, %ebp
-; CHECK-NEXT:    leal 6(%rsi,%rcx), %ecx
+; CHECK-NEXT:    orl %esi, %eax
+; CHECK-NEXT:    orl %edx, %eax
+; CHECK-NEXT:    leal 6(%r10,%rcx), %ecx
 ; CHECK-NEXT:    testw %cx, %cx
-; CHECK-NEXT:    cmovlel %eax, %ebp
-; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; CHECK-NEXT:    callq __extendhfsf2 at PLT
-; CHECK-NEXT:    xorps %xmm1, %xmm1
-; CHECK-NEXT:    ucomiss %xmm1, %xmm0
-; CHECK-NEXT:    cmovnel %ebp, %ebx
-; CHECK-NEXT:    cmovpl %ebp, %ebx
-; CHECK-NEXT:    cmovpl %r12d, %ebx
-; CHECK-NEXT:    shll $8, %ebx
-; CHECK-NEXT:    orl %r15d, %ebx
-; CHECK-NEXT:    movd %ebx, %xmm0
-; CHECK-NEXT:    addq $72, %rsp
+; CHECK-NEXT:    cmovlel %r9d, %eax
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload
+; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero
+; CHECK-NEXT:    ucomiss %xmm0, %xmm1
+; CHECK-NEXT:    cmovnel %eax, %esi
+; CHECK-NEXT:    cmovpl %eax, %esi
+; CHECK-NEXT:    cmovpl %edi, %esi
+; CHECK-NEXT:    shll $8, %esi
+; CHECK-NEXT:    orl %r8d, %esi
+; CHECK-NEXT:    movd %esi, %xmm0
+; CHECK-NEXT:    addq $88, %rsp
 ; CHECK-NEXT:    .cfi_def_cfa_offset 56
 ; CHECK-NEXT:    popq %rbx
 ; CHECK-NEXT:    .cfi_def_cfa_offset 48
@@ -2102,121 +2069,105 @@ define i8 @to_f8e5m2_from_f16(half %x) {
 ; CHECK-NEXT:    .cfi_offset %rbx, -32
 ; CHECK-NEXT:    .cfi_offset %r14, -24
 ; CHECK-NEXT:    .cfi_offset %rbp, -16
-; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; CHECK-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
 ; CHECK-NEXT:    callq __extendhfsf2 at PLT
-; CHECK-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
+; CHECK-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
+; CHECK-NEXT:    callq frexpf at PLT
+; CHECK-NEXT:    movl {{[0-9]+}}(%rsp), %r14d
+; CHECK-NEXT:    movl $-5, %eax
+; CHECK-NEXT:    subl %r14d, %eax
+; CHECK-NEXT:    cmpw $15, %ax
+; CHECK-NEXT:    movl $15, %ebx
+; CHECK-NEXT:    cmovbl %eax, %ebx
+; CHECK-NEXT:    cmpw $1, %bx
+; CHECK-NEXT:    movl %ebx, %ebp
+; CHECK-NEXT:    adcl $-1, %ebp
 ; CHECK-NEXT:    callq __truncsfhf2 at PLT
-; CHECK-NEXT:    pextrw $0, %xmm0, %edx
-; CHECK-NEXT:    movl %edx, %eax
-; CHECK-NEXT:    andl $31744, %eax # imm = 0x7C00
-; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; CHECK-NEXT:    pextrw $0, %xmm0, %ebx
-; CHECK-NEXT:    movl %ebx, %ecx
-; CHECK-NEXT:    andl $32767, %ecx # imm = 0x7FFF
-; CHECK-NEXT:    cmpl $1024, %ecx # imm = 0x400
-; CHECK-NEXT:    cmovael %ebx, %edx
-; CHECK-NEXT:    cmovael %ecx, %eax
-; CHECK-NEXT:    shrl $10, %eax
-; CHECK-NEXT:    leal -12(%rax), %esi
-; CHECK-NEXT:    cmpl $1024, %ecx # imm = 0x400
-; CHECK-NEXT:    cmovael %eax, %esi
-; CHECK-NEXT:    addl $-14, %esi
-; CHECK-NEXT:    andl $33791, %edx # imm = 0x83FF
-; CHECK-NEXT:    orl $14336, %edx # imm = 0x3800
-; CHECK-NEXT:    addl $-31744, %ecx # imm = 0x8400
-; CHECK-NEXT:    movzwl %cx, %eax
-; CHECK-NEXT:    xorl %edi, %edi
-; CHECK-NEXT:    cmpl $33792, %eax # imm = 0x8400
-; CHECK-NEXT:    cmovbel %edi, %esi
-; CHECK-NEXT:    cmovbel %ebx, %edx
-; CHECK-NEXT:    movl $-5, %ecx
-; CHECK-NEXT:    subl %esi, %ecx
-; CHECK-NEXT:    cmpw $15, %cx
-; CHECK-NEXT:    movl $15, %eax
-; CHECK-NEXT:    cmovbl %ecx, %eax
-; CHECK-NEXT:    cmpw $1, %ax
-; CHECK-NEXT:    movl %eax, %ecx
-; CHECK-NEXT:    adcl $-1, %ecx
-; CHECK-NEXT:    movl %edx, %r8d
-; CHECK-NEXT:    andl $1023, %r8d # imm = 0x3FF
-; CHECK-NEXT:    leal 1024(%r8), %r9d
-; CHECK-NEXT:    movl %r9d, %r10d
-; CHECK-NEXT:    shrl %cl, %r10d
-; CHECK-NEXT:    movl $1, %r11d
-; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
-; CHECK-NEXT:    shll %cl, %r11d
-; CHECK-NEXT:    decl %r11d
-; CHECK-NEXT:    xorl %ebp, %ebp
-; CHECK-NEXT:    testw %r11w, %r9w
-; CHECK-NEXT:    setne %bpl
-; CHECK-NEXT:    movl %eax, %ecx
-; CHECK-NEXT:    shrl %cl, %r9d
-; CHECK-NEXT:    movl %r9d, %ecx
-; CHECK-NEXT:    andl $1, %ecx
-; CHECK-NEXT:    orl %ebp, %ecx
-; CHECK-NEXT:    andl %r10d, %ecx
-; CHECK-NEXT:    cmpw $1, %ax
-; CHECK-NEXT:    cmovbl %edi, %ecx
-; CHECK-NEXT:    addl %r9d, %ecx
-; CHECK-NEXT:    xorl %eax, %eax
-; CHECK-NEXT:    cmpw $4, %cx
-; CHECK-NEXT:    cmovgel %edi, %ecx
-; CHECK-NEXT:    setge %al
-; CHECK-NEXT:    shrl $8, %ebx
-; CHECK-NEXT:    andl $128, %ebx
-; CHECK-NEXT:    leal (%rbx,%rax,4), %eax
-; CHECK-NEXT:    orl %ecx, %eax
-; CHECK-NEXT:    shrl $8, %r8d
-; CHECK-NEXT:    movl %r8d, %ecx
-; CHECK-NEXT:    andl $1, %ecx
+; CHECK-NEXT:    pextrw $0, %xmm0, %eax
+; CHECK-NEXT:    movl %eax, %edx
+; CHECK-NEXT:    andl $1023, %edx # imm = 0x3FF
+; CHECK-NEXT:    leal 1024(%rdx), %esi
+; CHECK-NEXT:    movl %esi, %edi
+; CHECK-NEXT:    movl %ebp, %ecx
+; CHECK-NEXT:    shrl %cl, %edi
+; CHECK-NEXT:    movl $1, %r8d
+; CHECK-NEXT:    shll %cl, %r8d
+; CHECK-NEXT:    decl %r8d
 ; CHECK-NEXT:    xorl %r9d, %r9d
-; CHECK-NEXT:    testb $127, %dl
+; CHECK-NEXT:    testw %r8w, %si
 ; CHECK-NEXT:    setne %r9b
-; CHECK-NEXT:    orl %ecx, %r9d
-; CHECK-NEXT:    shrl $7, %edx
-; CHECK-NEXT:    andl %r9d, %edx
-; CHECK-NEXT:    addl %r8d, %edx
+; CHECK-NEXT:    movl %ebx, %ecx
+; CHECK-NEXT:    shrl %cl, %esi
+; CHECK-NEXT:    movl %esi, %r8d
+; CHECK-NEXT:    andl $1, %r8d
+; CHECK-NEXT:    orl %r9d, %r8d
+; CHECK-NEXT:    andl %edi, %r8d
 ; CHECK-NEXT:    xorl %ecx, %ecx
-; CHECK-NEXT:    cmpw $4, %dx
-; CHECK-NEXT:    cmovgel %edi, %edx
-; CHECK-NEXT:    setge %cl
-; CHECK-NEXT:    leal (%rsi,%rcx), %edi
-; CHECK-NEXT:    leal 56(,%rdi,4), %edi
-; CHECK-NEXT:    movl %ebx, %ebp
-; CHECK-NEXT:    orl %edx, %ebp
-; CHECK-NEXT:    orl %edi, %ebp
-; CHECK-NEXT:    leal 14(%rsi,%rcx), %ecx
-; CHECK-NEXT:    testw %cx, %cx
-; CHECK-NEXT:    cmovlel %eax, %ebp
-; CHECK-NEXT:    cmpw $4, %dx
+; CHECK-NEXT:    cmpw $1, %bx
+; CHECK-NEXT:    cmovbl %ecx, %r8d
+; CHECK-NEXT:    addl %esi, %r8d
+; CHECK-NEXT:    xorl %esi, %esi
+; CHECK-NEXT:    cmpw $4, %r8w
+; CHECK-NEXT:    cmovgel %ecx, %r8d
+; CHECK-NEXT:    setge %sil
+; CHECK-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; CHECK-NEXT:    pextrw $0, %xmm1, %ebx
+; CHECK-NEXT:    shrl $8, %ebx
+; CHECK-NEXT:    andl $128, %ebx
+; CHECK-NEXT:    leal (%rbx,%rsi,4), %esi
+; CHECK-NEXT:    orl %r8d, %esi
+; CHECK-NEXT:    shrl $8, %edx
+; CHECK-NEXT:    movl %edx, %edi
+; CHECK-NEXT:    andl $1, %edi
+; CHECK-NEXT:    xorl %r8d, %r8d
+; CHECK-NEXT:    testb $127, %al
+; CHECK-NEXT:    setne %r8b
+; CHECK-NEXT:    orl %edi, %r8d
+; CHECK-NEXT:    shrl $7, %eax
+; CHECK-NEXT:    andl %r8d, %eax
+; CHECK-NEXT:    addl %edx, %eax
+; CHECK-NEXT:    xorl %edx, %edx
+; CHECK-NEXT:    cmpw $4, %ax
+; CHECK-NEXT:    cmovgel %ecx, %eax
+; CHECK-NEXT:    setge %dl
+; CHECK-NEXT:    leal (%r14,%rdx), %ecx
+; CHECK-NEXT:    leal 56(,%rcx,4), %edi
+; CHECK-NEXT:    movl %ebx, %ecx
+; CHECK-NEXT:    orl %eax, %ecx
+; CHECK-NEXT:    orl %edi, %ecx
+; CHECK-NEXT:    leal 14(%r14,%rdx), %edx
+; CHECK-NEXT:    testw %dx, %dx
+; CHECK-NEXT:    cmovlel %esi, %ecx
+; CHECK-NEXT:    cmpw $4, %ax
 ; CHECK-NEXT:    setge %al
-; CHECK-NEXT:    cmpw $30, %cx
-; CHECK-NEXT:    sete %dl
-; CHECK-NEXT:    andb %al, %dl
-; CHECK-NEXT:    cmpw $31, %cx
+; CHECK-NEXT:    cmpw $30, %dx
+; CHECK-NEXT:    sete %sil
+; CHECK-NEXT:    andb %al, %sil
+; CHECK-NEXT:    cmpw $31, %dx
 ; CHECK-NEXT:    setge %al
-; CHECK-NEXT:    orb %dl, %al
-; CHECK-NEXT:    leal 124(%rbx), %r14d
+; CHECK-NEXT:    orb %sil, %al
+; CHECK-NEXT:    leal 124(%rbx), %ebp
 ; CHECK-NEXT:    testb %al, %al
-; CHECK-NEXT:    cmovnel %r14d, %ebp
-; CHECK-NEXT:    callq __extendhfsf2 at PLT
-; CHECK-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
-; CHECK-NEXT:    xorps %xmm1, %xmm1
-; CHECK-NEXT:    ucomiss %xmm1, %xmm0
-; CHECK-NEXT:    cmovnel %ebp, %ebx
-; CHECK-NEXT:    cmovpl %ebp, %ebx
-; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; CHECK-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT:    cmovnel %ebp, %ecx
+; CHECK-NEXT:    xorps %xmm2, %xmm2
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; CHECK-NEXT:    ucomiss %xmm2, %xmm0
+; CHECK-NEXT:    cmovnel %ecx, %ebx
+; CHECK-NEXT:    cmovpl %ecx, %ebx
+; CHECK-NEXT:    movdqa %xmm1, %xmm0
+; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
 ; CHECK-NEXT:    callq __extendhfsf2 at PLT
 ; CHECK-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; CHECK-NEXT:    cmovnel %ebx, %r14d
-; CHECK-NEXT:    cmovpl %ebx, %r14d
-; CHECK-NEXT:    xorps %xmm0, %xmm0
-; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload
-; CHECK-NEXT:    # xmm1 = mem[0],zero,zero,zero
-; CHECK-NEXT:    ucomiss %xmm0, %xmm1
+; CHECK-NEXT:    cmovnel %ebx, %ebp
+; CHECK-NEXT:    cmovpl %ebx, %ebp
+; CHECK-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
+; CHECK-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; CHECK-NEXT:    pxor %xmm1, %xmm1
+; CHECK-NEXT:    ucomiss %xmm1, %xmm0
 ; CHECK-NEXT:    movl $126, %eax
-; CHECK-NEXT:    cmovnpl %r14d, %eax
+; CHECK-NEXT:    cmovnpl %ebp, %eax
 ; CHECK-NEXT:    # kill: def $al killed $al killed $eax
 ; CHECK-NEXT:    addq $32, %rsp
 ; CHECK-NEXT:    .cfi_def_cfa_offset 32

diff  --git a/llvm/test/CodeGen/X86/llvm.frexp.ll b/llvm/test/CodeGen/X86/llvm.frexp.ll
index d14d737a5ca29..3410fd5169c9a 100644
--- a/llvm/test/CodeGen/X86/llvm.frexp.ll
+++ b/llvm/test/CodeGen/X86/llvm.frexp.ll
@@ -5,36 +5,13 @@
 define { half, i32 } @test_frexp_f16_i32(half %a) nounwind {
 ; X64-LABEL: test_frexp_f16_i32:
 ; X64:       # %bb.0:
-; X64-NEXT:    subq $24, %rsp
-; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
+; X64-NEXT:    pushq %rax
 ; X64-NEXT:    callq __extendhfsf2 at PLT
-; X64-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
+; X64-NEXT:    callq frexpf at PLT
 ; X64-NEXT:    callq __truncsfhf2 at PLT
-; X64-NEXT:    pextrw $0, %xmm0, %ecx
-; X64-NEXT:    movl %ecx, %eax
-; X64-NEXT:    andl $31744, %eax # imm = 0x7C00
-; X64-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
-; X64-NEXT:    pextrw $0, %xmm0, %edx
-; X64-NEXT:    movl %edx, %esi
-; X64-NEXT:    andl $32767, %esi # imm = 0x7FFF
-; X64-NEXT:    cmpl $1024, %esi # imm = 0x400
-; X64-NEXT:    cmovael %edx, %ecx
-; X64-NEXT:    cmovael %esi, %eax
-; X64-NEXT:    shrl $10, %eax
-; X64-NEXT:    leal -12(%rax), %edi
-; X64-NEXT:    cmpl $1024, %esi # imm = 0x400
-; X64-NEXT:    cmovael %eax, %edi
-; X64-NEXT:    addl $-14, %edi
-; X64-NEXT:    andl $33791, %ecx # imm = 0x83FF
-; X64-NEXT:    orl $14336, %ecx # imm = 0x3800
-; X64-NEXT:    addl $-31744, %esi # imm = 0x8400
-; X64-NEXT:    movzwl %si, %esi
-; X64-NEXT:    xorl %eax, %eax
-; X64-NEXT:    cmpl $33792, %esi # imm = 0x8400
-; X64-NEXT:    cmoval %edi, %eax
-; X64-NEXT:    cmovbel %edx, %ecx
-; X64-NEXT:    pinsrw $0, %ecx, %xmm0
-; X64-NEXT:    addq $24, %rsp
+; X64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; X64-NEXT:    popq %rcx
 ; X64-NEXT:    retq
 ;
 ; WIN32-LABEL: test_frexp_f16_i32:
@@ -64,26 +41,12 @@ define { half, i32 } @test_frexp_f16_i32(half %a) nounwind {
 define half @test_frexp_f16_i32_only_use_fract(half %a) nounwind {
 ; X64-LABEL: test_frexp_f16_i32_only_use_fract:
 ; X64:       # %bb.0:
-; X64-NEXT:    subq $24, %rsp
-; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
+; X64-NEXT:    pushq %rax
 ; X64-NEXT:    callq __extendhfsf2 at PLT
-; X64-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
+; X64-NEXT:    callq frexpf at PLT
 ; X64-NEXT:    callq __truncsfhf2 at PLT
-; X64-NEXT:    pextrw $0, %xmm0, %eax
-; X64-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
-; X64-NEXT:    pextrw $0, %xmm0, %ecx
-; X64-NEXT:    movl %ecx, %edx
-; X64-NEXT:    andl $32767, %edx # imm = 0x7FFF
-; X64-NEXT:    cmpl $1024, %edx # imm = 0x400
-; X64-NEXT:    cmovael %ecx, %eax
-; X64-NEXT:    andl $33791, %eax # imm = 0x83FF
-; X64-NEXT:    orl $14336, %eax # imm = 0x3800
-; X64-NEXT:    addl $-31744, %edx # imm = 0x8400
-; X64-NEXT:    movzwl %dx, %edx
-; X64-NEXT:    cmpl $33792, %edx # imm = 0x8400
-; X64-NEXT:    cmovbel %ecx, %eax
-; X64-NEXT:    pinsrw $0, %eax, %xmm0
-; X64-NEXT:    addq $24, %rsp
+; X64-NEXT:    popq %rax
 ; X64-NEXT:    retq
 ;
 ; WIN32-LABEL: test_frexp_f16_i32_only_use_fract:
@@ -110,29 +73,12 @@ define half @test_frexp_f16_i32_only_use_fract(half %a) nounwind {
 define i32 @test_frexp_f16_i32_only_use_exp(half %a) nounwind {
 ; X64-LABEL: test_frexp_f16_i32_only_use_exp:
 ; X64:       # %bb.0:
-; X64-NEXT:    subq $24, %rsp
-; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
+; X64-NEXT:    pushq %rax
 ; X64-NEXT:    callq __extendhfsf2 at PLT
-; X64-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-NEXT:    callq __truncsfhf2 at PLT
-; X64-NEXT:    pextrw $0, %xmm0, %eax
-; X64-NEXT:    andl $31744, %eax # imm = 0x7C00
-; X64-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
-; X64-NEXT:    pextrw $0, %xmm0, %ecx
-; X64-NEXT:    andl $32767, %ecx # imm = 0x7FFF
-; X64-NEXT:    cmpl $1024, %ecx # imm = 0x400
-; X64-NEXT:    cmovael %ecx, %eax
-; X64-NEXT:    shrl $10, %eax
-; X64-NEXT:    leal -12(%rax), %edx
-; X64-NEXT:    cmpl $1024, %ecx # imm = 0x400
-; X64-NEXT:    cmovael %eax, %edx
-; X64-NEXT:    addl $-14, %edx
-; X64-NEXT:    addl $-31744, %ecx # imm = 0x8400
-; X64-NEXT:    movzwl %cx, %ecx
-; X64-NEXT:    xorl %eax, %eax
-; X64-NEXT:    cmpl $33792, %ecx # imm = 0x8400
-; X64-NEXT:    cmoval %edx, %eax
-; X64-NEXT:    addq $24, %rsp
+; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
+; X64-NEXT:    callq frexpf at PLT
+; X64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; X64-NEXT:    popq %rcx
 ; X64-NEXT:    retq
 ;
 ; WIN32-LABEL: test_frexp_f16_i32_only_use_exp:


        


More information about the llvm-commits mailing list