Цитата
А можно поподробнее как это реализовать?
Код
//объявляем
#define CPUInstructionNum 64
void (*CPUInstructionDecodeCall[CPUInstructionNum]) (void);
Код
//инициализируем
void CPUInstructionDecoderInit()
{
uint32 i;
for(i = 0; i < CPUInstructionNum; i++) CPUInstructionDecodeCall[i] = &CPUInvalidInstruction;
CPUInstructionDecodeCall[CIDO_J >> CIDO_Shift] = &CPUInstructionDecodeJ;
CPUInstructionDecodeCall[CIDO_JAL >> CIDO_Shift] = &CPUInstructionDecodeJAL;
...
CPUInstructionDecodeCall[CIDO_BEQ >> CIDO_Shift] = &CPUInstructionDecodeBEQ;
}
Код
//пользуемся
void CPUInstructionDecode()
{
(*CPUInstructionDecodeCall[CPUInstructionCurrent >> 26])();
}
смещение на 26, то только в моём случае.
ну а индексы массива это коды/опкоды приходящие из вне. у меня это, к примеру, такое
Код
enum ECPUInstructionDecoderOpcode
{
CIDO_J = 0x08000000,
CIDO_JAL = 0x0C000000,
...
CIDO_BEQ = 0x10000000,
};
Цитата
Думаю сделать через массив указателей на функции, но не знаю насколько это будет быстрее чем простой if.
это очень быстро))