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();
|
MI.eraseFromParent();
|
||||||
return Legalized;
|
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: {
|
case TargetOpcode::G_ADD: {
|
||||||
// FIXME: add support for when SizeOp0 isn't an exact multiple of
|
// 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}})
|
{s32, p0, 16, 8}})
|
||||||
.minScalar(0, s32);
|
.minScalar(0, s32);
|
||||||
|
|
||||||
|
getActionDefinitionsBuilder(G_TRUNC)
|
||||||
|
.legalIf([](const LegalityQuery &Query) { return false; })
|
||||||
|
.maxScalar(1, s32);
|
||||||
|
|
||||||
getActionDefinitionsBuilder(G_SELECT)
|
getActionDefinitionsBuilder(G_SELECT)
|
||||||
.legalForCartesianProduct({p0, s32, s64}, {s32})
|
.legalForCartesianProduct({p0, s32, s64}, {s32})
|
||||||
.minScalar(0, 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