-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[X86][GlobalIsel] Support G_INTRINSIC_TRUNC/G_FCEIL/G_FFLOOR #156633
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
; 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
; 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
; 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 |
There was a problem hiding this comment.
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)
llvm/test/CodeGen/X86/isel-ftrunc.ll
Outdated
@@ -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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
; 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 |
llvm/test/CodeGen/X86/isel-ftrunc.ll
Outdated
@@ -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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
; 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 |
@llvm/pr-subscribers-backend-x86 Author: Mahesh-Attarde (mahesh-attarde) ChangesThis 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:
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
}
-
|
; 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 |
There was a problem hiding this comment.
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)
getActionDefinitionsBuilder( | ||
{G_INTRINSIC_ROUNDEVEN, G_INTRINSIC_TRUNC, G_FCEIL, G_FFLOOR}) |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
This PR adds support for C/CPP Lib Intrinsic G_INTRINSIC_TRUNC/G_FCEIL/G_FFLOOR from LangRef in GlobalIsel.