Bytecode: directly use several enums inside instruction classes

master
Sébastien Villemot 2022-06-20 14:44:55 +02:00
parent 4662a42c9a
commit 5cd5676c8e
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
5 changed files with 70 additions and 73 deletions

View File

@ -467,39 +467,39 @@ public:
};
};
class FUNARY_ : public TagWithOneArgument<uint8_t>
class FUNARY_ : public TagWithOneArgument<UnaryOpcode>
{
public:
explicit FUNARY_(uint8_t op_type_arg) : TagWithOneArgument<uint8_t>::TagWithOneArgument{Tags::FUNARY, op_type_arg}
explicit FUNARY_(UnaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FUNARY, op_type_arg}
{
};
uint8_t
UnaryOpcode
get_op_type()
{
return arg1;
};
};
class FBINARY_ : public TagWithOneArgument<uint8_t>
class FBINARY_ : public TagWithOneArgument<BinaryOpcode>
{
public:
explicit FBINARY_(int op_type_arg) : TagWithOneArgument<uint8_t>::TagWithOneArgument{Tags::FBINARY, static_cast<uint8_t>(op_type_arg)}
explicit FBINARY_(BinaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FBINARY, op_type_arg}
{
};
uint8_t
BinaryOpcode
get_op_type()
{
return arg1;
};
};
class FTRINARY_ : public TagWithOneArgument<uint8_t>
class FTRINARY_ : public TagWithOneArgument<TrinaryOpcode>
{
public:
explicit FTRINARY_(int op_type_arg) : TagWithOneArgument<uint8_t>::TagWithOneArgument{Tags::FTRINARY, static_cast<uint8_t>(op_type_arg)}
explicit FTRINARY_(TrinaryOpcode op_type_arg) : TagWithOneArgument::TagWithOneArgument{Tags::FTRINARY, op_type_arg}
{
};
uint8_t
TrinaryOpcode
get_op_type()
{
return arg1;
@ -640,13 +640,13 @@ public:
};
};
class FLDVS_ : public TagWithTwoArguments<uint8_t, unsigned int>
class FLDVS_ : public TagWithTwoArguments<SymbolType, unsigned int>
{
public:
FLDVS_(uint8_t type_arg, unsigned int pos_arg) : TagWithTwoArguments<uint8_t, unsigned int>::TagWithTwoArguments{Tags::FLDVS, type_arg, pos_arg}
FLDVS_(SymbolType type_arg, unsigned int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FLDVS, type_arg, pos_arg}
{
};
uint8_t
SymbolType
get_type()
{
return arg1;
@ -658,14 +658,13 @@ public:
};
};
class FLDSV_ : public TagWithTwoArguments<uint8_t, unsigned int>
class FLDSV_ : public TagWithTwoArguments<SymbolType, unsigned int>
{
public:
FLDSV_(uint8_t type_arg, unsigned int pos_arg) :
TagWithTwoArguments<uint8_t, unsigned int>::TagWithTwoArguments{Tags::FLDSV, type_arg, pos_arg}
FLDSV_(SymbolType type_arg, unsigned int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FLDSV, type_arg, pos_arg}
{
};
uint8_t
SymbolType
get_type()
{
return arg1;
@ -677,14 +676,13 @@ public:
};
};
class FSTPSV_ : public TagWithTwoArguments<uint8_t, unsigned int>
class FSTPSV_ : public TagWithTwoArguments<SymbolType, unsigned int>
{
public:
FSTPSV_(uint8_t type_arg, unsigned int pos_arg) :
TagWithTwoArguments<uint8_t, unsigned int>::TagWithTwoArguments{Tags::FSTPSV, type_arg, pos_arg}
FSTPSV_(SymbolType type_arg, unsigned int pos_arg) : TagWithTwoArguments::TagWithTwoArguments{Tags::FSTPSV, type_arg, pos_arg}
{
};
uint8_t
SymbolType
get_type()
{
return arg1;
@ -696,18 +694,17 @@ public:
};
};
class FLDV_ : public TagWithThreeArguments<uint8_t, unsigned int, int>
class FLDV_ : public TagWithThreeArguments<SymbolType, unsigned int, int>
{
public:
FLDV_(int type_arg, unsigned int pos_arg) :
TagWithThreeArguments<uint8_t, unsigned int, int>::TagWithThreeArguments{Tags::FLDV, static_cast<uint8_t>(type_arg), pos_arg, 0}
FLDV_(SymbolType type_arg, unsigned int pos_arg) : TagWithThreeArguments::TagWithThreeArguments{Tags::FLDV, type_arg, pos_arg, 0}
{
};
FLDV_(int type_arg, unsigned int pos_arg, int lead_lag_arg) :
TagWithThreeArguments<uint8_t, unsigned int, int>::TagWithThreeArguments{Tags::FLDV, static_cast<uint8_t>(type_arg), pos_arg, lead_lag_arg}
FLDV_(SymbolType type_arg, unsigned int pos_arg, int lead_lag_arg) :
TagWithThreeArguments::TagWithThreeArguments{Tags::FLDV, type_arg, pos_arg, lead_lag_arg}
{
};
uint8_t
SymbolType
get_type()
{
return arg1;
@ -724,18 +721,18 @@ public:
};
};
class FSTPV_ : public TagWithThreeArguments<uint8_t, unsigned int, int>
class FSTPV_ : public TagWithThreeArguments<SymbolType, unsigned int, int>
{
public:
FSTPV_(int type_arg, unsigned int pos_arg) :
TagWithThreeArguments<uint8_t, unsigned int, int>::TagWithThreeArguments{Tags::FSTPV, static_cast<uint8_t>(type_arg), pos_arg, 0}
FSTPV_(SymbolType type_arg, unsigned int pos_arg) :
TagWithThreeArguments::TagWithThreeArguments{Tags::FSTPV, type_arg, pos_arg, 0}
{
};
FSTPV_(int type_arg, unsigned int pos_arg, int lead_lag_arg) :
TagWithThreeArguments<uint8_t, unsigned int, int>::TagWithThreeArguments{Tags::FSTPV, static_cast<uint8_t>(type_arg), pos_arg, lead_lag_arg}
FSTPV_(SymbolType type_arg, unsigned int pos_arg, int lead_lag_arg) :
TagWithThreeArguments::TagWithThreeArguments{Tags::FSTPV, type_arg, pos_arg, lead_lag_arg}
{
};
uint8_t
SymbolType
get_type()
{
return arg1;
@ -958,7 +955,7 @@ class FBEGINBLOCK_ : public BytecodeInstruction
{
private:
int size{0};
uint8_t type;
BlockSimulationType type;
vector<int> variable;
vector<int> equation;
vector<int> other_endogenous;
@ -975,7 +972,7 @@ private:
unsigned int nb_col_det_exo_jacob, nb_col_exo_jacob, nb_col_other_endo_jacob;
public:
FBEGINBLOCK_() : BytecodeInstruction{Tags::FBEGINBLOCK},
type{static_cast<uint8_t>(BlockSimulationType::unknown)}
type{BlockSimulationType::unknown}
{
}
FBEGINBLOCK_(unsigned int size_arg, BlockSimulationType type_arg, int unsigned first_element, int unsigned block_size,
@ -985,7 +982,7 @@ public:
vector<int> det_exogenous_arg, vector<int> exogenous_arg, vector<int> other_endogenous_arg) :
BytecodeInstruction{Tags::FBEGINBLOCK},
size{static_cast<int>(size_arg)},
type{static_cast<uint8_t>(type_arg)},
type{type_arg},
variable{variable_arg.begin()+first_element, variable_arg.begin()+(first_element+block_size)},
equation{equation_arg.begin()+first_element, equation_arg.begin()+(first_element+block_size)},
other_endogenous{move(other_endogenous_arg)},
@ -1010,7 +1007,7 @@ public:
bool is_linear_arg, int endo_nbr_arg, int Max_Lag_arg, int Max_Lead_arg, int &u_count_int_arg, int nb_col_jacob_arg) :
BytecodeInstruction{Tags::FBEGINBLOCK},
size{static_cast<int>(size_arg)},
type{static_cast<uint8_t>(type_arg)},
type{type_arg},
variable{variable_arg.begin()+first_element, variable_arg.begin()+(first_element+block_size)},
equation{equation_arg.begin()+first_element, equation_arg.begin()+(first_element+block_size)},
is_linear{is_linear_arg},
@ -1032,7 +1029,7 @@ public:
{
return size;
};
uint8_t
BlockSimulationType
get_type()
{
return type;
@ -1123,10 +1120,10 @@ public:
CompileCode.write(reinterpret_cast<char *>(&variable[i]), sizeof(variable[0]));
CompileCode.write(reinterpret_cast<char *>(&equation[i]), sizeof(equation[0]));
}
if (type == static_cast<uint8_t>(BlockSimulationType::solveTwoBoundariesSimple)
|| type == static_cast<uint8_t>(BlockSimulationType::solveTwoBoundariesComplete)
|| type == static_cast<uint8_t>(BlockSimulationType::solveBackwardComplete)
|| type == static_cast<uint8_t>(BlockSimulationType::solveForwardComplete))
if (type == BlockSimulationType::solveTwoBoundariesSimple
|| type == BlockSimulationType::solveTwoBoundariesComplete
|| type == BlockSimulationType::solveBackwardComplete
|| type == BlockSimulationType::solveForwardComplete)
{
CompileCode.write(reinterpret_cast<char *>(&is_linear), sizeof(is_linear));
CompileCode.write(reinterpret_cast<char *>(&endo_nbr), sizeof(endo_nbr));
@ -1165,10 +1162,10 @@ public:
memcpy(&bc.Equation, code, sizeof(bc.Equation)); code += sizeof(bc.Equation);
Block_Contain_.push_back(bc);
}
if (type == static_cast<uint8_t>(BlockSimulationType::solveTwoBoundariesSimple)
|| type == static_cast<uint8_t>(BlockSimulationType::solveTwoBoundariesComplete)
|| type == static_cast<uint8_t>(BlockSimulationType::solveBackwardComplete)
|| type == static_cast<uint8_t>(BlockSimulationType::solveForwardComplete))
if (type == BlockSimulationType::solveTwoBoundariesSimple
|| type == BlockSimulationType::solveTwoBoundariesComplete
|| type == BlockSimulationType::solveBackwardComplete
|| type == BlockSimulationType::solveForwardComplete)
{
memcpy(&is_linear, code, sizeof(is_linear)); code += sizeof(is_linear);
memcpy(&endo_nbr, code, sizeof(endo_nbr)); code += sizeof(endo_nbr);

View File

@ -935,17 +935,17 @@ DynamicModel::writeDynamicBytecode(const string &basename) const
{
FLDU_ fldu(get<2>(*it));
fldu.write(code_file, instruction_number);
FLDV_ fldv{static_cast<int>(SymbolType::endogenous), static_cast<unsigned int>(get<0>(*it)), get<1>(*it)};
FLDV_ fldv{SymbolType::endogenous, static_cast<unsigned int>(get<0>(*it)), get<1>(*it)};
fldv.write(code_file, instruction_number);
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::times)};
FBINARY_ fbinary{BinaryOpcode::times};
fbinary.write(code_file, instruction_number);
if (it != my_derivatives[i].begin())
{
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::plus)};
FBINARY_ fbinary{BinaryOpcode::plus};
fbinary.write(code_file, instruction_number);
}
}
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::minus)};
FBINARY_ fbinary{BinaryOpcode::minus};
fbinary.write(code_file, instruction_number);
}
FSTPU_ fstpu(i);
@ -1181,7 +1181,7 @@ DynamicModel::writeDynamicBlockBytecode(const string &basename) const
lhs->compile(code_file, instruction_number, false, temporary_terms_union, blocks_temporary_terms_idxs, true, false, tef_terms);
rhs->compile(code_file, instruction_number, false, temporary_terms_union, blocks_temporary_terms_idxs, true, false, tef_terms);
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::minus)};
FBINARY_ fbinary{BinaryOpcode::minus};
fbinary.write(code_file, instruction_number);
FSTPR_ fstpr(i - block_recursive);
fstpr.write(code_file, instruction_number);
@ -1277,10 +1277,10 @@ DynamicModel::writeDynamicBlockBytecode(const string &basename) const
{
FLDU_ fldu(Uf[v].Ufl->u);
fldu.write(code_file, instruction_number);
FLDV_ fldv{static_cast<int>(SymbolType::endogenous), static_cast<unsigned int>(Uf[v].Ufl->var), Uf[v].Ufl->lag};
FLDV_ fldv{SymbolType::endogenous, static_cast<unsigned int>(Uf[v].Ufl->var), Uf[v].Ufl->lag};
fldv.write(code_file, instruction_number);
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::times)};
FBINARY_ fbinary{BinaryOpcode::times};
fbinary.write(code_file, instruction_number);
FCUML_ fcuml;
@ -1293,7 +1293,7 @@ DynamicModel::writeDynamicBlockBytecode(const string &basename) const
free(Uf[v].Ufl);
Uf[v].Ufl = Uf[v].Ufl_First;
}
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::minus)};
FBINARY_ fbinary{BinaryOpcode::minus};
fbinary.write(code_file, instruction_number);
FSTPU_ fstpu(i - block_recursive);

