From 2e3b9c925390cc8b1d72a41d0564bb2862d3dba2 Mon Sep 17 00:00:00 2001 From: Brian Potchik Date: Sat, 2 Mar 2024 14:38:47 -0500 Subject: Add support for memory intrinsics. --- mediumlevelilinstruction.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'mediumlevelilinstruction.cpp') diff --git a/mediumlevelilinstruction.cpp b/mediumlevelilinstruction.cpp index 151a8463..0306a404 100644 --- a/mediumlevelilinstruction.cpp +++ b/mediumlevelilinstruction.cpp @@ -165,6 +165,8 @@ unordered_map> ParameterExprsMediumLevelOperandUsage}}, {MLIL_INTRINSIC_SSA, {OutputSSAVariablesMediumLevelOperandUsage, IntrinsicMediumLevelOperandUsage, ParameterExprsMediumLevelOperandUsage}}, + {MLIL_MEMORY_INTRINSIC_SSA, {OutputSSAVariablesSubExprMediumLevelOperandUsage, OutputSSAMemoryVersionMediumLevelOperandUsage, IntrinsicMediumLevelOperandUsage, + ParameterExprsMediumLevelOperandUsage, SourceMemoryVersionMediumLevelOperandUsage}}, {MLIL_FREE_VAR_SLOT, {DestVariableMediumLevelOperandUsage}}, {MLIL_FREE_VAR_SLOT_SSA, {DestSSAVariableMediumLevelOperandUsage, PartialSSAVariableSourceMediumLevelOperandUsage}}, @@ -1590,7 +1592,8 @@ void MediumLevelILInstruction::VisitExprs(const std::function()) + case MLIL_MEMORY_INTRINSIC_SSA: + for (auto i : GetParameterExprs()) i.VisitExprs(func); break; default: @@ -1904,6 +1907,12 @@ ExprId MediumLevelILInstruction::CopyTo(MediumLevelILFunction* dest, params.push_back(subExprHandler(i)); return dest->IntrinsicSSA( GetOutputSSAVariables(), GetIntrinsic(), params, *this); + case MLIL_MEMORY_INTRINSIC_SSA: + for (auto i : GetParameterExprs()) + params.push_back(subExprHandler(i)); + return dest->MemoryIntrinsicSSA(GetOutputSSAVariables(), + GetIntrinsic(), params, GetDestMemoryVersion(), + GetSourceMemoryVersion(), *this); case MLIL_FREE_VAR_SLOT: return dest->FreeVarSlot(GetDestVariable(), *this); case MLIL_FREE_VAR_SLOT_SSA: @@ -2930,6 +2939,15 @@ ExprId MediumLevelILFunction::IntrinsicSSA( } +ExprId MediumLevelILFunction::MemoryIntrinsicSSA(const vector& outputs, uint32_t intrinsic, + const vector& params, size_t newMemVersion, size_t prevMemVersion, const ILSourceLocation& loc) +{ + return AddExprWithLocation(MLIL_MEMORY_INTRINSIC_SSA, loc, 0, + AddExprWithLocation(MLIL_MEMORY_INTRINSIC_OUTPUT_SSA, loc, 0, newMemVersion, outputs.size() * 2, AddSSAVariableList(outputs)), intrinsic, + params.size(), AddOperandList(params), prevMemVersion); +} + + ExprId MediumLevelILFunction::FreeVarSlot(const Variable& var, const ILSourceLocation& loc) { return AddExprWithLocation(MLIL_FREE_VAR_SLOT, loc, 0, var.ToIdentifier()); -- cgit v1.3.1