クラス Onikiri::AlphaLinux::Alpha64Decoder

#include <Alpha64Decoder.h>

すべてのメンバ一覧

Public メソッド

 Alpha64Decoder ()
void Decode (u32 codeWord, DecodedInsn *out)

構成

struct  DecodedInsn


説明

Alpha64Decoder.h40 行で定義されています。


コンストラクタとデストラクタ

Alpha64Decoder::Alpha64Decoder (  ) 

Alpha64Decoder.cpp115 行で定義されています。

00116 {
00117 }


関数

void Alpha64Decoder::Decode ( u32  codeWord,
DecodedInsn out 
)

Alpha64Decoder.cpp119 行で定義されています。

参照先 ASSERTBRANCHBRANCH_FLOATBRANCH_SAVEOnikiri::AlphaLinux::Alpha64Decoder::DecodedInsn::clear()Onikiri::AlphaLinux::Alpha64Decoder::DecodedInsn::CodeWordOnikiri::EmulatorUtility::ExtractBits()Onikiri::AlphaLinux::Alpha64Decoder::DecodedInsn::ImmMEMORY_ADDRMEMORY_FUNCMEMORY_JMPMEMORY_LOADMEMORY_LOAD_FLOATMEMORY_STOREMEMORY_STORE_FLOATOPERATION_FLOATOPERATION_INTPALOnikiri::AlphaLinux::Alpha64Decoder::DecodedInsn::RegUNDEF.

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 }

関数の呼び出しグラフ:


このクラスの説明は次のファイルから生成されました:
Onikiri2に対してTue Jun 18 15:24:19 2013に生成されました。  doxygen 1.4.7