[llvm] 468dfaa - [Mips] Optimize instr cvt.s.d+mfc1+slti to mfhc1+slti (#194806)

via llvm-commits llvm-commits at lists.llvm.org
Wed May 6 20:30:09 PDT 2026


Author: yingopq
Date: 2026-05-07T11:30:04+08:00
New Revision: 468dfaafe613415ed662f2abff9720f0fb1a1b8a

URL: https://github.com/llvm/llvm-project/commit/468dfaafe613415ed662f2abff9720f0fb1a1b8a
DIFF: https://github.com/llvm/llvm-project/commit/468dfaafe613415ed662f2abff9720f0fb1a1b8a.diff

LOG: [Mips] Optimize instr cvt.s.d+mfc1+slti to mfhc1+slti (#194806)

Fix #171262.

Added: 
    llvm/test/CodeGen/Mips/cvt-mfc1-slti.ll

Modified: 
    llvm/lib/Target/Mips/MipsInstrFPU.td

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Mips/MipsInstrFPU.td b/llvm/lib/Target/Mips/MipsInstrFPU.td
index 36e22c7fecbb5..fa5bdca10f435 100644
--- a/llvm/lib/Target/Mips/MipsInstrFPU.td
+++ b/llvm/lib/Target/Mips/MipsInstrFPU.td
@@ -1020,6 +1020,14 @@ def : MipsPat<(MipsTruncIntFP FGR32Opnd:$src),
 def : MipsPat<(MipsMTC1_D64 GPR32Opnd:$src),
               (MTC1_D64 GPR32Opnd:$src)>, ISA_MIPS1, FGR_64;
 
+def : MipsPat<(setlt (i32 (bitconvert (f32 (fpround AFGR64Opnd:$src)))), 0),
+           (SLTi (MFHC1_D32 AFGR64Opnd:$src), 0)>,
+           ISA_MIPS32R2, FGR_32;
+
+def : MipsPat<(setlt (i32 (bitconvert (f32 (fpround FGR64Opnd:$src)))), 0),
+          (SLTi (MFHC1_D64 FGR64Opnd:$src), 0)>,
+          ISA_MIPS32R2, FGR_64;
+
 def : MipsPat<(f64 (any_sint_to_fp GPR32Opnd:$src)),
               (PseudoCVT_D32_W GPR32Opnd:$src)>, FGR_32;
 let AdditionalPredicates = [NotInMicroMips] in {

diff  --git a/llvm/test/CodeGen/Mips/cvt-mfc1-slti.ll b/llvm/test/CodeGen/Mips/cvt-mfc1-slti.ll
new file mode 100644
index 0000000000000..9bea2d52d5227
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/cvt-mfc1-slti.ll
@@ -0,0 +1,37 @@
+; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=MIPS32
+; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r2 -verify-machineinstrs < %s | FileCheck %s -check-prefix=MIPS32R2
+; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r6 -verify-machineinstrs < %s | FileCheck %s -check-prefix=MIPS32R6
+
+define i32 @test_sign_bit(double %a) nounwind {
+; MIPS32-LABEL: test_sign_bit:
+; MIPS32:       # %bb.0: # %entry
+; MIPS32-NEXT:    cvt.s.d $f0, $f12
+; MIPS32-NEXT:    mfc1 $1, $f0
+; MIPS32-NEXT:    slti $1, $1, 0
+; MIPS32-NEXT:    addiu	$2, $zero, -4
+; MIPS32-NEXT:    jr $ra
+; MIPS32-NEXT:    or $2, $1, $2
+
+; MIPS32R2-LABEL: test_sign_bit:
+; MIPS32R2:       # %bb.0: # %entry
+; MIPS32R2-NEXT:    mfhc1 $1, $f12
+; MIPS32R2-NEXT:    slti $1, $1, 0
+; MIPS32R2-NEXT:    addiu $2, $zero, -4
+; MIPS32R2-NEXT:    jr $ra
+; MIPS32R2-NEXT:    or $2, $1, $2
+
+; MIPS32R6-LABEL: test_sign_bit:
+; MIPS32R6:       # %bb.0: # %entry
+; MIPS32R6-NEXT:    mfhc1 $1, $f12
+; MIPS32R6-NEXT:    slti $1, $1, 0
+; MIPS32R6-NEXT:    addiu $2, $zero, -4
+; MIPS32R6-NEXT:    jr $ra
+; MIPS32R6-NEXT:    or $2, $1, $2
+
+entry:
+  %conv = fptrunc double %a to float
+  %i_val = bitcast float %conv to i32
+  %1 = icmp slt i32 %i_val, 0
+  %2 = select i1 %1, i32 -3, i32 -4
+  ret i32 %2
+}


        


More information about the llvm-commits mailing list