diff options
author | Kai Nacke <kai@redstar.de> | 2022-08-27 23:57:19 -0400 |
---|---|---|
committer | Kai Nacke <kai@redstar.de> | 2022-11-13 11:07:53 -0500 |
commit | 5303dd164a1216f3407ff5b516780f2de2727e8c (patch) | |
tree | 572c5279a8066a89a92e81ee15c3befe22f39b1d | |
parent | b8aa64495fd4170f36fb1065e3275a7ce1d7e328 (diff) | |
download | llvm-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.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/M88k/GISel/M88kLegalizerInfo.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Target/M88k/GISel/M88kRegisterBankInfo.cpp | 3 |
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(); |