aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Nacke <kai@redstar.de>2022-08-27 23:57:19 -0400
committerKai Nacke <kai@redstar.de>2022-11-13 11:07:53 -0500
commit5303dd164a1216f3407ff5b516780f2de2727e8c (patch)
tree572c5279a8066a89a92e81ee15c3befe22f39b1d
parentb8aa64495fd4170f36fb1065e3275a7ce1d7e328 (diff)
downloadllvm-5303dd164a1216f3407ff5b516780f2de2727e8c.zip
llvm-5303dd164a1216f3407ff5b516780f2de2727e8c.tar.gz
llvm-5303dd164a1216f3407ff5b516780f2de2727e8c.tar.bz2
[m88k] Implement G_FREEZE
Most likely this is not fully implemented yet, but it works for the most common cases.
-rw-r--r--llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp3
-rw-r--r--llvm/lib/Target/M88k/GISel/M88kLegalizerInfo.cpp4
-rw-r--r--llvm/lib/Target/M88k/GISel/M88kRegisterBankInfo.cpp3
3 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp b/llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp
index 53a5458..50a2ecd 100644
--- a/llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp
+++ b/llvm/lib/Target/M88k/GISel/M88kInstructionSelector.cpp
@@ -193,6 +193,7 @@ static bool selectCopy(MachineInstr &I, const TargetInstrInfo &TII,
<< " operand\n");
return false;
}
+ I.setDesc(TII.get(TargetOpcode::COPY));
return true;
}
@@ -1093,6 +1094,8 @@ bool M88kInstructionSelector::select(MachineInstr &I) {
return true;
switch (I.getOpcode()) {
+ case TargetOpcode::G_FREEZE:
+ return selectCopy(I, TII, MRI, TRI, RBI);
case TargetOpcode::G_INTRINSIC:
return selectIntrinsic(I, MBB, MRI);
case TargetOpcode::G_GLOBAL_VALUE:
diff --git a/llvm/lib/Target/M88k/GISel/M88kLegalizerInfo.cpp b/llvm/lib/Target/M88k/GISel/M88kLegalizerInfo.cpp
index fffaa10..ea865ca 100644
--- a/llvm/lib/Target/M88k/GISel/M88kLegalizerInfo.cpp
+++ b/llvm/lib/Target/M88k/GISel/M88kLegalizerInfo.cpp
@@ -47,7 +47,9 @@ M88kLegalizerInfo::M88kLegalizerInfo(const M88kSubtarget &ST) {
getActionDefinitionsBuilder(G_PHI).legalFor({S32, P0});
getActionDefinitionsBuilder(G_SELECT)
.customForCartesianProduct({S32, S64, P0}, {S1});
- getActionDefinitionsBuilder({G_IMPLICIT_DEF, G_FREEZE}).legalFor({S32});
+ getActionDefinitionsBuilder({G_IMPLICIT_DEF, G_FREEZE})
+ .legalFor({S32, P0})
+ .clampScalar(0, S32, S32);
getActionDefinitionsBuilder(G_MERGE_VALUES).legalFor({{S64, S32}});
getActionDefinitionsBuilder(G_UNMERGE_VALUES).legalFor({{S32, S64}});
getActionDefinitionsBuilder(G_CONSTANT)
diff --git a/llvm/lib/Target/M88k/GISel/M88kRegisterBankInfo.cpp b/llvm/lib/Target/M88k/GISel/M88kRegisterBankInfo.cpp
index cfa198c..60cbfe7 100644
--- a/llvm/lib/Target/M88k/GISel/M88kRegisterBankInfo.cpp
+++ b/llvm/lib/Target/M88k/GISel/M88kRegisterBankInfo.cpp
@@ -303,6 +303,9 @@ M88kRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
getValueMapping(PMI_GR64)});
break;
}
+ case TargetOpcode::G_FREEZE:
+ OperandsMapping = getValueMapping(PMI_GR32);
+ break;
case TargetOpcode::COPY: {
Register DstReg = MI.getOperand(0).getReg();
Register SrcReg = MI.getOperand(1).getReg();