1 //===-- EmulateInstructionMIPS.cpp -------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "EmulateInstructionMIPS.h"
14 #include "llvm-c/Disassembler.h"
15 #include "llvm/Support/TargetSelect.h"
16 #include "llvm/Support/TargetRegistry.h"
17 #include "llvm/MC/MCAsmInfo.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/MC/MCInstrInfo.h"
20 #include "llvm/MC/MCDisassembler.h"
21 #include "llvm/MC/MCRegisterInfo.h"
22 #include "llvm/MC/MCSubtargetInfo.h"
23 #include "llvm/MC/MCContext.h"
24 #include "lldb/Core/Address.h"
25 #include "lldb/Core/Opcode.h"
26 #include "lldb/Core/ArchSpec.h"
27 #include "lldb/Core/ConstString.h"
28 #include "lldb/Core/PluginManager.h"
29 #include "lldb/Core/DataExtractor.h"
30 #include "lldb/Core/Stream.h"
31 #include "lldb/Symbol/UnwindPlan.h"
33 #include "llvm/ADT/STLExtras.h"
35 #include "Plugins/Process/Utility/InstructionUtils.h"
36 #include "Plugins/Process/Utility/RegisterContext_mips64.h" //mips32 has same registers nos as mips64
39 using namespace lldb_private;
41 #define UInt(x) ((uint64_t)x)
42 #define integer int64_t
45 //----------------------------------------------------------------------
47 // EmulateInstructionMIPS implementation
49 //----------------------------------------------------------------------
53 void LLVMInitializeMipsTargetInfo ();
54 void LLVMInitializeMipsTarget ();
55 void LLVMInitializeMipsAsmPrinter ();
56 void LLVMInitializeMipsTargetMC ();
57 void LLVMInitializeMipsDisassembler ();
61 EmulateInstructionMIPS::EmulateInstructionMIPS (const lldb_private::ArchSpec &arch) :
62 EmulateInstruction (arch)
64 /* Create instance of llvm::MCDisassembler */
66 llvm::Triple triple = arch.GetTriple();
67 const llvm::Target *target = llvm::TargetRegistry::lookupTarget (triple.getTriple(), Error);
70 * If we fail to get the target then we haven't registered it. The SystemInitializerCommon
71 * does not initialize targets, MCs and disassemblers. However we need the MCDisassembler
72 * to decode the instructions so that the decoding complexity stays with LLVM.
73 * Initialize the MIPS targets and disassemblers.
78 LLVMInitializeMipsTargetInfo ();
79 LLVMInitializeMipsTarget ();
80 LLVMInitializeMipsAsmPrinter ();
81 LLVMInitializeMipsTargetMC ();
82 LLVMInitializeMipsDisassembler ();
83 target = llvm::TargetRegistry::lookupTarget (triple.getTriple(), Error);
91 switch (arch.GetCore())
93 case ArchSpec::eCore_mips32:
94 case ArchSpec::eCore_mips32el:
95 cpu = "mips32"; break;
96 case ArchSpec::eCore_mips32r2:
97 case ArchSpec::eCore_mips32r2el:
98 cpu = "mips32r2"; break;
99 case ArchSpec::eCore_mips32r3:
100 case ArchSpec::eCore_mips32r3el:
101 cpu = "mips32r3"; break;
102 case ArchSpec::eCore_mips32r5:
103 case ArchSpec::eCore_mips32r5el:
104 cpu = "mips32r5"; break;
105 case ArchSpec::eCore_mips32r6:
106 case ArchSpec::eCore_mips32r6el:
107 cpu = "mips32r6"; break;
108 case ArchSpec::eCore_mips64:
109 case ArchSpec::eCore_mips64el:
110 cpu = "mips64"; break;
111 case ArchSpec::eCore_mips64r2:
112 case ArchSpec::eCore_mips64r2el:
113 cpu = "mips64r2"; break;
114 case ArchSpec::eCore_mips64r3:
115 case ArchSpec::eCore_mips64r3el:
116 cpu = "mips64r3"; break;
117 case ArchSpec::eCore_mips64r5:
118 case ArchSpec::eCore_mips64r5el:
119 cpu = "mips64r5"; break;
120 case ArchSpec::eCore_mips64r6:
121 case ArchSpec::eCore_mips64r6el:
122 cpu = "mips64r6"; break;
124 cpu = "generic"; break;
127 m_reg_info.reset (target->createMCRegInfo (triple.getTriple()));
128 assert (m_reg_info.get());
130 m_insn_info.reset (target->createMCInstrInfo());
131 assert (m_insn_info.get());
133 m_asm_info.reset (target->createMCAsmInfo (*m_reg_info, triple.getTriple()));
134 m_subtype_info.reset (target->createMCSubtargetInfo (triple.getTriple(), cpu, ""));
135 assert (m_asm_info.get() && m_subtype_info.get());
137 m_context.reset (new llvm::MCContext (m_asm_info.get(), m_reg_info.get(), nullptr));
138 assert (m_context.get());
140 m_disasm.reset (target->createMCDisassembler (*m_subtype_info, *m_context));
141 assert (m_disasm.get());
145 EmulateInstructionMIPS::Initialize ()
147 PluginManager::RegisterPlugin (GetPluginNameStatic (),
148 GetPluginDescriptionStatic (),
153 EmulateInstructionMIPS::Terminate ()
155 PluginManager::UnregisterPlugin (CreateInstance);
159 EmulateInstructionMIPS::GetPluginNameStatic ()
161 ConstString g_plugin_name ("lldb.emulate-instruction.mips32");
162 return g_plugin_name;
165 lldb_private::ConstString
166 EmulateInstructionMIPS::GetPluginName()
168 static ConstString g_plugin_name ("EmulateInstructionMIPS");
169 return g_plugin_name;
173 EmulateInstructionMIPS::GetPluginDescriptionStatic ()
175 return "Emulate instructions for the MIPS32 architecture.";
179 EmulateInstructionMIPS::CreateInstance (const ArchSpec &arch, InstructionType inst_type)
181 if (EmulateInstructionMIPS::SupportsEmulatingInstructionsOfTypeStatic(inst_type))
183 if (arch.GetTriple().getArch() == llvm::Triple::mips
184 || arch.GetTriple().getArch() == llvm::Triple::mipsel)
186 std::auto_ptr<EmulateInstructionMIPS> emulate_insn_ap (new EmulateInstructionMIPS (arch));
187 if (emulate_insn_ap.get())
188 return emulate_insn_ap.release();
196 EmulateInstructionMIPS::SetTargetTriple (const ArchSpec &arch)
198 if (arch.GetTriple().getArch () == llvm::Triple::mips
199 || arch.GetTriple().getArch () == llvm::Triple::mipsel)
205 EmulateInstructionMIPS::GetRegisterName (unsigned reg_num, bool alternate_name)
211 case gcc_dwarf_sp_mips: return "r29";
212 case gcc_dwarf_r30_mips: return "r30";
213 case gcc_dwarf_ra_mips: return "r31";
214 case gcc_dwarf_f0_mips: return "f0";
215 case gcc_dwarf_f1_mips: return "f1";
216 case gcc_dwarf_f2_mips: return "f2";
217 case gcc_dwarf_f3_mips: return "f3";
218 case gcc_dwarf_f4_mips: return "f4";
219 case gcc_dwarf_f5_mips: return "f5";
220 case gcc_dwarf_f6_mips: return "f6";
221 case gcc_dwarf_f7_mips: return "f7";
222 case gcc_dwarf_f8_mips: return "f8";
223 case gcc_dwarf_f9_mips: return "f9";
224 case gcc_dwarf_f10_mips: return "f10";
225 case gcc_dwarf_f11_mips: return "f11";
226 case gcc_dwarf_f12_mips: return "f12";
227 case gcc_dwarf_f13_mips: return "f13";
228 case gcc_dwarf_f14_mips: return "f14";
229 case gcc_dwarf_f15_mips: return "f15";
230 case gcc_dwarf_f16_mips: return "f16";
231 case gcc_dwarf_f17_mips: return "f17";
232 case gcc_dwarf_f18_mips: return "f18";
233 case gcc_dwarf_f19_mips: return "f19";
234 case gcc_dwarf_f20_mips: return "f20";
235 case gcc_dwarf_f21_mips: return "f21";
236 case gcc_dwarf_f22_mips: return "f22";
237 case gcc_dwarf_f23_mips: return "f23";
238 case gcc_dwarf_f24_mips: return "f24";
239 case gcc_dwarf_f25_mips: return "f25";
240 case gcc_dwarf_f26_mips: return "f26";
241 case gcc_dwarf_f27_mips: return "f27";
242 case gcc_dwarf_f28_mips: return "f28";
243 case gcc_dwarf_f29_mips: return "f29";
244 case gcc_dwarf_f30_mips: return "f30";
245 case gcc_dwarf_f31_mips: return "f31";
254 case gcc_dwarf_zero_mips: return "r0";
255 case gcc_dwarf_r1_mips: return "r1";
256 case gcc_dwarf_r2_mips: return "r2";
257 case gcc_dwarf_r3_mips: return "r3";
258 case gcc_dwarf_r4_mips: return "r4";
259 case gcc_dwarf_r5_mips: return "r5";
260 case gcc_dwarf_r6_mips: return "r6";
261 case gcc_dwarf_r7_mips: return "r7";
262 case gcc_dwarf_r8_mips: return "r8";
263 case gcc_dwarf_r9_mips: return "r9";
264 case gcc_dwarf_r10_mips: return "r10";
265 case gcc_dwarf_r11_mips: return "r11";
266 case gcc_dwarf_r12_mips: return "r12";
267 case gcc_dwarf_r13_mips: return "r13";
268 case gcc_dwarf_r14_mips: return "r14";
269 case gcc_dwarf_r15_mips: return "r15";
270 case gcc_dwarf_r16_mips: return "r16";
271 case gcc_dwarf_r17_mips: return "r17";
272 case gcc_dwarf_r18_mips: return "r18";
273 case gcc_dwarf_r19_mips: return "r19";
274 case gcc_dwarf_r20_mips: return "r20";
275 case gcc_dwarf_r21_mips: return "r21";
276 case gcc_dwarf_r22_mips: return "r22";
277 case gcc_dwarf_r23_mips: return "r23";
278 case gcc_dwarf_r24_mips: return "r24";
279 case gcc_dwarf_r25_mips: return "r25";
280 case gcc_dwarf_r26_mips: return "r26";
281 case gcc_dwarf_r27_mips: return "r27";
282 case gcc_dwarf_gp_mips: return "gp";
283 case gcc_dwarf_sp_mips: return "sp";
284 case gcc_dwarf_r30_mips: return "fp";
285 case gcc_dwarf_ra_mips: return "ra";
286 case gcc_dwarf_sr_mips: return "sr";
287 case gcc_dwarf_lo_mips: return "lo";
288 case gcc_dwarf_hi_mips: return "hi";
289 case gcc_dwarf_bad_mips: return "bad";
290 case gcc_dwarf_cause_mips: return "cause";
291 case gcc_dwarf_pc_mips: return "pc";
292 case gcc_dwarf_f0_mips: return "fp_reg[0]";
293 case gcc_dwarf_f1_mips: return "fp_reg[1]";
294 case gcc_dwarf_f2_mips: return "fp_reg[2]";
295 case gcc_dwarf_f3_mips: return "fp_reg[3]";
296 case gcc_dwarf_f4_mips: return "fp_reg[4]";
297 case gcc_dwarf_f5_mips: return "fp_reg[5]";
298 case gcc_dwarf_f6_mips: return "fp_reg[6]";
299 case gcc_dwarf_f7_mips: return "fp_reg[7]";
300 case gcc_dwarf_f8_mips: return "fp_reg[8]";
301 case gcc_dwarf_f9_mips: return "fp_reg[9]";
302 case gcc_dwarf_f10_mips: return "fp_reg[10]";
303 case gcc_dwarf_f11_mips: return "fp_reg[11]";
304 case gcc_dwarf_f12_mips: return "fp_reg[12]";
305 case gcc_dwarf_f13_mips: return "fp_reg[13]";
306 case gcc_dwarf_f14_mips: return "fp_reg[14]";
307 case gcc_dwarf_f15_mips: return "fp_reg[15]";
308 case gcc_dwarf_f16_mips: return "fp_reg[16]";
309 case gcc_dwarf_f17_mips: return "fp_reg[17]";
310 case gcc_dwarf_f18_mips: return "fp_reg[18]";
311 case gcc_dwarf_f19_mips: return "fp_reg[19]";
312 case gcc_dwarf_f20_mips: return "fp_reg[20]";
313 case gcc_dwarf_f21_mips: return "fp_reg[21]";
314 case gcc_dwarf_f22_mips: return "fp_reg[22]";
315 case gcc_dwarf_f23_mips: return "fp_reg[23]";
316 case gcc_dwarf_f24_mips: return "fp_reg[24]";
317 case gcc_dwarf_f25_mips: return "fp_reg[25]";
318 case gcc_dwarf_f26_mips: return "fp_reg[26]";
319 case gcc_dwarf_f27_mips: return "fp_reg[27]";
320 case gcc_dwarf_f28_mips: return "fp_reg[28]";
321 case gcc_dwarf_f29_mips: return "fp_reg[29]";
322 case gcc_dwarf_f30_mips: return "fp_reg[30]";
323 case gcc_dwarf_f31_mips: return "fp_reg[31]";
324 case gcc_dwarf_fcsr_mips: return "fcsr";
325 case gcc_dwarf_fir_mips: return "fir";
331 EmulateInstructionMIPS::GetRegisterInfo (RegisterKind reg_kind, uint32_t reg_num, RegisterInfo ®_info)
333 if (reg_kind == eRegisterKindGeneric)
337 case LLDB_REGNUM_GENERIC_PC: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_pc_mips; break;
338 case LLDB_REGNUM_GENERIC_SP: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_sp_mips; break;
339 case LLDB_REGNUM_GENERIC_FP: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_r30_mips; break;
340 case LLDB_REGNUM_GENERIC_RA: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_ra_mips; break;
341 case LLDB_REGNUM_GENERIC_FLAGS: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_sr_mips; break;
347 if (reg_kind == eRegisterKindDWARF)
349 ::memset (®_info, 0, sizeof(RegisterInfo));
350 ::memset (reg_info.kinds, LLDB_INVALID_REGNUM, sizeof(reg_info.kinds));
352 if (reg_num == gcc_dwarf_sr_mips || reg_num == gcc_dwarf_fcsr_mips || reg_num == gcc_dwarf_fir_mips)
354 reg_info.byte_size = 4;
355 reg_info.format = eFormatHex;
356 reg_info.encoding = eEncodingUint;
358 else if ((int)reg_num >= gcc_dwarf_zero_mips && (int)reg_num <= gcc_dwarf_f31_mips)
360 reg_info.byte_size = 4;
361 reg_info.format = eFormatHex;
362 reg_info.encoding = eEncodingUint;
369 reg_info.name = GetRegisterName (reg_num, false);
370 reg_info.alt_name = GetRegisterName (reg_num, true);
371 reg_info.kinds[eRegisterKindDWARF] = reg_num;
375 case gcc_dwarf_r30_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; break;
376 case gcc_dwarf_ra_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; break;
377 case gcc_dwarf_sp_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; break;
378 case gcc_dwarf_pc_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; break;
379 case gcc_dwarf_sr_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS; break;
387 EmulateInstructionMIPS::MipsOpcode*
388 EmulateInstructionMIPS::GetOpcodeForInstruction (const char *op_name)
390 static EmulateInstructionMIPS::MipsOpcode
393 //----------------------------------------------------------------------
394 // Prologue/Epilogue instructions
395 //----------------------------------------------------------------------
396 { "ADDiu", &EmulateInstructionMIPS::Emulate_ADDiu, "ADDIU rt,rs,immediate" },
397 { "SW", &EmulateInstructionMIPS::Emulate_SW, "SW rt,offset(rs)" },
398 { "LW", &EmulateInstructionMIPS::Emulate_LW, "LW rt,offset(base)" },
400 //----------------------------------------------------------------------
401 // Branch instructions
402 //----------------------------------------------------------------------
403 { "BEQ", &EmulateInstructionMIPS::Emulate_BEQ, "BEQ rs,rt,offset" },
404 { "BNE", &EmulateInstructionMIPS::Emulate_BNE, "BNE rs,rt,offset" },
405 { "BEQL", &EmulateInstructionMIPS::Emulate_BEQL, "BEQL rs,rt,offset" },
406 { "BNEL", &EmulateInstructionMIPS::Emulate_BNEL, "BNEL rs,rt,offset" },
407 { "BGEZALL", &EmulateInstructionMIPS::Emulate_BGEZALL, "BGEZALL rt,offset" },
408 { "BAL", &EmulateInstructionMIPS::Emulate_BAL, "BAL offset" },
409 { "BGEZAL", &EmulateInstructionMIPS::Emulate_BGEZAL, "BGEZAL rs,offset" },
410 { "BALC", &EmulateInstructionMIPS::Emulate_BALC, "BALC offset" },
411 { "BC", &EmulateInstructionMIPS::Emulate_BC, "BC offset" },
412 { "BGEZ", &EmulateInstructionMIPS::Emulate_BGEZ, "BGEZ rs,offset" },
413 { "BLEZALC", &EmulateInstructionMIPS::Emulate_BLEZALC, "BLEZALC rs,offset" },
414 { "BGEZALC", &EmulateInstructionMIPS::Emulate_BGEZALC, "BGEZALC rs,offset" },
415 { "BLTZALC", &EmulateInstructionMIPS::Emulate_BLTZALC, "BLTZALC rs,offset" },
416 { "BGTZALC", &EmulateInstructionMIPS::Emulate_BGTZALC, "BGTZALC rs,offset" },
417 { "BEQZALC", &EmulateInstructionMIPS::Emulate_BEQZALC, "BEQZALC rs,offset" },
418 { "BNEZALC", &EmulateInstructionMIPS::Emulate_BNEZALC, "BNEZALC rs,offset" },
419 { "BEQC", &EmulateInstructionMIPS::Emulate_BEQC, "BEQC rs,rt,offset" },
420 { "BNEC", &EmulateInstructionMIPS::Emulate_BNEC, "BNEC rs,rt,offset" },
421 { "BLTC", &EmulateInstructionMIPS::Emulate_BLTC, "BLTC rs,rt,offset" },
422 { "BGEC", &EmulateInstructionMIPS::Emulate_BGEC, "BGEC rs,rt,offset" },
423 { "BLTUC", &EmulateInstructionMIPS::Emulate_BLTUC, "BLTUC rs,rt,offset" },
424 { "BGEUC", &EmulateInstructionMIPS::Emulate_BGEUC, "BGEUC rs,rt,offset" },
425 { "BLTZC", &EmulateInstructionMIPS::Emulate_BLTZC, "BLTZC rt,offset" },
426 { "BLEZC", &EmulateInstructionMIPS::Emulate_BLEZC, "BLEZC rt,offset" },
427 { "BGEZC", &EmulateInstructionMIPS::Emulate_BGEZC, "BGEZC rt,offset" },
428 { "BGTZC", &EmulateInstructionMIPS::Emulate_BGTZC, "BGTZC rt,offset" },
429 { "BEQZC", &EmulateInstructionMIPS::Emulate_BEQZC, "BEQZC rt,offset" },
430 { "BNEZC", &EmulateInstructionMIPS::Emulate_BNEZC, "BNEZC rt,offset" },
431 { "BGEZL", &EmulateInstructionMIPS::Emulate_BGEZL, "BGEZL rt,offset" },
432 { "BGTZ", &EmulateInstructionMIPS::Emulate_BGTZ, "BGTZ rt,offset" },
433 { "BGTZL", &EmulateInstructionMIPS::Emulate_BGTZL, "BGTZL rt,offset" },
434 { "BLEZ", &EmulateInstructionMIPS::Emulate_BLEZ, "BLEZ rt,offset" },
435 { "BLEZL", &EmulateInstructionMIPS::Emulate_BLEZL, "BLEZL rt,offset" },
436 { "BLTZ", &EmulateInstructionMIPS::Emulate_BLTZ, "BLTZ rt,offset" },
437 { "BLTZAL", &EmulateInstructionMIPS::Emulate_BLTZAL, "BLTZAL rt,offset" },
438 { "BLTZALL", &EmulateInstructionMIPS::Emulate_BLTZALL, "BLTZALL rt,offset" },
439 { "BLTZL", &EmulateInstructionMIPS::Emulate_BLTZL, "BLTZL rt,offset" },
440 { "BOVC", &EmulateInstructionMIPS::Emulate_BOVC, "BOVC rs,rt,offset" },
441 { "BNVC", &EmulateInstructionMIPS::Emulate_BNVC, "BNVC rs,rt,offset" },
442 { "J", &EmulateInstructionMIPS::Emulate_J, "J target" },
443 { "JAL", &EmulateInstructionMIPS::Emulate_JAL, "JAL target" },
444 { "JALX", &EmulateInstructionMIPS::Emulate_JAL, "JALX target" },
445 { "JALR", &EmulateInstructionMIPS::Emulate_JALR, "JALR target" },
446 { "JALR_HB", &EmulateInstructionMIPS::Emulate_JALR, "JALR.HB target" },
447 { "JIALC", &EmulateInstructionMIPS::Emulate_JIALC, "JIALC rt,offset" },
448 { "JIC", &EmulateInstructionMIPS::Emulate_JIC, "JIC rt,offset" },
449 { "JR", &EmulateInstructionMIPS::Emulate_JR, "JR target" },
450 { "JR_HB", &EmulateInstructionMIPS::Emulate_JR, "JR.HB target" },
451 { "BC1F", &EmulateInstructionMIPS::Emulate_BC1F, "BC1F cc, offset" },
452 { "BC1T", &EmulateInstructionMIPS::Emulate_BC1T, "BC1T cc, offset" },
453 { "BC1FL", &EmulateInstructionMIPS::Emulate_BC1FL, "BC1FL cc, offset" },
454 { "BC1TL", &EmulateInstructionMIPS::Emulate_BC1TL, "BC1TL cc, offset" },
455 { "BC1EQZ", &EmulateInstructionMIPS::Emulate_BC1EQZ, "BC1EQZ ft, offset" },
456 { "BC1NEZ", &EmulateInstructionMIPS::Emulate_BC1NEZ, "BC1NEZ ft, offset" },
457 { "BC1ANY2F", &EmulateInstructionMIPS::Emulate_BC1ANY2F, "BC1ANY2F cc, offset" },
458 { "BC1ANY2T", &EmulateInstructionMIPS::Emulate_BC1ANY2T, "BC1ANY2T cc, offset" },
459 { "BC1ANY4F", &EmulateInstructionMIPS::Emulate_BC1ANY4F, "BC1ANY4F cc, offset" },
460 { "BC1ANY4T", &EmulateInstructionMIPS::Emulate_BC1ANY4T, "BC1ANY4T cc, offset" },
463 static const size_t k_num_mips_opcodes = llvm::array_lengthof(g_opcodes);
465 for (size_t i = 0; i < k_num_mips_opcodes; ++i)
467 if (! strcasecmp (g_opcodes[i].op_name, op_name))
468 return &g_opcodes[i];
475 EmulateInstructionMIPS::ReadInstruction ()
477 bool success = false;
478 m_addr = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_ADDRESS, &success);
481 Context read_inst_context;
482 read_inst_context.type = eContextReadOpcode;
483 read_inst_context.SetNoArgs ();
484 m_opcode.SetOpcode32 (ReadMemoryUnsigned (read_inst_context, m_addr, 4, 0, &success), GetByteOrder());
487 m_addr = LLDB_INVALID_ADDRESS;
492 EmulateInstructionMIPS::EvaluateInstruction (uint32_t evaluate_options)
494 bool success = false;
495 llvm::MCInst mc_insn;
499 /* Keep the complexity of the decode logic with the llvm::MCDisassembler class. */
500 if (m_opcode.GetData (data))
502 llvm::MCDisassembler::DecodeStatus decode_status;
503 llvm::ArrayRef<uint8_t> raw_insn (data.GetDataStart(), data.GetByteSize());
504 decode_status = m_disasm->getInstruction (mc_insn, insn_size, raw_insn, m_addr, llvm::nulls(), llvm::nulls());
505 if (decode_status != llvm::MCDisassembler::Success)
510 * mc_insn.getOpcode() returns decoded opcode. However to make use
511 * of llvm::Mips::<insn> we would need "MipsGenInstrInfo.inc".
513 const char *op_name = m_insn_info->getName (mc_insn.getOpcode ());
519 * Decoding has been done already. Just get the call-back function
520 * and emulate the instruction.
522 MipsOpcode *opcode_data = GetOpcodeForInstruction (op_name);
524 if (opcode_data == NULL)
527 uint64_t old_pc = 0, new_pc = 0;
528 const bool auto_advance_pc = evaluate_options & eEmulateInstructionOptionAutoAdvancePC;
532 old_pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
537 /* emulate instruction */
538 success = (this->*opcode_data->callback) (mc_insn);
544 new_pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
548 /* If we haven't changed the PC, change it here */
549 if (old_pc == new_pc)
553 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, new_pc))
562 EmulateInstructionMIPS::CreateFunctionEntryUnwind (UnwindPlan &unwind_plan)
565 unwind_plan.SetRegisterKind (eRegisterKindDWARF);
567 UnwindPlan::RowSP row(new UnwindPlan::Row);
568 const bool can_replace = false;
570 // Our previous Call Frame Address is the stack pointer
571 row->GetCFAValue().SetIsRegisterPlusOffset(gcc_dwarf_sp_mips, 0);
573 // Our previous PC is in the RA
574 row->SetRegisterLocationToRegister(gcc_dwarf_pc_mips, gcc_dwarf_ra_mips, can_replace);
576 unwind_plan.AppendRow (row);
578 // All other registers are the same.
579 unwind_plan.SetSourceName ("EmulateInstructionMIPS");
580 unwind_plan.SetSourcedFromCompiler (eLazyBoolNo);
581 unwind_plan.SetUnwindPlanValidAtAllInstructions (eLazyBoolYes);
587 EmulateInstructionMIPS::nonvolatile_reg_p (uint32_t regnum)
591 case gcc_dwarf_r16_mips:
592 case gcc_dwarf_r17_mips:
593 case gcc_dwarf_r18_mips:
594 case gcc_dwarf_r19_mips:
595 case gcc_dwarf_r20_mips:
596 case gcc_dwarf_r21_mips:
597 case gcc_dwarf_r22_mips:
598 case gcc_dwarf_r23_mips:
599 case gcc_dwarf_gp_mips:
600 case gcc_dwarf_sp_mips:
601 case gcc_dwarf_r30_mips:
602 case gcc_dwarf_ra_mips:
611 EmulateInstructionMIPS::Emulate_ADDiu (llvm::MCInst& insn)
613 bool success = false;
614 const uint32_t imm16 = insn.getOperand(2).getImm();
615 uint32_t imm = SignedBits(imm16, 15, 0);
619 dst = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
620 src = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
622 /* Check if this is addiu sp,<src>,imm16 */
623 if (dst == gcc_dwarf_sp_mips)
625 /* read <src> register */
626 uint64_t src_opd_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + src, 0, &success);
630 result = src_opd_val + imm;
633 RegisterInfo reg_info_sp;
634 if (GetRegisterInfo (eRegisterKindDWARF, gcc_dwarf_sp_mips, reg_info_sp))
635 context.SetRegisterPlusOffset (reg_info_sp, imm);
637 /* We are allocating bytes on stack */
638 context.type = eContextAdjustStackPointer;
640 WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_sp_mips, result);
647 EmulateInstructionMIPS::Emulate_SW (llvm::MCInst& insn)
649 bool success = false;
650 uint32_t imm16 = insn.getOperand(2).getImm();
651 uint32_t imm = SignedBits(imm16, 15, 0);
654 src = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
655 base = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
657 /* We look for sp based non-volatile register stores */
658 if (base == gcc_dwarf_sp_mips && nonvolatile_reg_p (src))
661 RegisterInfo reg_info_base;
662 RegisterInfo reg_info_src;
664 if (!GetRegisterInfo (eRegisterKindDWARF, gcc_dwarf_zero_mips + base, reg_info_base)
665 || !GetRegisterInfo (eRegisterKindDWARF, gcc_dwarf_zero_mips + src, reg_info_src))
669 address = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + base, 0, &success);
673 /* destination address */
674 address = address + imm;
677 RegisterValue data_src;
678 context.type = eContextPushRegisterOnStack;
679 context.SetRegisterToRegisterPlusOffset (reg_info_src, reg_info_base, 0);
681 uint8_t buffer [RegisterValue::kMaxRegisterByteSize];
684 if (!ReadRegister (®_info_base, data_src))
687 if (data_src.GetAsMemoryData (®_info_src, buffer, reg_info_src.byte_size, eByteOrderLittle, error) == 0)
690 if (!WriteMemory (context, address, buffer, reg_info_src.byte_size))
700 EmulateInstructionMIPS::Emulate_LW (llvm::MCInst& insn)
704 src = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
705 base = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
707 if (base == gcc_dwarf_sp_mips && nonvolatile_reg_p (src))
709 RegisterValue data_src;
710 RegisterInfo reg_info_src;
712 if (!GetRegisterInfo (eRegisterKindDWARF, gcc_dwarf_zero_mips + src, reg_info_src))
716 context.type = eContextRegisterLoad;
718 if (!WriteRegister (context, ®_info_src, data_src))
728 EmulateInstructionMIPS::Emulate_BEQ (llvm::MCInst& insn)
730 bool success = false;
732 int32_t offset, pc, target, rs_val, rt_val;
736 * condition <- (GPR[rs] = GPR[rt])
738 * PC = PC + sign_ext (offset << 2)
740 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
741 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
742 offset = insn.getOperand(2).getImm();
744 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
748 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
752 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
756 if (rs_val == rt_val)
757 target = pc + offset;
762 context.type = eContextRelativeBranchImmediate;
764 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
771 EmulateInstructionMIPS::Emulate_BNE (llvm::MCInst& insn)
773 bool success = false;
775 int32_t offset, pc, target, rs_val, rt_val;
779 * condition <- (GPR[rs] != GPR[rt])
781 * PC = PC + sign_ext (offset << 2)
783 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
784 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
785 offset = insn.getOperand(2).getImm();
787 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
791 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
795 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
799 if (rs_val != rt_val)
800 target = pc + offset;
805 context.type = eContextRelativeBranchImmediate;
807 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
814 EmulateInstructionMIPS::Emulate_BEQL (llvm::MCInst& insn)
816 bool success = false;
818 int32_t offset, pc, target, rs_val, rt_val;
821 * BEQL rs, rt, offset
822 * condition <- (GPR[rs] = GPR[rt])
824 * PC = PC + sign_ext (offset << 2)
826 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
827 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
828 offset = insn.getOperand(2).getImm();
830 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
834 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
838 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
842 if (rs_val == rt_val)
843 target = pc + offset;
845 target = pc + 8; /* skip delay slot */
848 context.type = eContextRelativeBranchImmediate;
850 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
857 EmulateInstructionMIPS::Emulate_BNEL (llvm::MCInst& insn)
859 bool success = false;
861 int32_t offset, pc, target, rs_val, rt_val;
864 * BNEL rs, rt, offset
865 * condition <- (GPR[rs] != GPR[rt])
867 * PC = PC + sign_ext (offset << 2)
869 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
870 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
871 offset = insn.getOperand(2).getImm();
873 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
877 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
881 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
885 if (rs_val != rt_val)
886 target = pc + offset;
888 target = pc + 8; /* skip delay slot */
891 context.type = eContextRelativeBranchImmediate;
893 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
900 EmulateInstructionMIPS::Emulate_BGEZL (llvm::MCInst& insn)
902 bool success = false;
904 int32_t offset, pc, target;
909 * condition <- (GPR[rs] >= 0)
911 * PC = PC + sign_ext (offset << 2)
913 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
914 offset = insn.getOperand(1).getImm();
916 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
920 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
925 target = pc + offset;
927 target = pc + 8; /* skip delay slot */
930 context.type = eContextRelativeBranchImmediate;
932 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
939 EmulateInstructionMIPS::Emulate_BLTZL (llvm::MCInst& insn)
941 bool success = false;
943 int32_t offset, pc, target;
948 * condition <- (GPR[rs] < 0)
950 * PC = PC + sign_ext (offset << 2)
952 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
953 offset = insn.getOperand(1).getImm();
955 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
959 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
964 target = pc + offset;
966 target = pc + 8; /* skip delay slot */
969 context.type = eContextRelativeBranchImmediate;
971 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
978 EmulateInstructionMIPS::Emulate_BGTZL (llvm::MCInst& insn)
980 bool success = false;
982 int32_t offset, pc, target;
987 * condition <- (GPR[rs] > 0)
989 * PC = PC + sign_ext (offset << 2)
991 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
992 offset = insn.getOperand(1).getImm();
994 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
998 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1003 target = pc + offset;
1005 target = pc + 8; /* skip delay slot */
1008 context.type = eContextRelativeBranchImmediate;
1010 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1017 EmulateInstructionMIPS::Emulate_BLEZL (llvm::MCInst& insn)
1019 bool success = false;
1021 int32_t offset, pc, target;
1026 * condition <- (GPR[rs] <= 0)
1028 * PC = PC + sign_ext (offset << 2)
1030 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1031 offset = insn.getOperand(1).getImm();
1033 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1037 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1042 target = pc + offset;
1044 target = pc + 8; /* skip delay slot */
1047 context.type = eContextRelativeBranchImmediate;
1049 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1056 EmulateInstructionMIPS::Emulate_BGTZ (llvm::MCInst& insn)
1058 bool success = false;
1060 int32_t offset, pc, target;
1065 * condition <- (GPR[rs] > 0)
1067 * PC = PC + sign_ext (offset << 2)
1069 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1070 offset = insn.getOperand(1).getImm();
1072 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1076 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1081 target = pc + offset;
1086 context.type = eContextRelativeBranchImmediate;
1088 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1095 EmulateInstructionMIPS::Emulate_BLEZ (llvm::MCInst& insn)
1097 bool success = false;
1099 int32_t offset, pc, target;
1104 * condition <- (GPR[rs] <= 0)
1106 * PC = PC + sign_ext (offset << 2)
1108 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1109 offset = insn.getOperand(1).getImm();
1111 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1115 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1120 target = pc + offset;
1125 context.type = eContextRelativeBranchImmediate;
1127 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1134 EmulateInstructionMIPS::Emulate_BLTZ (llvm::MCInst& insn)
1136 bool success = false;
1138 int32_t offset, pc, target;
1143 * condition <- (GPR[rs] < 0)
1145 * PC = PC + sign_ext (offset << 2)
1147 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1148 offset = insn.getOperand(1).getImm();
1150 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1154 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1159 target = pc + offset;
1164 context.type = eContextRelativeBranchImmediate;
1166 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1173 EmulateInstructionMIPS::Emulate_BGEZALL (llvm::MCInst& insn)
1175 bool success = false;
1177 int32_t offset, pc, target;
1181 * BGEZALL rt, offset
1182 * condition <- (GPR[rs] >= 0)
1184 * PC = PC + sign_ext (offset << 2)
1186 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1187 offset = insn.getOperand(1).getImm();
1189 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1193 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1198 target = pc + offset;
1200 target = pc + 8; /* skip delay slot */
1203 context.type = eContextRelativeBranchImmediate;
1205 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1208 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1215 EmulateInstructionMIPS::Emulate_BAL (llvm::MCInst& insn)
1217 bool success = false;
1218 int32_t offset, pc, target;
1222 * offset = sign_ext (offset << 2)
1226 offset = insn.getOperand(0).getImm();
1228 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1232 target = pc + offset;
1236 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1239 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1246 EmulateInstructionMIPS::Emulate_BALC (llvm::MCInst& insn)
1248 bool success = false;
1249 int32_t offset, pc, target;
1253 * offset = sign_ext (offset << 2)
1255 * PC = PC + 4 + offset
1257 offset = insn.getOperand(0).getImm();
1259 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1263 target = pc + 4 + offset;
1267 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1270 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1277 EmulateInstructionMIPS::Emulate_BGEZAL (llvm::MCInst& insn)
1279 bool success = false;
1281 int32_t offset, pc, target;
1286 * offset = sign_ext (offset << 2)
1287 * condition <- (GPR[rs] >= 0)
1292 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1293 offset = insn.getOperand(1).getImm();
1295 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1299 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1305 if ((int32_t) rs_val >= 0)
1306 target = pc + offset;
1310 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1313 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1320 EmulateInstructionMIPS::Emulate_BLTZAL (llvm::MCInst& insn)
1322 bool success = false;
1324 int32_t offset, pc, target;
1329 * offset = sign_ext (offset << 2)
1330 * condition <- (GPR[rs] < 0)
1335 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1336 offset = insn.getOperand(1).getImm();
1338 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1342 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1348 if ((int32_t) rs_val < 0)
1349 target = pc + offset;
1353 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1356 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1363 EmulateInstructionMIPS::Emulate_BLTZALL (llvm::MCInst& insn)
1365 bool success = false;
1367 int32_t offset, pc, target;
1372 * offset = sign_ext (offset << 2)
1373 * condition <- (GPR[rs] < 0)
1378 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1379 offset = insn.getOperand(1).getImm();
1381 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1385 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1392 target = pc + offset;
1394 target = pc + 8; /* skip delay slot */
1396 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1399 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1407 EmulateInstructionMIPS::Emulate_BLEZALC (llvm::MCInst& insn)
1409 bool success = false;
1411 int32_t offset, pc, target;
1416 * offset = sign_ext (offset << 2)
1417 * condition <- (GPR[rs] <= 0)
1422 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1423 offset = insn.getOperand(1).getImm();
1425 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1429 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1436 target = pc + offset;
1440 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1443 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1450 EmulateInstructionMIPS::Emulate_BGEZALC (llvm::MCInst& insn)
1452 bool success = false;
1454 int32_t offset, pc, target;
1459 * offset = sign_ext (offset << 2)
1460 * condition <- (GPR[rs] >= 0)
1465 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1466 offset = insn.getOperand(1).getImm();
1468 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1472 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1479 target = pc + offset;
1483 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1486 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1493 EmulateInstructionMIPS::Emulate_BLTZALC (llvm::MCInst& insn)
1495 bool success = false;
1497 int32_t offset, pc, target;
1502 * offset = sign_ext (offset << 2)
1503 * condition <- (GPR[rs] < 0)
1508 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1509 offset = insn.getOperand(1).getImm();
1511 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1515 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1522 target = pc + offset;
1526 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1529 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1536 EmulateInstructionMIPS::Emulate_BGTZALC (llvm::MCInst& insn)
1538 bool success = false;
1540 int32_t offset, pc, target;
1545 * offset = sign_ext (offset << 2)
1546 * condition <- (GPR[rs] > 0)
1551 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1552 offset = insn.getOperand(1).getImm();
1554 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1558 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1565 target = pc + offset;
1569 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1572 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1579 EmulateInstructionMIPS::Emulate_BEQZALC (llvm::MCInst& insn)
1581 bool success = false;
1583 int32_t offset, pc, target, rs_val;
1587 * offset = sign_ext (offset << 2)
1588 * condition <- (GPR[rs] == 0)
1593 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1594 offset = insn.getOperand(1).getImm();
1596 pc = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1600 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1607 target = pc + offset;
1611 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1614 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1621 EmulateInstructionMIPS::Emulate_BNEZALC (llvm::MCInst& insn)
1623 bool success = false;
1625 int32_t offset, pc, target, rs_val;
1629 * offset = sign_ext (offset << 2)
1630 * condition <- (GPR[rs] != 0)
1635 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1636 offset = insn.getOperand(1).getImm();
1638 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1642 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1649 target = pc + offset;
1653 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1656 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1663 EmulateInstructionMIPS::Emulate_BGEZ (llvm::MCInst& insn)
1665 bool success = false;
1667 int32_t offset, pc, target, rs_val;
1671 * offset = sign_ext (offset << 2)
1672 * condition <- (GPR[rs] >= 0)
1676 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1677 offset = insn.getOperand(1).getImm();
1679 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1683 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1690 target = pc + offset;
1694 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1701 EmulateInstructionMIPS::Emulate_BC (llvm::MCInst& insn)
1703 bool success = false;
1704 int32_t offset, pc, target;
1708 * offset = sign_ext (offset << 2)
1709 * PC = PC + 4 + offset
1711 offset = insn.getOperand(0).getImm();
1713 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1717 target = pc + 4 + offset;
1721 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1728 EmulateInstructionMIPS::Emulate_BEQC (llvm::MCInst& insn)
1730 bool success = false;
1732 int32_t offset, pc, target, rs_val, rt_val;
1735 * BEQC rs, rt, offset
1736 * condition <- (GPR[rs] = GPR[rt])
1738 * PC = PC + sign_ext (offset << 2)
1740 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1741 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1742 offset = insn.getOperand(2).getImm();
1744 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1748 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1752 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1756 if (rs_val == rt_val)
1757 target = pc + 4 + offset;
1762 context.type = eContextRelativeBranchImmediate;
1764 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1771 EmulateInstructionMIPS::Emulate_BNEC (llvm::MCInst& insn)
1773 bool success = false;
1775 int32_t offset, pc, target, rs_val, rt_val;
1778 * BNEC rs, rt, offset
1779 * condition <- (GPR[rs] != GPR[rt])
1781 * PC = PC + sign_ext (offset << 2)
1783 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1784 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1785 offset = insn.getOperand(2).getImm();
1787 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1791 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1795 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1799 if (rs_val != rt_val)
1800 target = pc + 4 + offset;
1805 context.type = eContextRelativeBranchImmediate;
1807 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1814 EmulateInstructionMIPS::Emulate_BLTC (llvm::MCInst& insn)
1816 bool success = false;
1818 int32_t offset, pc, target;
1819 int32_t rs_val, rt_val;
1822 * BLTC rs, rt, offset
1823 * condition <- (GPR[rs] < GPR[rt])
1825 * PC = PC + sign_ext (offset << 2)
1827 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1828 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1829 offset = insn.getOperand(2).getImm();
1831 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1835 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1839 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1843 if (rs_val < rt_val)
1844 target = pc + 4 + offset;
1849 context.type = eContextRelativeBranchImmediate;
1851 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1858 EmulateInstructionMIPS::Emulate_BGEC (llvm::MCInst& insn)
1860 bool success = false;
1862 int32_t offset, pc, target;
1863 int32_t rs_val, rt_val;
1866 * BGEC rs, rt, offset
1867 * condition <- (GPR[rs] > GPR[rt])
1869 * PC = PC + sign_ext (offset << 2)
1871 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1872 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1873 offset = insn.getOperand(2).getImm();
1875 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1879 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1883 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1887 if (rs_val > rt_val)
1888 target = pc + 4 + offset;
1893 context.type = eContextRelativeBranchImmediate;
1895 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1902 EmulateInstructionMIPS::Emulate_BLTUC (llvm::MCInst& insn)
1904 bool success = false;
1906 int32_t offset, pc, target;
1907 uint32_t rs_val, rt_val;
1910 * BLTUC rs, rt, offset
1911 * condition <- (GPR[rs] < GPR[rt])
1913 * PC = PC + sign_ext (offset << 2)
1915 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1916 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1917 offset = insn.getOperand(2).getImm();
1919 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1923 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1927 rt_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1931 if (rs_val < rt_val)
1932 target = pc + 4 + offset;
1937 context.type = eContextRelativeBranchImmediate;
1939 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1946 EmulateInstructionMIPS::Emulate_BGEUC (llvm::MCInst& insn)
1948 bool success = false;
1950 int32_t offset, pc, target;
1951 uint32_t rs_val, rt_val;
1954 * BGEUC rs, rt, offset
1955 * condition <- (GPR[rs] > GPR[rt])
1957 * PC = PC + sign_ext (offset << 2)
1959 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1960 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1961 offset = insn.getOperand(2).getImm();
1963 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1967 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1971 rt_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1975 if (rs_val > rt_val)
1976 target = pc + 4 + offset;
1981 context.type = eContextRelativeBranchImmediate;
1983 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1990 EmulateInstructionMIPS::Emulate_BLTZC (llvm::MCInst& insn)
1992 bool success = false;
1994 int32_t offset, pc, target;
1999 * condition <- (GPR[rs] < 0)
2001 * PC = PC + sign_ext (offset << 2)
2003 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2004 offset = insn.getOperand(1).getImm();
2006 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2010 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2015 target = pc + 4 + offset;
2020 context.type = eContextRelativeBranchImmediate;
2022 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2029 EmulateInstructionMIPS::Emulate_BLEZC (llvm::MCInst& insn)
2031 bool success = false;
2033 int32_t offset, pc, target;
2038 * condition <- (GPR[rs] <= 0)
2040 * PC = PC + sign_ext (offset << 2)
2042 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2043 offset = insn.getOperand(1).getImm();
2045 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2049 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2054 target = pc + 4 + offset;
2059 context.type = eContextRelativeBranchImmediate;
2061 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2068 EmulateInstructionMIPS::Emulate_BGEZC (llvm::MCInst& insn)
2070 bool success = false;
2072 int32_t offset, pc, target;
2077 * condition <- (GPR[rs] >= 0)
2079 * PC = PC + sign_ext (offset << 2)
2081 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2082 offset = insn.getOperand(1).getImm();
2084 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2088 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2093 target = pc + 4 + offset;
2098 context.type = eContextRelativeBranchImmediate;
2100 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2107 EmulateInstructionMIPS::Emulate_BGTZC (llvm::MCInst& insn)
2109 bool success = false;
2111 int32_t offset, pc, target;
2116 * condition <- (GPR[rs] > 0)
2118 * PC = PC + sign_ext (offset << 2)
2120 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2121 offset = insn.getOperand(1).getImm();
2123 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2127 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2132 target = pc + 4 + offset;
2137 context.type = eContextRelativeBranchImmediate;
2139 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2146 EmulateInstructionMIPS::Emulate_BEQZC (llvm::MCInst& insn)
2148 bool success = false;
2150 int32_t offset, pc, target;
2155 * condition <- (GPR[rs] = 0)
2157 * PC = PC + sign_ext (offset << 2)
2159 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2160 offset = insn.getOperand(1).getImm();
2162 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2166 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2171 target = pc + 4 + offset;
2176 context.type = eContextRelativeBranchImmediate;
2178 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2185 EmulateInstructionMIPS::Emulate_BNEZC (llvm::MCInst& insn)
2187 bool success = false;
2189 int32_t offset, pc, target;
2194 * condition <- (GPR[rs] != 0)
2196 * PC = PC + sign_ext (offset << 2)
2198 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2199 offset = insn.getOperand(1).getImm();
2201 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2205 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2210 target = pc + 4 + offset;
2215 context.type = eContextRelativeBranchImmediate;
2217 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2224 IsAdd64bitOverflow (int32_t a, int32_t b)
2226 int32_t r = (uint32_t) a + (uint32_t) b;
2227 return (a < 0 && b < 0 && r >= 0) || (a >= 0 && b >= 0 && r < 0);
2231 EmulateInstructionMIPS::Emulate_BOVC (llvm::MCInst& insn)
2233 bool success = false;
2235 int32_t offset, pc, target;
2236 int32_t rs_val, rt_val;
2239 * BOVC rs, rt, offset
2240 * condition <- overflow(GPR[rs] + GPR[rt])
2242 * PC = PC + sign_ext (offset << 2)
2244 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2245 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
2246 offset = insn.getOperand(2).getImm();
2248 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2252 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2256 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
2260 if (IsAdd64bitOverflow (rs_val, rt_val))
2261 target = pc + offset;
2266 context.type = eContextRelativeBranchImmediate;
2268 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2275 EmulateInstructionMIPS::Emulate_BNVC (llvm::MCInst& insn)
2277 bool success = false;
2279 int32_t offset, pc, target;
2280 int32_t rs_val, rt_val;
2283 * BNVC rs, rt, offset
2284 * condition <- overflow(GPR[rs] + GPR[rt])
2286 * PC = PC + sign_ext (offset << 2)
2288 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2289 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
2290 offset = insn.getOperand(2).getImm();
2292 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2296 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2300 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
2304 if (! IsAdd64bitOverflow (rs_val, rt_val))
2305 target = pc + offset;
2310 context.type = eContextRelativeBranchImmediate;
2312 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2319 EmulateInstructionMIPS::Emulate_J (llvm::MCInst& insn)
2321 bool success = false;
2322 uint32_t offset, pc;
2326 * offset = sign_ext (offset << 2)
2327 * PC = PC[63-28] | offset
2329 offset = insn.getOperand(0).getImm();
2331 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2335 /* This is a PC-region branch and not PC-relative */
2336 pc = (pc & 0xF0000000UL) | offset;
2340 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, pc))
2347 EmulateInstructionMIPS::Emulate_JAL (llvm::MCInst& insn)
2349 bool success = false;
2350 uint32_t offset, target, pc;
2354 * offset = sign_ext (offset << 2)
2355 * PC = PC[63-28] | offset
2357 offset = insn.getOperand(0).getImm();
2359 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2363 /* This is a PC-region branch and not PC-relative */
2364 target = (pc & 0xF0000000UL) | offset;
2368 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2371 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
2378 EmulateInstructionMIPS::Emulate_JALR (llvm::MCInst& insn)
2380 bool success = false;
2382 uint32_t pc, rs_val;
2389 rt = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2390 rs = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
2392 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2396 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2402 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, rs_val))
2405 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, pc + 8))
2412 EmulateInstructionMIPS::Emulate_JIALC (llvm::MCInst& insn)
2414 bool success = false;
2416 int32_t target, offset, pc, rt_val;
2420 * offset = sign_ext (offset)
2421 * PC = GPR[rt] + offset
2424 rt = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2425 offset = insn.getOperand(1).getImm();
2427 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2431 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
2435 target = rt_val + offset;
2439 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2442 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
2449 EmulateInstructionMIPS::Emulate_JIC (llvm::MCInst& insn)
2451 bool success = false;
2453 int32_t target, offset, rt_val;
2457 * offset = sign_ext (offset)
2458 * PC = GPR[rt] + offset
2460 rt = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2461 offset = insn.getOperand(1).getImm();
2463 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
2467 target = rt_val + offset;
2471 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2478 EmulateInstructionMIPS::Emulate_JR (llvm::MCInst& insn)
2480 bool success = false;
2488 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2490 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2496 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, rs_val))
2503 EmulateInstructionMIPS::Emulate_BC1F (llvm::MCInst& insn)
2505 bool success = false;
2507 int32_t target, pc, offset;
2511 * condition <- (FPConditionCode(cc) == 0)
2513 * offset = sign_ext (offset)
2516 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2517 offset = insn.getOperand(1).getImm();
2519 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2523 fcsr = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2527 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2528 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2530 if ((fcsr & (1 << cc)) == 0)
2531 target = pc + offset;
2537 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2544 EmulateInstructionMIPS::Emulate_BC1T (llvm::MCInst& insn)
2546 bool success = false;
2548 int32_t target, pc, offset;
2552 * condition <- (FPConditionCode(cc) != 0)
2554 * offset = sign_ext (offset)
2557 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2558 offset = insn.getOperand(1).getImm();
2560 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2564 fcsr = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2568 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2569 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2571 if ((fcsr & (1 << cc)) != 0)
2572 target = pc + offset;
2578 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2585 EmulateInstructionMIPS::Emulate_BC1FL (llvm::MCInst& insn)
2587 bool success = false;
2589 int32_t target, pc, offset;
2593 * condition <- (FPConditionCode(cc) == 0)
2595 * offset = sign_ext (offset)
2598 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2599 offset = insn.getOperand(1).getImm();
2601 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2605 fcsr = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2609 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2610 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2612 if ((fcsr & (1 << cc)) == 0)
2613 target = pc + offset;
2615 target = pc + 8; /* skip delay slot */
2619 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2626 EmulateInstructionMIPS::Emulate_BC1TL (llvm::MCInst& insn)
2628 bool success = false;
2630 int32_t target, pc, offset;
2634 * condition <- (FPConditionCode(cc) != 0)
2636 * offset = sign_ext (offset)
2639 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2640 offset = insn.getOperand(1).getImm();
2642 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2646 fcsr = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2650 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2651 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2653 if ((fcsr & (1 << cc)) != 0)
2654 target = pc + offset;
2656 target = pc + 8; /* skip delay slot */
2660 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2667 EmulateInstructionMIPS::Emulate_BC1EQZ (llvm::MCInst& insn)
2669 bool success = false;
2672 int32_t target, pc, offset;
2676 * condition <- (FPR[ft].bit0 == 0)
2678 * offset = sign_ext (offset)
2679 * PC = PC + 4 + offset
2681 ft = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2682 offset = insn.getOperand(1).getImm();
2684 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2688 ft_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + ft, 0, &success);
2692 if ((ft_val & 1) == 0)
2693 target = pc + 4 + offset;
2699 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2706 EmulateInstructionMIPS::Emulate_BC1NEZ (llvm::MCInst& insn)
2708 bool success = false;
2711 int32_t target, pc, offset;
2715 * condition <- (FPR[ft].bit0 != 0)
2717 * offset = sign_ext (offset)
2718 * PC = PC + 4 + offset
2720 ft = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2721 offset = insn.getOperand(1).getImm();
2723 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2727 ft_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + ft, 0, &success);
2731 if ((ft_val & 1) != 0)
2732 target = pc + 4 + offset;
2738 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2745 EmulateInstructionMIPS::Emulate_BC1ANY2F (llvm::MCInst& insn)
2747 bool success = false;
2749 int32_t target, pc, offset;
2752 * BC1ANY2F cc, offset
2753 * condition <- (FPConditionCode(cc) == 0
2754 * || FPConditionCode(cc+1) == 0)
2756 * offset = sign_ext (offset)
2759 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2760 offset = insn.getOperand(1).getImm();
2762 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2766 fcsr = (uint32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2770 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2771 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2773 /* if any one bit is 0 */
2774 if (((fcsr >> cc) & 3) != 3)
2775 target = pc + offset;
2781 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2788 EmulateInstructionMIPS::Emulate_BC1ANY2T (llvm::MCInst& insn)
2790 bool success = false;
2792 int32_t target, pc, offset;
2795 * BC1ANY2T cc, offset
2796 * condition <- (FPConditionCode(cc) == 1
2797 * || FPConditionCode(cc+1) == 1)
2799 * offset = sign_ext (offset)
2802 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2803 offset = insn.getOperand(1).getImm();
2805 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2809 fcsr = (uint32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2813 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2814 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2816 /* if any one bit is 1 */
2817 if (((fcsr >> cc) & 3) != 0)
2818 target = pc + offset;
2824 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2831 EmulateInstructionMIPS::Emulate_BC1ANY4F (llvm::MCInst& insn)
2833 bool success = false;
2835 int32_t target, pc, offset;
2838 * BC1ANY4F cc, offset
2839 * condition <- (FPConditionCode(cc) == 0
2840 * || FPConditionCode(cc+1) == 0)
2841 * || FPConditionCode(cc+2) == 0)
2842 * || FPConditionCode(cc+3) == 0)
2844 * offset = sign_ext (offset)
2847 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2848 offset = insn.getOperand(1).getImm();
2850 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2854 fcsr = (uint32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2858 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2859 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2861 /* if any one bit is 0 */
2862 if (((fcsr >> cc) & 0xf) != 0xf)
2863 target = pc + offset;
2869 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2876 EmulateInstructionMIPS::Emulate_BC1ANY4T (llvm::MCInst& insn)
2878 bool success = false;
2880 int32_t target, pc, offset;
2883 * BC1ANY4T cc, offset
2884 * condition <- (FPConditionCode(cc) == 1
2885 * || FPConditionCode(cc+1) == 1)
2886 * || FPConditionCode(cc+2) == 1)
2887 * || FPConditionCode(cc+3) == 1)
2889 * offset = sign_ext (offset)
2892 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2893 offset = insn.getOperand(1).getImm();
2895 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2899 fcsr = (uint32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2903 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2904 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2906 /* if any one bit is 1 */
2907 if (((fcsr >> cc) & 0xf) != 0)
2908 target = pc + offset;
2914 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))