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_mips.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 std::string features = "";
128 uint32_t arch_flags = arch.GetFlags ();
129 if (arch_flags & ArchSpec::eMIPSAse_msa)
131 if (arch_flags & ArchSpec::eMIPSAse_dsp)
133 if (arch_flags & ArchSpec::eMIPSAse_dspr2)
134 features += "+dspr2,";
135 if (arch_flags & ArchSpec::eMIPSAse_mips16)
136 features += "+mips16,";
137 if (arch_flags & ArchSpec::eMIPSAse_micromips)
138 features += "+micromips,";
140 m_reg_info.reset (target->createMCRegInfo (triple.getTriple()));
141 assert (m_reg_info.get());
143 m_insn_info.reset (target->createMCInstrInfo());
144 assert (m_insn_info.get());
146 m_asm_info.reset (target->createMCAsmInfo (*m_reg_info, triple.getTriple()));
147 m_subtype_info.reset (target->createMCSubtargetInfo (triple.getTriple(), cpu, features));
148 assert (m_asm_info.get() && m_subtype_info.get());
150 m_context.reset (new llvm::MCContext (m_asm_info.get(), m_reg_info.get(), nullptr));
151 assert (m_context.get());
153 m_disasm.reset (target->createMCDisassembler (*m_subtype_info, *m_context));
154 assert (m_disasm.get());
158 EmulateInstructionMIPS::Initialize ()
160 PluginManager::RegisterPlugin (GetPluginNameStatic (),
161 GetPluginDescriptionStatic (),
166 EmulateInstructionMIPS::Terminate ()
168 PluginManager::UnregisterPlugin (CreateInstance);
172 EmulateInstructionMIPS::GetPluginNameStatic ()
174 ConstString g_plugin_name ("lldb.emulate-instruction.mips32");
175 return g_plugin_name;
178 lldb_private::ConstString
179 EmulateInstructionMIPS::GetPluginName()
181 static ConstString g_plugin_name ("EmulateInstructionMIPS");
182 return g_plugin_name;
186 EmulateInstructionMIPS::GetPluginDescriptionStatic ()
188 return "Emulate instructions for the MIPS32 architecture.";
192 EmulateInstructionMIPS::CreateInstance (const ArchSpec &arch, InstructionType inst_type)
194 if (EmulateInstructionMIPS::SupportsEmulatingInstructionsOfTypeStatic(inst_type))
196 if (arch.GetTriple().getArch() == llvm::Triple::mips
197 || arch.GetTriple().getArch() == llvm::Triple::mipsel)
199 std::auto_ptr<EmulateInstructionMIPS> emulate_insn_ap (new EmulateInstructionMIPS (arch));
200 if (emulate_insn_ap.get())
201 return emulate_insn_ap.release();
209 EmulateInstructionMIPS::SetTargetTriple (const ArchSpec &arch)
211 if (arch.GetTriple().getArch () == llvm::Triple::mips
212 || arch.GetTriple().getArch () == llvm::Triple::mipsel)
218 EmulateInstructionMIPS::GetRegisterName (unsigned reg_num, bool alternate_name)
224 case gcc_dwarf_sp_mips: return "r29";
225 case gcc_dwarf_r30_mips: return "r30";
226 case gcc_dwarf_ra_mips: return "r31";
227 case gcc_dwarf_f0_mips: return "f0";
228 case gcc_dwarf_f1_mips: return "f1";
229 case gcc_dwarf_f2_mips: return "f2";
230 case gcc_dwarf_f3_mips: return "f3";
231 case gcc_dwarf_f4_mips: return "f4";
232 case gcc_dwarf_f5_mips: return "f5";
233 case gcc_dwarf_f6_mips: return "f6";
234 case gcc_dwarf_f7_mips: return "f7";
235 case gcc_dwarf_f8_mips: return "f8";
236 case gcc_dwarf_f9_mips: return "f9";
237 case gcc_dwarf_f10_mips: return "f10";
238 case gcc_dwarf_f11_mips: return "f11";
239 case gcc_dwarf_f12_mips: return "f12";
240 case gcc_dwarf_f13_mips: return "f13";
241 case gcc_dwarf_f14_mips: return "f14";
242 case gcc_dwarf_f15_mips: return "f15";
243 case gcc_dwarf_f16_mips: return "f16";
244 case gcc_dwarf_f17_mips: return "f17";
245 case gcc_dwarf_f18_mips: return "f18";
246 case gcc_dwarf_f19_mips: return "f19";
247 case gcc_dwarf_f20_mips: return "f20";
248 case gcc_dwarf_f21_mips: return "f21";
249 case gcc_dwarf_f22_mips: return "f22";
250 case gcc_dwarf_f23_mips: return "f23";
251 case gcc_dwarf_f24_mips: return "f24";
252 case gcc_dwarf_f25_mips: return "f25";
253 case gcc_dwarf_f26_mips: return "f26";
254 case gcc_dwarf_f27_mips: return "f27";
255 case gcc_dwarf_f28_mips: return "f28";
256 case gcc_dwarf_f29_mips: return "f29";
257 case gcc_dwarf_f30_mips: return "f30";
258 case gcc_dwarf_f31_mips: return "f31";
267 case gcc_dwarf_zero_mips: return "r0";
268 case gcc_dwarf_r1_mips: return "r1";
269 case gcc_dwarf_r2_mips: return "r2";
270 case gcc_dwarf_r3_mips: return "r3";
271 case gcc_dwarf_r4_mips: return "r4";
272 case gcc_dwarf_r5_mips: return "r5";
273 case gcc_dwarf_r6_mips: return "r6";
274 case gcc_dwarf_r7_mips: return "r7";
275 case gcc_dwarf_r8_mips: return "r8";
276 case gcc_dwarf_r9_mips: return "r9";
277 case gcc_dwarf_r10_mips: return "r10";
278 case gcc_dwarf_r11_mips: return "r11";
279 case gcc_dwarf_r12_mips: return "r12";
280 case gcc_dwarf_r13_mips: return "r13";
281 case gcc_dwarf_r14_mips: return "r14";
282 case gcc_dwarf_r15_mips: return "r15";
283 case gcc_dwarf_r16_mips: return "r16";
284 case gcc_dwarf_r17_mips: return "r17";
285 case gcc_dwarf_r18_mips: return "r18";
286 case gcc_dwarf_r19_mips: return "r19";
287 case gcc_dwarf_r20_mips: return "r20";
288 case gcc_dwarf_r21_mips: return "r21";
289 case gcc_dwarf_r22_mips: return "r22";
290 case gcc_dwarf_r23_mips: return "r23";
291 case gcc_dwarf_r24_mips: return "r24";
292 case gcc_dwarf_r25_mips: return "r25";
293 case gcc_dwarf_r26_mips: return "r26";
294 case gcc_dwarf_r27_mips: return "r27";
295 case gcc_dwarf_gp_mips: return "gp";
296 case gcc_dwarf_sp_mips: return "sp";
297 case gcc_dwarf_r30_mips: return "fp";
298 case gcc_dwarf_ra_mips: return "ra";
299 case gcc_dwarf_sr_mips: return "sr";
300 case gcc_dwarf_lo_mips: return "lo";
301 case gcc_dwarf_hi_mips: return "hi";
302 case gcc_dwarf_bad_mips: return "bad";
303 case gcc_dwarf_cause_mips: return "cause";
304 case gcc_dwarf_pc_mips: return "pc";
305 case gcc_dwarf_f0_mips: return "f0";
306 case gcc_dwarf_f1_mips: return "f1";
307 case gcc_dwarf_f2_mips: return "f2";
308 case gcc_dwarf_f3_mips: return "f3";
309 case gcc_dwarf_f4_mips: return "f4";
310 case gcc_dwarf_f5_mips: return "f5";
311 case gcc_dwarf_f6_mips: return "f6";
312 case gcc_dwarf_f7_mips: return "f7";
313 case gcc_dwarf_f8_mips: return "f8";
314 case gcc_dwarf_f9_mips: return "f9";
315 case gcc_dwarf_f10_mips: return "f10";
316 case gcc_dwarf_f11_mips: return "f11";
317 case gcc_dwarf_f12_mips: return "f12";
318 case gcc_dwarf_f13_mips: return "f13";
319 case gcc_dwarf_f14_mips: return "f14";
320 case gcc_dwarf_f15_mips: return "f15";
321 case gcc_dwarf_f16_mips: return "f16";
322 case gcc_dwarf_f17_mips: return "f17";
323 case gcc_dwarf_f18_mips: return "f18";
324 case gcc_dwarf_f19_mips: return "f19";
325 case gcc_dwarf_f20_mips: return "f20";
326 case gcc_dwarf_f21_mips: return "f21";
327 case gcc_dwarf_f22_mips: return "f22";
328 case gcc_dwarf_f23_mips: return "f23";
329 case gcc_dwarf_f24_mips: return "f24";
330 case gcc_dwarf_f25_mips: return "f25";
331 case gcc_dwarf_f26_mips: return "f26";
332 case gcc_dwarf_f27_mips: return "f27";
333 case gcc_dwarf_f28_mips: return "f28";
334 case gcc_dwarf_f29_mips: return "f29";
335 case gcc_dwarf_f30_mips: return "f30";
336 case gcc_dwarf_f31_mips: return "f31";
337 case gcc_dwarf_fcsr_mips: return "fcsr";
338 case gcc_dwarf_fir_mips: return "fir";
344 EmulateInstructionMIPS::GetRegisterInfo (RegisterKind reg_kind, uint32_t reg_num, RegisterInfo ®_info)
346 if (reg_kind == eRegisterKindGeneric)
350 case LLDB_REGNUM_GENERIC_PC: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_pc_mips; break;
351 case LLDB_REGNUM_GENERIC_SP: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_sp_mips; break;
352 case LLDB_REGNUM_GENERIC_FP: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_r30_mips; break;
353 case LLDB_REGNUM_GENERIC_RA: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_ra_mips; break;
354 case LLDB_REGNUM_GENERIC_FLAGS: reg_kind = eRegisterKindDWARF; reg_num = gcc_dwarf_sr_mips; break;
360 if (reg_kind == eRegisterKindDWARF)
362 ::memset (®_info, 0, sizeof(RegisterInfo));
363 ::memset (reg_info.kinds, LLDB_INVALID_REGNUM, sizeof(reg_info.kinds));
365 if (reg_num == gcc_dwarf_sr_mips || reg_num == gcc_dwarf_fcsr_mips || reg_num == gcc_dwarf_fir_mips)
367 reg_info.byte_size = 4;
368 reg_info.format = eFormatHex;
369 reg_info.encoding = eEncodingUint;
371 else if ((int)reg_num >= gcc_dwarf_zero_mips && (int)reg_num <= gcc_dwarf_f31_mips)
373 reg_info.byte_size = 4;
374 reg_info.format = eFormatHex;
375 reg_info.encoding = eEncodingUint;
382 reg_info.name = GetRegisterName (reg_num, false);
383 reg_info.alt_name = GetRegisterName (reg_num, true);
384 reg_info.kinds[eRegisterKindDWARF] = reg_num;
388 case gcc_dwarf_r30_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; break;
389 case gcc_dwarf_ra_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; break;
390 case gcc_dwarf_sp_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; break;
391 case gcc_dwarf_pc_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; break;
392 case gcc_dwarf_sr_mips: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS; break;
400 EmulateInstructionMIPS::MipsOpcode*
401 EmulateInstructionMIPS::GetOpcodeForInstruction (const char *op_name)
403 static EmulateInstructionMIPS::MipsOpcode
406 //----------------------------------------------------------------------
407 // Prologue/Epilogue instructions
408 //----------------------------------------------------------------------
409 { "ADDiu", &EmulateInstructionMIPS::Emulate_ADDiu, "ADDIU rt,rs,immediate" },
410 { "SW", &EmulateInstructionMIPS::Emulate_SW, "SW rt,offset(rs)" },
411 { "LW", &EmulateInstructionMIPS::Emulate_LW, "LW rt,offset(base)" },
413 //----------------------------------------------------------------------
414 // Branch instructions
415 //----------------------------------------------------------------------
416 { "BEQ", &EmulateInstructionMIPS::Emulate_BEQ, "BEQ rs,rt,offset" },
417 { "BNE", &EmulateInstructionMIPS::Emulate_BNE, "BNE rs,rt,offset" },
418 { "BEQL", &EmulateInstructionMIPS::Emulate_BEQL, "BEQL rs,rt,offset" },
419 { "BNEL", &EmulateInstructionMIPS::Emulate_BNEL, "BNEL rs,rt,offset" },
420 { "BGEZALL", &EmulateInstructionMIPS::Emulate_BGEZALL, "BGEZALL rt,offset" },
421 { "BAL", &EmulateInstructionMIPS::Emulate_BAL, "BAL offset" },
422 { "BGEZAL", &EmulateInstructionMIPS::Emulate_BGEZAL, "BGEZAL rs,offset" },
423 { "BALC", &EmulateInstructionMIPS::Emulate_BALC, "BALC offset" },
424 { "BC", &EmulateInstructionMIPS::Emulate_BC, "BC offset" },
425 { "BGEZ", &EmulateInstructionMIPS::Emulate_BGEZ, "BGEZ rs,offset" },
426 { "BLEZALC", &EmulateInstructionMIPS::Emulate_BLEZALC, "BLEZALC rs,offset" },
427 { "BGEZALC", &EmulateInstructionMIPS::Emulate_BGEZALC, "BGEZALC rs,offset" },
428 { "BLTZALC", &EmulateInstructionMIPS::Emulate_BLTZALC, "BLTZALC rs,offset" },
429 { "BGTZALC", &EmulateInstructionMIPS::Emulate_BGTZALC, "BGTZALC rs,offset" },
430 { "BEQZALC", &EmulateInstructionMIPS::Emulate_BEQZALC, "BEQZALC rs,offset" },
431 { "BNEZALC", &EmulateInstructionMIPS::Emulate_BNEZALC, "BNEZALC rs,offset" },
432 { "BEQC", &EmulateInstructionMIPS::Emulate_BEQC, "BEQC rs,rt,offset" },
433 { "BNEC", &EmulateInstructionMIPS::Emulate_BNEC, "BNEC rs,rt,offset" },
434 { "BLTC", &EmulateInstructionMIPS::Emulate_BLTC, "BLTC rs,rt,offset" },
435 { "BGEC", &EmulateInstructionMIPS::Emulate_BGEC, "BGEC rs,rt,offset" },
436 { "BLTUC", &EmulateInstructionMIPS::Emulate_BLTUC, "BLTUC rs,rt,offset" },
437 { "BGEUC", &EmulateInstructionMIPS::Emulate_BGEUC, "BGEUC rs,rt,offset" },
438 { "BLTZC", &EmulateInstructionMIPS::Emulate_BLTZC, "BLTZC rt,offset" },
439 { "BLEZC", &EmulateInstructionMIPS::Emulate_BLEZC, "BLEZC rt,offset" },
440 { "BGEZC", &EmulateInstructionMIPS::Emulate_BGEZC, "BGEZC rt,offset" },
441 { "BGTZC", &EmulateInstructionMIPS::Emulate_BGTZC, "BGTZC rt,offset" },
442 { "BEQZC", &EmulateInstructionMIPS::Emulate_BEQZC, "BEQZC rt,offset" },
443 { "BNEZC", &EmulateInstructionMIPS::Emulate_BNEZC, "BNEZC rt,offset" },
444 { "BGEZL", &EmulateInstructionMIPS::Emulate_BGEZL, "BGEZL rt,offset" },
445 { "BGTZ", &EmulateInstructionMIPS::Emulate_BGTZ, "BGTZ rt,offset" },
446 { "BGTZL", &EmulateInstructionMIPS::Emulate_BGTZL, "BGTZL rt,offset" },
447 { "BLEZ", &EmulateInstructionMIPS::Emulate_BLEZ, "BLEZ rt,offset" },
448 { "BLEZL", &EmulateInstructionMIPS::Emulate_BLEZL, "BLEZL rt,offset" },
449 { "BLTZ", &EmulateInstructionMIPS::Emulate_BLTZ, "BLTZ rt,offset" },
450 { "BLTZAL", &EmulateInstructionMIPS::Emulate_BLTZAL, "BLTZAL rt,offset" },
451 { "BLTZALL", &EmulateInstructionMIPS::Emulate_BLTZALL, "BLTZALL rt,offset" },
452 { "BLTZL", &EmulateInstructionMIPS::Emulate_BLTZL, "BLTZL rt,offset" },
453 { "BOVC", &EmulateInstructionMIPS::Emulate_BOVC, "BOVC rs,rt,offset" },
454 { "BNVC", &EmulateInstructionMIPS::Emulate_BNVC, "BNVC rs,rt,offset" },
455 { "J", &EmulateInstructionMIPS::Emulate_J, "J target" },
456 { "JAL", &EmulateInstructionMIPS::Emulate_JAL, "JAL target" },
457 { "JALX", &EmulateInstructionMIPS::Emulate_JAL, "JALX target" },
458 { "JALR", &EmulateInstructionMIPS::Emulate_JALR, "JALR target" },
459 { "JALR_HB", &EmulateInstructionMIPS::Emulate_JALR, "JALR.HB target" },
460 { "JIALC", &EmulateInstructionMIPS::Emulate_JIALC, "JIALC rt,offset" },
461 { "JIC", &EmulateInstructionMIPS::Emulate_JIC, "JIC rt,offset" },
462 { "JR", &EmulateInstructionMIPS::Emulate_JR, "JR target" },
463 { "JR_HB", &EmulateInstructionMIPS::Emulate_JR, "JR.HB target" },
464 { "BC1F", &EmulateInstructionMIPS::Emulate_BC1F, "BC1F cc, offset" },
465 { "BC1T", &EmulateInstructionMIPS::Emulate_BC1T, "BC1T cc, offset" },
466 { "BC1FL", &EmulateInstructionMIPS::Emulate_BC1FL, "BC1FL cc, offset" },
467 { "BC1TL", &EmulateInstructionMIPS::Emulate_BC1TL, "BC1TL cc, offset" },
468 { "BC1EQZ", &EmulateInstructionMIPS::Emulate_BC1EQZ, "BC1EQZ ft, offset" },
469 { "BC1NEZ", &EmulateInstructionMIPS::Emulate_BC1NEZ, "BC1NEZ ft, offset" },
470 { "BC1ANY2F", &EmulateInstructionMIPS::Emulate_BC1ANY2F, "BC1ANY2F cc, offset" },
471 { "BC1ANY2T", &EmulateInstructionMIPS::Emulate_BC1ANY2T, "BC1ANY2T cc, offset" },
472 { "BC1ANY4F", &EmulateInstructionMIPS::Emulate_BC1ANY4F, "BC1ANY4F cc, offset" },
473 { "BC1ANY4T", &EmulateInstructionMIPS::Emulate_BC1ANY4T, "BC1ANY4T cc, offset" },
476 static const size_t k_num_mips_opcodes = llvm::array_lengthof(g_opcodes);
478 for (size_t i = 0; i < k_num_mips_opcodes; ++i)
480 if (! strcasecmp (g_opcodes[i].op_name, op_name))
481 return &g_opcodes[i];
488 EmulateInstructionMIPS::ReadInstruction ()
490 bool success = false;
491 m_addr = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_ADDRESS, &success);
494 Context read_inst_context;
495 read_inst_context.type = eContextReadOpcode;
496 read_inst_context.SetNoArgs ();
497 m_opcode.SetOpcode32 (ReadMemoryUnsigned (read_inst_context, m_addr, 4, 0, &success), GetByteOrder());
500 m_addr = LLDB_INVALID_ADDRESS;
505 EmulateInstructionMIPS::EvaluateInstruction (uint32_t evaluate_options)
507 bool success = false;
508 llvm::MCInst mc_insn;
512 /* Keep the complexity of the decode logic with the llvm::MCDisassembler class. */
513 if (m_opcode.GetData (data))
515 llvm::MCDisassembler::DecodeStatus decode_status;
516 llvm::ArrayRef<uint8_t> raw_insn (data.GetDataStart(), data.GetByteSize());
517 decode_status = m_disasm->getInstruction (mc_insn, insn_size, raw_insn, m_addr, llvm::nulls(), llvm::nulls());
518 if (decode_status != llvm::MCDisassembler::Success)
523 * mc_insn.getOpcode() returns decoded opcode. However to make use
524 * of llvm::Mips::<insn> we would need "MipsGenInstrInfo.inc".
526 const char *op_name = m_insn_info->getName (mc_insn.getOpcode ());
532 * Decoding has been done already. Just get the call-back function
533 * and emulate the instruction.
535 MipsOpcode *opcode_data = GetOpcodeForInstruction (op_name);
537 if (opcode_data == NULL)
540 uint64_t old_pc = 0, new_pc = 0;
541 const bool auto_advance_pc = evaluate_options & eEmulateInstructionOptionAutoAdvancePC;
545 old_pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
550 /* emulate instruction */
551 success = (this->*opcode_data->callback) (mc_insn);
557 new_pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
561 /* If we haven't changed the PC, change it here */
562 if (old_pc == new_pc)
566 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, new_pc))
575 EmulateInstructionMIPS::CreateFunctionEntryUnwind (UnwindPlan &unwind_plan)
578 unwind_plan.SetRegisterKind (eRegisterKindDWARF);
580 UnwindPlan::RowSP row(new UnwindPlan::Row);
581 const bool can_replace = false;
583 // Our previous Call Frame Address is the stack pointer
584 row->GetCFAValue().SetIsRegisterPlusOffset(gcc_dwarf_sp_mips, 0);
586 // Our previous PC is in the RA
587 row->SetRegisterLocationToRegister(gcc_dwarf_pc_mips, gcc_dwarf_ra_mips, can_replace);
589 unwind_plan.AppendRow (row);
591 // All other registers are the same.
592 unwind_plan.SetSourceName ("EmulateInstructionMIPS");
593 unwind_plan.SetSourcedFromCompiler (eLazyBoolNo);
594 unwind_plan.SetUnwindPlanValidAtAllInstructions (eLazyBoolYes);
600 EmulateInstructionMIPS::nonvolatile_reg_p (uint32_t regnum)
604 case gcc_dwarf_r16_mips:
605 case gcc_dwarf_r17_mips:
606 case gcc_dwarf_r18_mips:
607 case gcc_dwarf_r19_mips:
608 case gcc_dwarf_r20_mips:
609 case gcc_dwarf_r21_mips:
610 case gcc_dwarf_r22_mips:
611 case gcc_dwarf_r23_mips:
612 case gcc_dwarf_gp_mips:
613 case gcc_dwarf_sp_mips:
614 case gcc_dwarf_r30_mips:
615 case gcc_dwarf_ra_mips:
624 EmulateInstructionMIPS::Emulate_ADDiu (llvm::MCInst& insn)
626 bool success = false;
627 const uint32_t imm16 = insn.getOperand(2).getImm();
628 uint32_t imm = SignedBits(imm16, 15, 0);
632 dst = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
633 src = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
635 /* Check if this is addiu sp,<src>,imm16 */
636 if (dst == gcc_dwarf_sp_mips)
638 /* read <src> register */
639 uint64_t src_opd_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + src, 0, &success);
643 result = src_opd_val + imm;
646 RegisterInfo reg_info_sp;
647 if (GetRegisterInfo (eRegisterKindDWARF, gcc_dwarf_sp_mips, reg_info_sp))
648 context.SetRegisterPlusOffset (reg_info_sp, imm);
650 /* We are allocating bytes on stack */
651 context.type = eContextAdjustStackPointer;
653 WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_sp_mips, result);
660 EmulateInstructionMIPS::Emulate_SW (llvm::MCInst& insn)
662 bool success = false;
663 uint32_t imm16 = insn.getOperand(2).getImm();
664 uint32_t imm = SignedBits(imm16, 15, 0);
667 src = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
668 base = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
670 /* We look for sp based non-volatile register stores */
671 if (base == gcc_dwarf_sp_mips && nonvolatile_reg_p (src))
674 RegisterInfo reg_info_base;
675 RegisterInfo reg_info_src;
677 if (!GetRegisterInfo (eRegisterKindDWARF, gcc_dwarf_zero_mips + base, reg_info_base)
678 || !GetRegisterInfo (eRegisterKindDWARF, gcc_dwarf_zero_mips + src, reg_info_src))
682 address = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + base, 0, &success);
686 /* destination address */
687 address = address + imm;
690 RegisterValue data_src;
691 context.type = eContextPushRegisterOnStack;
692 context.SetRegisterToRegisterPlusOffset (reg_info_src, reg_info_base, 0);
694 uint8_t buffer [RegisterValue::kMaxRegisterByteSize];
697 if (!ReadRegister (®_info_base, data_src))
700 if (data_src.GetAsMemoryData (®_info_src, buffer, reg_info_src.byte_size, eByteOrderLittle, error) == 0)
703 if (!WriteMemory (context, address, buffer, reg_info_src.byte_size))
713 EmulateInstructionMIPS::Emulate_LW (llvm::MCInst& insn)
717 src = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
718 base = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
720 if (base == gcc_dwarf_sp_mips && nonvolatile_reg_p (src))
722 RegisterValue data_src;
723 RegisterInfo reg_info_src;
725 if (!GetRegisterInfo (eRegisterKindDWARF, gcc_dwarf_zero_mips + src, reg_info_src))
729 context.type = eContextRegisterLoad;
731 if (!WriteRegister (context, ®_info_src, data_src))
741 EmulateInstructionMIPS::Emulate_BEQ (llvm::MCInst& insn)
743 bool success = false;
745 int32_t offset, pc, target, rs_val, rt_val;
749 * condition <- (GPR[rs] = GPR[rt])
751 * PC = PC + sign_ext (offset << 2)
753 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
754 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
755 offset = insn.getOperand(2).getImm();
757 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
761 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
765 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
769 if (rs_val == rt_val)
770 target = pc + offset;
775 context.type = eContextRelativeBranchImmediate;
777 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
784 EmulateInstructionMIPS::Emulate_BNE (llvm::MCInst& insn)
786 bool success = false;
788 int32_t offset, pc, target, rs_val, rt_val;
792 * condition <- (GPR[rs] != GPR[rt])
794 * PC = PC + sign_ext (offset << 2)
796 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
797 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
798 offset = insn.getOperand(2).getImm();
800 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
804 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
808 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
812 if (rs_val != rt_val)
813 target = pc + offset;
818 context.type = eContextRelativeBranchImmediate;
820 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
827 EmulateInstructionMIPS::Emulate_BEQL (llvm::MCInst& insn)
829 bool success = false;
831 int32_t offset, pc, target, rs_val, rt_val;
834 * BEQL rs, rt, offset
835 * condition <- (GPR[rs] = GPR[rt])
837 * PC = PC + sign_ext (offset << 2)
839 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
840 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
841 offset = insn.getOperand(2).getImm();
843 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
847 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
851 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
855 if (rs_val == rt_val)
856 target = pc + offset;
858 target = pc + 8; /* skip delay slot */
861 context.type = eContextRelativeBranchImmediate;
863 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
870 EmulateInstructionMIPS::Emulate_BNEL (llvm::MCInst& insn)
872 bool success = false;
874 int32_t offset, pc, target, rs_val, rt_val;
877 * BNEL rs, rt, offset
878 * condition <- (GPR[rs] != GPR[rt])
880 * PC = PC + sign_ext (offset << 2)
882 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
883 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
884 offset = insn.getOperand(2).getImm();
886 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
890 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
894 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
898 if (rs_val != rt_val)
899 target = pc + offset;
901 target = pc + 8; /* skip delay slot */
904 context.type = eContextRelativeBranchImmediate;
906 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
913 EmulateInstructionMIPS::Emulate_BGEZL (llvm::MCInst& insn)
915 bool success = false;
917 int32_t offset, pc, target;
922 * condition <- (GPR[rs] >= 0)
924 * PC = PC + sign_ext (offset << 2)
926 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
927 offset = insn.getOperand(1).getImm();
929 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
933 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
938 target = pc + offset;
940 target = pc + 8; /* skip delay slot */
943 context.type = eContextRelativeBranchImmediate;
945 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
952 EmulateInstructionMIPS::Emulate_BLTZL (llvm::MCInst& insn)
954 bool success = false;
956 int32_t offset, pc, target;
961 * condition <- (GPR[rs] < 0)
963 * PC = PC + sign_ext (offset << 2)
965 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
966 offset = insn.getOperand(1).getImm();
968 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
972 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
977 target = pc + offset;
979 target = pc + 8; /* skip delay slot */
982 context.type = eContextRelativeBranchImmediate;
984 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
991 EmulateInstructionMIPS::Emulate_BGTZL (llvm::MCInst& insn)
993 bool success = false;
995 int32_t offset, pc, target;
1000 * condition <- (GPR[rs] > 0)
1002 * PC = PC + sign_ext (offset << 2)
1004 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1005 offset = insn.getOperand(1).getImm();
1007 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1011 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1016 target = pc + offset;
1018 target = pc + 8; /* skip delay slot */
1021 context.type = eContextRelativeBranchImmediate;
1023 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1030 EmulateInstructionMIPS::Emulate_BLEZL (llvm::MCInst& insn)
1032 bool success = false;
1034 int32_t offset, pc, target;
1039 * condition <- (GPR[rs] <= 0)
1041 * PC = PC + sign_ext (offset << 2)
1043 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1044 offset = insn.getOperand(1).getImm();
1046 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1050 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1055 target = pc + offset;
1057 target = pc + 8; /* skip delay slot */
1060 context.type = eContextRelativeBranchImmediate;
1062 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1069 EmulateInstructionMIPS::Emulate_BGTZ (llvm::MCInst& insn)
1071 bool success = false;
1073 int32_t offset, pc, target;
1078 * condition <- (GPR[rs] > 0)
1080 * PC = PC + sign_ext (offset << 2)
1082 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1083 offset = insn.getOperand(1).getImm();
1085 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1089 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1094 target = pc + offset;
1099 context.type = eContextRelativeBranchImmediate;
1101 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1108 EmulateInstructionMIPS::Emulate_BLEZ (llvm::MCInst& insn)
1110 bool success = false;
1112 int32_t offset, pc, target;
1117 * condition <- (GPR[rs] <= 0)
1119 * PC = PC + sign_ext (offset << 2)
1121 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1122 offset = insn.getOperand(1).getImm();
1124 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1128 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1133 target = pc + offset;
1138 context.type = eContextRelativeBranchImmediate;
1140 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1147 EmulateInstructionMIPS::Emulate_BLTZ (llvm::MCInst& insn)
1149 bool success = false;
1151 int32_t offset, pc, target;
1156 * condition <- (GPR[rs] < 0)
1158 * PC = PC + sign_ext (offset << 2)
1160 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1161 offset = insn.getOperand(1).getImm();
1163 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1167 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1172 target = pc + offset;
1177 context.type = eContextRelativeBranchImmediate;
1179 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1186 EmulateInstructionMIPS::Emulate_BGEZALL (llvm::MCInst& insn)
1188 bool success = false;
1190 int32_t offset, pc, target;
1194 * BGEZALL rt, offset
1195 * condition <- (GPR[rs] >= 0)
1197 * PC = PC + sign_ext (offset << 2)
1199 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1200 offset = insn.getOperand(1).getImm();
1202 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1206 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1211 target = pc + offset;
1213 target = pc + 8; /* skip delay slot */
1216 context.type = eContextRelativeBranchImmediate;
1218 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1221 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1228 EmulateInstructionMIPS::Emulate_BAL (llvm::MCInst& insn)
1230 bool success = false;
1231 int32_t offset, pc, target;
1235 * offset = sign_ext (offset << 2)
1239 offset = insn.getOperand(0).getImm();
1241 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1245 target = pc + offset;
1249 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1252 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1259 EmulateInstructionMIPS::Emulate_BALC (llvm::MCInst& insn)
1261 bool success = false;
1262 int32_t offset, pc, target;
1266 * offset = sign_ext (offset << 2)
1268 * PC = PC + 4 + offset
1270 offset = insn.getOperand(0).getImm();
1272 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1276 target = pc + 4 + offset;
1280 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1283 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1290 EmulateInstructionMIPS::Emulate_BGEZAL (llvm::MCInst& insn)
1292 bool success = false;
1294 int32_t offset, pc, target;
1299 * offset = sign_ext (offset << 2)
1300 * condition <- (GPR[rs] >= 0)
1305 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1306 offset = insn.getOperand(1).getImm();
1308 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1312 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1318 if ((int32_t) rs_val >= 0)
1319 target = pc + offset;
1323 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1326 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1333 EmulateInstructionMIPS::Emulate_BLTZAL (llvm::MCInst& insn)
1335 bool success = false;
1337 int32_t offset, pc, target;
1342 * offset = sign_ext (offset << 2)
1343 * condition <- (GPR[rs] < 0)
1348 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1349 offset = insn.getOperand(1).getImm();
1351 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1355 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1361 if ((int32_t) rs_val < 0)
1362 target = pc + offset;
1366 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1369 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1376 EmulateInstructionMIPS::Emulate_BLTZALL (llvm::MCInst& insn)
1378 bool success = false;
1380 int32_t offset, pc, target;
1385 * offset = sign_ext (offset << 2)
1386 * condition <- (GPR[rs] < 0)
1391 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1392 offset = insn.getOperand(1).getImm();
1394 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1398 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1405 target = pc + offset;
1407 target = pc + 8; /* skip delay slot */
1409 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1412 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
1420 EmulateInstructionMIPS::Emulate_BLEZALC (llvm::MCInst& insn)
1422 bool success = false;
1424 int32_t offset, pc, target;
1429 * offset = sign_ext (offset << 2)
1430 * condition <- (GPR[rs] <= 0)
1435 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1436 offset = insn.getOperand(1).getImm();
1438 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1442 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1449 target = pc + offset;
1453 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1456 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1463 EmulateInstructionMIPS::Emulate_BGEZALC (llvm::MCInst& insn)
1465 bool success = false;
1467 int32_t offset, pc, target;
1472 * offset = sign_ext (offset << 2)
1473 * condition <- (GPR[rs] >= 0)
1478 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1479 offset = insn.getOperand(1).getImm();
1481 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1485 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1492 target = pc + offset;
1496 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1499 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1506 EmulateInstructionMIPS::Emulate_BLTZALC (llvm::MCInst& insn)
1508 bool success = false;
1510 int32_t offset, pc, target;
1515 * offset = sign_ext (offset << 2)
1516 * condition <- (GPR[rs] < 0)
1521 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1522 offset = insn.getOperand(1).getImm();
1524 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1528 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1535 target = pc + offset;
1539 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1542 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1549 EmulateInstructionMIPS::Emulate_BGTZALC (llvm::MCInst& insn)
1551 bool success = false;
1553 int32_t offset, pc, target;
1558 * offset = sign_ext (offset << 2)
1559 * condition <- (GPR[rs] > 0)
1564 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1565 offset = insn.getOperand(1).getImm();
1567 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1571 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1578 target = pc + offset;
1582 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1585 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1592 EmulateInstructionMIPS::Emulate_BEQZALC (llvm::MCInst& insn)
1594 bool success = false;
1596 int32_t offset, pc, target, rs_val;
1600 * offset = sign_ext (offset << 2)
1601 * condition <- (GPR[rs] == 0)
1606 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1607 offset = insn.getOperand(1).getImm();
1609 pc = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1613 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1620 target = pc + offset;
1624 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1627 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1634 EmulateInstructionMIPS::Emulate_BNEZALC (llvm::MCInst& insn)
1636 bool success = false;
1638 int32_t offset, pc, target, rs_val;
1642 * offset = sign_ext (offset << 2)
1643 * condition <- (GPR[rs] != 0)
1648 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1649 offset = insn.getOperand(1).getImm();
1651 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1655 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1662 target = pc + offset;
1666 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1669 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
1676 EmulateInstructionMIPS::Emulate_BGEZ (llvm::MCInst& insn)
1678 bool success = false;
1680 int32_t offset, pc, target, rs_val;
1684 * offset = sign_ext (offset << 2)
1685 * condition <- (GPR[rs] >= 0)
1689 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1690 offset = insn.getOperand(1).getImm();
1692 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1696 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1703 target = pc + offset;
1707 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1714 EmulateInstructionMIPS::Emulate_BC (llvm::MCInst& insn)
1716 bool success = false;
1717 int32_t offset, pc, target;
1721 * offset = sign_ext (offset << 2)
1722 * PC = PC + 4 + offset
1724 offset = insn.getOperand(0).getImm();
1726 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1730 target = pc + 4 + offset;
1734 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1741 EmulateInstructionMIPS::Emulate_BEQC (llvm::MCInst& insn)
1743 bool success = false;
1745 int32_t offset, pc, target, rs_val, rt_val;
1748 * BEQC rs, rt, offset
1749 * condition <- (GPR[rs] = GPR[rt])
1751 * PC = PC + sign_ext (offset << 2)
1753 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1754 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1755 offset = insn.getOperand(2).getImm();
1757 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1761 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1765 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1769 if (rs_val == rt_val)
1770 target = pc + 4 + offset;
1775 context.type = eContextRelativeBranchImmediate;
1777 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1784 EmulateInstructionMIPS::Emulate_BNEC (llvm::MCInst& insn)
1786 bool success = false;
1788 int32_t offset, pc, target, rs_val, rt_val;
1791 * BNEC rs, rt, offset
1792 * condition <- (GPR[rs] != GPR[rt])
1794 * PC = PC + sign_ext (offset << 2)
1796 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1797 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1798 offset = insn.getOperand(2).getImm();
1800 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1804 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1808 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1812 if (rs_val != rt_val)
1813 target = pc + 4 + offset;
1818 context.type = eContextRelativeBranchImmediate;
1820 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1827 EmulateInstructionMIPS::Emulate_BLTC (llvm::MCInst& insn)
1829 bool success = false;
1831 int32_t offset, pc, target;
1832 int32_t rs_val, rt_val;
1835 * BLTC rs, rt, offset
1836 * condition <- (GPR[rs] < GPR[rt])
1838 * PC = PC + sign_ext (offset << 2)
1840 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1841 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1842 offset = insn.getOperand(2).getImm();
1844 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1848 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1852 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1856 if (rs_val < rt_val)
1857 target = pc + 4 + offset;
1862 context.type = eContextRelativeBranchImmediate;
1864 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1871 EmulateInstructionMIPS::Emulate_BGEC (llvm::MCInst& insn)
1873 bool success = false;
1875 int32_t offset, pc, target;
1876 int32_t rs_val, rt_val;
1879 * BGEC rs, rt, offset
1880 * condition <- (GPR[rs] > GPR[rt])
1882 * PC = PC + sign_ext (offset << 2)
1884 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1885 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1886 offset = insn.getOperand(2).getImm();
1888 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1892 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1896 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1900 if (rs_val > rt_val)
1901 target = pc + 4 + offset;
1906 context.type = eContextRelativeBranchImmediate;
1908 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1915 EmulateInstructionMIPS::Emulate_BLTUC (llvm::MCInst& insn)
1917 bool success = false;
1919 int32_t offset, pc, target;
1920 uint32_t rs_val, rt_val;
1923 * BLTUC rs, rt, offset
1924 * condition <- (GPR[rs] < GPR[rt])
1926 * PC = PC + sign_ext (offset << 2)
1928 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1929 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1930 offset = insn.getOperand(2).getImm();
1932 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1936 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1940 rt_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1944 if (rs_val < rt_val)
1945 target = pc + 4 + offset;
1950 context.type = eContextRelativeBranchImmediate;
1952 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
1959 EmulateInstructionMIPS::Emulate_BGEUC (llvm::MCInst& insn)
1961 bool success = false;
1963 int32_t offset, pc, target;
1964 uint32_t rs_val, rt_val;
1967 * BGEUC rs, rt, offset
1968 * condition <- (GPR[rs] > GPR[rt])
1970 * PC = PC + sign_ext (offset << 2)
1972 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
1973 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
1974 offset = insn.getOperand(2).getImm();
1976 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
1980 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
1984 rt_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
1988 if (rs_val > rt_val)
1989 target = pc + 4 + offset;
1994 context.type = eContextRelativeBranchImmediate;
1996 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2003 EmulateInstructionMIPS::Emulate_BLTZC (llvm::MCInst& insn)
2005 bool success = false;
2007 int32_t offset, pc, target;
2012 * condition <- (GPR[rs] < 0)
2014 * PC = PC + sign_ext (offset << 2)
2016 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2017 offset = insn.getOperand(1).getImm();
2019 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2023 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2028 target = pc + 4 + offset;
2033 context.type = eContextRelativeBranchImmediate;
2035 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2042 EmulateInstructionMIPS::Emulate_BLEZC (llvm::MCInst& insn)
2044 bool success = false;
2046 int32_t offset, pc, target;
2051 * condition <- (GPR[rs] <= 0)
2053 * PC = PC + sign_ext (offset << 2)
2055 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2056 offset = insn.getOperand(1).getImm();
2058 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2062 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2067 target = pc + 4 + offset;
2072 context.type = eContextRelativeBranchImmediate;
2074 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2081 EmulateInstructionMIPS::Emulate_BGEZC (llvm::MCInst& insn)
2083 bool success = false;
2085 int32_t offset, pc, target;
2090 * condition <- (GPR[rs] >= 0)
2092 * PC = PC + sign_ext (offset << 2)
2094 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2095 offset = insn.getOperand(1).getImm();
2097 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2101 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2106 target = pc + 4 + offset;
2111 context.type = eContextRelativeBranchImmediate;
2113 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2120 EmulateInstructionMIPS::Emulate_BGTZC (llvm::MCInst& insn)
2122 bool success = false;
2124 int32_t offset, pc, target;
2129 * condition <- (GPR[rs] > 0)
2131 * PC = PC + sign_ext (offset << 2)
2133 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2134 offset = insn.getOperand(1).getImm();
2136 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2140 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2145 target = pc + 4 + offset;
2150 context.type = eContextRelativeBranchImmediate;
2152 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2159 EmulateInstructionMIPS::Emulate_BEQZC (llvm::MCInst& insn)
2161 bool success = false;
2163 int32_t offset, pc, target;
2168 * condition <- (GPR[rs] = 0)
2170 * PC = PC + sign_ext (offset << 2)
2172 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2173 offset = insn.getOperand(1).getImm();
2175 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2179 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2184 target = pc + 4 + offset;
2189 context.type = eContextRelativeBranchImmediate;
2191 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2198 EmulateInstructionMIPS::Emulate_BNEZC (llvm::MCInst& insn)
2200 bool success = false;
2202 int32_t offset, pc, target;
2207 * condition <- (GPR[rs] != 0)
2209 * PC = PC + sign_ext (offset << 2)
2211 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2212 offset = insn.getOperand(1).getImm();
2214 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2218 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2223 target = pc + 4 + offset;
2228 context.type = eContextRelativeBranchImmediate;
2230 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2237 IsAdd64bitOverflow (int32_t a, int32_t b)
2239 int32_t r = (uint32_t) a + (uint32_t) b;
2240 return (a < 0 && b < 0 && r >= 0) || (a >= 0 && b >= 0 && r < 0);
2244 EmulateInstructionMIPS::Emulate_BOVC (llvm::MCInst& insn)
2246 bool success = false;
2248 int32_t offset, pc, target;
2249 int32_t rs_val, rt_val;
2252 * BOVC rs, rt, offset
2253 * condition <- overflow(GPR[rs] + GPR[rt])
2255 * PC = PC + sign_ext (offset << 2)
2257 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2258 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
2259 offset = insn.getOperand(2).getImm();
2261 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2265 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2269 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
2273 if (IsAdd64bitOverflow (rs_val, rt_val))
2274 target = pc + offset;
2279 context.type = eContextRelativeBranchImmediate;
2281 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2288 EmulateInstructionMIPS::Emulate_BNVC (llvm::MCInst& insn)
2290 bool success = false;
2292 int32_t offset, pc, target;
2293 int32_t rs_val, rt_val;
2296 * BNVC rs, rt, offset
2297 * condition <- overflow(GPR[rs] + GPR[rt])
2299 * PC = PC + sign_ext (offset << 2)
2301 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2302 rt = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
2303 offset = insn.getOperand(2).getImm();
2305 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2309 rs_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2313 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
2317 if (! IsAdd64bitOverflow (rs_val, rt_val))
2318 target = pc + offset;
2323 context.type = eContextRelativeBranchImmediate;
2325 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2332 EmulateInstructionMIPS::Emulate_J (llvm::MCInst& insn)
2334 bool success = false;
2335 uint32_t offset, pc;
2339 * offset = sign_ext (offset << 2)
2340 * PC = PC[63-28] | offset
2342 offset = insn.getOperand(0).getImm();
2344 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2348 /* This is a PC-region branch and not PC-relative */
2349 pc = (pc & 0xF0000000UL) | offset;
2353 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, pc))
2360 EmulateInstructionMIPS::Emulate_JAL (llvm::MCInst& insn)
2362 bool success = false;
2363 uint32_t offset, target, pc;
2367 * offset = sign_ext (offset << 2)
2368 * PC = PC[63-28] | offset
2370 offset = insn.getOperand(0).getImm();
2372 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2376 /* This is a PC-region branch and not PC-relative */
2377 target = (pc & 0xF0000000UL) | offset;
2381 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2384 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 8))
2391 EmulateInstructionMIPS::Emulate_JALR (llvm::MCInst& insn)
2393 bool success = false;
2395 uint32_t pc, rs_val;
2402 rt = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2403 rs = m_reg_info->getEncodingValue (insn.getOperand(1).getReg());
2405 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2409 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2415 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, rs_val))
2418 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, pc + 8))
2425 EmulateInstructionMIPS::Emulate_JIALC (llvm::MCInst& insn)
2427 bool success = false;
2429 int32_t target, offset, pc, rt_val;
2433 * offset = sign_ext (offset)
2434 * PC = GPR[rt] + offset
2437 rt = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2438 offset = insn.getOperand(1).getImm();
2440 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2444 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
2448 target = rt_val + offset;
2452 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2455 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_ra_mips, pc + 4))
2462 EmulateInstructionMIPS::Emulate_JIC (llvm::MCInst& insn)
2464 bool success = false;
2466 int32_t target, offset, rt_val;
2470 * offset = sign_ext (offset)
2471 * PC = GPR[rt] + offset
2473 rt = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2474 offset = insn.getOperand(1).getImm();
2476 rt_val = (int32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rt, 0, &success);
2480 target = rt_val + offset;
2484 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2491 EmulateInstructionMIPS::Emulate_JR (llvm::MCInst& insn)
2493 bool success = false;
2501 rs = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2503 rs_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + rs, 0, &success);
2509 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, rs_val))
2516 EmulateInstructionMIPS::Emulate_BC1F (llvm::MCInst& insn)
2518 bool success = false;
2520 int32_t target, pc, offset;
2524 * condition <- (FPConditionCode(cc) == 0)
2526 * offset = sign_ext (offset)
2529 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2530 offset = insn.getOperand(1).getImm();
2532 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2536 fcsr = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2540 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2541 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2543 if ((fcsr & (1 << cc)) == 0)
2544 target = pc + offset;
2550 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2557 EmulateInstructionMIPS::Emulate_BC1T (llvm::MCInst& insn)
2559 bool success = false;
2561 int32_t target, pc, offset;
2565 * condition <- (FPConditionCode(cc) != 0)
2567 * offset = sign_ext (offset)
2570 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2571 offset = insn.getOperand(1).getImm();
2573 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2577 fcsr = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2581 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2582 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2584 if ((fcsr & (1 << cc)) != 0)
2585 target = pc + offset;
2591 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2598 EmulateInstructionMIPS::Emulate_BC1FL (llvm::MCInst& insn)
2600 bool success = false;
2602 int32_t target, pc, offset;
2606 * condition <- (FPConditionCode(cc) == 0)
2608 * offset = sign_ext (offset)
2611 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2612 offset = insn.getOperand(1).getImm();
2614 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2618 fcsr = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2622 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2623 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2625 if ((fcsr & (1 << cc)) == 0)
2626 target = pc + offset;
2628 target = pc + 8; /* skip delay slot */
2632 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2639 EmulateInstructionMIPS::Emulate_BC1TL (llvm::MCInst& insn)
2641 bool success = false;
2643 int32_t target, pc, offset;
2647 * condition <- (FPConditionCode(cc) != 0)
2649 * offset = sign_ext (offset)
2652 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2653 offset = insn.getOperand(1).getImm();
2655 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2659 fcsr = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2663 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2664 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2666 if ((fcsr & (1 << cc)) != 0)
2667 target = pc + offset;
2669 target = pc + 8; /* skip delay slot */
2673 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2680 EmulateInstructionMIPS::Emulate_BC1EQZ (llvm::MCInst& insn)
2682 bool success = false;
2685 int32_t target, pc, offset;
2689 * condition <- (FPR[ft].bit0 == 0)
2691 * offset = sign_ext (offset)
2692 * PC = PC + 4 + offset
2694 ft = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2695 offset = insn.getOperand(1).getImm();
2697 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2701 ft_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + ft, 0, &success);
2705 if ((ft_val & 1) == 0)
2706 target = pc + 4 + offset;
2712 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2719 EmulateInstructionMIPS::Emulate_BC1NEZ (llvm::MCInst& insn)
2721 bool success = false;
2724 int32_t target, pc, offset;
2728 * condition <- (FPR[ft].bit0 != 0)
2730 * offset = sign_ext (offset)
2731 * PC = PC + 4 + offset
2733 ft = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2734 offset = insn.getOperand(1).getImm();
2736 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2740 ft_val = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_zero_mips + ft, 0, &success);
2744 if ((ft_val & 1) != 0)
2745 target = pc + 4 + offset;
2751 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2758 EmulateInstructionMIPS::Emulate_BC1ANY2F (llvm::MCInst& insn)
2760 bool success = false;
2762 int32_t target, pc, offset;
2765 * BC1ANY2F cc, offset
2766 * condition <- (FPConditionCode(cc) == 0
2767 * || FPConditionCode(cc+1) == 0)
2769 * offset = sign_ext (offset)
2772 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2773 offset = insn.getOperand(1).getImm();
2775 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2779 fcsr = (uint32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2783 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2784 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2786 /* if any one bit is 0 */
2787 if (((fcsr >> cc) & 3) != 3)
2788 target = pc + offset;
2794 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2801 EmulateInstructionMIPS::Emulate_BC1ANY2T (llvm::MCInst& insn)
2803 bool success = false;
2805 int32_t target, pc, offset;
2808 * BC1ANY2T cc, offset
2809 * condition <- (FPConditionCode(cc) == 1
2810 * || FPConditionCode(cc+1) == 1)
2812 * offset = sign_ext (offset)
2815 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2816 offset = insn.getOperand(1).getImm();
2818 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2822 fcsr = (uint32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2826 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2827 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2829 /* if any one bit is 1 */
2830 if (((fcsr >> cc) & 3) != 0)
2831 target = pc + offset;
2837 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2844 EmulateInstructionMIPS::Emulate_BC1ANY4F (llvm::MCInst& insn)
2846 bool success = false;
2848 int32_t target, pc, offset;
2851 * BC1ANY4F cc, offset
2852 * condition <- (FPConditionCode(cc) == 0
2853 * || FPConditionCode(cc+1) == 0)
2854 * || FPConditionCode(cc+2) == 0)
2855 * || FPConditionCode(cc+3) == 0)
2857 * offset = sign_ext (offset)
2860 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2861 offset = insn.getOperand(1).getImm();
2863 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2867 fcsr = (uint32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2871 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2872 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2874 /* if any one bit is 0 */
2875 if (((fcsr >> cc) & 0xf) != 0xf)
2876 target = pc + offset;
2882 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))
2889 EmulateInstructionMIPS::Emulate_BC1ANY4T (llvm::MCInst& insn)
2891 bool success = false;
2893 int32_t target, pc, offset;
2896 * BC1ANY4T cc, offset
2897 * condition <- (FPConditionCode(cc) == 1
2898 * || FPConditionCode(cc+1) == 1)
2899 * || FPConditionCode(cc+2) == 1)
2900 * || FPConditionCode(cc+3) == 1)
2902 * offset = sign_ext (offset)
2905 cc = m_reg_info->getEncodingValue (insn.getOperand(0).getReg());
2906 offset = insn.getOperand(1).getImm();
2908 pc = ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_pc_mips, 0, &success);
2912 fcsr = (uint32_t) ReadRegisterUnsigned (eRegisterKindDWARF, gcc_dwarf_fcsr_mips, 0, &success);
2916 /* fcsr[23], fcsr[25-31] are vaild condition bits */
2917 fcsr = ((fcsr >> 24) & 0xfe) | ((fcsr >> 23) & 0x01);
2919 /* if any one bit is 1 */
2920 if (((fcsr >> cc) & 0xf) != 0)
2921 target = pc + offset;
2927 if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, gcc_dwarf_pc_mips, target))