View File

@ -1244,26 +1244,26 @@ VariableNode::compile(ostream &CompileCode, unsigned int &instruction_number,
{
if (steady_dynamic) // steady state values in a dynamic model
{
FLDVS_ fldvs{static_cast<uint8_t>(type), static_cast<unsigned int>(tsid)};
FLDVS_ fldvs{type, static_cast<unsigned int>(tsid)};
fldvs.write(CompileCode, instruction_number);
}
else
{
if (type == SymbolType::parameter)
{
FLDV_ fldv{static_cast<int>(type), static_cast<unsigned int>(tsid)};
FLDV_ fldv{type, static_cast<unsigned int>(tsid)};
fldv.write(CompileCode, instruction_number);
}
else
{
FLDV_ fldv{static_cast<int>(type), static_cast<unsigned int>(tsid), lag};
FLDV_ fldv{type, static_cast<unsigned int>(tsid), lag};
fldv.write(CompileCode, instruction_number);
}
}
}
else
{
FLDSV_ fldsv{static_cast<uint8_t>(type), static_cast<unsigned int>(tsid)};
FLDSV_ fldsv{type, static_cast<unsigned int>(tsid)};
fldsv.write(CompileCode, instruction_number);
}
}
@ -1280,19 +1280,19 @@ VariableNode::compile(ostream &CompileCode, unsigned int &instruction_number,
{
if (type == SymbolType::parameter)
{
FSTPV_ fstpv{static_cast<int>(type), static_cast<unsigned int>(tsid)};
FSTPV_ fstpv{type, static_cast<unsigned int>(tsid)};
fstpv.write(CompileCode, instruction_number);
}
else
{
FSTPV_ fstpv{static_cast<int>(type), static_cast<unsigned int>(tsid), lag};
FSTPV_ fstpv{type, static_cast<unsigned int>(tsid), lag};
fstpv.write(CompileCode, instruction_number);
}
}
}
else
{
FSTPSV_ fstpsv{static_cast<uint8_t>(type), static_cast<unsigned int>(tsid)};
FSTPSV_ fstpsv{type, static_cast<unsigned int>(tsid)};
fstpsv.write(CompileCode, instruction_number);
}
}
@ -3036,7 +3036,7 @@ UnaryOpNode::compile(ostream &CompileCode, unsigned int &instruction_number,
else
{
arg->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, temporary_terms_idxs, dynamic, steady_dynamic, tef_terms);
FUNARY_ funary{static_cast<uint8_t>(op_code)};
FUNARY_ funary{op_code};
funary.write(CompileCode, instruction_number);
}
}
@ -4299,7 +4299,7 @@ BinaryOpNode::compile(ostream &CompileCode, unsigned int &instruction_number,
}
arg1->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, temporary_terms_idxs, dynamic, steady_dynamic, tef_terms);
arg2->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, temporary_terms_idxs, dynamic, steady_dynamic, tef_terms);
FBINARY_ fbinary{static_cast<int>(op_code)};
FBINARY_ fbinary{op_code};
fbinary.write(CompileCode, instruction_number);
}
@ -5995,7 +5995,7 @@ TrinaryOpNode::compile(ostream &CompileCode, unsigned int &instruction_number,
arg1->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, temporary_terms_idxs, dynamic, steady_dynamic, tef_terms);
arg2->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, temporary_terms_idxs, dynamic, steady_dynamic, tef_terms);
arg3->compile(CompileCode, instruction_number, lhs_rhs, temporary_terms, temporary_terms_idxs, dynamic, steady_dynamic, tef_terms);
FTRINARY_ ftrinary{static_cast<int>(op_code)};
FTRINARY_ ftrinary{op_code};
ftrinary.write(CompileCode, instruction_number);
}

