forked from OSchip/llvm-project
[MIPS GlobalISel] NarrowScalar G_TRUNC
Add NarrowScalar for G_TRUNC when NarrowTy is half the size of source. NarrowScalar G_TRUNC to s32 for MIPS32. Differential Revision: https://reviews.llvm.org/D66202 llvm-svn: 369509
This commit is contained in:
parent
67443c3c6e
commit
5b4c5c2c54
|
@ -633,6 +633,21 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
|
|||
MI.eraseFromParent();
|
||||
return Legalized;
|
||||
}
|
||||
case TargetOpcode::G_TRUNC: {
|
||||
if (TypeIdx != 1)
|
||||
return UnableToLegalize;
|
||||
|
||||
uint64_t SizeOp1 = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits();
|
||||
if (NarrowTy.getSizeInBits() * 2 != SizeOp1) {
|
||||
LLVM_DEBUG(dbgs() << "Can't narrow trunc to type " << NarrowTy << "\n");
|
||||
return UnableToLegalize;
|
||||
}
|
||||
|
||||
auto Unmerge = MIRBuilder.buildUnmerge(NarrowTy, MI.getOperand(1).getReg());
|
||||
MIRBuilder.buildCopy(MI.getOperand(0).getReg(), Unmerge.getReg(0));
|
||||
MI.eraseFromParent();
|
||||
return Legalized;
|
||||
}
|
||||
|
||||
case TargetOpcode::G_ADD: {
|
||||
// FIXME: add support for when SizeOp0 isn't an exact multiple of
|
||||
|
|
|
@ -54,6 +54,10 @@ MipsLegalizerInfo::MipsLegalizerInfo(const MipsSubtarget &ST) {
|
|||
{s32, p0, 16, 8}})
|
||||
.minScalar(0, s32);
|
||||
|
||||
getActionDefinitionsBuilder(G_TRUNC)
|
||||
.legalIf([](const LegalityQuery &Query) { return false; })
|
||||
.maxScalar(1, s32);
|
||||
|
||||
getActionDefinitionsBuilder(G_SELECT)
|
||||
.legalForCartesianProduct({p0, s32, s64}, {s32})
|
||||
.minScalar(0, s32)
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
||||
# RUN: llc -O0 -mtriple=mipsel-linux-gnu -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=MIPS32
|
||||
--- |
|
||||
|
||||
define void @trunc() {entry: ret void}
|
||||
|
||||
...
|
||||
---
|
||||
name: trunc
|
||||
alignment: 2
|
||||
tracksRegLiveness: true
|
||||
body: |
|
||||
bb.1.entry:
|
||||
liveins: $a0, $a1
|
||||
|
||||
; MIPS32-LABEL: name: trunc
|
||||
; MIPS32: liveins: $a0, $a1
|
||||
; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0
|
||||
; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1
|
||||
; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
|
||||
; MIPS32: $v0 = COPY [[COPY2]](s32)
|
||||
; MIPS32: RetRA implicit $v0
|
||||
%1:_(s32) = COPY $a0
|
||||
%2:_(s32) = COPY $a1
|
||||
%0:_(s64) = G_MERGE_VALUES %1(s32), %2(s32)
|
||||
%3:_(s32) = G_TRUNC %0(s64)
|
||||
$v0 = COPY %3(s32)
|
||||
RetRA implicit $v0
|
||||
|
||||
...
|
|
@ -0,0 +1,13 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32
|
||||
|
||||
define i32 @trunc(i64 %x) {
|
||||
; MIPS32-LABEL: trunc:
|
||||
; MIPS32: # %bb.0: # %entry
|
||||
; MIPS32-NEXT: move $2, $4
|
||||
; MIPS32-NEXT: jr $ra
|
||||
; MIPS32-NEXT: nop
|
||||
entry:
|
||||
%conv = trunc i64 %x to i32
|
||||
ret i32 %conv
|
||||
}
|
Loading…
Reference in New Issue