diff --git a/src/arch/x86/insts/microldstop.hh b/src/arch/x86/insts/microldstop.hh index 067e5bd8b3..8ce458b544 100644 --- a/src/arch/x86/insts/microldstop.hh +++ b/src/arch/x86/insts/microldstop.hh @@ -39,6 +39,8 @@ #ifndef __ARCH_X86_INSTS_MICROLDSTOP_HH__ #define __ARCH_X86_INSTS_MICROLDSTOP_HH__ +#include + #include "arch/x86/insts/microop.hh" #include "arch/x86/insts/microop_args.hh" #include "arch/x86/ldstflags.hh" @@ -89,7 +91,7 @@ class LdStOp : public InstOperands Request::FlagsType mem_flags, OpClass op_class) : InstOperands( mach_inst, mnem, inst_mnem, set_flags, op_class, - _data, { _scale, _index, _base, _disp, _segment }, + { _data, { _scale, _index, _base, _disp, _segment } }, data_size, address_size, mem_flags | _segment.index) {} }; @@ -108,7 +110,7 @@ class LdStFpOp : public InstOperands Request::FlagsType mem_flags, OpClass op_class) : InstOperands( mach_inst, mnem, inst_mnem, set_flags, op_class, - _data, { _scale, _index, _base, _disp, _segment }, + { _data, { _scale, _index, _base, _disp, _segment } }, data_size, address_size, mem_flags | _segment.index) {} }; @@ -126,7 +128,7 @@ class MemNoDataOp : public InstOperands Request::FlagsType mem_flags, OpClass op_class) : InstOperands( mach_inst, mnem, inst_mnem, set_flags, op_class, - { _scale, _index, _base, _disp, _segment }, + { { _scale, _index, _base, _disp, _segment } }, data_size, address_size, mem_flags | _segment.index) {} }; @@ -148,7 +150,7 @@ class LdStSplitOp : Request::FlagsType mem_flags, OpClass op_class) : InstOperands( mach_inst, mnem, inst_mnem, set_flags, op_class, - data_low, data_hi, { _scale, _index, _base, _disp, _segment }, + { data_low, data_hi, { _scale, _index, _base, _disp, _segment } }, data_size, address_size, mem_flags | _segment.index) {} }; diff --git a/src/arch/x86/insts/microop_args.hh b/src/arch/x86/insts/microop_args.hh index 3a9cb060e2..f810a740a8 100644 --- a/src/arch/x86/insts/microop_args.hh +++ b/src/arch/x86/insts/microop_args.hh @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include "arch/x86/insts/static_inst.hh" #include "arch/x86/regs/int.hh" @@ -338,13 +340,26 @@ struct AddrOp template class InstOperands : public Base, public Operands... { + private: + using ArgTuple = std::tuple; + + template + InstOperands(std::index_sequence, ExtMachInst mach_inst, + const char *mnem, const char *inst_mnem, uint64_t set_flags, + OpClass op_class, GEM5_VAR_USED ArgTuple args, + CTorArgs... ctor_args) : + Base(mach_inst, mnem, inst_mnem, set_flags, op_class, ctor_args...), + Operands(this, std::get(args))... + {} + protected: template InstOperands(ExtMachInst mach_inst, const char *mnem, const char *inst_mnem, uint64_t set_flags, OpClass op_class, - typename Operands::ArgType... args, CTorArgs... ctor_args) : - Base(mach_inst, mnem, inst_mnem, set_flags, op_class, ctor_args...), - Operands(this, args)... + ArgTuple args, CTorArgs... ctor_args) : + InstOperands(std::make_index_sequence{}, + mach_inst, mnem, inst_mnem, set_flags, op_class, + std::move(args), ctor_args...) {} std::string diff --git a/src/arch/x86/insts/microspecop.hh b/src/arch/x86/insts/microspecop.hh index 3d2c6318d9..ed78024c04 100644 --- a/src/arch/x86/insts/microspecop.hh +++ b/src/arch/x86/insts/microspecop.hh @@ -42,7 +42,7 @@ class MicroHalt : public InstOperands InstOperands(mach_inst, "halt", inst_mnem, set_flags | (1ULL << StaticInst::IsNonSpeculative) | (1ULL << StaticInst::IsQuiesce), - No_OpClass) + No_OpClass, {}) {} Fault diff --git a/src/arch/x86/isa/microops/fpop.isa b/src/arch/x86/isa/microops/fpop.isa index f727fdc88b..dc83362a0d 100644 --- a/src/arch/x86/isa/microops/fpop.isa +++ b/src/arch/x86/isa/microops/fpop.isa @@ -92,7 +92,7 @@ def template MicroFpOpConstructor {{ const char *inst_mnem, uint64_t set_flags, uint8_t data_size, int8_t _spm, Args... args) : %(base_class)s(mach_inst, "%(mnemonic)s", inst_mnem, set_flags, - %(op_class)s, args..., data_size, _spm) + %(op_class)s, { args... }, data_size, _spm) { %(set_reg_idx_arr)s; %(constructor)s; diff --git a/src/arch/x86/isa/microops/limmop.isa b/src/arch/x86/isa/microops/limmop.isa index b0444b87b9..c1312e6073 100644 --- a/src/arch/x86/isa/microops/limmop.isa +++ b/src/arch/x86/isa/microops/limmop.isa @@ -64,7 +64,7 @@ def template MicroLimmOpDeclare {{ uint64_t set_flags, Dest _dest, uint64_t _imm, uint8_t data_size) : %(base_class)s(mach_inst, "%(mnemonic)s", inst_mnem, set_flags, - %(op_class)s, _dest, _imm, data_size, 0) + %(op_class)s, { _dest, _imm }, data_size, 0) { %(set_reg_idx_arr)s; %(constructor)s; diff --git a/src/arch/x86/isa/microops/mediaop.isa b/src/arch/x86/isa/microops/mediaop.isa index 3effff8357..7577728b71 100644 --- a/src/arch/x86/isa/microops/mediaop.isa +++ b/src/arch/x86/isa/microops/mediaop.isa @@ -58,7 +58,7 @@ def template MediaOpDeclare {{ uint64_t set_flags, uint8_t src_size, uint8_t dest_size, uint16_t _ext, Args... args) : %(base_class)s(mach_inst, "%(mnemonic)s", inst_mnem, set_flags, - %(op_class)s, args..., src_size, dest_size, _ext) + %(op_class)s, { args... }, src_size, dest_size, _ext) { %(set_reg_idx_arr)s; %(constructor)s; diff --git a/src/arch/x86/isa/microops/regop.isa b/src/arch/x86/isa/microops/regop.isa index 13b801c03e..0cca5b5c7f 100644 --- a/src/arch/x86/isa/microops/regop.isa +++ b/src/arch/x86/isa/microops/regop.isa @@ -79,7 +79,7 @@ def template MicroRegOpDeclare {{ uint64_t set_flags, uint8_t data_size, uint16_t _ext, Args... args) : %(base_class)s(mach_inst, "%(mnemonic)s", inst_mnem, set_flags, - %(op_class)s, args..., data_size, _ext) + %(op_class)s, { args... }, data_size, _ext) { %(set_reg_idx_arr)s; %(constructor)s; @@ -102,7 +102,7 @@ def template MicroRegOpBranchDeclare {{ uint64_t set_flags, uint8_t data_size, uint16_t _ext, Args... args) : %(base_class)s(mach_inst, "%(mnemonic)s", inst_mnem, set_flags, - %(op_class)s, args..., data_size, _ext) + %(op_class)s, { args... }, data_size, _ext) { %(set_reg_idx_arr)s; %(constructor)s; diff --git a/src/arch/x86/isa/microops/seqop.isa b/src/arch/x86/isa/microops/seqop.isa index 7b5210152e..5eae7e692f 100644 --- a/src/arch/x86/isa/microops/seqop.isa +++ b/src/arch/x86/isa/microops/seqop.isa @@ -43,7 +43,7 @@ def template BrDeclare {{ %(class_name)s(ExtMachInst mach_inst, const char *inst_mnem, uint64_t set_flags, uint16_t _target, uint8_t _cc) : %(base_class)s(mach_inst, "%(mnemonic)s", inst_mnem, set_flags, - %(op_class)s, _target, _cc) + %(op_class)s, { _target }, _cc) { %(set_reg_idx_arr)s; %(constructor)s; @@ -77,7 +77,7 @@ def template EretDeclare {{ %(class_name)s(ExtMachInst mach_inst, const char *inst_mnem, uint64_t set_flags, uint8_t _cc) : %(base_class)s(mach_inst, "%(mnemonic)s", inst_mnem, set_flags, - %(op_class)s, _cc) + %(op_class)s, {}, _cc) { %(set_reg_idx_arr)s; %(constructor)s; diff --git a/src/arch/x86/isa/microops/specop.isa b/src/arch/x86/isa/microops/specop.isa index c5fe5bc0c8..0a720ee0f9 100644 --- a/src/arch/x86/isa/microops/specop.isa +++ b/src/arch/x86/isa/microops/specop.isa @@ -75,7 +75,7 @@ def template MicroFaultConstructor {{ ExtMachInst mach_inst, const char *inst_mnem, uint64_t set_flags, Fault _fault, uint8_t _cc) : %(base_class)s(mach_inst, "fault", inst_mnem, set_flags, No_OpClass, - _fault, _cc) + { _fault }, _cc) { %(set_reg_idx_arr)s; %(constructor)s;