View File

@ -1416,7 +1416,7 @@ ModelTree::compileModelEquations(ostream &code_file, unsigned int &instruction_n
lhs->compile(code_file, instruction_number, false, temporary_terms_union, temporary_terms_idxs, dynamic, steady_dynamic, tef_terms);
rhs->compile(code_file, instruction_number, false, temporary_terms_union, temporary_terms_idxs, dynamic, steady_dynamic, tef_terms);
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::minus)};
FBINARY_ fbinary{BinaryOpcode::minus};
fbinary.write(code_file, instruction_number);
FSTPR_ fstpr(eq);

View File

@ -469,17 +469,17 @@ StaticModel::writeStaticBytecode(const string &basename) const
{
FLDSU_ fldsu(it.second);
fldsu.write(code_file, instruction_number);
FLDSV_ fldsv{static_cast<int>(SymbolType::endogenous), static_cast<unsigned int>(it.first)};
FLDSV_ fldsv{SymbolType::endogenous, static_cast<unsigned int>(it.first)};
fldsv.write(code_file, instruction_number);
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::times)};
FBINARY_ fbinary{BinaryOpcode::times};
fbinary.write(code_file, instruction_number);
if (exchange(printed_something, true))
{
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::plus)};
FBINARY_ fbinary{BinaryOpcode::plus};
fbinary.write(code_file, instruction_number);
}
}
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::minus)};
FBINARY_ fbinary{BinaryOpcode::minus};
fbinary.write(code_file, instruction_number);
}
FSTPSU_ fstpsu(i);
@ -694,7 +694,7 @@ StaticModel::writeStaticBlockBytecode(const string &basename) const
lhs->compile(code_file, instruction_number, false, temporary_terms_union, blocks_temporary_terms_idxs, false, false, tef_terms);
rhs->compile(code_file, instruction_number, false, temporary_terms_union, blocks_temporary_terms_idxs, false, false, tef_terms);
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::minus)};
FBINARY_ fbinary{BinaryOpcode::minus};
fbinary.write(code_file, instruction_number);
FSTPR_ fstpr(i - block_recursive);
@ -771,10 +771,10 @@ StaticModel::writeStaticBlockBytecode(const string &basename) const
{
FLDSU_ fldsu(Uf[v].Ufl->u);
fldsu.write(code_file, instruction_number);
FLDSV_ fldsv{static_cast<int>(SymbolType::endogenous), static_cast<unsigned int>(Uf[v].Ufl->var)};
FLDSV_ fldsv{SymbolType::endogenous, static_cast<unsigned int>(Uf[v].Ufl->var)};
fldsv.write(code_file, instruction_number);
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::times)};
FBINARY_ fbinary{BinaryOpcode::times};
fbinary.write(code_file, instruction_number);
FCUML_ fcuml;
@ -787,7 +787,7 @@ StaticModel::writeStaticBlockBytecode(const string &basename) const
free(Uf[v].Ufl);
Uf[v].Ufl = Uf[v].Ufl_First;
}
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::minus)};
FBINARY_ fbinary{BinaryOpcode::minus};
fbinary.write(code_file, instruction_number);
FSTPSU_ fstpsu(i - block_recursive);
@ -868,7 +868,7 @@ StaticModel::writeStaticBlockBytecode(const string &basename) const
lhs->compile(code_file, instruction_number, false, temporary_terms_union, blocks_temporary_terms_idxs, false, false, tef_terms);
rhs->compile(code_file, instruction_number, false, temporary_terms_union, blocks_temporary_terms_idxs, false, false, tef_terms);
FBINARY_ fbinary{static_cast<int>(BinaryOpcode::minus)};
FBINARY_ fbinary{BinaryOpcode::minus};
fbinary.write(code_file, instruction_number);
FSTPR_ fstpr(i - block_recursive);