Skip to content

Conversation

mahesh-attarde
Copy link
Contributor

This PR adds support for C/CPP Lib Intrinsic G_INTRINSIC_TRUNC/G_FCEIL/G_FFLOOR from LangRef in GlobalIsel.

; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86
; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X86
; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X86

; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86
; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X86
; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X86

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should allow to keep fast-isel and sdag under the same check unchanged but then it will introduce a copy for fp80. So it is about have 2 copies (for float and double) vs one copy for (fp80)

@@ -3,8 +3,8 @@
; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X64,FASTISEL-X64
; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86
; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86

@@ -3,8 +3,8 @@
; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X64,FASTISEL-X64
; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86
; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86
; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X86

@llvmbot
Copy link
Member

llvmbot commented Sep 3, 2025

@llvm/pr-subscribers-backend-x86

Author: Mahesh-Attarde (mahesh-attarde)

Changes

This PR adds support for C/CPP Lib Intrinsic G_INTRINSIC_TRUNC/G_FCEIL/G_FFLOOR from LangRef in GlobalIsel.


Full diff: https://github.com/llvm/llvm-project/pull/156633.diff

4 Files Affected:

  • (modified) llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp (+2-1)
  • (modified) llvm/test/CodeGen/X86/isel-ceil.ll (+70-23)
  • (modified) llvm/test/CodeGen/X86/isel-floor.ll (+70-24)
  • (modified) llvm/test/CodeGen/X86/isel-ftrunc.ll (+70-24)
diff --git a/llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp b/llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp
index 7fe58539cd4ec..c27e6075c779f 100644
--- a/llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp
+++ b/llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp
@@ -580,7 +580,8 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
       .lower();
 
   // fp intrinsics
-  getActionDefinitionsBuilder(G_INTRINSIC_ROUNDEVEN)
+  getActionDefinitionsBuilder(
+      {G_INTRINSIC_ROUNDEVEN, G_INTRINSIC_TRUNC, G_FCEIL, G_FFLOOR})
       .scalarize(0)
       .minScalar(0, LLT::scalar(32))
       .libcall();
diff --git a/llvm/test/CodeGen/X86/isel-ceil.ll b/llvm/test/CodeGen/X86/isel-ceil.ll
index c82cfebd4814d..831da72a0aa96 100644
--- a/llvm/test/CodeGen/X86/isel-ceil.ll
+++ b/llvm/test/CodeGen/X86/isel-ceil.ll
@@ -1,10 +1,10 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
 ; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,DAG-X64
 ; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X64,FASTISEL-X64
-; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86
-; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86
-; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=GISEL-X64
-; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=X86
+; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86
+; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X86
+; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64
+; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86
 
 define float @ceil_f32(float %a) nounwind readnone {
 ; DAG-X64-LABEL: ceil_f32:
@@ -18,18 +18,39 @@ define float @ceil_f32(float %a) nounwind readnone {
 ; FASTISEL-X64-NEXT:    popq %rax
 ; FASTISEL-X64-NEXT:    retq
 ;
-; X86-LABEL: ceil_f32:
-; X86:       # %bb.0:
-; X86-NEXT:    subl $12, %esp
-; X86-NEXT:    flds {{[0-9]+}}(%esp)
-; X86-NEXT:    fstps (%esp)
-; X86-NEXT:    calll ceilf
-; X86-NEXT:    addl $12, %esp
-; X86-NEXT:    retl
+; DAG-X86-LABEL: ceil_f32:
+; DAG-X86:       # %bb.0:
+; DAG-X86-NEXT:    subl $12, %esp
+; DAG-X86-NEXT:    flds {{[0-9]+}}(%esp)
+; DAG-X86-NEXT:    fstps (%esp)
+; DAG-X86-NEXT:    calll ceilf
+; DAG-X86-NEXT:    addl $12, %esp
+; DAG-X86-NEXT:    retl
+;
+; FASTISEL-X86-LABEL: ceil_f32:
+; FASTISEL-X86:       # %bb.0:
+; FASTISEL-X86-NEXT:    subl $12, %esp
+; FASTISEL-X86-NEXT:    flds {{[0-9]+}}(%esp)
+; FASTISEL-X86-NEXT:    fstps (%esp)
+; FASTISEL-X86-NEXT:    calll ceilf
+; FASTISEL-X86-NEXT:    addl $12, %esp
+; FASTISEL-X86-NEXT:    retl
 ;
 ; GISEL-X64-LABEL: ceil_f32:
 ; GISEL-X64:       # %bb.0:
-; GISEL-X64-NEXT:    jmp ceilf@PLT # TAILCALL
+; GISEL-X64-NEXT:    pushq %rax
+; GISEL-X64-NEXT:    callq ceilf
+; GISEL-X64-NEXT:    popq %rax
+; GISEL-X64-NEXT:    retq
+;
+; GISEL-X86-LABEL: ceil_f32:
+; GISEL-X86:       # %bb.0:
+; GISEL-X86-NEXT:    subl $12, %esp
+; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GISEL-X86-NEXT:    movl %eax, (%esp)
+; GISEL-X86-NEXT:    calll ceilf
+; GISEL-X86-NEXT:    addl $12, %esp
+; GISEL-X86-NEXT:    retl
   %c = call float @llvm.ceil.f32(float %a)
   ret float %c
 }
@@ -46,18 +67,44 @@ define double @ceil_f64(double %a) nounwind readnone {
 ; FASTISEL-X64-NEXT:    popq %rax
 ; FASTISEL-X64-NEXT:    retq
 ;
-; X86-LABEL: ceil_f64:
-; X86:       # %bb.0:
-; X86-NEXT:    subl $12, %esp
-; X86-NEXT:    fldl {{[0-9]+}}(%esp)
-; X86-NEXT:    fstpl (%esp)
-; X86-NEXT:    calll ceil
-; X86-NEXT:    addl $12, %esp
-; X86-NEXT:    retl
+; DAG-X86-LABEL: ceil_f64:
+; DAG-X86:       # %bb.0:
+; DAG-X86-NEXT:    subl $12, %esp
+; DAG-X86-NEXT:    fldl {{[0-9]+}}(%esp)
+; DAG-X86-NEXT:    fstpl (%esp)
+; DAG-X86-NEXT:    calll ceil
+; DAG-X86-NEXT:    addl $12, %esp
+; DAG-X86-NEXT:    retl
+;
+; FASTISEL-X86-LABEL: ceil_f64:
+; FASTISEL-X86:       # %bb.0:
+; FASTISEL-X86-NEXT:    subl $12, %esp
+; FASTISEL-X86-NEXT:    fldl {{[0-9]+}}(%esp)
+; FASTISEL-X86-NEXT:    fstpl (%esp)
+; FASTISEL-X86-NEXT:    calll ceil
+; FASTISEL-X86-NEXT:    addl $12, %esp
+; FASTISEL-X86-NEXT:    retl
 ;
 ; GISEL-X64-LABEL: ceil_f64:
 ; GISEL-X64:       # %bb.0:
-; GISEL-X64-NEXT:    jmp ceil@PLT # TAILCALL
+; GISEL-X64-NEXT:    pushq %rax
+; GISEL-X64-NEXT:    callq ceil
+; GISEL-X64-NEXT:    popq %rax
+; GISEL-X64-NEXT:    retq
+;
+; GISEL-X86-LABEL: ceil_f64:
+; GISEL-X86:       # %bb.0:
+; GISEL-X86-NEXT:    subl $12, %esp
+; GISEL-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
+; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; GISEL-X86-NEXT:    movl 4(%eax), %eax
+; GISEL-X86-NEXT:    xorl %edx, %edx
+; GISEL-X86-NEXT:    addl %esp, %edx
+; GISEL-X86-NEXT:    movl %ecx, (%esp)
+; GISEL-X86-NEXT:    movl %eax, 4(%edx)
+; GISEL-X86-NEXT:    calll ceil
+; GISEL-X86-NEXT:    addl $12, %esp
+; GISEL-X86-NEXT:    retl
   %c = call double @llvm.ceil.f64(double %a)
   ret double %c
 }
@@ -86,7 +133,7 @@ define x86_fp80 @ceil_f80(x86_fp80 %a) nounwind readnone {
 ; GISEL-X64-NEXT:    subq $24, %rsp
 ; GISEL-X64-NEXT:    fldt {{[0-9]+}}(%rsp)
 ; GISEL-X64-NEXT:    fstpt (%rsp)
-; GISEL-X64-NEXT:    callq ceill@PLT
+; GISEL-X64-NEXT:    callq ceill
 ; GISEL-X64-NEXT:    addq $24, %rsp
 ; GISEL-X64-NEXT:    retq
   %c = call x86_fp80 @llvm.ceil.f80(x86_fp80 %a)
diff --git a/llvm/test/CodeGen/X86/isel-floor.ll b/llvm/test/CodeGen/X86/isel-floor.ll
index 675925b611263..acd47cb7d5b86 100644
--- a/llvm/test/CodeGen/X86/isel-floor.ll
+++ b/llvm/test/CodeGen/X86/isel-floor.ll
@@ -1,10 +1,10 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
 ; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,DAG-X64
 ; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X64,FASTISEL-X64
-; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86
-; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86
-; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=GISEL-X64
-; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=X86
+; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86
+; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X86
+; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64
+; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86
 
 define float @floor_f32(float %a) nounwind readnone {
 ; DAG-X64-LABEL: floor_f32:
@@ -18,18 +18,39 @@ define float @floor_f32(float %a) nounwind readnone {
 ; FASTISEL-X64-NEXT:    popq %rax
 ; FASTISEL-X64-NEXT:    retq
 ;
-; X86-LABEL: floor_f32:
-; X86:       # %bb.0:
-; X86-NEXT:    subl $12, %esp
-; X86-NEXT:    flds {{[0-9]+}}(%esp)
-; X86-NEXT:    fstps (%esp)
-; X86-NEXT:    calll floorf
-; X86-NEXT:    addl $12, %esp
-; X86-NEXT:    retl
+; DAG-X86-LABEL: floor_f32:
+; DAG-X86:       # %bb.0:
+; DAG-X86-NEXT:    subl $12, %esp
+; DAG-X86-NEXT:    flds {{[0-9]+}}(%esp)
+; DAG-X86-NEXT:    fstps (%esp)
+; DAG-X86-NEXT:    calll floorf
+; DAG-X86-NEXT:    addl $12, %esp
+; DAG-X86-NEXT:    retl
+;
+; FASTISEL-X86-LABEL: floor_f32:
+; FASTISEL-X86:       # %bb.0:
+; FASTISEL-X86-NEXT:    subl $12, %esp
+; FASTISEL-X86-NEXT:    flds {{[0-9]+}}(%esp)
+; FASTISEL-X86-NEXT:    fstps (%esp)
+; FASTISEL-X86-NEXT:    calll floorf
+; FASTISEL-X86-NEXT:    addl $12, %esp
+; FASTISEL-X86-NEXT:    retl
 ;
 ; GISEL-X64-LABEL: floor_f32:
 ; GISEL-X64:       # %bb.0:
-; GISEL-X64-NEXT:    jmp floorf@PLT # TAILCALL
+; GISEL-X64-NEXT:    pushq %rax
+; GISEL-X64-NEXT:    callq floorf
+; GISEL-X64-NEXT:    popq %rax
+; GISEL-X64-NEXT:    retq
+;
+; GISEL-X86-LABEL: floor_f32:
+; GISEL-X86:       # %bb.0:
+; GISEL-X86-NEXT:    subl $12, %esp
+; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GISEL-X86-NEXT:    movl %eax, (%esp)
+; GISEL-X86-NEXT:    calll floorf
+; GISEL-X86-NEXT:    addl $12, %esp
+; GISEL-X86-NEXT:    retl
   %c = call float @llvm.floor.f32(float %a)
   ret float %c
 }
@@ -46,18 +67,44 @@ define double @floor_f64(double %a) nounwind readnone {
 ; FASTISEL-X64-NEXT:    popq %rax
 ; FASTISEL-X64-NEXT:    retq
 ;
-; X86-LABEL: floor_f64:
-; X86:       # %bb.0:
-; X86-NEXT:    subl $12, %esp
-; X86-NEXT:    fldl {{[0-9]+}}(%esp)
-; X86-NEXT:    fstpl (%esp)
-; X86-NEXT:    calll floor
-; X86-NEXT:    addl $12, %esp
-; X86-NEXT:    retl
+; DAG-X86-LABEL: floor_f64:
+; DAG-X86:       # %bb.0:
+; DAG-X86-NEXT:    subl $12, %esp
+; DAG-X86-NEXT:    fldl {{[0-9]+}}(%esp)
+; DAG-X86-NEXT:    fstpl (%esp)
+; DAG-X86-NEXT:    calll floor
+; DAG-X86-NEXT:    addl $12, %esp
+; DAG-X86-NEXT:    retl
+;
+; FASTISEL-X86-LABEL: floor_f64:
+; FASTISEL-X86:       # %bb.0:
+; FASTISEL-X86-NEXT:    subl $12, %esp
+; FASTISEL-X86-NEXT:    fldl {{[0-9]+}}(%esp)
+; FASTISEL-X86-NEXT:    fstpl (%esp)
+; FASTISEL-X86-NEXT:    calll floor
+; FASTISEL-X86-NEXT:    addl $12, %esp
+; FASTISEL-X86-NEXT:    retl
 ;
 ; GISEL-X64-LABEL: floor_f64:
 ; GISEL-X64:       # %bb.0:
-; GISEL-X64-NEXT:    jmp floor@PLT # TAILCALL
+; GISEL-X64-NEXT:    pushq %rax
+; GISEL-X64-NEXT:    callq floor
+; GISEL-X64-NEXT:    popq %rax
+; GISEL-X64-NEXT:    retq
+;
+; GISEL-X86-LABEL: floor_f64:
+; GISEL-X86:       # %bb.0:
+; GISEL-X86-NEXT:    subl $12, %esp
+; GISEL-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
+; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; GISEL-X86-NEXT:    movl 4(%eax), %eax
+; GISEL-X86-NEXT:    xorl %edx, %edx
+; GISEL-X86-NEXT:    addl %esp, %edx
+; GISEL-X86-NEXT:    movl %ecx, (%esp)
+; GISEL-X86-NEXT:    movl %eax, 4(%edx)
+; GISEL-X86-NEXT:    calll floor
+; GISEL-X86-NEXT:    addl $12, %esp
+; GISEL-X86-NEXT:    retl
   %c = call double @llvm.floor.f64(double %a)
   ret double %c
 }
@@ -86,10 +133,9 @@ define x86_fp80 @floor_f80(x86_fp80 %a) nounwind readnone {
 ; GISEL-X64-NEXT:    subq $24, %rsp
 ; GISEL-X64-NEXT:    fldt {{[0-9]+}}(%rsp)
 ; GISEL-X64-NEXT:    fstpt (%rsp)
-; GISEL-X64-NEXT:    callq floorl@PLT
+; GISEL-X64-NEXT:    callq floorl
 ; GISEL-X64-NEXT:    addq $24, %rsp
 ; GISEL-X64-NEXT:    retq
   %c = call x86_fp80 @llvm.floor.f80(x86_fp80 %a)
   ret x86_fp80 %c
 }
-
diff --git a/llvm/test/CodeGen/X86/isel-ftrunc.ll b/llvm/test/CodeGen/X86/isel-ftrunc.ll
index 9bf06193961a3..797aef02a4939 100644
--- a/llvm/test/CodeGen/X86/isel-ftrunc.ll
+++ b/llvm/test/CodeGen/X86/isel-ftrunc.ll
@@ -1,10 +1,10 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
 ; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,DAG-X64
 ; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X64,FASTISEL-X64
-; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86
-; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86
-; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=GISEL-X64
-; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=X86
+; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86
+; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X86
+; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64
+; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86
 
 define float @trunc_f32(float %a) nounwind readnone {
 ; DAG-X64-LABEL: trunc_f32:
@@ -18,18 +18,39 @@ define float @trunc_f32(float %a) nounwind readnone {
 ; FASTISEL-X64-NEXT:    popq %rax
 ; FASTISEL-X64-NEXT:    retq
 ;
-; X86-LABEL: trunc_f32:
-; X86:       # %bb.0:
-; X86-NEXT:    subl $12, %esp
-; X86-NEXT:    flds {{[0-9]+}}(%esp)
-; X86-NEXT:    fstps (%esp)
-; X86-NEXT:    calll truncf
-; X86-NEXT:    addl $12, %esp
-; X86-NEXT:    retl
+; DAG-X86-LABEL: trunc_f32:
+; DAG-X86:       # %bb.0:
+; DAG-X86-NEXT:    subl $12, %esp
+; DAG-X86-NEXT:    flds {{[0-9]+}}(%esp)
+; DAG-X86-NEXT:    fstps (%esp)
+; DAG-X86-NEXT:    calll truncf
+; DAG-X86-NEXT:    addl $12, %esp
+; DAG-X86-NEXT:    retl
+;
+; FASTISEL-X86-LABEL: trunc_f32:
+; FASTISEL-X86:       # %bb.0:
+; FASTISEL-X86-NEXT:    subl $12, %esp
+; FASTISEL-X86-NEXT:    flds {{[0-9]+}}(%esp)
+; FASTISEL-X86-NEXT:    fstps (%esp)
+; FASTISEL-X86-NEXT:    calll truncf
+; FASTISEL-X86-NEXT:    addl $12, %esp
+; FASTISEL-X86-NEXT:    retl
 ;
 ; GISEL-X64-LABEL: trunc_f32:
 ; GISEL-X64:       # %bb.0:
-; GISEL-X64-NEXT:    jmp truncf@PLT # TAILCALL
+; GISEL-X64-NEXT:    pushq %rax
+; GISEL-X64-NEXT:    callq truncf
+; GISEL-X64-NEXT:    popq %rax
+; GISEL-X64-NEXT:    retq
+;
+; GISEL-X86-LABEL: trunc_f32:
+; GISEL-X86:       # %bb.0:
+; GISEL-X86-NEXT:    subl $12, %esp
+; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; GISEL-X86-NEXT:    movl %eax, (%esp)
+; GISEL-X86-NEXT:    calll truncf
+; GISEL-X86-NEXT:    addl $12, %esp
+; GISEL-X86-NEXT:    retl
   %c = call float @llvm.trunc.f32(float %a)
   ret float %c
 }
@@ -46,18 +67,44 @@ define double @trunc_f64(double %a) nounwind readnone {
 ; FASTISEL-X64-NEXT:    popq %rax
 ; FASTISEL-X64-NEXT:    retq
 ;
-; X86-LABEL: trunc_f64:
-; X86:       # %bb.0:
-; X86-NEXT:    subl $12, %esp
-; X86-NEXT:    fldl {{[0-9]+}}(%esp)
-; X86-NEXT:    fstpl (%esp)
-; X86-NEXT:    calll trunc
-; X86-NEXT:    addl $12, %esp
-; X86-NEXT:    retl
+; DAG-X86-LABEL: trunc_f64:
+; DAG-X86:       # %bb.0:
+; DAG-X86-NEXT:    subl $12, %esp
+; DAG-X86-NEXT:    fldl {{[0-9]+}}(%esp)
+; DAG-X86-NEXT:    fstpl (%esp)
+; DAG-X86-NEXT:    calll trunc
+; DAG-X86-NEXT:    addl $12, %esp
+; DAG-X86-NEXT:    retl
+;
+; FASTISEL-X86-LABEL: trunc_f64:
+; FASTISEL-X86:       # %bb.0:
+; FASTISEL-X86-NEXT:    subl $12, %esp
+; FASTISEL-X86-NEXT:    fldl {{[0-9]+}}(%esp)
+; FASTISEL-X86-NEXT:    fstpl (%esp)
+; FASTISEL-X86-NEXT:    calll trunc
+; FASTISEL-X86-NEXT:    addl $12, %esp
+; FASTISEL-X86-NEXT:    retl
 ;
 ; GISEL-X64-LABEL: trunc_f64:
 ; GISEL-X64:       # %bb.0:
-; GISEL-X64-NEXT:    jmp trunc@PLT # TAILCALL
+; GISEL-X64-NEXT:    pushq %rax
+; GISEL-X64-NEXT:    callq trunc
+; GISEL-X64-NEXT:    popq %rax
+; GISEL-X64-NEXT:    retq
+;
+; GISEL-X86-LABEL: trunc_f64:
+; GISEL-X86:       # %bb.0:
+; GISEL-X86-NEXT:    subl $12, %esp
+; GISEL-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
+; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; GISEL-X86-NEXT:    movl 4(%eax), %eax
+; GISEL-X86-NEXT:    xorl %edx, %edx
+; GISEL-X86-NEXT:    addl %esp, %edx
+; GISEL-X86-NEXT:    movl %ecx, (%esp)
+; GISEL-X86-NEXT:    movl %eax, 4(%edx)
+; GISEL-X86-NEXT:    calll trunc
+; GISEL-X86-NEXT:    addl $12, %esp
+; GISEL-X86-NEXT:    retl
   %c = call double @llvm.trunc.f64(double %a)
   ret double %c
 }
@@ -86,10 +133,9 @@ define x86_fp80 @trunc_f80(x86_fp80   %a) nounwind readnone {
 ; GISEL-X64-NEXT:    subq $24, %rsp
 ; GISEL-X64-NEXT:    fldt {{[0-9]+}}(%rsp)
 ; GISEL-X64-NEXT:    fstpt (%rsp)
-; GISEL-X64-NEXT:    callq truncl@PLT
+; GISEL-X64-NEXT:    callq truncl
 ; GISEL-X64-NEXT:    addq $24, %rsp
 ; GISEL-X64-NEXT:    retq
   %c = call x86_fp80   @llvm.trunc.f80(x86_fp80   %a)
   ret x86_fp80   %c
 }
-

@RKSimon RKSimon requested review from RKSimon and e-kud September 3, 2025 15:30
; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86
; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X86
; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should allow to keep fast-isel and sdag under the same check unchanged but then it will introduce a copy for fp80. So it is about have 2 copies (for float and double) vs one copy for (fp80)

Comment on lines +583 to +584
getActionDefinitionsBuilder(
{G_INTRINSIC_ROUNDEVEN, G_INTRINSIC_TRUNC, G_FCEIL, G_FFLOOR})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like we need to move everything to the list above of

{G_LROUND, G_LLROUND, G_FCOS,  G_FCOSH, G_FACOS,  G_FSIN,  G_FSINH,
       G_FASIN,  G_FTAN,    G_FTANH, G_FATAN, G_FATAN2, G_FPOW,  G_FEXP,
       G_FEXP2,  G_FEXP10,  G_FLOG,  G_FLOG2, G_FLOG10, G_FPOWI, G_FSINCOS})

Or at least G_FCEIL and G_FFLOOR, since there is a comment // fp intrinsics

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I considered it, depending on lang ref spec, all these should be under legality rules specified below on 585 and 586.
we did not have that in list above. I will give try.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants