#include <Alpha64Decoder.h>
Public メソッド | |
Alpha64Decoder () | |
void | Decode (u32 codeWord, DecodedInsn *out) |
構成 | |
struct | DecodedInsn |
Alpha64Decoder.h の 40 行で定義されています。
Alpha64Decoder::Alpha64Decoder | ( | ) |
void Alpha64Decoder::Decode | ( | u32 | codeWord, | |
DecodedInsn * | out | |||
) |
Alpha64Decoder.cpp の 119 行で定義されています。
参照先 ASSERT・BRANCH・BRANCH_FLOAT・BRANCH_SAVE・Onikiri::AlphaLinux::Alpha64Decoder::DecodedInsn::clear()・Onikiri::AlphaLinux::Alpha64Decoder::DecodedInsn::CodeWord・Onikiri::EmulatorUtility::ExtractBits()・Onikiri::AlphaLinux::Alpha64Decoder::DecodedInsn::Imm・MEMORY_ADDR・MEMORY_FUNC・MEMORY_JMP・MEMORY_LOAD・MEMORY_LOAD_FLOAT・MEMORY_STORE・MEMORY_STORE_FLOAT・OPERATION_FLOAT・OPERATION_INT・PAL・Onikiri::AlphaLinux::Alpha64Decoder::DecodedInsn::Reg・UNDEF.
00120 { 00121 out->clear(); 00122 00123 u32 opcode = (codeWord >> 26) & 0x3f; 00124 out->CodeWord = codeWord; 00125 00126 InsnType type = OpCodeToInsnType[opcode]; 00127 00128 switch (type) { 00129 case PAL: 00130 out->Imm[1] = ExtractBits(codeWord, 0, 26); 00131 break; 00132 case UNDEF: 00133 break; 00134 case MEMORY_ADDR: 00135 case MEMORY_LOAD: 00136 out->Imm[0] = ExtractBits<u64>(codeWord, 0, 16, true); 00137 out->Reg[0] = ExtractBits(codeWord, 21, 5); 00138 out->Reg[1] = ExtractBits(codeWord, 16, 5); 00139 break; 00140 case MEMORY_STORE: 00141 out->Imm[0] = ExtractBits<u64>(codeWord, 0, 16, true); 00142 out->Reg[2] = ExtractBits(codeWord, 21, 5); 00143 out->Reg[1] = ExtractBits(codeWord, 16, 5); 00144 break; 00145 case MEMORY_LOAD_FLOAT: 00146 out->Imm[0] = ExtractBits<u64>(codeWord, 0, 16, true); 00147 out->Reg[0] = ExtractBits(codeWord, 21, 5)+32; // fp register 00148 out->Reg[1] = ExtractBits(codeWord, 16, 5); 00149 break; 00150 case MEMORY_STORE_FLOAT: 00151 out->Imm[0] = ExtractBits<u64>(codeWord, 0, 16, true); 00152 out->Reg[2] = ExtractBits(codeWord, 21, 5)+32; // fp register 00153 out->Reg[1] = ExtractBits(codeWord, 16, 5); 00154 break; 00155 case MEMORY_FUNC: 00156 out->Imm[1] = ExtractBits(codeWord, 0, 16); 00157 out->Reg[0] = ExtractBits(codeWord, 21, 5); 00158 out->Reg[1] = ExtractBits(codeWord, 16, 5); 00159 break; 00160 case MEMORY_JMP: 00161 out->Imm[0] = ExtractBits(codeWord, 0, 14); 00162 //out->Imm[0] = ExtractBits(codeWord, 14, 2); 00163 out->Reg[1] = ExtractBits(codeWord, 16, 5); // Rb 00164 out->Reg[0] = ExtractBits(codeWord, 21, 5); // Ra 00165 break; 00166 case BRANCH: 00167 out->Imm[0] = ExtractBits<u64>(codeWord, 0, 21, true); 00168 out->Reg[1] = ExtractBits(codeWord, 21, 5); 00169 break; 00170 case BRANCH_FLOAT: 00171 out->Imm[0] = ExtractBits<u64>(codeWord, 0, 21, true); 00172 out->Reg[1] = ExtractBits(codeWord, 21, 5)+32; // fp register 00173 break; 00174 case BRANCH_SAVE: 00175 out->Imm[0] = ExtractBits<u64>(codeWord, 0, 21, true); 00176 out->Reg[0] = ExtractBits(codeWord, 21, 5); 00177 break; 00178 case OPERATION_INT: 00179 out->Reg[0] = ExtractBits(codeWord, 0, 5); 00180 out->Imm[1] = ExtractBits(codeWord, 5, 7); 00181 if (ExtractBits(codeWord, 12, 1)) 00182 out->Imm[0] = ExtractBits(codeWord, 13, 8); 00183 else 00184 out->Reg[2] = ExtractBits(codeWord, 16, 5); 00185 if (ExtractBits(codeWord, 5, 3) == 0 && 00186 ExtractBits(codeWord, 9, 3) == 7) // FTOIx 00187 out->Reg[1] = ExtractBits(codeWord, 21, 5) + 32; // fp register 00188 else 00189 out->Reg[1] = ExtractBits(codeWord, 21, 5); 00190 break; 00191 case OPERATION_FLOAT: 00192 out->Reg[0] = ExtractBits(codeWord, 0, 5) + 32; 00193 out->Imm[1] = ExtractBits(codeWord, 5, 11); 00194 out->Reg[2] = ExtractBits(codeWord, 16, 5) + 32; // fp register 00195 if(ExtractBits(codeWord, 5, 4) == 4) // ITOFx 00196 out->Reg[1] = ExtractBits(codeWord, 21, 5); // int register 00197 else 00198 out->Reg[1] = ExtractBits(codeWord, 21, 5) + 32; 00199 break; 00200 default: 00201 ASSERT(0); // never reached 00202 } 00203 }
関数の呼び出しグラフ: