8#if defined(USE_SIMULATOR)
40const Simulator::fpr_t Simulator::fp_zero;
46 explicit S390Debugger(Simulator* sim) : sim_(sim) {}
50#if V8_TARGET_LITTLE_ENDIAN
51 static const Instr kBreakpointInstr = (0x0000FFB2);
52 static const Instr kNopInstr = (0x00160016);
54 static const Instr kBreakpointInstr = (0xB2FF0000);
55 static const Instr kNopInstr = (0x16001600);
60 intptr_t GetRegisterValue(
int regnum);
61 double GetRegisterPairDoubleValue(
int regnum);
62 double GetFPDoubleRegisterValue(
int regnum);
63 float GetFPFloatRegisterValue(
int regnum);
64 bool GetValue(
const char* desc, intptr_t* value);
65 bool GetFPDoubleValue(
const char* desc,
double* value);
68 bool SetBreakpoint(Instruction* breakpc);
69 void DeleteBreakpoint();
73 void UndoBreakpoint();
74 void RedoBreakpoint();
77void Simulator::DebugAtNextPC() {
78 PrintF(
"Starting debugger on the next instruction:\n");
80 S390Debugger(
this).Debug();
83intptr_t S390Debugger::GetRegisterValue(
int regnum) {
84 return sim_->get_register(regnum);
87double S390Debugger::GetRegisterPairDoubleValue(
int regnum) {
88 return sim_->get_double_from_register_pair(regnum);
91double S390Debugger::GetFPDoubleRegisterValue(
int regnum) {
92 return sim_->get_fpr<
double>(regnum);
95float S390Debugger::GetFPFloatRegisterValue(
int regnum) {
96 return sim_->get_fpr<
float>(regnum);
99bool S390Debugger::GetValue(
const char* desc, intptr_t* value) {
102 *value = GetRegisterValue(regnum);
105 if (strncmp(desc,
"0x", 2) == 0) {
107 reinterpret_cast<uintptr_t*
>(value)) == 1;
109 return SScanF(desc,
"%" V8PRIuPTR,
reinterpret_cast<uintptr_t*
>(value)) ==
115bool S390Debugger::GetFPDoubleValue(
const char* desc,
double* value) {
118 *value = sim_->get_fpr<
double>(regnum);
124bool S390Debugger::SetBreakpoint(Instruction* break_pc) {
126 if (sim_->break_pc_ !=
nullptr) {
131 sim_->break_pc_ = break_pc;
132 sim_->break_instr_ = break_pc->InstructionBits();
141void SetInstructionBitsInCodeSpace(Instruction*
instr,
Instr value,
143 CodePageMemoryModificationScopeForDebugging scope(
149void S390Debugger::DeleteBreakpoint() {
151 sim_->break_pc_ =
nullptr;
152 sim_->break_instr_ = 0;
155void S390Debugger::UndoBreakpoint() {
156 if (sim_->break_pc_ !=
nullptr) {
157 SetInstructionBitsInCodeSpace(sim_->break_pc_, sim_->break_instr_,
158 sim_->isolate_->heap());
162void S390Debugger::RedoBreakpoint() {
163 if (sim_->break_pc_ !=
nullptr) {
164 SetInstructionBitsInCodeSpace(sim_->break_pc_, kBreakpointInstr,
165 sim_->isolate_->heap());
169void S390Debugger::Debug() {
170 if (
v8_flags.correctness_fuzzer_suppressions) {
171 PrintF(
"Debugger disabled for differential fuzzing.\n");
174 intptr_t last_pc = -1;
177#define COMMAND_SIZE 63
181#define XSTR(a) STR(a)
183 char cmd[COMMAND_SIZE + 1];
184 char arg1[ARG_SIZE + 1];
185 char arg2[ARG_SIZE + 1];
186 char* argv[3] = {cmd, arg1, arg2};
189 cmd[COMMAND_SIZE] = 0;
200 while (!done && !sim_->has_bad_pc()) {
201 if (last_pc != sim_->get_pc()) {
206 dasm.InstructionDecode(buffer,
207 reinterpret_cast<uint8_t*
>(sim_->get_pc()));
209 last_pc = sim_->get_pc();
212 if (line ==
nullptr) {
215 char* last_input = sim_->last_debugger_input();
216 if (strcmp(line,
"\n") == 0 && last_input !=
nullptr) {
220 sim_->set_last_debugger_input(line);
224 int argc = SScanF(line,
225 "%" XSTR(COMMAND_SIZE)
"s "
226 "%" XSTR(ARG_SIZE)
"s "
227 "%" XSTR(ARG_SIZE)
"s",
229 if ((strcmp(cmd,
"si") == 0) || (strcmp(cmd,
"stepi") == 0)) {
233 if ((
reinterpret_cast<Instruction*
>(sim_->get_pc()))
234 ->InstructionBits() == 0x7D821008) {
237 sim_->ExecuteInstruction(
238 reinterpret_cast<Instruction*
>(sim_->get_pc()));
241 if (argc == 2 && last_pc != sim_->get_pc()) {
247 if (GetValue(arg1, &value)) {
250 for (
int i = 1; (!sim_->has_bad_pc()) &&
i < value;
i++) {
251 dasm.InstructionDecode(
252 buffer,
reinterpret_cast<uint8_t*
>(sim_->get_pc()));
255 sim_->ExecuteInstruction(
256 reinterpret_cast<Instruction*
>(sim_->get_pc()));
261 while (!sim_->has_bad_pc()) {
262 dasm.InstructionDecode(
263 buffer,
reinterpret_cast<uint8_t*
>(sim_->get_pc()));
264 char* mnemonicStart = buffer.
begin();
265 while (*mnemonicStart != 0 && *mnemonicStart !=
' ')
267 SScanF(mnemonicStart,
"%s", mnemonic);
268 if (!strcmp(arg1, mnemonic))
break;
272 sim_->ExecuteInstruction(
273 reinterpret_cast<Instruction*
>(sim_->get_pc()));
277 }
else if ((strcmp(cmd,
"c") == 0) || (strcmp(cmd,
"cont") == 0)) {
279 if ((
reinterpret_cast<Instruction*
>(sim_->get_pc()))
280 ->InstructionBits() == 0x7D821008) {
284 sim_->ExecuteInstruction(
285 reinterpret_cast<Instruction*
>(sim_->get_pc()));
289 }
else if ((strcmp(cmd,
"p") == 0) || (strcmp(cmd,
"print") == 0)) {
290 if (argc == 2 || (argc == 3 && strcmp(arg2,
"fp") == 0)) {
293 if (strcmp(arg1,
"all") == 0) {
295 value = GetRegisterValue(
i);
298 if ((argc == 3 && strcmp(arg2,
"fp") == 0) &&
i < 8 &&
300 dvalue = GetRegisterPairDoubleValue(
i);
301 PrintF(
" (%f)\n", dvalue);
302 }
else if (
i != 0 && !((
i + 1) & 3)) {
307 sim_->condition_reg_);
308 }
else if (strcmp(arg1,
"alld") == 0) {
310 value = GetRegisterValue(
i);
313 if ((argc == 3 && strcmp(arg2,
"fp") == 0) &&
i < 8 &&
315 dvalue = GetRegisterPairDoubleValue(
i);
316 PrintF(
" (%f)\n", dvalue);
317 }
else if (!((
i + 1) % 2)) {
322 sim_->condition_reg_);
323 }
else if (strcmp(arg1,
"allf") == 0) {
325 float fvalue = GetFPFloatRegisterValue(
i);
327 PrintF(
"%3s: %f 0x%08x\n",
331 }
else if (strcmp(arg1,
"alld") == 0) {
333 dvalue = GetFPDoubleRegisterValue(
i);
335 PrintF(
"%3s: %f 0x%08x %08x\n",
337 static_cast<uint32_t
>(as_words >> 32),
338 static_cast<uint32_t
>(as_words & 0xFFFFFFFF));
340 }
else if (arg1[0] ==
'r' &&
341 (arg1[1] >=
'0' && arg1[1] <=
'2' &&
342 (arg1[2] ==
'\0' || (arg1[2] >=
'0' && arg1[2] <=
'5' &&
343 arg1[3] ==
'\0')))) {
344 int regnum = strtoul(&arg1[1], 0, 10);
346 value = GetRegisterValue(regnum);
350 PrintF(
"%s unrecognized\n", arg1);
353 if (GetValue(arg1, &value)) {
356 }
else if (GetFPDoubleValue(arg1, &dvalue)) {
358 PrintF(
"%s: %f 0x%08x %08x\n", arg1, dvalue,
359 static_cast<uint32_t
>(as_words >> 32),
360 static_cast<uint32_t
>(as_words & 0xFFFFFFFF));
362 PrintF(
"%s unrecognized\n", arg1);
366 PrintF(
"print <register>\n");
368 }
else if ((strcmp(cmd,
"po") == 0) ||
369 (strcmp(cmd,
"printobject") == 0)) {
373 if (GetValue(arg1, &value)) {
375 os << arg1 <<
": \n";
380 os << Brief(obj) <<
"\n";
383 os << arg1 <<
" unrecognized\n";
386 PrintF(
"printobject <value>\n");
388 }
else if (strcmp(cmd,
"setpc") == 0) {
391 if (!GetValue(arg1, &value)) {
392 PrintF(
"%s unrecognized\n", arg1);
396 }
else if (strcmp(cmd,
"stack") == 0 || strcmp(cmd,
"mem") == 0 ||
397 strcmp(cmd,
"dump") == 0) {
398 intptr_t* cur =
nullptr;
399 intptr_t*
end =
nullptr;
402 if (strcmp(cmd,
"stack") == 0) {
403 cur =
reinterpret_cast<intptr_t*
>(sim_->get_register(Simulator::sp));
406 if (!GetValue(arg1, &value)) {
407 PrintF(
"%s unrecognized\n", arg1);
410 cur =
reinterpret_cast<intptr_t*
>(
value);
415 if (argc == next_arg) {
418 if (!GetValue(argv[next_arg], &words)) {
424 bool skip_obj_print = (strcmp(cmd,
"dump") == 0);
427 reinterpret_cast<intptr_t
>(cur), *cur, *cur);
429 Heap* current_heap = sim_->isolate_->heap();
430 if (!skip_obj_print) {
442 }
else if (strcmp(cmd,
"disasm") == 0 || strcmp(cmd,
"di") == 0) {
448 uint8_t* prev =
nullptr;
449 uint8_t* cur =
nullptr;
454 cur =
reinterpret_cast<uint8_t*
>(sim_->get_pc());
455 }
else if (argc == 2) {
457 if (regnum !=
kNoRegister || strncmp(arg1,
"0x", 2) == 0) {
460 if (GetValue(arg1, &value)) {
461 cur =
reinterpret_cast<uint8_t*
>(
value);
466 if (GetValue(arg1, &value)) {
467 cur =
reinterpret_cast<uint8_t*
>(sim_->get_pc());
475 if (GetValue(arg1, &value1) && GetValue(arg2, &value2)) {
476 cur =
reinterpret_cast<uint8_t*
>(value1);
478 numInstructions =
static_cast<int32_t>(value2);
482 while (numInstructions > 0) {
484 cur += dasm.InstructionDecode(buffer, cur);
489 }
else if (strcmp(cmd,
"gdb") == 0) {
490 PrintF(
"relinquishing control to gdb\n");
492 PrintF(
"regaining control from gdb\n");
493 }
else if (strcmp(cmd,
"break") == 0) {
496 if (GetValue(arg1, &value)) {
497 if (!SetBreakpoint(
reinterpret_cast<Instruction*
>(value))) {
498 PrintF(
"setting breakpoint failed\n");
501 PrintF(
"%s unrecognized\n", arg1);
504 PrintF(
"break <address>\n");
506 }
else if (strcmp(cmd,
"del") == 0) {
508 }
else if (strcmp(cmd,
"cr") == 0) {
509 PrintF(
"Condition reg: %08x\n", sim_->condition_reg_);
510 }
else if (strcmp(cmd,
"stop") == 0) {
514 Instruction* stop_instr =
reinterpret_cast<Instruction*
>(stop_pc);
515 Instruction* msg_address =
516 reinterpret_cast<Instruction*
>(stop_pc +
sizeof(
FourByteInstr));
517 if ((argc == 2) && (strcmp(arg1,
"unstop") == 0)) {
519 if (sim_->isStopInstruction(stop_instr)) {
520 SetInstructionBitsInCodeSpace(stop_instr, kNopInstr,
521 sim_->isolate_->heap());
522 msg_address->SetInstructionBits(kNopInstr);
524 PrintF(
"Not at debugger stop.\n");
526 }
else if (argc == 3) {
528 if (strcmp(arg1,
"info") == 0) {
529 if (strcmp(arg2,
"all") == 0) {
530 PrintF(
"Stop information:\n");
531 for (uint32_t
i = 0;
i < sim_->kNumOfWatchedStops;
i++) {
532 sim_->PrintStopInfo(
i);
534 }
else if (GetValue(arg2, &value)) {
535 sim_->PrintStopInfo(value);
537 PrintF(
"Unrecognized argument.\n");
539 }
else if (strcmp(arg1,
"enable") == 0) {
541 if (strcmp(arg2,
"all") == 0) {
542 for (uint32_t
i = 0;
i < sim_->kNumOfWatchedStops;
i++) {
545 }
else if (GetValue(arg2, &value)) {
546 sim_->EnableStop(value);
548 PrintF(
"Unrecognized argument.\n");
550 }
else if (strcmp(arg1,
"disable") == 0) {
552 if (strcmp(arg2,
"all") == 0) {
553 for (uint32_t
i = 0;
i < sim_->kNumOfWatchedStops;
i++) {
554 sim_->DisableStop(
i);
556 }
else if (GetValue(arg2, &value)) {
557 sim_->DisableStop(value);
559 PrintF(
"Unrecognized argument.\n");
563 PrintF(
"Wrong usage. Use help command for more information.\n");
565 }
else if (strcmp(cmd,
"icount") == 0) {
566 PrintF(
"%05" PRId64
"\n", sim_->icount_);
567 }
else if ((strcmp(cmd,
"t") == 0) || strcmp(cmd,
"trace") == 0) {
568 sim_->ToggleInstructionTracing();
569 PrintF(
"Trace of executed instructions is %s\n",
570 sim_->InstructionTracingEnabled() ?
"on" :
"off");
571 }
else if ((strcmp(cmd,
"h") == 0) || (strcmp(cmd,
"help") == 0)) {
573 PrintF(
" continue execution (alias 'c')\n");
574 PrintF(
"stepi [num instructions]\n");
575 PrintF(
" step one/num instruction(s) (alias 'si')\n");
576 PrintF(
"print <register>\n");
577 PrintF(
" print register content (alias 'p')\n");
578 PrintF(
" use register name 'all' to display all integer registers\n");
580 " use register name 'alld' to display integer registers "
581 "with decimal values\n");
582 PrintF(
" use register name 'rN' to display register number 'N'\n");
583 PrintF(
" add argument 'fp' to print register pair double values\n");
585 " use register name 'allf' to display floating-point "
587 PrintF(
"printobject <register>\n");
588 PrintF(
" print an object from a register (alias 'po')\n");
590 PrintF(
" print condition register\n");
591 PrintF(
"stack [<num words>]\n");
592 PrintF(
" dump stack content, default dump 10 words)\n");
593 PrintF(
"mem <address> [<num words>]\n");
594 PrintF(
" dump memory content, default dump 10 words)\n");
595 PrintF(
"dump [<words>]\n");
597 " dump memory content without pretty printing JS objects, default "
599 PrintF(
"disasm [<instructions>]\n");
600 PrintF(
"disasm [<address/register>]\n");
601 PrintF(
"disasm [[<address/register>] <instructions>]\n");
602 PrintF(
" disassemble code, default is 10 instructions\n");
603 PrintF(
" from pc (alias 'di')\n");
606 PrintF(
"break <address>\n");
607 PrintF(
" set a break point on the address\n");
609 PrintF(
" delete the breakpoint\n");
610 PrintF(
"trace (alias 't')\n");
611 PrintF(
" toogle the tracing of all executed statements\n");
612 PrintF(
"stop feature:\n");
613 PrintF(
" Description:\n");
614 PrintF(
" Stops are debug instructions inserted by\n");
615 PrintF(
" the Assembler::stop() function.\n");
616 PrintF(
" When hitting a stop, the Simulator will\n");
617 PrintF(
" stop and give control to the S390Debugger.\n");
618 PrintF(
" The first %d stop codes are watched:\n",
619 Simulator::kNumOfWatchedStops);
620 PrintF(
" - They can be enabled / disabled: the Simulator\n");
621 PrintF(
" will / won't stop when hitting them.\n");
622 PrintF(
" - The Simulator keeps track of how many times they \n");
623 PrintF(
" are met. (See the info command.) Going over a\n");
624 PrintF(
" disabled stop still increases its counter. \n");
626 PrintF(
" stop info all/<code> : print infos about number <code>\n");
627 PrintF(
" or all stop(s).\n");
628 PrintF(
" stop enable/disable all/<code> : enables / disables\n");
629 PrintF(
" all or number <code> stop(s)\n");
631 PrintF(
" ignore the stop instruction at the current location\n");
634 PrintF(
"Unknown command: %s\n", cmd);
652bool Simulator::InstructionTracingEnabled() {
return instruction_tracing_; }
654void Simulator::ToggleInstructionTracing() {
655 instruction_tracing_ = !instruction_tracing_;
658bool Simulator::ICacheMatch(
void*
one,
void* two) {
659 DCHECK_EQ(
reinterpret_cast<intptr_t
>(
one) & CachePage::kPageMask, 0);
660 DCHECK_EQ(
reinterpret_cast<intptr_t
>(two) & CachePage::kPageMask, 0);
664static uint32_t ICacheHash(
void*
key) {
665 return static_cast<uint32_t
>(
reinterpret_cast<uintptr_t
>(
key)) >> 2;
668static bool AllOnOnePage(uintptr_t
start,
int size) {
669 intptr_t start_page = (
start & ~CachePage::kPageMask);
670 intptr_t end_page = ((
start +
size) & ~CachePage::kPageMask);
671 return start_page == end_page;
674void Simulator::set_last_debugger_input(
char* input) {
676 last_debugger_input_ = input;
679void Simulator::SetRedirectInstruction(Instruction* instruction) {
681#if V8_TARGET_LITTLE_ENDIAN
682 instruction->SetInstructionBits(0x1000FFB2);
689 void* start_addr,
size_t size) {
690 intptr_t
start =
reinterpret_cast<intptr_t
>(start_addr);
691 int intra_line = (
start & CachePage::kLineMask);
694 size = ((size - 1) | CachePage::kLineMask) + 1;
696 while (!AllOnOnePage(
start, size - 1)) {
697 int bytes_to_flush = CachePage::kPageSize -
offset;
698 FlushOnePage(i_cache,
start, bytes_to_flush);
699 start += bytes_to_flush;
700 size -= bytes_to_flush;
705 FlushOnePage(i_cache,
start, size);
712 if (entry->value ==
nullptr) {
713 CachePage* new_page =
new CachePage();
714 entry->value = new_page;
716 return reinterpret_cast<CachePage*
>(entry->value);
721 intptr_t
start,
int size) {
725 DCHECK_EQ(size & CachePage::kLineMask, 0);
726 void* page =
reinterpret_cast<void*
>(
start & (~CachePage::kPageMask));
728 CachePage* cache_page = GetCachePage(i_cache, page);
729 char* valid_bytemap = cache_page->ValidityByte(
offset);
730 memset(valid_bytemap, CachePage::LINE_INVALID, size >> CachePage::kLineShift);
734 Instruction*
instr) {
735 intptr_t address =
reinterpret_cast<intptr_t
>(
instr);
736 void* page =
reinterpret_cast<void*
>(address & (~CachePage::kPageMask));
737 void* line =
reinterpret_cast<void*
>(address & (~CachePage::kLineMask));
738 int offset = (address & CachePage::kPageMask);
739 CachePage* cache_page = GetCachePage(i_cache, page);
740 char* cache_valid_byte = cache_page->ValidityByte(
offset);
741 bool cache_hit = (*cache_valid_byte == CachePage::LINE_VALID);
742 char* cached_line = cache_page->CachedData(
offset & ~CachePage::kLineMask);
750 memcpy(cached_line, line, CachePage::kLineLength);
751 *cache_valid_byte = CachePage::LINE_VALID;
755Simulator::EvaluateFuncType Simulator::EvalTable[] = {
nullptr};
757void Simulator::EvalTableInit() {
758 for (
int i = 0;
i < MAX_NUM_OPCODES;
i++) {
759 EvalTable[
i] = &Simulator::Evaluate_Unknown;
762#define S390_SUPPORTED_VECTOR_OPCODE_LIST(V) \
763 V(vst, VST, 0xE70E) \
765 V(vlp, VLP, 0xE7DF) \
766 V(vlgv, VLGV, 0xE721) \
767 V(vlvg, VLVG, 0xE722) \
768 V(vlvgp, VLVGP, 0xE762) \
769 V(vrep, VREP, 0xE74D) \
770 V(vlrep, VLREP, 0xE705) \
771 V(vrepi, VREPI, 0xE745) \
772 V(vlr, VLR, 0xE756) \
773 V(vsteb, VSTEB, 0xE708) \
774 V(vsteh, VSTEH, 0xE709) \
775 V(vstef, VSTEF, 0xE70B) \
776 V(vsteg, VSTEG, 0xE70A) \
777 V(vleb, VLEB, 0xE701) \
778 V(vleh, VLEH, 0xE701) \
779 V(vlef, VLEF, 0xE703) \
780 V(vleg, VLEG, 0xE702) \
781 V(vavgl, VAVGL, 0xE7F0) \
784 V(vml, VML, 0xE7A2) \
785 V(vme, VME, 0xE7A6) \
786 V(vmle, VMLE, 0xE7A4) \
787 V(vmo, VMO, 0xE7A7) \
788 V(vmlo, VMLO, 0xE7A75) \
789 V(vnc, VNC, 0xE769) \
790 V(vsum, VSUM, 0xE764) \
791 V(vsumg, VSUMG, 0xE765) \
792 V(vpk, VPK, 0xE794) \
793 V(vmrl, VMRL, 0xE760) \
794 V(vmrh, VMRH, 0xE761) \
795 V(vpks, VPKS, 0xE797) \
796 V(vpkls, VPKLS, 0xE795) \
797 V(vupll, VUPLL, 0xE7D4) \
798 V(vuplh, VUPLH, 0xE7D5) \
799 V(vupl, VUPL, 0xE7D6) \
800 V(vuph, VUPH, 0xE7D7) \
801 V(vpopct, VPOPCT, 0xE750) \
802 V(vcdg, VCDG, 0xE7C3) \
803 V(vcdlg, VCDLG, 0xE7C1) \
804 V(vcgd, VCGD, 0xE7C2) \
805 V(vclgd, VCLGD, 0xE7C0) \
806 V(vmnl, VMNL, 0xE7FC) \
807 V(vmxl, VMXL, 0xE7FD) \
808 V(vmn, VMN, 0xE7FE) \
809 V(vmx, VMX, 0xE7FF) \
810 V(vceq, VCEQ, 0xE7F8) \
812 V(vchl, VCHL, 0xE7F9) \
813 V(vch, VCH, 0xE7FB) \
816 V(vno, VNO, 0xE768B) \
817 V(vlc, VLC, 0xE7DE) \
818 V(vsel, VSEL, 0xE78D) \
819 V(vperm, VPERM, 0xE78C) \
820 V(vbperm, VBPERM, 0xE785) \
821 V(vtm, VTM, 0xE7D8) \
822 V(vesl, VESL, 0xE730) \
823 V(veslv, VESLV, 0xE770) \
832 V(vfsq, VFSQ, 0xE7CE) \
833 V(vfmax, VFMAX, 0xE7EF) \
834 V(vfmin, VFMIN, 0xE7EE) \
835 V(vfce, VFCE, 0xE7E8) \
836 V(vfpso, VFPSO, 0xE7CC) \
837 V(vfche, VFCHE, 0xE7EA) \
838 V(vfch, VFCH, 0xE7EB) \
839 V(vfi, VFI, 0xE7C7) \
840 V(vfs, VFS, 0xE7E2) \
841 V(vfa, VFA, 0xE7E3) \
842 V(vfd, VFD, 0xE7E5) \
843 V(vfm, VFM, 0xE7E7) \
844 V(vfma, VFMA, 0xE78F) \
848#define CREATE_EVALUATE_TABLE(name, op_name, op_value) \
849 EvalTable[op_name] = &Simulator::Evaluate_##op_name;
850 S390_SUPPORTED_VECTOR_OPCODE_LIST(CREATE_EVALUATE_TABLE);
851#undef CREATE_EVALUATE_TABLE
853 EvalTable[
DUMY] = &Simulator::Evaluate_DUMY;
854 EvalTable[
BKPT] = &Simulator::Evaluate_BKPT;
855 EvalTable[SPM] = &Simulator::Evaluate_SPM;
856 EvalTable[BALR] = &Simulator::Evaluate_BALR;
857 EvalTable[BCTR] = &Simulator::Evaluate_BCTR;
858 EvalTable[BCR] = &Simulator::Evaluate_BCR;
859 EvalTable[
SVC] = &Simulator::Evaluate_SVC;
860 EvalTable[BSM] = &Simulator::Evaluate_BSM;
861 EvalTable[BASSM] = &Simulator::Evaluate_BASSM;
862 EvalTable[BASR] = &Simulator::Evaluate_BASR;
863 EvalTable[MVCL] = &Simulator::Evaluate_MVCL;
864 EvalTable[CLCL] = &Simulator::Evaluate_CLCL;
865 EvalTable[LPR] = &Simulator::Evaluate_LPR;
866 EvalTable[LNR] = &Simulator::Evaluate_LNR;
867 EvalTable[LTR] = &Simulator::Evaluate_LTR;
868 EvalTable[LCR] = &Simulator::Evaluate_LCR;
869 EvalTable[NR] = &Simulator::Evaluate_NR;
870 EvalTable[CLR] = &Simulator::Evaluate_CLR;
871 EvalTable[
OR] = &Simulator::Evaluate_OR;
872 EvalTable[XR] = &Simulator::Evaluate_XR;
873 EvalTable[LR] = &Simulator::Evaluate_LR;
874 EvalTable[CR] = &Simulator::Evaluate_CR;
875 EvalTable[AR] = &Simulator::Evaluate_AR;
876 EvalTable[SR] = &Simulator::Evaluate_SR;
877 EvalTable[MR] = &Simulator::Evaluate_MR;
878 EvalTable[DR] = &Simulator::Evaluate_DR;
879 EvalTable[ALR] = &Simulator::Evaluate_ALR;
880 EvalTable[SLR] = &Simulator::Evaluate_SLR;
881 EvalTable[
LDR] = &Simulator::Evaluate_LDR;
882 EvalTable[CDR] = &Simulator::Evaluate_CDR;
883 EvalTable[LER] = &Simulator::Evaluate_LER;
884 EvalTable[STH] = &Simulator::Evaluate_STH;
885 EvalTable[LA] = &Simulator::Evaluate_LA;
886 EvalTable[STC] = &Simulator::Evaluate_STC;
887 EvalTable[IC_z] = &Simulator::Evaluate_IC_z;
888 EvalTable[EX] = &Simulator::Evaluate_EX;
889 EvalTable[BAL] = &Simulator::Evaluate_BAL;
890 EvalTable[BCT] = &Simulator::Evaluate_BCT;
891 EvalTable[
BC] = &Simulator::Evaluate_BC;
892 EvalTable[
LH] = &Simulator::Evaluate_LH;
893 EvalTable[CH] = &Simulator::Evaluate_CH;
894 EvalTable[AH] = &Simulator::Evaluate_AH;
895 EvalTable[
SH] = &Simulator::Evaluate_SH;
896 EvalTable[MH] = &Simulator::Evaluate_MH;
897 EvalTable[BAS] = &Simulator::Evaluate_BAS;
898 EvalTable[CVD] = &Simulator::Evaluate_CVD;
899 EvalTable[CVB] = &Simulator::Evaluate_CVB;
900 EvalTable[
ST] = &Simulator::Evaluate_ST;
901 EvalTable[LAE] = &Simulator::Evaluate_LAE;
902 EvalTable[
N] = &Simulator::Evaluate_N;
903 EvalTable[CL] = &Simulator::Evaluate_CL;
904 EvalTable[O] = &Simulator::Evaluate_O;
905 EvalTable[
X] = &Simulator::Evaluate_X;
906 EvalTable[
L] = &Simulator::Evaluate_L;
907 EvalTable[C] = &Simulator::Evaluate_C;
908 EvalTable[
A] = &Simulator::Evaluate_A;
909 EvalTable[
S] = &Simulator::Evaluate_S;
910 EvalTable[M] = &Simulator::Evaluate_M;
911 EvalTable[
D] = &Simulator::Evaluate_D;
912 EvalTable[AL] = &Simulator::Evaluate_AL;
913 EvalTable[SL] = &Simulator::Evaluate_SL;
914 EvalTable[STD] = &Simulator::Evaluate_STD;
915 EvalTable[
LD] = &Simulator::Evaluate_LD;
916 EvalTable[CD] = &Simulator::Evaluate_CD;
917 EvalTable[STE] = &Simulator::Evaluate_STE;
918 EvalTable[MS] = &Simulator::Evaluate_MS;
919 EvalTable[
LE] = &Simulator::Evaluate_LE;
920 EvalTable[BRXH] = &Simulator::Evaluate_BRXH;
921 EvalTable[BRXLE] = &Simulator::Evaluate_BRXLE;
922 EvalTable[BXH] = &Simulator::Evaluate_BXH;
923 EvalTable[BXLE] = &Simulator::Evaluate_BXLE;
924 EvalTable[
SRL] = &Simulator::Evaluate_SRL;
925 EvalTable[
SLL] = &Simulator::Evaluate_SLL;
926 EvalTable[
SRA] = &Simulator::Evaluate_SRA;
927 EvalTable[SLA] = &Simulator::Evaluate_SLA;
928 EvalTable[SRDL] = &Simulator::Evaluate_SRDL;
929 EvalTable[SLDL] = &Simulator::Evaluate_SLDL;
930 EvalTable[SRDA] = &Simulator::Evaluate_SRDA;
931 EvalTable[SLDA] = &Simulator::Evaluate_SLDA;
932 EvalTable[STM] = &Simulator::Evaluate_STM;
933 EvalTable[TM] = &Simulator::Evaluate_TM;
934 EvalTable[MVI] = &Simulator::Evaluate_MVI;
935 EvalTable[TS] = &Simulator::Evaluate_TS;
936 EvalTable[NI] = &Simulator::Evaluate_NI;
937 EvalTable[CLI] = &Simulator::Evaluate_CLI;
938 EvalTable[OI] = &Simulator::Evaluate_OI;
939 EvalTable[XI] = &Simulator::Evaluate_XI;
940 EvalTable[LM] = &Simulator::Evaluate_LM;
941 EvalTable[CS] = &Simulator::Evaluate_CS;
942 EvalTable[MVCLE] = &Simulator::Evaluate_MVCLE;
943 EvalTable[CLCLE] = &Simulator::Evaluate_CLCLE;
944 EvalTable[MC] = &Simulator::Evaluate_MC;
945 EvalTable[CDS] = &Simulator::Evaluate_CDS;
946 EvalTable[STCM] = &Simulator::Evaluate_STCM;
947 EvalTable[ICM] = &Simulator::Evaluate_ICM;
948 EvalTable[BPRP] = &Simulator::Evaluate_BPRP;
949 EvalTable[BPP] = &Simulator::Evaluate_BPP;
950 EvalTable[TRTR] = &Simulator::Evaluate_TRTR;
951 EvalTable[
MVN] = &Simulator::Evaluate_MVN;
952 EvalTable[MVC] = &Simulator::Evaluate_MVC;
953 EvalTable[MVZ] = &Simulator::Evaluate_MVZ;
954 EvalTable[NC] = &Simulator::Evaluate_NC;
955 EvalTable[CLC] = &Simulator::Evaluate_CLC;
956 EvalTable[OC] = &Simulator::Evaluate_OC;
957 EvalTable[XC] = &Simulator::Evaluate_XC;
958 EvalTable[MVCP] = &Simulator::Evaluate_MVCP;
959 EvalTable[TR] = &Simulator::Evaluate_TR;
960 EvalTable[TRT] = &Simulator::Evaluate_TRT;
961 EvalTable[ED] = &Simulator::Evaluate_ED;
962 EvalTable[EDMK] = &Simulator::Evaluate_EDMK;
963 EvalTable[PKU] = &Simulator::Evaluate_PKU;
964 EvalTable[UNPKU] = &Simulator::Evaluate_UNPKU;
965 EvalTable[MVCIN] = &Simulator::Evaluate_MVCIN;
966 EvalTable[PKA] = &Simulator::Evaluate_PKA;
967 EvalTable[UNPKA] = &Simulator::Evaluate_UNPKA;
968 EvalTable[PLO] = &Simulator::Evaluate_PLO;
969 EvalTable[LMD] = &Simulator::Evaluate_LMD;
970 EvalTable[SRP] = &Simulator::Evaluate_SRP;
971 EvalTable[MVO] = &Simulator::Evaluate_MVO;
972 EvalTable[PACK] = &Simulator::Evaluate_PACK;
973 EvalTable[UNPK] = &Simulator::Evaluate_UNPK;
974 EvalTable[ZAP] = &Simulator::Evaluate_ZAP;
975 EvalTable[AP] = &Simulator::Evaluate_AP;
976 EvalTable[SP] = &Simulator::Evaluate_SP;
977 EvalTable[MP] = &Simulator::Evaluate_MP;
978 EvalTable[DP] = &Simulator::Evaluate_DP;
979 EvalTable[UPT] = &Simulator::Evaluate_UPT;
980 EvalTable[PFPO] = &Simulator::Evaluate_PFPO;
981 EvalTable[IIHH] = &Simulator::Evaluate_IIHH;
982 EvalTable[IIHL] = &Simulator::Evaluate_IIHL;
983 EvalTable[IILH] = &Simulator::Evaluate_IILH;
984 EvalTable[IILL] = &Simulator::Evaluate_IILL;
985 EvalTable[NIHH] = &Simulator::Evaluate_NIHH;
986 EvalTable[NIHL] = &Simulator::Evaluate_NIHL;
987 EvalTable[NILH] = &Simulator::Evaluate_NILH;
988 EvalTable[NILL] = &Simulator::Evaluate_NILL;
989 EvalTable[OIHH] = &Simulator::Evaluate_OIHH;
990 EvalTable[OIHL] = &Simulator::Evaluate_OIHL;
991 EvalTable[OILH] = &Simulator::Evaluate_OILH;
992 EvalTable[OILL] = &Simulator::Evaluate_OILL;
993 EvalTable[LLIHH] = &Simulator::Evaluate_LLIHH;
994 EvalTable[LLIHL] = &Simulator::Evaluate_LLIHL;
995 EvalTable[LLILH] = &Simulator::Evaluate_LLILH;
996 EvalTable[LLILL] = &Simulator::Evaluate_LLILL;
997 EvalTable[TMLH] = &Simulator::Evaluate_TMLH;
998 EvalTable[TMLL] = &Simulator::Evaluate_TMLL;
999 EvalTable[TMHH] = &Simulator::Evaluate_TMHH;
1000 EvalTable[TMHL] = &Simulator::Evaluate_TMHL;
1001 EvalTable[BRC] = &Simulator::Evaluate_BRC;
1002 EvalTable[BRAS] = &Simulator::Evaluate_BRAS;
1003 EvalTable[BRCT] = &Simulator::Evaluate_BRCT;
1004 EvalTable[BRCTG] = &Simulator::Evaluate_BRCTG;
1005 EvalTable[LHI] = &Simulator::Evaluate_LHI;
1006 EvalTable[LGHI] = &Simulator::Evaluate_LGHI;
1007 EvalTable[AHI] = &Simulator::Evaluate_AHI;
1008 EvalTable[AGHI] = &Simulator::Evaluate_AGHI;
1009 EvalTable[MHI] = &Simulator::Evaluate_MHI;
1010 EvalTable[MGHI] = &Simulator::Evaluate_MGHI;
1011 EvalTable[CHI] = &Simulator::Evaluate_CHI;
1012 EvalTable[CGHI] = &Simulator::Evaluate_CGHI;
1013 EvalTable[LARL] = &Simulator::Evaluate_LARL;
1014 EvalTable[LGFI] = &Simulator::Evaluate_LGFI;
1015 EvalTable[BRCL] = &Simulator::Evaluate_BRCL;
1016 EvalTable[BRASL] = &Simulator::Evaluate_BRASL;
1017 EvalTable[XIHF] = &Simulator::Evaluate_XIHF;
1018 EvalTable[XILF] = &Simulator::Evaluate_XILF;
1019 EvalTable[IIHF] = &Simulator::Evaluate_IIHF;
1020 EvalTable[IILF] = &Simulator::Evaluate_IILF;
1021 EvalTable[NIHF] = &Simulator::Evaluate_NIHF;
1022 EvalTable[NILF] = &Simulator::Evaluate_NILF;
1023 EvalTable[OIHF] = &Simulator::Evaluate_OIHF;
1024 EvalTable[OILF] = &Simulator::Evaluate_OILF;
1025 EvalTable[LLIHF] = &Simulator::Evaluate_LLIHF;
1026 EvalTable[LLILF] = &Simulator::Evaluate_LLILF;
1027 EvalTable[MSGFI] = &Simulator::Evaluate_MSGFI;
1028 EvalTable[MSFI] = &Simulator::Evaluate_MSFI;
1029 EvalTable[SLGFI] = &Simulator::Evaluate_SLGFI;
1030 EvalTable[SLFI] = &Simulator::Evaluate_SLFI;
1031 EvalTable[AGFI] = &Simulator::Evaluate_AGFI;
1032 EvalTable[AFI] = &Simulator::Evaluate_AFI;
1033 EvalTable[ALGFI] = &Simulator::Evaluate_ALGFI;
1034 EvalTable[ALFI] = &Simulator::Evaluate_ALFI;
1035 EvalTable[CGFI] = &Simulator::Evaluate_CGFI;
1036 EvalTable[CFI] = &Simulator::Evaluate_CFI;
1037 EvalTable[CLGFI] = &Simulator::Evaluate_CLGFI;
1038 EvalTable[CLFI] = &Simulator::Evaluate_CLFI;
1039 EvalTable[LLHRL] = &Simulator::Evaluate_LLHRL;
1040 EvalTable[LGHRL] = &Simulator::Evaluate_LGHRL;
1041 EvalTable[LHRL] = &Simulator::Evaluate_LHRL;
1042 EvalTable[LLGHRL] = &Simulator::Evaluate_LLGHRL;
1043 EvalTable[STHRL] = &Simulator::Evaluate_STHRL;
1044 EvalTable[LGRL] = &Simulator::Evaluate_LGRL;
1045 EvalTable[STGRL] = &Simulator::Evaluate_STGRL;
1046 EvalTable[LGFRL] = &Simulator::Evaluate_LGFRL;
1047 EvalTable[LRL] = &Simulator::Evaluate_LRL;
1048 EvalTable[LLGFRL] = &Simulator::Evaluate_LLGFRL;
1049 EvalTable[STRL] = &Simulator::Evaluate_STRL;
1050 EvalTable[EXRL] = &Simulator::Evaluate_EXRL;
1051 EvalTable[PFDRL] = &Simulator::Evaluate_PFDRL;
1052 EvalTable[CGHRL] = &Simulator::Evaluate_CGHRL;
1053 EvalTable[CHRL] = &Simulator::Evaluate_CHRL;
1054 EvalTable[CGRL] = &Simulator::Evaluate_CGRL;
1055 EvalTable[CGFRL] = &Simulator::Evaluate_CGFRL;
1056 EvalTable[ECTG] = &Simulator::Evaluate_ECTG;
1057 EvalTable[CSST] = &Simulator::Evaluate_CSST;
1058 EvalTable[LPD] = &Simulator::Evaluate_LPD;
1059 EvalTable[LPDG] = &Simulator::Evaluate_LPDG;
1060 EvalTable[BRCTH] = &Simulator::Evaluate_BRCTH;
1061 EvalTable[AIH] = &Simulator::Evaluate_AIH;
1062 EvalTable[ALSIH] = &Simulator::Evaluate_ALSIH;
1063 EvalTable[ALSIHN] = &Simulator::Evaluate_ALSIHN;
1064 EvalTable[CIH] = &Simulator::Evaluate_CIH;
1065 EvalTable[CLIH] = &Simulator::Evaluate_CLIH;
1066 EvalTable[STCK] = &Simulator::Evaluate_STCK;
1067 EvalTable[CFC] = &Simulator::Evaluate_CFC;
1068 EvalTable[IPM] = &Simulator::Evaluate_IPM;
1069 EvalTable[HSCH] = &Simulator::Evaluate_HSCH;
1070 EvalTable[MSCH] = &Simulator::Evaluate_MSCH;
1071 EvalTable[SSCH] = &Simulator::Evaluate_SSCH;
1072 EvalTable[STSCH] = &Simulator::Evaluate_STSCH;
1073 EvalTable[TSCH] = &Simulator::Evaluate_TSCH;
1074 EvalTable[TPI] = &Simulator::Evaluate_TPI;
1075 EvalTable[SAL] = &Simulator::Evaluate_SAL;
1076 EvalTable[RSCH] = &Simulator::Evaluate_RSCH;
1077 EvalTable[STCRW] = &Simulator::Evaluate_STCRW;
1078 EvalTable[STCPS] = &Simulator::Evaluate_STCPS;
1079 EvalTable[RCHP] = &Simulator::Evaluate_RCHP;
1080 EvalTable[SCHM] = &Simulator::Evaluate_SCHM;
1081 EvalTable[CKSM] = &Simulator::Evaluate_CKSM;
1082 EvalTable[SAR] = &Simulator::Evaluate_SAR;
1083 EvalTable[EAR] = &Simulator::Evaluate_EAR;
1084 EvalTable[
MSR] = &Simulator::Evaluate_MSR;
1085 EvalTable[MSRKC] = &Simulator::Evaluate_MSRKC;
1086 EvalTable[MVST] = &Simulator::Evaluate_MVST;
1087 EvalTable[CUSE] = &Simulator::Evaluate_CUSE;
1088 EvalTable[SRST] = &Simulator::Evaluate_SRST;
1089 EvalTable[XSCH] = &Simulator::Evaluate_XSCH;
1090 EvalTable[STCKE] = &Simulator::Evaluate_STCKE;
1091 EvalTable[STCKF] = &Simulator::Evaluate_STCKF;
1092 EvalTable[SRNM] = &Simulator::Evaluate_SRNM;
1093 EvalTable[STFPC] = &Simulator::Evaluate_STFPC;
1094 EvalTable[LFPC] = &Simulator::Evaluate_LFPC;
1095 EvalTable[TRE] = &Simulator::Evaluate_TRE;
1096 EvalTable[STFLE] = &Simulator::Evaluate_STFLE;
1097 EvalTable[SRNMB] = &Simulator::Evaluate_SRNMB;
1098 EvalTable[SRNMT] = &Simulator::Evaluate_SRNMT;
1099 EvalTable[LFAS] = &Simulator::Evaluate_LFAS;
1100 EvalTable[PPA] = &Simulator::Evaluate_PPA;
1101 EvalTable[ETND] = &Simulator::Evaluate_ETND;
1102 EvalTable[TEND] = &Simulator::Evaluate_TEND;
1103 EvalTable[NIAI] = &Simulator::Evaluate_NIAI;
1104 EvalTable[TABORT] = &Simulator::Evaluate_TABORT;
1105 EvalTable[TRAP4] = &Simulator::Evaluate_TRAP4;
1106 EvalTable[LPEBR] = &Simulator::Evaluate_LPEBR;
1107 EvalTable[LNEBR] = &Simulator::Evaluate_LNEBR;
1108 EvalTable[LTEBR] = &Simulator::Evaluate_LTEBR;
1109 EvalTable[LCEBR] = &Simulator::Evaluate_LCEBR;
1110 EvalTable[LDEBR] = &Simulator::Evaluate_LDEBR;
1111 EvalTable[LXDBR] = &Simulator::Evaluate_LXDBR;
1112 EvalTable[LXEBR] = &Simulator::Evaluate_LXEBR;
1113 EvalTable[MXDBR] = &Simulator::Evaluate_MXDBR;
1114 EvalTable[KEBR] = &Simulator::Evaluate_KEBR;
1115 EvalTable[CEBR] = &Simulator::Evaluate_CEBR;
1116 EvalTable[AEBR] = &Simulator::Evaluate_AEBR;
1117 EvalTable[SEBR] = &Simulator::Evaluate_SEBR;
1118 EvalTable[MDEBR] = &Simulator::Evaluate_MDEBR;
1119 EvalTable[DEBR] = &Simulator::Evaluate_DEBR;
1120 EvalTable[MAEBR] = &Simulator::Evaluate_MAEBR;
1121 EvalTable[MSEBR] = &Simulator::Evaluate_MSEBR;
1122 EvalTable[LPDBR] = &Simulator::Evaluate_LPDBR;
1123 EvalTable[LNDBR] = &Simulator::Evaluate_LNDBR;
1124 EvalTable[LTDBR] = &Simulator::Evaluate_LTDBR;
1125 EvalTable[LCDBR] = &Simulator::Evaluate_LCDBR;
1126 EvalTable[SQEBR] = &Simulator::Evaluate_SQEBR;
1127 EvalTable[SQDBR] = &Simulator::Evaluate_SQDBR;
1128 EvalTable[SQXBR] = &Simulator::Evaluate_SQXBR;
1129 EvalTable[MEEBR] = &Simulator::Evaluate_MEEBR;
1130 EvalTable[KDBR] = &Simulator::Evaluate_KDBR;
1131 EvalTable[CDBR] = &Simulator::Evaluate_CDBR;
1132 EvalTable[ADBR] = &Simulator::Evaluate_ADBR;
1133 EvalTable[SDBR] = &Simulator::Evaluate_SDBR;
1134 EvalTable[MDBR] = &Simulator::Evaluate_MDBR;
1135 EvalTable[DDBR] = &Simulator::Evaluate_DDBR;
1136 EvalTable[MADBR] = &Simulator::Evaluate_MADBR;
1137 EvalTable[MSDBR] = &Simulator::Evaluate_MSDBR;
1138 EvalTable[LPXBR] = &Simulator::Evaluate_LPXBR;
1139 EvalTable[LNXBR] = &Simulator::Evaluate_LNXBR;
1140 EvalTable[LTXBR] = &Simulator::Evaluate_LTXBR;
1141 EvalTable[LCXBR] = &Simulator::Evaluate_LCXBR;
1142 EvalTable[LEDBRA] = &Simulator::Evaluate_LEDBRA;
1143 EvalTable[LDXBRA] = &Simulator::Evaluate_LDXBRA;
1144 EvalTable[LEXBRA] = &Simulator::Evaluate_LEXBRA;
1145 EvalTable[FIXBRA] = &Simulator::Evaluate_FIXBRA;
1146 EvalTable[KXBR] = &Simulator::Evaluate_KXBR;
1147 EvalTable[CXBR] = &Simulator::Evaluate_CXBR;
1148 EvalTable[AXBR] = &Simulator::Evaluate_AXBR;
1149 EvalTable[SXBR] = &Simulator::Evaluate_SXBR;
1150 EvalTable[MXBR] = &Simulator::Evaluate_MXBR;
1151 EvalTable[DXBR] = &Simulator::Evaluate_DXBR;
1152 EvalTable[TBEDR] = &Simulator::Evaluate_TBEDR;
1153 EvalTable[TBDR] = &Simulator::Evaluate_TBDR;
1154 EvalTable[DIEBR] = &Simulator::Evaluate_DIEBR;
1155 EvalTable[FIEBRA] = &Simulator::Evaluate_FIEBRA;
1156 EvalTable[THDER] = &Simulator::Evaluate_THDER;
1157 EvalTable[THDR] = &Simulator::Evaluate_THDR;
1158 EvalTable[DIDBR] = &Simulator::Evaluate_DIDBR;
1159 EvalTable[FIDBRA] = &Simulator::Evaluate_FIDBRA;
1160 EvalTable[LXR] = &Simulator::Evaluate_LXR;
1161 EvalTable[LPDFR] = &Simulator::Evaluate_LPDFR;
1162 EvalTable[LNDFR] = &Simulator::Evaluate_LNDFR;
1163 EvalTable[LCDFR] = &Simulator::Evaluate_LCDFR;
1164 EvalTable[LZER] = &Simulator::Evaluate_LZER;
1165 EvalTable[LZDR] = &Simulator::Evaluate_LZDR;
1166 EvalTable[LZXR] = &Simulator::Evaluate_LZXR;
1167 EvalTable[SFPC] = &Simulator::Evaluate_SFPC;
1168 EvalTable[SFASR] = &Simulator::Evaluate_SFASR;
1169 EvalTable[EFPC] = &Simulator::Evaluate_EFPC;
1170 EvalTable[CELFBR] = &Simulator::Evaluate_CELFBR;
1171 EvalTable[CDLFBR] = &Simulator::Evaluate_CDLFBR;
1172 EvalTable[CXLFBR] = &Simulator::Evaluate_CXLFBR;
1173 EvalTable[CEFBRA] = &Simulator::Evaluate_CEFBRA;
1174 EvalTable[CDFBRA] = &Simulator::Evaluate_CDFBRA;
1175 EvalTable[CXFBRA] = &Simulator::Evaluate_CXFBRA;
1176 EvalTable[CFEBRA] = &Simulator::Evaluate_CFEBRA;
1177 EvalTable[CFDBRA] = &Simulator::Evaluate_CFDBRA;
1178 EvalTable[CFXBRA] = &Simulator::Evaluate_CFXBRA;
1179 EvalTable[CLFEBR] = &Simulator::Evaluate_CLFEBR;
1180 EvalTable[CLFDBR] = &Simulator::Evaluate_CLFDBR;
1181 EvalTable[CLFXBR] = &Simulator::Evaluate_CLFXBR;
1182 EvalTable[CELGBR] = &Simulator::Evaluate_CELGBR;
1183 EvalTable[CDLGBR] = &Simulator::Evaluate_CDLGBR;
1184 EvalTable[CXLGBR] = &Simulator::Evaluate_CXLGBR;
1185 EvalTable[CEGBRA] = &Simulator::Evaluate_CEGBRA;
1186 EvalTable[CDGBRA] = &Simulator::Evaluate_CDGBRA;
1187 EvalTable[CXGBRA] = &Simulator::Evaluate_CXGBRA;
1188 EvalTable[CGEBRA] = &Simulator::Evaluate_CGEBRA;
1189 EvalTable[CGDBRA] = &Simulator::Evaluate_CGDBRA;
1190 EvalTable[CGXBRA] = &Simulator::Evaluate_CGXBRA;
1191 EvalTable[CLGEBR] = &Simulator::Evaluate_CLGEBR;
1192 EvalTable[CLGDBR] = &Simulator::Evaluate_CLGDBR;
1193 EvalTable[CFER] = &Simulator::Evaluate_CFER;
1194 EvalTable[CFDR] = &Simulator::Evaluate_CFDR;
1195 EvalTable[CFXR] = &Simulator::Evaluate_CFXR;
1196 EvalTable[LDGR] = &Simulator::Evaluate_LDGR;
1197 EvalTable[CGER] = &Simulator::Evaluate_CGER;
1198 EvalTable[CGDR] = &Simulator::Evaluate_CGDR;
1199 EvalTable[CGXR] = &Simulator::Evaluate_CGXR;
1200 EvalTable[LGDR] = &Simulator::Evaluate_LGDR;
1201 EvalTable[MDTRA] = &Simulator::Evaluate_MDTRA;
1202 EvalTable[DDTRA] = &Simulator::Evaluate_DDTRA;
1203 EvalTable[ADTRA] = &Simulator::Evaluate_ADTRA;
1204 EvalTable[SDTRA] = &Simulator::Evaluate_SDTRA;
1205 EvalTable[LDETR] = &Simulator::Evaluate_LDETR;
1206 EvalTable[LEDTR] = &Simulator::Evaluate_LEDTR;
1207 EvalTable[LTDTR] = &Simulator::Evaluate_LTDTR;
1208 EvalTable[FIDTR] = &Simulator::Evaluate_FIDTR;
1209 EvalTable[MXTRA] = &Simulator::Evaluate_MXTRA;
1210 EvalTable[DXTRA] = &Simulator::Evaluate_DXTRA;
1211 EvalTable[AXTRA] = &Simulator::Evaluate_AXTRA;
1212 EvalTable[SXTRA] = &Simulator::Evaluate_SXTRA;
1213 EvalTable[LXDTR] = &Simulator::Evaluate_LXDTR;
1214 EvalTable[LDXTR] = &Simulator::Evaluate_LDXTR;
1215 EvalTable[LTXTR] = &Simulator::Evaluate_LTXTR;
1216 EvalTable[FIXTR] = &Simulator::Evaluate_FIXTR;
1217 EvalTable[KDTR] = &Simulator::Evaluate_KDTR;
1218 EvalTable[CGDTRA] = &Simulator::Evaluate_CGDTRA;
1219 EvalTable[CUDTR] = &Simulator::Evaluate_CUDTR;
1220 EvalTable[CDTR] = &Simulator::Evaluate_CDTR;
1221 EvalTable[EEDTR] = &Simulator::Evaluate_EEDTR;
1222 EvalTable[ESDTR] = &Simulator::Evaluate_ESDTR;
1223 EvalTable[KXTR] = &Simulator::Evaluate_KXTR;
1224 EvalTable[CGXTRA] = &Simulator::Evaluate_CGXTRA;
1225 EvalTable[CUXTR] = &Simulator::Evaluate_CUXTR;
1226 EvalTable[CSXTR] = &Simulator::Evaluate_CSXTR;
1227 EvalTable[CXTR] = &Simulator::Evaluate_CXTR;
1228 EvalTable[EEXTR] = &Simulator::Evaluate_EEXTR;
1229 EvalTable[ESXTR] = &Simulator::Evaluate_ESXTR;
1230 EvalTable[CDGTRA] = &Simulator::Evaluate_CDGTRA;
1231 EvalTable[CDUTR] = &Simulator::Evaluate_CDUTR;
1232 EvalTable[CDSTR] = &Simulator::Evaluate_CDSTR;
1233 EvalTable[CEDTR] = &Simulator::Evaluate_CEDTR;
1234 EvalTable[QADTR] = &Simulator::Evaluate_QADTR;
1235 EvalTable[IEDTR] = &Simulator::Evaluate_IEDTR;
1236 EvalTable[RRDTR] = &Simulator::Evaluate_RRDTR;
1237 EvalTable[CXGTRA] = &Simulator::Evaluate_CXGTRA;
1238 EvalTable[CXUTR] = &Simulator::Evaluate_CXUTR;
1239 EvalTable[CXSTR] = &Simulator::Evaluate_CXSTR;
1240 EvalTable[CEXTR] = &Simulator::Evaluate_CEXTR;
1241 EvalTable[QAXTR] = &Simulator::Evaluate_QAXTR;
1242 EvalTable[IEXTR] = &Simulator::Evaluate_IEXTR;
1243 EvalTable[RRXTR] = &Simulator::Evaluate_RRXTR;
1244 EvalTable[LPGR] = &Simulator::Evaluate_LPGR;
1245 EvalTable[LNGR] = &Simulator::Evaluate_LNGR;
1246 EvalTable[LTGR] = &Simulator::Evaluate_LTGR;
1247 EvalTable[LCGR] = &Simulator::Evaluate_LCGR;
1248 EvalTable[LGR] = &Simulator::Evaluate_LGR;
1249 EvalTable[LGBR] = &Simulator::Evaluate_LGBR;
1250 EvalTable[LGHR] = &Simulator::Evaluate_LGHR;
1251 EvalTable[AGR] = &Simulator::Evaluate_AGR;
1252 EvalTable[SGR] = &Simulator::Evaluate_SGR;
1253 EvalTable[ALGR] = &Simulator::Evaluate_ALGR;
1254 EvalTable[SLGR] = &Simulator::Evaluate_SLGR;
1255 EvalTable[MSGR] = &Simulator::Evaluate_MSGR;
1256 EvalTable[MSGRKC] = &Simulator::Evaluate_MSGRKC;
1257 EvalTable[DSGR] = &Simulator::Evaluate_DSGR;
1258 EvalTable[LRVGR] = &Simulator::Evaluate_LRVGR;
1259 EvalTable[LPGFR] = &Simulator::Evaluate_LPGFR;
1260 EvalTable[LNGFR] = &Simulator::Evaluate_LNGFR;
1261 EvalTable[LTGFR] = &Simulator::Evaluate_LTGFR;
1262 EvalTable[LCGFR] = &Simulator::Evaluate_LCGFR;
1263 EvalTable[LGFR] = &Simulator::Evaluate_LGFR;
1264 EvalTable[LLGFR] = &Simulator::Evaluate_LLGFR;
1265 EvalTable[LLGTR] = &Simulator::Evaluate_LLGTR;
1266 EvalTable[AGFR] = &Simulator::Evaluate_AGFR;
1267 EvalTable[SGFR] = &Simulator::Evaluate_SGFR;
1268 EvalTable[ALGFR] = &Simulator::Evaluate_ALGFR;
1269 EvalTable[SLGFR] = &Simulator::Evaluate_SLGFR;
1270 EvalTable[MSGFR] = &Simulator::Evaluate_MSGFR;
1271 EvalTable[DSGFR] = &Simulator::Evaluate_DSGFR;
1272 EvalTable[KMAC] = &Simulator::Evaluate_KMAC;
1273 EvalTable[LRVR] = &Simulator::Evaluate_LRVR;
1274 EvalTable[CGR] = &Simulator::Evaluate_CGR;
1275 EvalTable[CLGR] = &Simulator::Evaluate_CLGR;
1276 EvalTable[LBR] = &Simulator::Evaluate_LBR;
1277 EvalTable[LHR] = &Simulator::Evaluate_LHR;
1278 EvalTable[KMF] = &Simulator::Evaluate_KMF;
1279 EvalTable[KMO] = &Simulator::Evaluate_KMO;
1280 EvalTable[PCC] = &Simulator::Evaluate_PCC;
1281 EvalTable[KMCTR] = &Simulator::Evaluate_KMCTR;
1282 EvalTable[KM] = &Simulator::Evaluate_KM;
1283 EvalTable[KMC] = &Simulator::Evaluate_KMC;
1284 EvalTable[CGFR] = &Simulator::Evaluate_CGFR;
1285 EvalTable[KIMD] = &Simulator::Evaluate_KIMD;
1286 EvalTable[KLMD] = &Simulator::Evaluate_KLMD;
1287 EvalTable[CFDTR] = &Simulator::Evaluate_CFDTR;
1288 EvalTable[CLGDTR] = &Simulator::Evaluate_CLGDTR;
1289 EvalTable[CLFDTR] = &Simulator::Evaluate_CLFDTR;
1290 EvalTable[BCTGR] = &Simulator::Evaluate_BCTGR;
1291 EvalTable[CFXTR] = &Simulator::Evaluate_CFXTR;
1292 EvalTable[CLFXTR] = &Simulator::Evaluate_CLFXTR;
1293 EvalTable[CDFTR] = &Simulator::Evaluate_CDFTR;
1294 EvalTable[CDLGTR] = &Simulator::Evaluate_CDLGTR;
1295 EvalTable[CDLFTR] = &Simulator::Evaluate_CDLFTR;
1296 EvalTable[CXFTR] = &Simulator::Evaluate_CXFTR;
1297 EvalTable[CXLGTR] = &Simulator::Evaluate_CXLGTR;
1298 EvalTable[CXLFTR] = &Simulator::Evaluate_CXLFTR;
1299 EvalTable[CGRT] = &Simulator::Evaluate_CGRT;
1300 EvalTable[NGR] = &Simulator::Evaluate_NGR;
1301 EvalTable[OGR] = &Simulator::Evaluate_OGR;
1302 EvalTable[XGR] = &Simulator::Evaluate_XGR;
1303 EvalTable[FLOGR] = &Simulator::Evaluate_FLOGR;
1304 EvalTable[LLGCR] = &Simulator::Evaluate_LLGCR;
1305 EvalTable[LLGHR] = &Simulator::Evaluate_LLGHR;
1306 EvalTable[MLGR] = &Simulator::Evaluate_MLGR;
1307 EvalTable[MGRK] = &Simulator::Evaluate_MGRK;
1308 EvalTable[MG] = &Simulator::Evaluate_MG;
1309 EvalTable[DLGR] = &Simulator::Evaluate_DLGR;
1310 EvalTable[ALCGR] = &Simulator::Evaluate_ALCGR;
1311 EvalTable[SLBGR] = &Simulator::Evaluate_SLBGR;
1312 EvalTable[EPSW] = &Simulator::Evaluate_EPSW;
1313 EvalTable[TRTT] = &Simulator::Evaluate_TRTT;
1314 EvalTable[TRTO] = &Simulator::Evaluate_TRTO;
1315 EvalTable[TROT] = &Simulator::Evaluate_TROT;
1316 EvalTable[TROO] = &Simulator::Evaluate_TROO;
1317 EvalTable[LLCR] = &Simulator::Evaluate_LLCR;
1318 EvalTable[LLHR] = &Simulator::Evaluate_LLHR;
1319 EvalTable[MLR] = &Simulator::Evaluate_MLR;
1320 EvalTable[DLR] = &Simulator::Evaluate_DLR;
1321 EvalTable[ALCR] = &Simulator::Evaluate_ALCR;
1322 EvalTable[SLBR] = &Simulator::Evaluate_SLBR;
1323 EvalTable[CU14] = &Simulator::Evaluate_CU14;
1324 EvalTable[CU24] = &Simulator::Evaluate_CU24;
1325 EvalTable[CU41] = &Simulator::Evaluate_CU41;
1326 EvalTable[CU42] = &Simulator::Evaluate_CU42;
1327 EvalTable[TRTRE] = &Simulator::Evaluate_TRTRE;
1328 EvalTable[SRSTU] = &Simulator::Evaluate_SRSTU;
1329 EvalTable[TRTE] = &Simulator::Evaluate_TRTE;
1330 EvalTable[AHHHR] = &Simulator::Evaluate_AHHHR;
1331 EvalTable[SHHHR] = &Simulator::Evaluate_SHHHR;
1332 EvalTable[ALHHHR] = &Simulator::Evaluate_ALHHHR;
1333 EvalTable[SLHHHR] = &Simulator::Evaluate_SLHHHR;
1334 EvalTable[CHHR] = &Simulator::Evaluate_CHHR;
1335 EvalTable[AHHLR] = &Simulator::Evaluate_AHHLR;
1336 EvalTable[SHHLR] = &Simulator::Evaluate_SHHLR;
1337 EvalTable[ALHHLR] = &Simulator::Evaluate_ALHHLR;
1338 EvalTable[SLHHLR] = &Simulator::Evaluate_SLHHLR;
1339 EvalTable[CHLR] = &Simulator::Evaluate_CHLR;
1340 EvalTable[POPCNT_Z] = &Simulator::Evaluate_POPCNT_Z;
1341 EvalTable[LOCGR] = &Simulator::Evaluate_LOCGR;
1342 EvalTable[NGRK] = &Simulator::Evaluate_NGRK;
1343 EvalTable[OGRK] = &Simulator::Evaluate_OGRK;
1344 EvalTable[XGRK] = &Simulator::Evaluate_XGRK;
1345 EvalTable[AGRK] = &Simulator::Evaluate_AGRK;
1346 EvalTable[SGRK] = &Simulator::Evaluate_SGRK;
1347 EvalTable[ALGRK] = &Simulator::Evaluate_ALGRK;
1348 EvalTable[SLGRK] = &Simulator::Evaluate_SLGRK;
1349 EvalTable[LOCR] = &Simulator::Evaluate_LOCR;
1350 EvalTable[NRK] = &Simulator::Evaluate_NRK;
1351 EvalTable[ORK] = &Simulator::Evaluate_ORK;
1352 EvalTable[XRK] = &Simulator::Evaluate_XRK;
1353 EvalTable[ARK] = &Simulator::Evaluate_ARK;
1354 EvalTable[SRK] = &Simulator::Evaluate_SRK;
1355 EvalTable[ALRK] = &Simulator::Evaluate_ALRK;
1356 EvalTable[SLRK] = &Simulator::Evaluate_SLRK;
1357 EvalTable[LTG] = &Simulator::Evaluate_LTG;
1358 EvalTable[LG] = &Simulator::Evaluate_LG;
1359 EvalTable[CVBY] = &Simulator::Evaluate_CVBY;
1360 EvalTable[AG] = &Simulator::Evaluate_AG;
1361 EvalTable[SG] = &Simulator::Evaluate_SG;
1362 EvalTable[ALG] = &Simulator::Evaluate_ALG;
1363 EvalTable[SLG] = &Simulator::Evaluate_SLG;
1364 EvalTable[MSG] = &Simulator::Evaluate_MSG;
1365 EvalTable[DSG] = &Simulator::Evaluate_DSG;
1366 EvalTable[CVBG] = &Simulator::Evaluate_CVBG;
1367 EvalTable[LRVG] = &Simulator::Evaluate_LRVG;
1368 EvalTable[
LT] = &Simulator::Evaluate_LT;
1369 EvalTable[LGF] = &Simulator::Evaluate_LGF;
1370 EvalTable[LGH] = &Simulator::Evaluate_LGH;
1371 EvalTable[LLGF] = &Simulator::Evaluate_LLGF;
1372 EvalTable[LLGT] = &Simulator::Evaluate_LLGT;
1373 EvalTable[AGF] = &Simulator::Evaluate_AGF;
1374 EvalTable[SGF] = &Simulator::Evaluate_SGF;
1375 EvalTable[ALGF] = &Simulator::Evaluate_ALGF;
1376 EvalTable[SLGF] = &Simulator::Evaluate_SLGF;
1377 EvalTable[MSGF] = &Simulator::Evaluate_MSGF;
1378 EvalTable[DSGF] = &Simulator::Evaluate_DSGF;
1379 EvalTable[LRV] = &Simulator::Evaluate_LRV;
1380 EvalTable[LRVH] = &Simulator::Evaluate_LRVH;
1381 EvalTable[CG] = &Simulator::Evaluate_CG;
1382 EvalTable[CLG] = &Simulator::Evaluate_CLG;
1383 EvalTable[STG] = &Simulator::Evaluate_STG;
1384 EvalTable[NTSTG] = &Simulator::Evaluate_NTSTG;
1385 EvalTable[CVDY] = &Simulator::Evaluate_CVDY;
1386 EvalTable[CVDG] = &Simulator::Evaluate_CVDG;
1387 EvalTable[STRVG] = &Simulator::Evaluate_STRVG;
1388 EvalTable[CGF] = &Simulator::Evaluate_CGF;
1389 EvalTable[CLGF] = &Simulator::Evaluate_CLGF;
1390 EvalTable[LTGF] = &Simulator::Evaluate_LTGF;
1391 EvalTable[CGH] = &Simulator::Evaluate_CGH;
1392 EvalTable[PFD] = &Simulator::Evaluate_PFD;
1393 EvalTable[STRV] = &Simulator::Evaluate_STRV;
1394 EvalTable[STRVH] = &Simulator::Evaluate_STRVH;
1395 EvalTable[BCTG] = &Simulator::Evaluate_BCTG;
1396 EvalTable[STY] = &Simulator::Evaluate_STY;
1397 EvalTable[MSY] = &Simulator::Evaluate_MSY;
1398 EvalTable[MSC] = &Simulator::Evaluate_MSC;
1399 EvalTable[NY] = &Simulator::Evaluate_NY;
1400 EvalTable[CLY] = &Simulator::Evaluate_CLY;
1401 EvalTable[OY] = &Simulator::Evaluate_OY;
1402 EvalTable[XY] = &Simulator::Evaluate_XY;
1403 EvalTable[LY] = &Simulator::Evaluate_LY;
1404 EvalTable[CY] = &Simulator::Evaluate_CY;
1405 EvalTable[AY] = &Simulator::Evaluate_AY;
1406 EvalTable[
SY] = &Simulator::Evaluate_SY;
1407 EvalTable[MFY] = &Simulator::Evaluate_MFY;
1408 EvalTable[ALY] = &Simulator::Evaluate_ALY;
1409 EvalTable[SLY] = &Simulator::Evaluate_SLY;
1410 EvalTable[STHY] = &Simulator::Evaluate_STHY;
1411 EvalTable[LAY] = &Simulator::Evaluate_LAY;
1412 EvalTable[STCY] = &Simulator::Evaluate_STCY;
1413 EvalTable[ICY] = &Simulator::Evaluate_ICY;
1414 EvalTable[LAEY] = &Simulator::Evaluate_LAEY;
1415 EvalTable[
LB] = &Simulator::Evaluate_LB;
1416 EvalTable[LGB] = &Simulator::Evaluate_LGB;
1417 EvalTable[LHY] = &Simulator::Evaluate_LHY;
1418 EvalTable[CHY] = &Simulator::Evaluate_CHY;
1419 EvalTable[AHY] = &Simulator::Evaluate_AHY;
1420 EvalTable[SHY] = &Simulator::Evaluate_SHY;
1421 EvalTable[MHY] = &Simulator::Evaluate_MHY;
1422 EvalTable[NG] = &Simulator::Evaluate_NG;
1423 EvalTable[OG] = &Simulator::Evaluate_OG;
1424 EvalTable[XG] = &Simulator::Evaluate_XG;
1425 EvalTable[LGAT] = &Simulator::Evaluate_LGAT;
1426 EvalTable[MLG] = &Simulator::Evaluate_MLG;
1427 EvalTable[DLG] = &Simulator::Evaluate_DLG;
1428 EvalTable[ALCG] = &Simulator::Evaluate_ALCG;
1429 EvalTable[SLBG] = &Simulator::Evaluate_SLBG;
1430 EvalTable[STPQ] = &Simulator::Evaluate_STPQ;
1431 EvalTable[LPQ] = &Simulator::Evaluate_LPQ;
1432 EvalTable[LLGC] = &Simulator::Evaluate_LLGC;
1433 EvalTable[LLGH] = &Simulator::Evaluate_LLGH;
1434 EvalTable[LLC] = &Simulator::Evaluate_LLC;
1435 EvalTable[LLH] = &Simulator::Evaluate_LLH;
1436 EvalTable[ML] = &Simulator::Evaluate_ML;
1437 EvalTable[DL] = &Simulator::Evaluate_DL;
1438 EvalTable[ALC] = &Simulator::Evaluate_ALC;
1439 EvalTable[SLB] = &Simulator::Evaluate_SLB;
1440 EvalTable[LLGTAT] = &Simulator::Evaluate_LLGTAT;
1441 EvalTable[LLGFAT] = &Simulator::Evaluate_LLGFAT;
1442 EvalTable[LAT] = &Simulator::Evaluate_LAT;
1443 EvalTable[LBH] = &Simulator::Evaluate_LBH;
1444 EvalTable[LLCH] = &Simulator::Evaluate_LLCH;
1445 EvalTable[STCH] = &Simulator::Evaluate_STCH;
1446 EvalTable[LHH] = &Simulator::Evaluate_LHH;
1447 EvalTable[LLHH] = &Simulator::Evaluate_LLHH;
1448 EvalTable[STHH] = &Simulator::Evaluate_STHH;
1449 EvalTable[LFHAT] = &Simulator::Evaluate_LFHAT;
1450 EvalTable[LFH] = &Simulator::Evaluate_LFH;
1451 EvalTable[STFH] = &Simulator::Evaluate_STFH;
1452 EvalTable[CHF] = &Simulator::Evaluate_CHF;
1453 EvalTable[MVCDK] = &Simulator::Evaluate_MVCDK;
1454 EvalTable[MVHHI] = &Simulator::Evaluate_MVHHI;
1455 EvalTable[MVGHI] = &Simulator::Evaluate_MVGHI;
1456 EvalTable[MVHI] = &Simulator::Evaluate_MVHI;
1457 EvalTable[CHHSI] = &Simulator::Evaluate_CHHSI;
1458 EvalTable[CGHSI] = &Simulator::Evaluate_CGHSI;
1459 EvalTable[CHSI] = &Simulator::Evaluate_CHSI;
1460 EvalTable[CLFHSI] = &Simulator::Evaluate_CLFHSI;
1461 EvalTable[TBEGIN] = &Simulator::Evaluate_TBEGIN;
1462 EvalTable[TBEGINC] = &Simulator::Evaluate_TBEGINC;
1463 EvalTable[LMG] = &Simulator::Evaluate_LMG;
1464 EvalTable[SRAG] = &Simulator::Evaluate_SRAG;
1465 EvalTable[SLAG] = &Simulator::Evaluate_SLAG;
1466 EvalTable[SRLG] = &Simulator::Evaluate_SRLG;
1467 EvalTable[SLLG] = &Simulator::Evaluate_SLLG;
1468 EvalTable[CSY] = &Simulator::Evaluate_CSY;
1469 EvalTable[CSG] = &Simulator::Evaluate_CSG;
1470 EvalTable[RLLG] = &Simulator::Evaluate_RLLG;
1471 EvalTable[RLL] = &Simulator::Evaluate_RLL;
1472 EvalTable[STMG] = &Simulator::Evaluate_STMG;
1473 EvalTable[STMH] = &Simulator::Evaluate_STMH;
1474 EvalTable[STCMH] = &Simulator::Evaluate_STCMH;
1475 EvalTable[STCMY] = &Simulator::Evaluate_STCMY;
1476 EvalTable[CDSY] = &Simulator::Evaluate_CDSY;
1477 EvalTable[CDSG] = &Simulator::Evaluate_CDSG;
1478 EvalTable[BXHG] = &Simulator::Evaluate_BXHG;
1479 EvalTable[BXLEG] = &Simulator::Evaluate_BXLEG;
1480 EvalTable[ECAG] = &Simulator::Evaluate_ECAG;
1481 EvalTable[TMY] = &Simulator::Evaluate_TMY;
1482 EvalTable[MVIY] = &Simulator::Evaluate_MVIY;
1483 EvalTable[NIY] = &Simulator::Evaluate_NIY;
1484 EvalTable[CLIY] = &Simulator::Evaluate_CLIY;
1485 EvalTable[OIY] = &Simulator::Evaluate_OIY;
1486 EvalTable[XIY] = &Simulator::Evaluate_XIY;
1487 EvalTable[ASI] = &Simulator::Evaluate_ASI;
1488 EvalTable[ALSI] = &Simulator::Evaluate_ALSI;
1489 EvalTable[AGSI] = &Simulator::Evaluate_AGSI;
1490 EvalTable[ALGSI] = &Simulator::Evaluate_ALGSI;
1491 EvalTable[ICMH] = &Simulator::Evaluate_ICMH;
1492 EvalTable[ICMY] = &Simulator::Evaluate_ICMY;
1493 EvalTable[MVCLU] = &Simulator::Evaluate_MVCLU;
1494 EvalTable[CLCLU] = &Simulator::Evaluate_CLCLU;
1495 EvalTable[STMY] = &Simulator::Evaluate_STMY;
1496 EvalTable[LMH] = &Simulator::Evaluate_LMH;
1497 EvalTable[LMY] = &Simulator::Evaluate_LMY;
1498 EvalTable[TP] = &Simulator::Evaluate_TP;
1499 EvalTable[SRAK] = &Simulator::Evaluate_SRAK;
1500 EvalTable[SLAK] = &Simulator::Evaluate_SLAK;
1501 EvalTable[SRLK] = &Simulator::Evaluate_SRLK;
1502 EvalTable[SLLK] = &Simulator::Evaluate_SLLK;
1503 EvalTable[LOCG] = &Simulator::Evaluate_LOCG;
1504 EvalTable[STOCG] = &Simulator::Evaluate_STOCG;
1505 EvalTable[LANG] = &Simulator::Evaluate_LANG;
1506 EvalTable[LAOG] = &Simulator::Evaluate_LAOG;
1507 EvalTable[LAXG] = &Simulator::Evaluate_LAXG;
1508 EvalTable[LAAG] = &Simulator::Evaluate_LAAG;
1509 EvalTable[LAALG] = &Simulator::Evaluate_LAALG;
1510 EvalTable[LOC] = &Simulator::Evaluate_LOC;
1511 EvalTable[STOC] = &Simulator::Evaluate_STOC;
1512 EvalTable[LAN] = &Simulator::Evaluate_LAN;
1513 EvalTable[LAO] = &Simulator::Evaluate_LAO;
1514 EvalTable[LAX] = &Simulator::Evaluate_LAX;
1515 EvalTable[LAA] = &Simulator::Evaluate_LAA;
1516 EvalTable[LAAL] = &Simulator::Evaluate_LAAL;
1517 EvalTable[BRXHG] = &Simulator::Evaluate_BRXHG;
1518 EvalTable[BRXLG] = &Simulator::Evaluate_BRXLG;
1519 EvalTable[RISBLG] = &Simulator::Evaluate_RISBLG;
1520 EvalTable[RNSBG] = &Simulator::Evaluate_RNSBG;
1521 EvalTable[RISBG] = &Simulator::Evaluate_RISBG;
1522 EvalTable[ROSBG] = &Simulator::Evaluate_ROSBG;
1523 EvalTable[RXSBG] = &Simulator::Evaluate_RXSBG;
1524 EvalTable[RISBGN] = &Simulator::Evaluate_RISBGN;
1525 EvalTable[RISBHG] = &Simulator::Evaluate_RISBHG;
1526 EvalTable[CGRJ] = &Simulator::Evaluate_CGRJ;
1527 EvalTable[CGIT] = &Simulator::Evaluate_CGIT;
1528 EvalTable[CIT] = &Simulator::Evaluate_CIT;
1529 EvalTable[CLFIT] = &Simulator::Evaluate_CLFIT;
1530 EvalTable[CGIJ] = &Simulator::Evaluate_CGIJ;
1531 EvalTable[CIJ] = &Simulator::Evaluate_CIJ;
1532 EvalTable[AHIK] = &Simulator::Evaluate_AHIK;
1533 EvalTable[AGHIK] = &Simulator::Evaluate_AGHIK;
1534 EvalTable[ALHSIK] = &Simulator::Evaluate_ALHSIK;
1535 EvalTable[ALGHSIK] = &Simulator::Evaluate_ALGHSIK;
1536 EvalTable[CGRB] = &Simulator::Evaluate_CGRB;
1537 EvalTable[CGIB] = &Simulator::Evaluate_CGIB;
1538 EvalTable[CIB] = &Simulator::Evaluate_CIB;
1539 EvalTable[LDEB] = &Simulator::Evaluate_LDEB;
1540 EvalTable[LXDB] = &Simulator::Evaluate_LXDB;
1541 EvalTable[LXEB] = &Simulator::Evaluate_LXEB;
1542 EvalTable[MXDB] = &Simulator::Evaluate_MXDB;
1543 EvalTable[KEB] = &Simulator::Evaluate_KEB;
1544 EvalTable[CEB] = &Simulator::Evaluate_CEB;
1545 EvalTable[AEB] = &Simulator::Evaluate_AEB;
1546 EvalTable[
SEB] = &Simulator::Evaluate_SEB;
1547 EvalTable[MDEB] = &Simulator::Evaluate_MDEB;
1548 EvalTable[DEB] = &Simulator::Evaluate_DEB;
1549 EvalTable[MAEB] = &Simulator::Evaluate_MAEB;
1550 EvalTable[MSEB] = &Simulator::Evaluate_MSEB;
1551 EvalTable[TCEB] = &Simulator::Evaluate_TCEB;
1552 EvalTable[TCDB] = &Simulator::Evaluate_TCDB;
1553 EvalTable[TCXB] = &Simulator::Evaluate_TCXB;
1554 EvalTable[SQEB] = &Simulator::Evaluate_SQEB;
1555 EvalTable[SQDB] = &Simulator::Evaluate_SQDB;
1556 EvalTable[MEEB] = &Simulator::Evaluate_MEEB;
1557 EvalTable[KDB] = &Simulator::Evaluate_KDB;
1558 EvalTable[CDB] = &Simulator::Evaluate_CDB;
1559 EvalTable[ADB] = &Simulator::Evaluate_ADB;
1560 EvalTable[SDB] = &Simulator::Evaluate_SDB;
1561 EvalTable[MDB] = &Simulator::Evaluate_MDB;
1562 EvalTable[DDB] = &Simulator::Evaluate_DDB;
1563 EvalTable[MADB] = &Simulator::Evaluate_MADB;
1564 EvalTable[MSDB] = &Simulator::Evaluate_MSDB;
1565 EvalTable[SLDT] = &Simulator::Evaluate_SLDT;
1566 EvalTable[SRDT] = &Simulator::Evaluate_SRDT;
1567 EvalTable[SLXT] = &Simulator::Evaluate_SLXT;
1568 EvalTable[SRXT] = &Simulator::Evaluate_SRXT;
1569 EvalTable[TDCET] = &Simulator::Evaluate_TDCET;
1570 EvalTable[TDGET] = &Simulator::Evaluate_TDGET;
1571 EvalTable[TDCDT] = &Simulator::Evaluate_TDCDT;
1572 EvalTable[TDGDT] = &Simulator::Evaluate_TDGDT;
1573 EvalTable[TDCXT] = &Simulator::Evaluate_TDCXT;
1574 EvalTable[TDGXT] = &Simulator::Evaluate_TDGXT;
1575 EvalTable[LEY] = &Simulator::Evaluate_LEY;
1576 EvalTable[LDY] = &Simulator::Evaluate_LDY;
1577 EvalTable[STEY] = &Simulator::Evaluate_STEY;
1578 EvalTable[STDY] = &Simulator::Evaluate_STDY;
1579 EvalTable[CZDT] = &Simulator::Evaluate_CZDT;
1580 EvalTable[CZXT] = &Simulator::Evaluate_CZXT;
1581 EvalTable[CDZT] = &Simulator::Evaluate_CDZT;
1582 EvalTable[CXZT] = &Simulator::Evaluate_CXZT;
1585Simulator::Simulator(Isolate* isolate) :
isolate_(isolate) {
1587 base::CallOnce(&once, &Simulator::EvalTableInit);
1590 stack_ =
reinterpret_cast<uint8_t*
>(base::Malloc(AllocatedStackSize()));
1591 pc_modified_ =
false;
1593 break_pc_ =
nullptr;
1600 for (
int i = 0;
i < kNumGPRs;
i++) {
1604 special_reg_pc_ = 0;
1607 for (
int i = 0;
i < kNumFPRs;
i++) {
1608 set_simd_register_by_lane<double>(
i, 0, 0.0);
1609 set_simd_register_by_lane<double>(
i, 1, 0.0);
1617 last_debugger_input_ =
nullptr;
1620 SetMutexDeadlockDetectionMode(absl::OnDeadlockCycle::kIgnore);
1623Simulator::~Simulator() { base::Free(stack_); }
1626Simulator* Simulator::current(Isolate* isolate) {
1628 isolate->FindOrAllocatePerThreadDataForThisThread();
1631 Simulator* sim = isolate_data->simulator();
1632 if (sim ==
nullptr) {
1634 sim =
new Simulator(isolate);
1635 isolate_data->set_simulator(sim);
1641void Simulator::set_register(
int reg, uint64_t value) {
1647const uint64_t& Simulator::get_register(
int reg)
const {
1652uint64_t& Simulator::get_register(
int reg) {
1657template <
typename T>
1658T Simulator::get_low_register(
int reg)
const {
1662 if (
reg >= kNumGPRs)
return 0;
1667template <
typename T>
1668T Simulator::get_high_register(
int reg)
const {
1672 if (
reg >= kNumGPRs)
return 0;
1677template <
class T,
class R>
1678static R ComputeSignedRoundingResult(T a, T n) {
1679 constexpr T NINF = -std::numeric_limits<T>::infinity();
1680 constexpr T PINF = std::numeric_limits<T>::infinity();
1681 constexpr long double MN =
1682 static_cast<long double>(std::numeric_limits<R>::min());
1683 constexpr long double MP =
1684 static_cast<long double>(std::numeric_limits<R>::max());
1686 if (NINF <= a && a < MN && n < MN) {
1687 return std::numeric_limits<R>::min();
1688 }
else if (NINF < a && a < MN && n == MN) {
1689 return std::numeric_limits<R>::min();
1690 }
else if (MN <= a && a < 0.0) {
1691 return static_cast<R
>(
n);
1692 }
else if (a == 0.0) {
1694 }
else if (0.0 < a && a <= MP) {
1695 return static_cast<R
>(
n);
1696 }
else if (MP < a && a <= PINF && n == MP) {
1697 return std::numeric_limits<R>::max();
1699 return std::numeric_limits<R>::max();
1700 }
else if (std::isnan(a)) {
1701 return std::numeric_limits<R>::min();
1707template <
class T,
class R>
1708static R ComputeLogicalRoundingResult(T a, T n) {
1709 constexpr T NINF = -std::numeric_limits<T>::infinity();
1710 constexpr T PINF = std::numeric_limits<T>::infinity();
1711 constexpr long double MP =
1712 static_cast<long double>(std::numeric_limits<R>::max());
1714 if (NINF <= a && a <= 0.0) {
1716 }
else if (0.0 < a && a <= MP) {
1717 return static_cast<R
>(
n);
1718 }
else if (MP < a && a <= PINF) {
1719 return std::numeric_limits<R>::max();
1720 }
else if (std::isnan(a)) {
1727void Simulator::set_low_register(
int reg, uint32_t value) {
1728 uint64_t shifted_val =
static_cast<uint64_t
>(
value);
1730 uint64_t
result = (orig_val >> 32 << 32) | shifted_val;
1734void Simulator::set_high_register(
int reg, uint32_t value) {
1735 uint64_t shifted_val =
static_cast<uint64_t
>(
value) << 32;
1737 uint64_t
result = (orig_val & 0xFFFFFFFF) | shifted_val;
1741double Simulator::get_double_from_register_pair(
int reg) {
1743 double dm_val = 0.0;
1748void Simulator::set_pc(intptr_t value) {
1749 pc_modified_ =
true;
1750 special_reg_pc_ =
value;
1753bool Simulator::has_bad_pc()
const {
1754 return ((special_reg_pc_ == bad_lr) || (special_reg_pc_ == end_sim_pc));
1758intptr_t Simulator::get_pc()
const {
return special_reg_pc_; }
1764void Simulator::GetFpArgs(
double*
x,
double*
y, intptr_t*
z) {
1765 *
x = get_fpr<double>(0);
1766 *
y = get_fpr<double>(2);
1767 *
z = get_register(2);
1771void Simulator::SetFpResult(
const double&
result) { set_fpr(0,
result); }
1773void Simulator::TrashCallerSaveRegisters() {
1782uint32_t Simulator::ReadWU(intptr_t addr) {
1783 uint32_t* ptr =
reinterpret_cast<uint32_t*
>(addr);
1787int64_t Simulator::ReadW64(intptr_t addr) {
1788 int64_t* ptr =
reinterpret_cast<int64_t*
>(addr);
1792int32_t Simulator::ReadW(intptr_t addr) {
1797void Simulator::WriteW(intptr_t addr, uint32_t value) {
1798 uint32_t* ptr =
reinterpret_cast<uint32_t*
>(addr);
1803void Simulator::WriteW(intptr_t addr, int32_t value) {
1809uint16_t Simulator::ReadHU(intptr_t addr) {
1814int16_t Simulator::ReadH(intptr_t addr) {
1819void Simulator::WriteH(intptr_t addr, uint16_t value) {
1825void Simulator::WriteH(intptr_t addr, int16_t value) {
1831uint8_t Simulator::ReadBU(intptr_t addr) {
1832 uint8_t* ptr =
reinterpret_cast<uint8_t*
>(addr);
1836int8_t Simulator::ReadB(intptr_t addr) {
1837 int8_t* ptr =
reinterpret_cast<int8_t*
>(addr);
1841void Simulator::WriteB(intptr_t addr, uint8_t value) {
1842 uint8_t* ptr =
reinterpret_cast<uint8_t*
>(addr);
1846void Simulator::WriteB(intptr_t addr, int8_t value) {
1847 int8_t* ptr =
reinterpret_cast<int8_t*
>(addr);
1851int64_t Simulator::ReadDW(intptr_t addr) {
1852 int64_t* ptr =
reinterpret_cast<int64_t*
>(addr);
1856void Simulator::WriteDW(intptr_t addr, int64_t value) {
1857 int64_t* ptr =
reinterpret_cast<int64_t*
>(addr);
1865double Simulator::ReadDouble(intptr_t addr) {
1866 double* ptr =
reinterpret_cast<double*
>(addr);
1870float Simulator::ReadFloat(intptr_t addr) {
1871 float* ptr =
reinterpret_cast<float*
>(addr);
1876uintptr_t Simulator::StackLimit(uintptr_t c_limit)
const {
1879 if (base::Stack::GetCurrentStackPosition() < c_limit) {
1880 return reinterpret_cast<uintptr_t
>(get_sp());
1885 return reinterpret_cast<uintptr_t
>(stack_) + kStackProtectionSize;
1888uintptr_t Simulator::StackBase()
const {
1889 return reinterpret_cast<uintptr_t
>(stack_) + UsableStackSize();
1892base::Vector<uint8_t> Simulator::GetCentralStackView()
const {
1896 return base::VectorOf(stack_, UsableStackSize());
1900 for (
int i = 0;
i < kNumGPRs; ++
i) {
1901 visitor->
VisitPointer(
reinterpret_cast<const void*
>(get_register(
i)));
1904 for (
const void*
const* current =
1905 reinterpret_cast<const void* const*
>(get_sp());
1907 const void* address = *
current;
1908 if (address ==
nullptr) {
1916void Simulator::Format(Instruction*
instr,
const char* format) {
1917 PrintF(
"Simulator found unsupported instruction:\n 0x%08" V8PRIxPTR ": %s\n",
1918 reinterpret_cast<intptr_t
>(
instr), format);
1923bool Simulator::CarryFrom(int32_t left, int32_t right, int32_t carry) {
1924 uint32_t uleft =
static_cast<uint32_t
>(left);
1925 uint32_t uright =
static_cast<uint32_t
>(right);
1926 uint32_t urest = 0xFFFFFFFFU - uleft;
1928 return (uright > urest) ||
1929 (
carry && (((uright + 1) > urest) || (uright > (urest - 1))));
1933bool Simulator::BorrowFrom(int32_t left, int32_t right) {
1934 uint32_t uleft =
static_cast<uint32_t
>(left);
1935 uint32_t uright =
static_cast<uint32_t
>(right);
1937 return (uright > uleft);
1941template <
typename T1>
1942bool Simulator::OverflowFromSigned(
T1 alu_out,
T1 left,
T1 right,
1947 overflow = ((left >= 0 && right >= 0) || (left < 0 && right < 0))
1949 && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
1952 overflow = ((left < 0 && right >= 0) || (left >= 0 && right < 0))
1954 && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
1959static void decodeObjectPair(ObjectPair* pair, intptr_t*
x, intptr_t*
y) {
1960 *
x =
static_cast<intptr_t
>(pair->x);
1961 *
y =
static_cast<intptr_t
>(pair->y);
1965using SimulatorRuntimeCall = intptr_t (*)(
1966 intptr_t arg0, intptr_t arg1, intptr_t arg2, intptr_t arg3, intptr_t arg4,
1967 intptr_t arg5, intptr_t arg6, intptr_t arg7, intptr_t arg8, intptr_t arg9,
1968 intptr_t arg10, intptr_t arg11, intptr_t arg12, intptr_t arg13,
1969 intptr_t arg14, intptr_t arg15, intptr_t arg16, intptr_t arg17,
1970 intptr_t arg18, intptr_t arg19);
1971using SimulatorRuntimePairCall =
ObjectPair (*)(
1972 intptr_t arg0, intptr_t arg1, intptr_t arg2, intptr_t arg3, intptr_t arg4,
1973 intptr_t arg5, intptr_t arg6, intptr_t arg7, intptr_t arg8, intptr_t arg9,
1974 intptr_t arg10, intptr_t arg11, intptr_t arg12, intptr_t arg13,
1975 intptr_t arg14, intptr_t arg15, intptr_t arg16, intptr_t arg17,
1976 intptr_t arg18, intptr_t arg19);
1979using SimulatorRuntimeCompareCall = int (*)(
double darg0,
double darg1);
1980using SimulatorRuntimeFPFPCall = double (*)(
double darg0,
double darg1);
1981using SimulatorRuntimeFPCall = double (*)(
double darg0);
1982using SimulatorRuntimeFPIntCall = double (*)(
double darg0, intptr_t arg0);
1983using SimulatorRuntimeIntFPCall =
int32_t (*)(
double darg0);
1986using SimulatorRuntimeFPTaggedCall = double (*)(
int32_t arg0,
int32_t arg1,
1991using SimulatorRuntimeDirectApiCall = void (*)(intptr_t arg0);
1993using SimulatorRuntimeDirectGetterCall = void (*)(intptr_t arg0, intptr_t arg1);
1997void Simulator::SoftwareInterrupt(Instruction*
instr) {
1998 int svc =
instr->SvcValue();
2003 bool stack_aligned =
2004 (get_register(sp) & (
v8_flags.sim_stack_alignment - 1)) == 0;
2005 Redirection* redirection = Redirection::FromInstruction(
instr);
2006 const int kArgCount = 20;
2007 const int kRegisterArgCount = 5;
2008 int arg0_regnum = 2;
2009 intptr_t result_buffer = 0;
2010 bool uses_result_buffer =
2011 redirection->type() == ExternalReference::BUILTIN_CALL_PAIR &&
2013 if (uses_result_buffer) {
2014 result_buffer = get_register(r2);
2017 intptr_t arg[kArgCount];
2019 for (
int i = 0;
i < kRegisterArgCount;
i++) {
2020 arg[
i] = get_register(arg0_regnum +
i);
2023 intptr_t* stack_pointer =
reinterpret_cast<intptr_t*
>(get_register(sp));
2024 for (
int i = kRegisterArgCount;
i < kArgCount;
i++) {
2027 (
i - kRegisterArgCount)];
2029 static_assert(kArgCount == kRegisterArgCount + 15);
2030 static_assert(kMaxCParameters == kArgCount);
2032 (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) ||
2033 (redirection->type() == ExternalReference::BUILTIN_COMPARE_CALL) ||
2034 (redirection->type() == ExternalReference::BUILTIN_FP_CALL) ||
2035 (redirection->type() == ExternalReference::BUILTIN_FP_INT_CALL) ||
2036 (redirection->type() == ExternalReference::BUILTIN_INT_FP_CALL);
2039 *
reinterpret_cast<intptr_t*
>(get_register(sp) +
2044 reinterpret_cast<intptr_t
>(redirection->external_function());
2046 double dval0, dval1;
2050 GetFpArgs(&dval0, &dval1, &ival);
2051 if (InstructionTracingEnabled() || !stack_aligned) {
2052 SimulatorRuntimeCall generic_target =
2053 reinterpret_cast<SimulatorRuntimeCall
>(external);
2054 switch (redirection->type()) {
2055 case ExternalReference::BUILTIN_FP_FP_CALL:
2056 case ExternalReference::BUILTIN_COMPARE_CALL:
2057 PrintF(
"Call to host function at %p with args %f, %f",
2061 case ExternalReference::BUILTIN_FP_CALL:
2062 PrintF(
"Call to host function at %p with arg %f",
2066 case ExternalReference::BUILTIN_FP_INT_CALL:
2071 case ExternalReference::BUILTIN_INT_FP_CALL:
2072 PrintF(
"Call to host function at %p with args %f",
2079 if (!stack_aligned) {
2081 static_cast<intptr_t
>(get_register(sp)));
2085 CHECK(stack_aligned);
2086 switch (redirection->type()) {
2087 case ExternalReference::BUILTIN_COMPARE_CALL: {
2088 SimulatorRuntimeCompareCall target =
2089 reinterpret_cast<SimulatorRuntimeCompareCall
>(external);
2090 iresult =
target(dval0, dval1);
2091 set_register(r2, iresult);
2094 case ExternalReference::BUILTIN_FP_FP_CALL: {
2095 SimulatorRuntimeFPFPCall target =
2096 reinterpret_cast<SimulatorRuntimeFPFPCall
>(external);
2097 dresult =
target(dval0, dval1);
2098 SetFpResult(dresult);
2101 case ExternalReference::BUILTIN_FP_CALL: {
2102 SimulatorRuntimeFPCall target =
2103 reinterpret_cast<SimulatorRuntimeFPCall
>(external);
2105 SetFpResult(dresult);
2108 case ExternalReference::BUILTIN_FP_INT_CALL: {
2109 SimulatorRuntimeFPIntCall target =
2110 reinterpret_cast<SimulatorRuntimeFPIntCall
>(external);
2111 dresult =
target(dval0, ival);
2112 SetFpResult(dresult);
2115 case ExternalReference::BUILTIN_INT_FP_CALL: {
2116 SimulatorRuntimeIntFPCall target =
2117 reinterpret_cast<SimulatorRuntimeIntFPCall
>(external);
2120 TrashCallerSaveRegisters();
2122 set_register(r0,
static_cast<int32_t>(iresult));
2128 if (InstructionTracingEnabled()) {
2129 switch (redirection->type()) {
2130 case ExternalReference::BUILTIN_COMPARE_CALL:
2131 case ExternalReference::BUILTIN_INT_FP_CALL:
2132 PrintF(
"Returned %08x\n", iresult);
2134 case ExternalReference::BUILTIN_FP_FP_CALL:
2135 case ExternalReference::BUILTIN_FP_CALL:
2136 case ExternalReference::BUILTIN_FP_INT_CALL:
2137 PrintF(
"Returned %f\n", dresult);
2143 }
else if (redirection->type() ==
2144 ExternalReference::BUILTIN_FP_POINTER_CALL) {
2145 if (InstructionTracingEnabled() || !stack_aligned) {
2147 reinterpret_cast<void*
>(external), arg[0]);
2148 if (!stack_aligned) {
2154 CHECK(stack_aligned);
2155 SimulatorRuntimeFPTaggedCall target =
2156 reinterpret_cast<SimulatorRuntimeFPTaggedCall
>(external);
2157 double dresult =
target(arg[0], arg[1], arg[2], arg[3]);
2159 TrashCallerSaveRegisters();
2161 SetFpResult(dresult);
2162 if (InstructionTracingEnabled()) {
2163 PrintF(
"Returned %f\n", dresult);
2165 }
else if (redirection->type() == ExternalReference::DIRECT_API_CALL) {
2169 if (InstructionTracingEnabled() || !stack_aligned) {
2171 reinterpret_cast<void*
>(external), arg[0]);
2172 if (!stack_aligned) {
2174 static_cast<intptr_t
>(get_register(sp)));
2178 CHECK(stack_aligned);
2179 SimulatorRuntimeDirectApiCall target =
2180 reinterpret_cast<SimulatorRuntimeDirectApiCall
>(external);
2182 }
else if (redirection->type() == ExternalReference::DIRECT_GETTER_CALL) {
2186 if (InstructionTracingEnabled() || !stack_aligned) {
2189 reinterpret_cast<void*
>(external), arg[0], arg[1]);
2190 if (!stack_aligned) {
2192 static_cast<intptr_t
>(get_register(sp)));
2196 CHECK(stack_aligned);
2197 SimulatorRuntimeDirectGetterCall target =
2198 reinterpret_cast<SimulatorRuntimeDirectGetterCall
>(external);
2200 arg[0] = base::bit_cast<intptr_t>(arg[0]);
2205 if (InstructionTracingEnabled() || !stack_aligned) {
2206 SimulatorRuntimeCall target =
2207 reinterpret_cast<SimulatorRuntimeCall
>(external);
2209 "Call to host function at %p,\n"
2217 reinterpret_cast<void*
>(
FUNCTION_ADDR(target)), arg[0], arg[1],
2218 arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], arg[8], arg[9],
2219 arg[10], arg[11], arg[12], arg[13], arg[14], arg[15], arg[16],
2220 arg[17], arg[18], arg[19]);
2221 if (!stack_aligned) {
2223 static_cast<intptr_t
>(get_register(sp)));
2227 CHECK(stack_aligned);
2228 if (redirection->type() == ExternalReference::BUILTIN_CALL_PAIR) {
2229 SimulatorRuntimePairCall target =
2230 reinterpret_cast<SimulatorRuntimePairCall
>(external);
2232 target(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6],
2233 arg[7], arg[8], arg[9], arg[10], arg[11], arg[12], arg[13],
2234 arg[14], arg[15], arg[16], arg[17], arg[18], arg[19]);
2238 if (InstructionTracingEnabled()) {
2242 set_register(r2,
x);
2243 set_register(r3,
y);
2245 memcpy(
reinterpret_cast<void*
>(result_buffer), &
result,
2246 sizeof(ObjectPair));
2247 set_register(r2, result_buffer);
2260 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL ||
2261 redirection->type() == ExternalReference::FAST_C_CALL);
2262 SimulatorRuntimeCall target =
2263 reinterpret_cast<SimulatorRuntimeCall
>(external);
2265 target(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6],
2266 arg[7], arg[8], arg[9], arg[10], arg[11], arg[12], arg[13],
2267 arg[14], arg[15], arg[16], arg[17], arg[18], arg[19]);
2268 if (InstructionTracingEnabled()) {
2271 set_register(r2,
result);
2303 int64_t saved_lr = *
reinterpret_cast<intptr_t*
>(
2309 S390Debugger(
this).Debug();
2313 if (svc >= (1 << 23)) {
2315 if (isWatchedStop(code)) {
2316 IncreaseStopCounter(code);
2320 if (isEnabledStop(code)) {
2321 if (code != kMaxStopCode) {
2322 PrintF(
"Simulator hit stop %u. ", code);
2324 PrintF(
"Simulator hit stop. ");
2328 set_pc(get_pc() +
sizeof(FourByteInstr) + kSystemPointerSize);
2338bool Simulator::isStopInstruction(Instruction*
instr) {
2339 return (
instr->Bits(27, 24) == 0xF) && (
instr->SvcValue() >= kStopCode);
2342bool Simulator::isWatchedStop(uint32_t code) {
2344 return code < kNumOfWatchedStops;
2347bool Simulator::isEnabledStop(uint32_t code) {
2350 return !isWatchedStop(code) ||
2351 !(watched_stops_[
code].count & kStopDisabledBit);
2354void Simulator::EnableStop(uint32_t code) {
2355 DCHECK(isWatchedStop(code));
2356 if (!isEnabledStop(code)) {
2357 watched_stops_[
code].count &= ~kStopDisabledBit;
2361void Simulator::DisableStop(uint32_t code) {
2362 DCHECK(isWatchedStop(code));
2363 if (isEnabledStop(code)) {
2364 watched_stops_[
code].count |= kStopDisabledBit;
2368void Simulator::IncreaseStopCounter(uint32_t code) {
2370 DCHECK(isWatchedStop(code));
2371 if ((watched_stops_[code].count & ~(1 << 31)) == 0x7FFFFFFF) {
2373 "Stop counter for code %i has overflowed.\n"
2374 "Enabling this code and reseting the counter to 0.\n",
2376 watched_stops_[
code].count = 0;
2379 watched_stops_[
code].count++;
2384void Simulator::PrintStopInfo(uint32_t code) {
2386 if (!isWatchedStop(code)) {
2387 PrintF(
"Stop not watched.");
2389 const char* state = isEnabledStop(code) ?
"Enabled" :
"Disabled";
2390 int32_t count = watched_stops_[
code].count & ~kStopDisabledBit;
2393 if (watched_stops_[code].desc) {
2394 PrintF(
"stop %i - 0x%x: \t%s, \tcounter = %i, \t%s\n", code, code,
2395 state, count, watched_stops_[code].desc);
2397 PrintF(
"stop %i - 0x%x: \t%s, \tcounter = %i\n", code, code, state,
2410#define CheckOverflowForIntAdd(src1, src2, type) \
2411 OverflowFromSigned<type>(src1 + src2, src1, src2, true);
2413#define CheckOverflowForIntSub(src1, src2, type) \
2414 OverflowFromSigned<type>(src1 - src2, src1, src2, false);
2417#define CheckOverflowForUIntAdd(src1, src2) \
2418 ((src1) + (src2) < (src1) || (src1) + (src2) < (src2))
2421#define CheckOverflowForUIntSub(src1, src2) ((src1) - (src2) > (src1))
2424#define CheckOverflowForMul(src1, src2) (((src1) * (src2)) / (src2) != (src1))
2427#define CheckOverflowForShiftRight(src1, src2) \
2428 (((src1) >> (src2)) << (src2) != (src1))
2431#define CheckOverflowForShiftLeft(src1, src2) \
2432 (((src1) << (src2)) >> (src2) != (src1))
2434int Simulator::DecodeInstruction(Instruction*
instr) {
2437 return (this->*EvalTable[op])(
instr);
2441void Simulator::ExecuteInstruction(Instruction*
instr,
bool auto_incr_pc) {
2445 CheckICache(i_cache(),
instr);
2448 pc_modified_ =
false;
2450 if (InstructionTracingEnabled()) {
2455 dasm.InstructionDecode(buffer,
reinterpret_cast<uint8_t*
>(
instr));
2457 reinterpret_cast<intptr_t
>(
instr), buffer.
begin());
2465 int length = DecodeInstruction(
instr);
2467 if (!pc_modified_ && auto_incr_pc) {
2469 set_pc(
reinterpret_cast<intptr_t
>(
instr) + length);
2474void Simulator::DebugStart() {
2475 S390Debugger dbg(
this);
2479void Simulator::Execute() {
2482 intptr_t program_counter = get_pc();
2487 while (program_counter != end_sim_pc) {
2488 Instruction*
instr =
reinterpret_cast<Instruction*
>(program_counter);
2489 ExecuteInstruction(
instr);
2490 program_counter = get_pc();
2495 while (program_counter != end_sim_pc) {
2496 Instruction*
instr =
reinterpret_cast<Instruction*
>(program_counter);
2497 if (icount_ ==
v8_flags.stop_sim_at) {
2498 S390Debugger dbg(
this);
2501 ExecuteInstruction(
instr);
2503 program_counter = get_pc();
2508void Simulator::CallInternal(Address entry,
int reg_arg_count) {
2510 isolate_->stack_guard()->AdjustStackLimitForSimulator();
2515 set_pc(*(
reinterpret_cast<intptr_t*
>(entry)));
2518 set_pc(
static_cast<intptr_t
>(entry));
2521 int64_t r6_val = get_register(r6);
2522 int64_t r7_val = get_register(r7);
2523 int64_t r8_val = get_register(r8);
2524 int64_t r9_val = get_register(r9);
2525 int64_t r10_val = get_register(r10);
2526 int64_t r11_val = get_register(r11);
2527 int64_t r12_val = get_register(r12);
2528 int64_t r13_val = get_register(r13);
2532 set_register(ip, get_pc());
2542 uintptr_t callee_saved_value = icount_;
2543 if (reg_arg_count < 5) {
2544 set_register(r6, callee_saved_value + 6);
2546 set_register(r7, callee_saved_value + 7);
2547 set_register(r8, callee_saved_value + 8);
2548 set_register(r9, callee_saved_value + 9);
2549 set_register(r10, callee_saved_value + 10);
2550 set_register(r11, callee_saved_value + 11);
2551 set_register(r12, callee_saved_value + 12);
2552 set_register(r13, callee_saved_value + 13);
2558 if (reg_arg_count < 5) {
2559 DCHECK_EQ(callee_saved_value + 6, get_register(r6));
2561 DCHECK_EQ(callee_saved_value + 7, get_register(r7));
2562 DCHECK_EQ(callee_saved_value + 8, get_register(r8));
2563 DCHECK_EQ(callee_saved_value + 9, get_register(r9));
2564 DCHECK_EQ(callee_saved_value + 10, get_register(r10));
2565 DCHECK_EQ(callee_saved_value + 11, get_register(r11));
2566 DCHECK_EQ(callee_saved_value + 12, get_register(r12));
2567 DCHECK_EQ(callee_saved_value + 13, get_register(r13));
2570 set_register(r6, r6_val);
2571 set_register(r7, r7_val);
2572 set_register(r8, r8_val);
2573 set_register(r9, r9_val);
2574 set_register(r10, r10_val);
2575 set_register(r11, r11_val);
2576 set_register(r12, r12_val);
2577 set_register(r13, r13_val);
2580intptr_t Simulator::CallImpl(Address entry,
int argument_count,
2581 const intptr_t* arguments) {
2583 isolate_->stack_guard()->AdjustStackLimitForSimulator();
2586 int64_t r6_val = get_register(r6);
2587 int64_t r7_val = get_register(r7);
2588 int64_t r8_val = get_register(r8);
2589 int64_t r9_val = get_register(r9);
2590 int64_t r10_val = get_register(r10);
2591 int64_t r11_val = get_register(r11);
2592 int64_t r12_val = get_register(r12);
2593 int64_t r13_val = get_register(r13);
2598 int reg_arg_count = std::min(5, argument_count);
2599 int stack_arg_count = argument_count - reg_arg_count;
2600 for (
int i = 0;
i < reg_arg_count;
i++) {
2601 set_register(
i + 2, arguments[
i]);
2605 int64_t original_stack = get_register(sp);
2607 uintptr_t entry_stack =
2610 if (base::OS::ActivationFrameAlignment() != 0) {
2611 entry_stack &= -base::OS::ActivationFrameAlignment();
2615 intptr_t* stack_argument =
2617 memcpy(stack_argument, arguments + reg_arg_count,
2618 stack_arg_count *
sizeof(*arguments));
2619 set_register(sp, entry_stack);
2622#if ABI_USES_FUNCTION_DESCRIPTORS
2624 set_pc(*(
reinterpret_cast<intptr_t*
>(entry)));
2627 set_pc(
static_cast<intptr_t
>(entry));
2631 set_register(r12, get_pc());
2640 uintptr_t callee_saved_value = icount_;
2641 if (reg_arg_count < 5) {
2642 set_register(r6, callee_saved_value + 6);
2644 set_register(r7, callee_saved_value + 7);
2645 set_register(r8, callee_saved_value + 8);
2646 set_register(r9, callee_saved_value + 9);
2647 set_register(r10, callee_saved_value + 10);
2648 set_register(r11, callee_saved_value + 11);
2649 set_register(r12, callee_saved_value + 12);
2650 set_register(r13, callee_saved_value + 13);
2656 if (reg_arg_count < 5) {
2657 DCHECK_EQ(callee_saved_value + 6, get_register(r6));
2659 DCHECK_EQ(callee_saved_value + 7, get_register(r7));
2660 DCHECK_EQ(callee_saved_value + 8, get_register(r8));
2661 DCHECK_EQ(callee_saved_value + 9, get_register(r9));
2662 DCHECK_EQ(callee_saved_value + 10, get_register(r10));
2663 DCHECK_EQ(callee_saved_value + 11, get_register(r11));
2664 DCHECK_EQ(callee_saved_value + 12, get_register(r12));
2665 DCHECK_EQ(callee_saved_value + 13, get_register(r13));
2668 set_register(r6, r6_val);
2669 set_register(r7, r7_val);
2670 set_register(r8, r8_val);
2671 set_register(r9, r9_val);
2672 set_register(r10, r10_val);
2673 set_register(r11, r11_val);
2674 set_register(r12, r12_val);
2675 set_register(r13, r13_val);
2678 DCHECK_EQ(entry_stack, get_register(sp));
2679 set_register(sp, original_stack);
2682 return get_register(r2);
2685void Simulator::CallFP(Address entry,
double d0,
double d1) {
2688 CallInternal(entry);
2691int32_t Simulator::CallFPReturnsInt(Address entry,
double d0,
double d1) {
2692 CallFP(entry, d0, d1);
2697double Simulator::CallFPReturnsDouble(Address entry,
double d0,
double d1) {
2698 CallFP(entry, d0, d1);
2699 return get_fpr<double>(0);
2702uintptr_t Simulator::PushAddress(uintptr_t address) {
2703 uintptr_t new_sp = get_register(sp) -
sizeof(uintptr_t);
2704 uintptr_t* stack_slot =
reinterpret_cast<uintptr_t*
>(new_sp);
2705 *stack_slot = address;
2706 set_register(sp, new_sp);
2710uintptr_t Simulator::PopAddress() {
2711 uintptr_t current_sp = get_register(sp);
2712 uintptr_t* stack_slot =
reinterpret_cast<uintptr_t*
>(current_sp);
2713 uintptr_t address = *stack_slot;
2714 set_register(sp, current_sp +
sizeof(uintptr_t));
2718#define EVALUATE(name) int Simulator::Evaluate_##name(Instruction* instr)
2720#define DCHECK_OPCODE(op) DCHECK(instr->S390OpcodeValue() == op)
2722#define AS(type) reinterpret_cast<type*>(instr)
2724#define DECODE_RIL_A_INSTRUCTION(r1, i2) \
2725 int r1 = AS(RILInstruction)->R1Value(); \
2726 uint32_t i2 = AS(RILInstruction)->I2UnsignedValue(); \
2729#define DECODE_RIL_B_INSTRUCTION(r1, i2) \
2730 int r1 = AS(RILInstruction)->R1Value(); \
2731 int32_t i2 = AS(RILInstruction)->I2Value(); \
2734#define DECODE_RIL_C_INSTRUCTION(m1, ri2) \
2735 Condition m1 = static_cast<Condition>(AS(RILInstruction)->R1Value()); \
2736 uint64_t ri2 = AS(RILInstruction)->I2Value(); \
2739#define DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2) \
2740 int r1 = AS(RXYInstruction)->R1Value(); \
2741 int x2 = AS(RXYInstruction)->X2Value(); \
2742 int b2 = AS(RXYInstruction)->B2Value(); \
2743 int d2 = AS(RXYInstruction)->D2Value(); \
2746#define DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val) \
2747 int x2 = AS(RXInstruction)->X2Value(); \
2748 int b2 = AS(RXInstruction)->B2Value(); \
2749 int r1 = AS(RXInstruction)->R1Value(); \
2750 intptr_t d2_val = AS(RXInstruction)->D2Value(); \
2753#define DECODE_RS_A_INSTRUCTION(r1, r3, b2, d2) \
2754 int r3 = AS(RSInstruction)->R3Value(); \
2755 int b2 = AS(RSInstruction)->B2Value(); \
2756 int r1 = AS(RSInstruction)->R1Value(); \
2757 intptr_t d2 = AS(RSInstruction)->D2Value(); \
2760#define DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2) \
2761 int b2 = AS(RSInstruction)->B2Value(); \
2762 int r1 = AS(RSInstruction)->R1Value(); \
2763 int d2 = AS(RSInstruction)->D2Value(); \
2766#define DECODE_RSI_INSTRUCTION(r1, r3, i2) \
2767 int r1 = AS(RSIInstruction)->R1Value(); \
2768 int r3 = AS(RSIInstruction)->R3Value(); \
2769 int32_t i2 = AS(RSIInstruction)->I2Value(); \
2772#define DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val) \
2773 int b1 = AS(SIInstruction)->B1Value(); \
2774 intptr_t d1_val = AS(SIInstruction)->D1Value(); \
2775 uint8_t imm_val = AS(SIInstruction)->I2Value(); \
2778#define DECODE_SIL_INSTRUCTION(b1, d1, i2) \
2779 int b1 = AS(SILInstruction)->B1Value(); \
2780 intptr_t d1 = AS(SILInstruction)->D1Value(); \
2781 int16_t i2 = AS(SILInstruction)->I2Value(); \
2784#define DECODE_SIY_INSTRUCTION(b1, d1, i2) \
2785 int b1 = AS(SIYInstruction)->B1Value(); \
2786 intptr_t d1 = AS(SIYInstruction)->D1Value(); \
2787 uint8_t i2 = AS(SIYInstruction)->I2Value(); \
2790#define DECODE_RRE_INSTRUCTION(r1, r2) \
2791 int r1 = AS(RREInstruction)->R1Value(); \
2792 int r2 = AS(RREInstruction)->R2Value(); \
2795#define DECODE_RRE_INSTRUCTION_M3(r1, r2, m3) \
2796 int r1 = AS(RREInstruction)->R1Value(); \
2797 int r2 = AS(RREInstruction)->R2Value(); \
2798 int m3 = AS(RREInstruction)->M3Value(); \
2801#define DECODE_RRE_INSTRUCTION_NO_R2(r1) \
2802 int r1 = AS(RREInstruction)->R1Value(); \
2805#define DECODE_RRD_INSTRUCTION(r1, r2, r3) \
2806 int r1 = AS(RRDInstruction)->R1Value(); \
2807 int r2 = AS(RRDInstruction)->R2Value(); \
2808 int r3 = AS(RRDInstruction)->R3Value(); \
2811#define DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4) \
2812 int r1 = AS(RRFInstruction)->R1Value(); \
2813 int r2 = AS(RRFInstruction)->R2Value(); \
2814 int m3 = AS(RRFInstruction)->M3Value(); \
2815 int m4 = AS(RRFInstruction)->M4Value(); \
2818#define DECODE_RRF_A_INSTRUCTION(r1, r2, r3) \
2819 int r1 = AS(RRFInstruction)->R1Value(); \
2820 int r2 = AS(RRFInstruction)->R2Value(); \
2821 int r3 = AS(RRFInstruction)->R3Value(); \
2824#define DECODE_RRF_C_INSTRUCTION(r1, r2, m3) \
2825 int r1 = AS(RRFInstruction)->R1Value(); \
2826 int r2 = AS(RRFInstruction)->R2Value(); \
2827 Condition m3 = static_cast<Condition>(AS(RRFInstruction)->M3Value()); \
2830#define DECODE_RR_INSTRUCTION(r1, r2) \
2831 int r1 = AS(RRInstruction)->R1Value(); \
2832 int r2 = AS(RRInstruction)->R2Value(); \
2835#define DECODE_RIE_D_INSTRUCTION(r1, r2, i2) \
2836 int r1 = AS(RIEInstruction)->R1Value(); \
2837 int r2 = AS(RIEInstruction)->R2Value(); \
2838 int32_t i2 = AS(RIEInstruction)->I6Value(); \
2841#define DECODE_RIE_E_INSTRUCTION(r1, r2, i2) \
2842 int r1 = AS(RIEInstruction)->R1Value(); \
2843 int r2 = AS(RIEInstruction)->R2Value(); \
2844 int32_t i2 = AS(RIEInstruction)->I6Value(); \
2847#define DECODE_RIE_F_INSTRUCTION(r1, r2, i3, i4, i5) \
2848 int r1 = AS(RIEInstruction)->R1Value(); \
2849 int r2 = AS(RIEInstruction)->R2Value(); \
2850 uint32_t i3 = AS(RIEInstruction)->I3Value(); \
2851 uint32_t i4 = AS(RIEInstruction)->I4Value(); \
2852 uint32_t i5 = AS(RIEInstruction)->I5Value(); \
2855#define DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2) \
2856 int r1 = AS(RSYInstruction)->R1Value(); \
2857 int r3 = AS(RSYInstruction)->R3Value(); \
2858 int b2 = AS(RSYInstruction)->B2Value(); \
2859 intptr_t d2 = AS(RSYInstruction)->D2Value(); \
2862#define DECODE_RI_A_INSTRUCTION(instr, r1, i2) \
2863 int32_t r1 = AS(RIInstruction)->R1Value(); \
2864 int16_t i2 = AS(RIInstruction)->I2Value(); \
2867#define DECODE_RI_B_INSTRUCTION(instr, r1, i2) \
2868 int32_t r1 = AS(RILInstruction)->R1Value(); \
2869 int16_t i2 = AS(RILInstruction)->I2Value(); \
2872#define DECODE_RI_C_INSTRUCTION(instr, m1, i2) \
2873 Condition m1 = static_cast<Condition>(AS(RIInstruction)->R1Value()); \
2874 int16_t i2 = AS(RIInstruction)->I2Value(); \
2877#define DECODE_RXE_INSTRUCTION(r1, b2, x2, d2) \
2878 int r1 = AS(RXEInstruction)->R1Value(); \
2879 int b2 = AS(RXEInstruction)->B2Value(); \
2880 int x2 = AS(RXEInstruction)->X2Value(); \
2881 int d2 = AS(RXEInstruction)->D2Value(); \
2884#define DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3) \
2885 int r1 = AS(VRR_A_Instruction)->R1Value(); \
2886 int r2 = AS(VRR_A_Instruction)->R2Value(); \
2887 int m5 = AS(VRR_A_Instruction)->M5Value(); \
2888 int m4 = AS(VRR_A_Instruction)->M4Value(); \
2889 int m3 = AS(VRR_A_Instruction)->M3Value(); \
2892#define DECODE_VRR_B_INSTRUCTION(r1, r2, r3, m5, m4) \
2893 int r1 = AS(VRR_B_Instruction)->R1Value(); \
2894 int r2 = AS(VRR_B_Instruction)->R2Value(); \
2895 int r3 = AS(VRR_B_Instruction)->R3Value(); \
2896 int m5 = AS(VRR_B_Instruction)->M5Value(); \
2897 int m4 = AS(VRR_B_Instruction)->M4Value(); \
2900#define DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4) \
2901 int r1 = AS(VRR_C_Instruction)->R1Value(); \
2902 int r2 = AS(VRR_C_Instruction)->R2Value(); \
2903 int r3 = AS(VRR_C_Instruction)->R3Value(); \
2904 int m6 = AS(VRR_C_Instruction)->M6Value(); \
2905 int m5 = AS(VRR_C_Instruction)->M5Value(); \
2906 int m4 = AS(VRR_C_Instruction)->M4Value(); \
2909#define DECODE_VRR_E_INSTRUCTION(r1, r2, r3, r4, m6, m5) \
2910 int r1 = AS(VRR_E_Instruction)->R1Value(); \
2911 int r2 = AS(VRR_E_Instruction)->R2Value(); \
2912 int r3 = AS(VRR_E_Instruction)->R3Value(); \
2913 int r4 = AS(VRR_E_Instruction)->R4Value(); \
2914 int m6 = AS(VRR_E_Instruction)->M6Value(); \
2915 int m5 = AS(VRR_E_Instruction)->M5Value(); \
2918#define DECODE_VRR_F_INSTRUCTION(r1, r2, r3) \
2919 int r1 = AS(VRR_F_Instruction)->R1Value(); \
2920 int r2 = AS(VRR_F_Instruction)->R2Value(); \
2921 int r3 = AS(VRR_F_Instruction)->R3Value(); \
2924#define DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3) \
2925 int r1 = AS(VRX_Instruction)->R1Value(); \
2926 int x2 = AS(VRX_Instruction)->X2Value(); \
2927 int b2 = AS(VRX_Instruction)->B2Value(); \
2928 int d2 = AS(VRX_Instruction)->D2Value(); \
2929 int m3 = AS(VRX_Instruction)->M3Value(); \
2932#define DECODE_VRS_INSTRUCTION(r1, r3, b2, d2, m4) \
2933 int r1 = AS(VRS_Instruction)->R1Value(); \
2934 int r3 = AS(VRS_Instruction)->R3Value(); \
2935 int b2 = AS(VRS_Instruction)->B2Value(); \
2936 int d2 = AS(VRS_Instruction)->D2Value(); \
2937 int m4 = AS(VRS_Instruction)->M4Value(); \
2940#define DECODE_VRI_A_INSTRUCTION(r1, i2, m3) \
2941 int r1 = AS(VRI_A_Instruction)->R1Value(); \
2942 int16_t i2 = AS(VRI_A_Instruction)->I2Value(); \
2943 int m3 = AS(VRI_A_Instruction)->M3Value(); \
2946#define DECODE_VRI_C_INSTRUCTION(r1, r3, i2, m4) \
2947 int r1 = AS(VRI_C_Instruction)->R1Value(); \
2948 int r3 = AS(VRI_C_Instruction)->R3Value(); \
2949 uint16_t i2 = AS(VRI_C_Instruction)->I2Value(); \
2950 int m4 = AS(VRI_C_Instruction)->M4Value(); \
2953#define GET_ADDRESS(index_reg, base_reg, offset) \
2954 (((index_reg) == 0) ? 0 : get_register(index_reg)) + \
2955 (((base_reg) == 0) ? 0 : get_register(base_reg)) + offset
2961 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
2963 intptr_t addr = GET_ADDRESS(x2, b2, d2);
2964 fpr_t* ptr =
reinterpret_cast<fpr_t*
>(addr);
2965 *ptr = get_simd_register(r1);
2971 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
2973 intptr_t addr = GET_ADDRESS(x2, b2, d2);
2974 fpr_t* ptr =
reinterpret_cast<fpr_t*
>(addr);
2975 DCHECK(m3 != 3 || (0x7 & addr) == 0);
2976 DCHECK(m3 != 4 || (0xf & addr) == 0);
2977 set_simd_register(r1, *ptr);
2981#define VECTOR_LOAD_POSITIVE(r1, r2, type) \
2982 for (size_t i = 0, j = 0; j < kSimd128Size; i++, j += sizeof(type)) { \
2983 set_simd_register_by_lane<type>( \
2984 r1, i, abs(get_simd_register_by_lane<type>(r2, i))); \
2988 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
2993 VECTOR_LOAD_POSITIVE(r1, r2, int8_t)
2997 VECTOR_LOAD_POSITIVE(r1, r2, int16_t)
3001 VECTOR_LOAD_POSITIVE(r1, r2, int32_t)
3005 VECTOR_LOAD_POSITIVE(r1, r2, int64_t)
3014#undef VECTOR_LOAD_POSITIVE
3016#define VECTOR_AVERAGE_U(r1, r2, r3, type) \
3017 for (size_t i = 0, j = 0; j < kSimd128Size; i++, j += sizeof(type)) { \
3018 type src0 = get_simd_register_by_lane<type>(r2, i); \
3019 type src1 = get_simd_register_by_lane<type>(r3, i); \
3020 set_simd_register_by_lane<type>( \
3021 r1, i, (static_cast<type>(src0) + static_cast<type>(src1) + 1) >> 1); \
3024 DCHECK_OPCODE(VAVGL);
3025 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3030 VECTOR_AVERAGE_U(r1, r2, r3, uint8_t)
3034 VECTOR_AVERAGE_U(r1, r2, r3, uint16_t)
3038 VECTOR_AVERAGE_U(r1, r2, r3, uint32_t)
3042 VECTOR_AVERAGE_U(r1, r2, r3, uint64_t)
3051#undef VECTOR_AVERAGE_U
3054 DCHECK_OPCODE(VLGV);
3055 DECODE_VRS_INSTRUCTION(r1, r3, b2, d2, m4);
3056 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3057 int64_t index = b2_val + d2;
3058#define CASE(i, type) \
3060 set_register(r1, get_simd_register_by_lane<type>(r3, index)); \
3075 DCHECK_OPCODE(VLVG);
3076 DECODE_VRS_INSTRUCTION(r1, r3, b2, d2, m4);
3077 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3078 int64_t index = b2_val + d2;
3079#define CASE(i, type) \
3081 set_simd_register_by_lane<type>(r1, index, \
3082 static_cast<type>(get_register(r3))); \
3097 DCHECK_OPCODE(VLVGP);
3098 DECODE_VRR_F_INSTRUCTION(r1, r2, r3);
3099 set_simd_register_by_lane<int64_t>(r1, 0, get_register(r2));
3100 set_simd_register_by_lane<int64_t>(r1, 1, get_register(r3));
3104#define FOR_EACH_LANE(i, type) \
3105 for (uint32_t i = 0; i < kSimd128Size / sizeof(type); i++)
3108 DCHECK_OPCODE(VREP);
3109 DECODE_VRI_C_INSTRUCTION(r1, r3, i2, m4);
3110#define CASE(i, type) \
3112 FOR_EACH_LANE(j, type) { \
3113 set_simd_register_by_lane<type>( \
3114 r1, j, get_simd_register_by_lane<type>(r3, i2)); \
3131 DCHECK_OPCODE(VLREP);
3132 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3133 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3134#define CASE(i, type) \
3136 FOR_EACH_LANE(j, type) { \
3137 set_simd_register_by_lane<type>(r1, j, *reinterpret_cast<type*>(addr)); \
3154 DCHECK_OPCODE(VREPI);
3155 DECODE_VRI_A_INSTRUCTION(r1, i2, m3);
3156#define CASE(i, type) \
3158 FOR_EACH_LANE(j, type) { \
3159 set_simd_register_by_lane<type>(r1, j, static_cast<type>(i2)); \
3177 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3181 set_simd_register(r1, get_simd_register(r2));
3186 DCHECK_OPCODE(VSTEB);
3187 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3188 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3189 int8_t value = get_simd_register_by_lane<int8_t>(r1, m3);
3190 WriteB(addr, value);
3195 DCHECK_OPCODE(VSTEH);
3196 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3197 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3198 int16_t value = get_simd_register_by_lane<int16_t>(r1, m3);
3199 WriteH(addr, value);
3204 DCHECK_OPCODE(VSTEF);
3205 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3206 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3207 int32_t value = get_simd_register_by_lane<int32_t>(r1, m3);
3208 WriteW(addr, value);
3213 DCHECK_OPCODE(VSTEG);
3214 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3215 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3216 int64_t value = get_simd_register_by_lane<int64_t>(r1, m3);
3217 WriteDW(addr, value);
3222 DCHECK_OPCODE(VLEB);
3223 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3224 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3225 int8_t value = ReadB(addr);
3226 set_simd_register_by_lane<int8_t>(r1, m3, value);
3231 DCHECK_OPCODE(VLEH);
3232 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3233 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3235 set_simd_register_by_lane<int16_t>(r1, m3, value);
3240 DCHECK_OPCODE(VLEF);
3241 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3242 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3244 set_simd_register_by_lane<int32_t>(r1, m3, value);
3249 DCHECK_OPCODE(VLEG);
3250 DECODE_VRX_INSTRUCTION(r1, x2, b2, d2, m3);
3251 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3252 uint64_t value = ReadDW(addr);
3253 set_simd_register_by_lane<uint64_t>(r1, m3, value);
3258template <
class T,
class Operation>
3259inline static void VectorBinaryOp(Simulator* sim,
int dst,
int src1,
int src2,
3261 FOR_EACH_LANE(
i, T) {
3262 T src1_val = sim->get_simd_register_by_lane<T>(src1,
i);
3263 T src2_val = sim->get_simd_register_by_lane<T>(src2,
i);
3264 T dst_val = op(src1_val, src2_val);
3265 sim->set_simd_register_by_lane<T>(dst,
i, dst_val);
3269#define VECTOR_BINARY_OP_FOR_TYPE(type, op) \
3270 VectorBinaryOp<type>(this, r1, r2, r3, [](type a, type b) { return a op b; });
3272#define VECTOR_BINARY_OP(op) \
3275 VECTOR_BINARY_OP_FOR_TYPE(int8_t, op) \
3278 VECTOR_BINARY_OP_FOR_TYPE(int16_t, op) \
3281 VECTOR_BINARY_OP_FOR_TYPE(int32_t, op) \
3284 VECTOR_BINARY_OP_FOR_TYPE(int64_t, op) \
3293 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3302 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3311 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3318#define VECTOR_MULTIPLY_EVEN_ODD_TYPE(r1, r2, r3, input_type, result_type, \
3320 size_t i = 0, j = 0, k = 0; \
3321 size_t lane_size = sizeof(input_type); \
3326 for (; j < kSimd128Size; i += 2, j += lane_size * 2, k++) { \
3327 result_type src0 = static_cast<result_type>( \
3328 get_simd_register_by_lane<input_type>(r2, i)); \
3329 result_type src1 = static_cast<result_type>( \
3330 get_simd_register_by_lane<input_type>(r3, i)); \
3331 set_simd_register_by_lane<result_type>(r1, k, src0 * src1); \
3333#define VECTOR_MULTIPLY_EVEN_ODD(r1, r2, r3, is_odd, sign) \
3336 VECTOR_MULTIPLY_EVEN_ODD_TYPE(r1, r2, r3, sign##int8_t, sign##int16_t, \
3341 VECTOR_MULTIPLY_EVEN_ODD_TYPE(r1, r2, r3, sign##int16_t, sign##int32_t, \
3346 VECTOR_MULTIPLY_EVEN_ODD_TYPE(r1, r2, r3, sign##int32_t, sign##int64_t, \
3355 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3358 VECTOR_MULTIPLY_EVEN_ODD(r1, r2, r3,
false, )
3364 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3367 VECTOR_MULTIPLY_EVEN_ODD(r1, r2, r3,
true, )
3371 DCHECK_OPCODE(VMLE);
3372 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3375 VECTOR_MULTIPLY_EVEN_ODD(r1, r2, r3,
false, u)
3380 DCHECK_OPCODE(VMLO);
3381 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3384 VECTOR_MULTIPLY_EVEN_ODD(r1, r2, r3,
true, u)
3387#undef VECTOR_MULTIPLY_EVEN_ODD
3388#undef VECTOR_MULTIPLY_EVEN_ODD_TYPE
3392 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3396 for (
int i = 0;
i < 2;
i++) {
3397 int64_t lane_1 = get_simd_register_by_lane<uint64_t>(r2,
i);
3398 int64_t lane_2 = get_simd_register_by_lane<uint64_t>(r3,
i);
3399 set_simd_register_by_lane<uint64_t>(r1,
i, lane_1 & ~lane_2);
3404template <
class S,
class D>
3405void VectorSum(Simulator* sim,
int dst,
int src1,
int src2) {
3407 FOR_EACH_LANE(
i, S) {
3408 value += sim->get_simd_register_by_lane<
S>(src1,
i);
3409 if ((
i + 1) % (
sizeof(
D) /
sizeof(S)) == 0) {
3410 value += sim->get_simd_register_by_lane<
S>(src2,
i);
3411 sim->set_simd_register_by_lane<
D>(dst,
i / (
sizeof(
D) /
sizeof(
S)),
3418#define CASE(i, S, D) \
3420 VectorSum<S, D>(this, r1, r2, r3); \
3423 DCHECK_OPCODE(VSUM);
3424 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3428 CASE(0, uint8_t, uint32_t);
3429 CASE(1, uint16_t, uint32_t);
3437 DCHECK_OPCODE(VSUMG);
3438 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3442 CASE(1, uint16_t, uint64_t);
3443 CASE(2, uint32_t, uint64_t);
3451#define VECTOR_MERGE(type, is_low_side) \
3452 constexpr size_t index_limit = (kSimd128Size / sizeof(type)) / 2; \
3453 for (size_t i = 0, source_index = is_low_side ? i + index_limit : i; \
3454 i < index_limit; i++, source_index++) { \
3455 set_simd_register_by_lane<type>( \
3456 r1, 2 * i, get_simd_register_by_lane<type>(r2, source_index)); \
3457 set_simd_register_by_lane<type>( \
3458 r1, (2 * i) + 1, get_simd_register_by_lane<type>(r3, source_index)); \
3460#define CASE(i, type, is_low_side) \
3462 VECTOR_MERGE(type, is_low_side) \
3465 DCHECK_OPCODE(VMRL);
3466 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3470 CASE(0, int8_t,
true);
3471 CASE(1, int16_t,
true);
3472 CASE(2, int32_t,
true);
3473 CASE(3, int64_t,
true);
3481 DCHECK_OPCODE(VMRH);
3482 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3486 CASE(0, int8_t,
false);
3487 CASE(1, int16_t,
false);
3488 CASE(2, int32_t,
false);
3489 CASE(3, int64_t,
false);
3498template <
class S,
class D>
3499void VectorPack(Simulator* sim,
int dst,
int src1,
int src2,
bool saturate,
3500 const D& max = 0,
const D& min = 0) {
3507 if (count == kSimd128Size /
sizeof(S)) {
3511 value = sim->get_simd_register_by_lane<
S>(src,
count);
3515 else if (value < min)
3520 FOR_EACH_LANE(
i,
D) { sim->set_simd_register_by_lane<
D>(dst,
i, temps[
i]); }
3523#define CASE(i, S, D, SAT, MAX, MIN) \
3525 VectorPack<S, D>(this, r1, r2, r3, SAT, MAX, MIN); \
3529 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3533 CASE(1, uint16_t, uint8_t,
false, 0, 0);
3534 CASE(2, uint32_t, uint16_t,
false, 0, 0);
3535 CASE(3, uint64_t, uint32_t,
false, 0, 0);
3543 DCHECK_OPCODE(VPKS);
3544 DECODE_VRR_B_INSTRUCTION(r1, r2, r3, m5, m4);
3548 CASE(1, int16_t, int8_t,
true, INT8_MAX, INT8_MIN);
3549 CASE(2, int32_t, int16_t,
true, INT16_MAX, INT16_MIN);
3550 CASE(3, int64_t, int32_t,
true, INT32_MAX, INT32_MIN);
3558 DCHECK_OPCODE(VPKLS);
3559 DECODE_VRR_B_INSTRUCTION(r1, r2, r3, m5, m4);
3563 CASE(1, uint16_t, uint8_t,
true, UINT8_MAX, 0);
3564 CASE(2, uint32_t, uint16_t,
true, UINT16_MAX, 0);
3565 CASE(3, uint64_t, uint32_t,
true, UINT32_MAX, 0);
3573template <
class S,
class D>
3574void VectorUnpackHigh(Simulator* sim,
int dst,
int src) {
3576 D temps[kItemCount] = {0};
3578 FOR_EACH_LANE(
i,
D) { temps[
i] = sim->get_simd_register_by_lane<
S>(src,
i); }
3579 FOR_EACH_LANE(
i,
D) { sim->set_simd_register_by_lane<
D>(dst,
i, temps[
i]); }
3582#define CASE(i, S, D) \
3584 VectorUnpackHigh<S, D>(this, r1, r2); \
3588 DCHECK_OPCODE(VUPH);
3589 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3593 CASE(0, int8_t, int16_t);
3594 CASE(1, int16_t, int32_t);
3595 CASE(2, int32_t, int64_t);
3603 DCHECK_OPCODE(VUPLH);
3604 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3608 CASE(0, uint8_t, uint16_t);
3609 CASE(1, uint16_t, uint32_t);
3610 CASE(2, uint32_t, uint64_t);
3619void VectorPopulationCount(Simulator* sim,
int dst,
int src) {
3620 FOR_EACH_LANE(
i, S) {
3621 sim->set_simd_register_by_lane<
S>(
3623 base::bits::CountPopulation(sim->get_simd_register_by_lane<S>(src,
i)));
3629 VectorPopulationCount<S>(this, r1, r2); \
3632 DCHECK_OPCODE(VPOPCT);
3633 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3645#define CASE(i, S, D) \
3647 FOR_EACH_LANE(index, S) { \
3648 set_simd_register_by_lane<D>( \
3649 r1, index, static_cast<D>(get_simd_register_by_lane<S>(r2, index))); \
3654 DCHECK_OPCODE(VCDG);
3655 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3659 CASE(2, int32_t,
float);
3660 CASE(3, int64_t,
double);
3668 DCHECK_OPCODE(VCDLG);
3669 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3673 CASE(2, uint32_t,
float);
3674 CASE(3, uint64_t,
double);
3682#define CASE(i, S, D, type) \
3684 FOR_EACH_LANE(index, S) { \
3685 S a = get_simd_register_by_lane<S>(r2, index); \
3686 S n = ComputeRounding<S>(a, m5); \
3687 set_simd_register_by_lane<D>( \
3689 static_cast<D>(Compute##type##RoundingResult<S, D>(a, n))); \
3694 DCHECK_OPCODE(VCGD);
3695 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3698 CASE(2,
float, int32_t, Signed);
3699 CASE(3,
double, int64_t, Signed);
3707 DCHECK_OPCODE(VCLGD);
3708 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3711 CASE(2,
float, uint32_t, Logical);
3712 CASE(3,
double, uint64_t, Logical);
3720template <
class S,
class D>
3721void VectorUnpackLow(Simulator* sim,
int dst,
int src) {
3723 D temps[kItemCount] = {0};
3727 FOR_EACH_LANE(
i,
D) {
3728 temps[
i] = sim->get_simd_register_by_lane<
S>(src,
i,
false);
3730 FOR_EACH_LANE(
i,
D) {
3731 sim->set_simd_register_by_lane<
D>(dst,
i, temps[
i],
false);
3735#define CASE(i, S, D) \
3737 VectorUnpackLow<S, D>(this, r1, r2); \
3740 DCHECK_OPCODE(VUPL);
3741 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3745 CASE(0, int8_t, int16_t);
3746 CASE(1, int16_t, int32_t);
3747 CASE(2, int32_t, int64_t);
3755 DCHECK_OPCODE(VUPLL);
3756 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3760 CASE(0, uint8_t, uint16_t);
3761 CASE(1, uint16_t, uint32_t);
3762 CASE(2, uint32_t, uint64_t);
3770#define VECTOR_MAX_MIN_FOR_TYPE(type, op) \
3771 VectorBinaryOp<type>(this, r1, r2, r3, \
3772 [](type a, type b) { return (a op b) ? a : b; });
3774#define VECTOR_MAX_MIN(op, sign) \
3777 VECTOR_MAX_MIN_FOR_TYPE(sign##int8_t, op) \
3780 VECTOR_MAX_MIN_FOR_TYPE(sign##int16_t, op) \
3783 VECTOR_MAX_MIN_FOR_TYPE(sign##int32_t, op) \
3786 VECTOR_MAX_MIN_FOR_TYPE(sign##int64_t, op) \
3795 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3803 DCHECK_OPCODE(VMXL);
3804 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3807 VECTOR_MAX_MIN(>, u)
3813 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3821 DCHECK_OPCODE(VMNL);
3822 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3825 VECTOR_MAX_MIN(<, u);
3829#define VECTOR_COMPARE_FOR_TYPE(type, op) \
3830 VectorBinaryOp<type>(this, r1, r2, r3, \
3831 [](type a, type b) { return (a op b) ? -1 : 0; });
3833#define VECTOR_COMPARE(op, sign) \
3836 VECTOR_COMPARE_FOR_TYPE(sign##int8_t, op) \
3839 VECTOR_COMPARE_FOR_TYPE(sign##int16_t, op) \
3842 VECTOR_COMPARE_FOR_TYPE(sign##int32_t, op) \
3845 VECTOR_COMPARE_FOR_TYPE(sign##int64_t, op) \
3853 DCHECK_OPCODE(VCEQ);
3854 DECODE_VRR_B_INSTRUCTION(r1, r2, r3, m5, m4);
3857 VECTOR_COMPARE(==, )
3863 DECODE_VRR_B_INSTRUCTION(r1, r2, r3, m5, m4);
3871 DCHECK_OPCODE(VCHL);
3872 DECODE_VRR_B_INSTRUCTION(r1, r2, r3, m5, m4);
3875 VECTOR_COMPARE(>, u)
3881 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3885 VECTOR_BINARY_OP_FOR_TYPE(int64_t, |)
3891 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3895 VECTOR_BINARY_OP_FOR_TYPE(int64_t, &)
3901 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3905 VECTOR_BINARY_OP_FOR_TYPE(int64_t, ^)
3909#define VECTOR_NOR(r1, r2, r3, type) \
3910 for (size_t i = 0, j = 0; j < kSimd128Size; i++, j += sizeof(type)) { \
3911 type src0 = get_simd_register_by_lane<type>(r2, i); \
3912 type src1 = get_simd_register_by_lane<type>(r3, i); \
3913 set_simd_register_by_lane<type>(r1, i, ~(src0 | src1)); \
3917 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
3922 VECTOR_NOR(r1, r2, r3, int8_t)
3926 VECTOR_NOR(r1, r2, r3, int16_t)
3930 VECTOR_NOR(r1, r2, r3, int32_t)
3934 VECTOR_NOR(r1, r2, r3, int64_t)
3946void VectorLoadComplement(Simulator* sim,
int dst,
int src) {
3947 FOR_EACH_LANE(
i, T) {
3948 T src_val = sim->get_simd_register_by_lane<T>(src,
i);
3949 sim->set_simd_register_by_lane<T>(dst,
i, -src_val);
3955 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
3959#define CASE(i, type) \
3961 VectorLoadComplement<type>(this, r1, r2); \
3975 DCHECK_OPCODE(VPERM);
3976 DECODE_VRR_E_INSTRUCTION(r1, r2, r3, r4, m6, m5);
3981 int8_t lane_num = get_simd_register_by_lane<int8_t>(r4,
i);
3983 lane_num = (lane_num << 3) >> 3;
3985 if (lane_num >= kSimd128Size) {
3989 temp[
i] = get_simd_register_by_lane<int8_t>(
reg, lane_num);
3992 set_simd_register_by_lane<int8_t>(r1,
i, temp[
i]);
3998 DCHECK_OPCODE(VBPERM);
3999 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4004 unsigned __int128 src_bits =
4005 base::bit_cast<__int128>(get_simd_register(r2).int8);
4008 uint8_t selected_bit_index = get_simd_register_by_lane<uint8_t>(r3,
i);
4009 if (selected_bit_index < (kSimd128Size * kBitsPerByte)) {
4010 unsigned __int128 bit_value =
4012 result_bits |= bit_value;
4015 set_simd_register_by_lane<uint64_t>(r1, 0, 0);
4016 set_simd_register_by_lane<uint64_t>(r1, 1, 0);
4018 set_simd_register_by_lane<uint8_t>(r1, 6,
4019 static_cast<uint8_t
>(result_bits >> 8));
4020 set_simd_register_by_lane<uint8_t>(
4021 r1, 7,
static_cast<uint8_t
>((result_bits << 8) >> 8));
4026 DCHECK_OPCODE(VSEL);
4027 DECODE_VRR_E_INSTRUCTION(r1, r2, r3, r4, m6, m5);
4030 unsigned __int128 src_1 =
4031 base::bit_cast<__int128>(get_simd_register(r2).int8);
4032 unsigned __int128 src_2 =
4033 base::bit_cast<__int128>(get_simd_register(r3).int8);
4034 unsigned __int128 src_3 =
4035 base::bit_cast<__int128>(get_simd_register(r4).int8);
4036 unsigned __int128 tmp = (src_1 & src_3) | (src_2 & ~src_3);
4037 fpr_t
result = base::bit_cast<fpr_t>(tmp);
4038 set_simd_register(r1,
result);
4042template <
class T,
class Operation>
4043void VectorShift(Simulator* sim,
int dst,
int src,
unsigned int shift,
4045 FOR_EACH_LANE(
i, T) {
4046 T src_val = sim->get_simd_register_by_lane<T>(src,
i);
4047 T dst_val = op(src_val, shift);
4048 sim->set_simd_register_by_lane<T>(dst,
i, dst_val);
4052#define VECTOR_SHIFT_FOR_TYPE(type, op, shift) \
4053 VectorShift<type>(this, r1, r3, shift, \
4054 [](type a, unsigned int shift) { return a op shift; });
4056#define VECTOR_SHIFT(op, sign) \
4059 VECTOR_SHIFT_FOR_TYPE(sign##int8_t, op, shift) \
4062 VECTOR_SHIFT_FOR_TYPE(sign##int16_t, op, shift) \
4065 VECTOR_SHIFT_FOR_TYPE(sign##int32_t, op, shift) \
4068 VECTOR_SHIFT_FOR_TYPE(sign##int64_t, op, shift) \
4076 DCHECK_OPCODE(VESL);
4077 DECODE_VRS_INSTRUCTION(r1, r3, b2, d2, m4);
4078 unsigned int shift = get_register(b2) + d2;
4084 DCHECK_OPCODE(VESRA);
4085 DECODE_VRS_INSTRUCTION(r1, r3, b2, d2, m4);
4086 unsigned int shift = get_register(b2) + d2;
4092 DCHECK_OPCODE(VESRL);
4093 DECODE_VRS_INSTRUCTION(r1, r3, b2, d2, m4);
4094 unsigned int shift = get_register(b2) + d2;
4099#define VECTOR_SHIFT_WITH_OPERAND_TYPE(r1, r2, r3, type, op) \
4100 for (size_t i = 0, j = 0; j < kSimd128Size; i++, j += sizeof(type)) { \
4101 type src0 = get_simd_register_by_lane<type>(r2, i); \
4102 type src1 = get_simd_register_by_lane<type>(r3, i); \
4103 set_simd_register_by_lane<type>(r1, i, \
4104 src0 op(src1 % (sizeof(type) * 8))); \
4107#define VECTOR_SHIFT_WITH_OPERAND(r1, r2, r3, op, sign) \
4110 VECTOR_SHIFT_WITH_OPERAND_TYPE(r1, r2, r3, sign##int8_t, op) \
4114 VECTOR_SHIFT_WITH_OPERAND_TYPE(r1, r2, r3, sign##int16_t, op) \
4118 VECTOR_SHIFT_WITH_OPERAND_TYPE(r1, r2, r3, sign##int32_t, op) \
4122 VECTOR_SHIFT_WITH_OPERAND_TYPE(r1, r2, r3, sign##int64_t, op) \
4130 DCHECK_OPCODE(VESLV);
4131 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4134 VECTOR_SHIFT_WITH_OPERAND(r1, r2, r3, <<, )
4139 DCHECK_OPCODE(VESRAV);
4140 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4143 VECTOR_SHIFT_WITH_OPERAND(r1, r2, r3, >>, )
4148 DCHECK_OPCODE(VESRLV);
4149 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4152 VECTOR_SHIFT_WITH_OPERAND(r1, r2, r3, >>, u)
4155#undef VECTOR_SHIFT_WITH_OPERAND
4156#undef VECTOR_SHIFT_WITH_OPERAND_TYPE
4160 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
4164 int64_t src1 = get_simd_register_by_lane<int64_t>(r1, 0);
4165 int64_t src2 = get_simd_register_by_lane<int64_t>(r1, 1);
4166 int64_t mask1 = get_simd_register_by_lane<int64_t>(r2, 0);
4167 int64_t mask2 = get_simd_register_by_lane<int64_t>(r2, 1);
4168 if ((src1 & mask1) == 0 && (src2 & mask2) == 0) {
4169 condition_reg_ = 0x8;
4172 if ((src1 & mask1) == mask1 && (src2 & mask2) == mask2) {
4173 condition_reg_ = 0x1;
4176 condition_reg_ = 0x4;
4180#define VECTOR_FP_BINARY_OP(op) \
4183 DCHECK(CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_1)); \
4185 float src1 = get_simd_register_by_lane<float>(r2, 0); \
4186 float src2 = get_simd_register_by_lane<float>(r3, 0); \
4187 set_simd_register_by_lane<float>(r1, 0, src1 op src2); \
4190 VECTOR_BINARY_OP_FOR_TYPE(float, op) \
4195 double src1 = get_simd_register_by_lane<double>(r2, 0); \
4196 double src2 = get_simd_register_by_lane<double>(r3, 0); \
4197 set_simd_register_by_lane<double>(r1, 0, src1 op src2); \
4200 VECTOR_BINARY_OP_FOR_TYPE(double, op) \
4210 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4212 VECTOR_FP_BINARY_OP(+)
4218 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4220 VECTOR_FP_BINARY_OP(-)
4226 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4228 VECTOR_FP_BINARY_OP(*)
4234 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4236 VECTOR_FP_BINARY_OP(/)
4240#define VECTOR_FP_MULTIPLY_QFMS_OPERATION(type, op, sign, first_lane_only, \
4242 for (size_t i = 0, j = 0; j < kSimd128Size; i++, j += sizeof(type)) { \
4243 type src0 = get_simd_register_by_lane<type>(r2, i); \
4244 type src1 = get_simd_register_by_lane<type>(r3, i); \
4245 type src2 = get_simd_register_by_lane<type>(r4, i); \
4246 type result = sign * function(src0, src1, op src2); \
4247 if (isinf(src0)) result = src0; \
4248 if (isinf(src1)) result = src1; \
4249 if (isinf(src2)) result = src2; \
4250 set_simd_register_by_lane<type>(r1, i, result); \
4251 if (first_lane_only) break; \
4254#define VECTOR_FP_MULTIPLY_QFMS(op, sign) \
4257 DCHECK(CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_1)); \
4259 VECTOR_FP_MULTIPLY_QFMS_OPERATION(float, op, sign, true, fmaf) \
4262 VECTOR_FP_MULTIPLY_QFMS_OPERATION(float, op, sign, false, fmaf) \
4267 VECTOR_FP_MULTIPLY_QFMS_OPERATION(double, op, sign, true, fma) \
4270 VECTOR_FP_MULTIPLY_QFMS_OPERATION(double, op, sign, false, fma) \
4279 DCHECK_OPCODE(VFMA);
4280 DECODE_VRR_E_INSTRUCTION(r1, r2, r3, r4, m6, m5);
4283 VECTOR_FP_MULTIPLY_QFMS(+, 1)
4288 DCHECK_OPCODE(VFNMS);
4289 DECODE_VRR_E_INSTRUCTION(r1, r2, r3, r4, m6, m5);
4292 VECTOR_FP_MULTIPLY_QFMS(-, -1)
4295#undef VECTOR_FP_MULTIPLY_QFMS
4296#undef VECTOR_FP_MULTIPLY_QFMS_OPERATION
4298template <
class FP_Type>
4299static FP_Type JavaMathMax(FP_Type
x, FP_Type
y) {
4300 if (std::isnan(
x) || std::isnan(
y))
return NAN;
4301 if (std::signbit(
x) < std::signbit(
y))
return x;
4302 return x >
y ?
x :
y;
4305template <
class FP_Type>
4306static FP_Type IEEE_maxNum(FP_Type
x, FP_Type
y) {
4307 if (
x >
y)
return x;
4308 if (
x <
y)
return y;
4309 if (
x ==
y)
return x;
4310 if (!std::isnan(
x))
return x;
4311 if (!std::isnan(
y))
return y;
4315template <
class FP_Type>
4316static FP_Type FPMax(
int m6, FP_Type lhs, FP_Type rhs) {
4319 return IEEE_maxNum(lhs, rhs);
4321 return JavaMathMax(lhs, rhs);
4323 return std::max(lhs, rhs);
4325 return std::fmax(lhs, rhs);
4329 return static_cast<FP_Type
>(0);
4332template <
class FP_Type>
4333static FP_Type JavaMathMin(FP_Type
x, FP_Type
y) {
4334 if (isnan(
x) || isnan(
y))
4336 else if (signbit(
y) < signbit(
x))
4338 else if (signbit(
y) != signbit(
x))
4340 return (
x <
y) ?
x :
y;
4343template <
class FP_Type>
4344static FP_Type IEEE_minNum(FP_Type
x, FP_Type
y) {
4345 if (
x >
y)
return y;
4346 if (
x <
y)
return x;
4347 if (
x ==
y)
return x;
4348 if (!std::isnan(
x))
return x;
4349 if (!std::isnan(
y))
return y;
4353template <
class FP_Type>
4354static FP_Type FPMin(
int m6, FP_Type lhs, FP_Type rhs) {
4357 return IEEE_minNum(lhs, rhs);
4359 return JavaMathMin(lhs, rhs);
4361 return std::min(lhs, rhs);
4363 return std::fmin(lhs, rhs);
4367 return static_cast<FP_Type
>(0);
4371template <
class FP_Type,
class Operation>
4372static void FPMinMaxForEachLane(Simulator* sim,
Operation Op,
int dst,
int lhs,
4373 int rhs,
int m5,
int m6) {
4374 DCHECK(m5 == 8 || m5 == 0);
4376 FP_Type src1 = sim->get_fpr<FP_Type>(lhs);
4377 FP_Type src2 = sim->get_fpr<FP_Type>(rhs);
4378 FP_Type res = Op(m6, src1, src2);
4379 sim->set_fpr(dst, res);
4381 FOR_EACH_LANE(
i, FP_Type) {
4382 FP_Type src1 = sim->get_simd_register_by_lane<FP_Type>(lhs,
i);
4383 FP_Type src2 = sim->get_simd_register_by_lane<FP_Type>(rhs,
i);
4384 FP_Type res = Op(m6, src1, src2);
4385 sim->set_simd_register_by_lane<FP_Type>(dst,
i, res);
4390#define CASE(i, type, op) \
4392 FPMinMaxForEachLane<type>(this, op<type>, r1, r2, r3, m5, m6); \
4395 DCHECK(CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_1));
4396 DCHECK_OPCODE(VFMIN);
4397 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4399 CASE(2,
float, FPMin);
4400 CASE(3,
double, FPMin);
4408 DCHECK(CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_1));
4409 DCHECK_OPCODE(VFMAX);
4410 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4412 CASE(2,
float, FPMax);
4413 CASE(3,
double, FPMax);
4421template <
class S,
class D,
class Operation>
4422void VectorFPCompare(Simulator* sim,
int dst,
int src1,
int src2,
int m6,
4424 static_assert(
sizeof(
S) ==
sizeof(
D),
4425 "Expect input type size == output type size");
4426 bool some_zero =
false;
4428 FOR_EACH_LANE(
i,
D) {
4429 S src1_val = sim->get_simd_register_by_lane<
S>(src1,
i);
4430 S src2_val = sim->get_simd_register_by_lane<
S>(src2,
i);
4431 D value = op(src1_val, src2_val);
4432 sim->set_simd_register_by_lane<
D>(dst,
i,
value);
4442 sim->condition_reg_ =
CC_OF;
4443 }
else if (some_zero) {
4444 sim->condition_reg_ = 0x04;
4449#define VECTOR_FP_COMPARE_FOR_TYPE(S, D, op) \
4450 VectorFPCompare<S, D>(this, r1, r2, r3, m6, \
4451 [](S a, S b) { return (a op b) ? -1 : 0; });
4453#define VECTOR_FP_COMPARE(op) \
4456 DCHECK(CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_1)); \
4458 float src1 = get_simd_register_by_lane<float>(r2, 0); \
4459 float src2 = get_simd_register_by_lane<float>(r3, 0); \
4460 set_simd_register_by_lane<int32_t>(r1, 0, (src1 op src2) ? -1 : 0); \
4463 VECTOR_FP_COMPARE_FOR_TYPE(float, int32_t, op) \
4468 double src1 = get_simd_register_by_lane<double>(r2, 0); \
4469 double src2 = get_simd_register_by_lane<double>(r3, 0); \
4470 set_simd_register_by_lane<int64_t>(r1, 0, (src1 op src2) ? -1 : 0); \
4473 VECTOR_FP_COMPARE_FOR_TYPE(double, int64_t, op) \
4482 DCHECK_OPCODE(VFCE);
4483 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4484 VECTOR_FP_COMPARE(==)
4489 DCHECK_OPCODE(VFCHE);
4490 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4492 VECTOR_FP_COMPARE(>=)
4497 DCHECK_OPCODE(VFCH);
4498 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
4500 VECTOR_FP_COMPARE(>)
4506template <class T, class Op>
4507static
void VectorUnaryOp(Simulator* sim,
int dst,
int src,
int sec, Op op) {
4509 T value = op(sim->get_fpr<T>(src));
4510 sim->set_fpr(dst, value);
4513 FOR_EACH_LANE(
i, T) {
4514 T value = op(sim->get_simd_register_by_lane<T>(src,
i));
4515 sim->set_simd_register_by_lane<T>(dst,
i,
value);
4520#define CASE(i, T, op) \
4522 VectorUnaryOp<T>(sim, dst, src, m4, op); \
4526void VectorSignOp(Simulator* sim,
int dst,
int src,
int m4,
int m5) {
4528 CASE(0, T, [](T value) {
return -
value; });
4529 CASE(1, T, [](T value) {
return -std::abs(value); });
4530 CASE(2, T, [](T value) {
return std::abs(value); });
4538 DCHECK_OPCODE(VFPSO);
4539 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
4543 VectorSignOp<T>(this, r1, r2, m4, m5); \
4555 DCHECK_OPCODE(VFSQ);
4556 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
4561 VectorUnaryOp<T>(this, r1, r2, m4, [](T val) { return std::sqrt(val); }); \
4574 DECODE_VRR_A_INSTRUCTION(r1, r2, m5, m4, m3);
4580 DCHECK(CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_1));
4581 for (
int i = 0;
i < 4;
i++) {
4582 float value = get_simd_register_by_lane<float>(r2,
i);
4583 float n = ComputeRounding<float>(value, m5);
4584 set_simd_register_by_lane<float>(r1,
i, n);
4588 for (
int i = 0;
i < 2;
i++) {
4589 double value = get_simd_register_by_lane<double>(r2,
i);
4590 double n = ComputeRounding<double>(value, m5);
4591 set_simd_register_by_lane<double>(r1,
i, n);
4601 DCHECK_OPCODE(DUMY);
4602 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
4613 DECODE_RR_INSTRUCTION(r1, r2);
4614 uint32_t r1_val = get_low_register<uint32_t>(r1);
4615 uint32_t r2_val = get_low_register<uint32_t>(r2);
4616 SetS390ConditionCode<uint32_t>(r1_val, r2_val);
4622 DECODE_RR_INSTRUCTION(r1, r2);
4623 set_low_register(r1, get_low_register<int32_t>(r2));
4629 DECODE_RR_INSTRUCTION(r1, r2);
4630 int32_t r1_val = get_low_register<int32_t>(r1);
4631 int32_t r2_val = get_low_register<int32_t>(r2);
4632 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val, int32_t);
4634 SetS390ConditionCode<int32_t>(r1_val, 0);
4635 SetS390OverflowCode(isOF);
4636 set_low_register(r1, r1_val);
4642 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
4643 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
4644 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
4645 intptr_t addr = b2_val + x2_val + d2_val;
4646 int32_t mem_val = ReadW(addr);
4647 set_low_register(r1, mem_val);
4653 DECODE_RI_C_INSTRUCTION(
instr, m1, i2);
4655 if (TestConditionCode(m1)) {
4656 intptr_t
offset = 2 * i2;
4657 set_pc(get_pc() +
offset);
4664 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
4665 int32_t r1_val = get_low_register<int32_t>(r1);
4666 bool isOF = CheckOverflowForIntAdd(r1_val, i2, int32_t);
4668 set_low_register(r1, r1_val);
4669 SetS390ConditionCode<int32_t>(r1_val, 0);
4670 SetS390OverflowCode(isOF);
4675 DCHECK_OPCODE(AGHI);
4676 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
4677 int64_t r1_val = get_register(r1);
4679 isOF = CheckOverflowForIntAdd(r1_val, i2, int64_t);
4681 set_register(r1, r1_val);
4682 SetS390ConditionCode<int64_t>(r1_val, 0);
4683 SetS390OverflowCode(isOF);
4688 DCHECK_OPCODE(BRCL);
4689 DECODE_RIL_C_INSTRUCTION(m1, ri2);
4691 if (TestConditionCode(m1)) {
4692 intptr_t
offset = 2 * ri2;
4693 set_pc(get_pc() +
offset);
4699 DCHECK_OPCODE(IIHF);
4700 DECODE_RIL_A_INSTRUCTION(r1, imm);
4701 set_high_register(r1, imm);
4706 DCHECK_OPCODE(IILF);
4707 DECODE_RIL_A_INSTRUCTION(r1, imm);
4708 set_low_register(r1, imm);
4714 DECODE_RRE_INSTRUCTION(r1, r2);
4715 set_register(r1, get_register(r2));
4721 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
4722 intptr_t addr = GET_ADDRESS(x2, b2, d2);
4723 int64_t mem_val = ReadDW(addr);
4724 set_register(r1, mem_val);
4730 DECODE_RRE_INSTRUCTION(r1, r2);
4731 int64_t r1_val = get_register(r1);
4732 int64_t r2_val = get_register(r2);
4733 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val, int64_t);
4735 set_register(r1, r1_val);
4736 SetS390ConditionCode<int64_t>(r1_val, 0);
4737 SetS390OverflowCode(isOF);
4742 DCHECK_OPCODE(LGFR);
4743 DECODE_RRE_INSTRUCTION(r1, r2);
4744 int32_t r2_val = get_low_register<int32_t>(r2);
4745 int64_t
result =
static_cast<int64_t
>(r2_val);
4746 set_register(r1,
result);
4753 DECODE_RRE_INSTRUCTION(r1, r2);
4754 int32_t r2_val = get_low_register<int32_t>(r2);
4757 set_low_register(r1, r2_val);
4762 DCHECK_OPCODE(LGBR);
4763 DECODE_RRE_INSTRUCTION(r1, r2);
4764 int64_t r2_val = get_low_register<int64_t>(r2);
4767 set_register(r1, r2_val);
4773 DECODE_RRE_INSTRUCTION(r1, r2);
4774 int32_t r2_val = get_low_register<int32_t>(r2);
4777 set_low_register(r1, r2_val);
4782 DCHECK_OPCODE(LGHR);
4783 DECODE_RRE_INSTRUCTION(r1, r2);
4784 int64_t r2_val = get_low_register<int64_t>(r2);
4787 set_register(r1, r2_val);
4793 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
4794 intptr_t addr = GET_ADDRESS(x2, b2, d2);
4795 int64_t mem_val =
static_cast<int64_t
>(ReadW(addr));
4796 set_register(r1, mem_val);
4802 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
4803 int32_t r1_val = get_low_register<int32_t>(r1);
4804 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
4805 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
4806 intptr_t addr = b2_val + x2_val + d2_val;
4807 WriteW(addr, r1_val);
4813 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
4814 intptr_t addr = GET_ADDRESS(x2, b2, d2);
4815 uint64_t value = get_register(r1);
4816 WriteDW(addr, value);
4822 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
4823 intptr_t addr = GET_ADDRESS(x2, b2, d2);
4824 uint32_t value = get_low_register<uint32_t>(r1);
4825 WriteW(addr, value);
4831 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
4832 intptr_t addr = GET_ADDRESS(x2, b2, d2);
4833 uint32_t mem_val = ReadWU(addr);
4834 set_low_register(r1, mem_val);
4839 DCHECK_OPCODE(LLGC);
4840 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
4841 uint8_t mem_val = ReadBU(GET_ADDRESS(x2, b2, d2));
4842 set_register(r1,
static_cast<uint64_t
>(mem_val));
4848 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
4849 uint8_t mem_val = ReadBU(GET_ADDRESS(x2, b2, d2));
4850 set_low_register(r1,
static_cast<uint32_t
>(mem_val));
4856 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
4858 int shiftBits = GET_ADDRESS(0, b2, d2) & 0x3F;
4860 uint32_t r3_val = get_low_register<uint32_t>(r3);
4861 uint32_t alu_out = 0;
4862 uint32_t rotateBits = r3_val >> (32 - shiftBits);
4863 alu_out = (r3_val << shiftBits) | (rotateBits);
4864 set_low_register(r1, alu_out);
4869 DCHECK_OPCODE(RISBG);
4870 DECODE_RIE_F_INSTRUCTION(r1, r2, i3, i4, i5);
4872 uint32_t start_bit = i3 & 0x3F;
4874 uint32_t end_bit = i4 & 0x3F;
4876 uint32_t shift_amount = i5 & 0x3F;
4878 bool zero_remaining = (0 != (i4 & 0x80));
4880 uint64_t src_val = get_register(r2);
4883 uint64_t rotated_val =
4884 (src_val << shift_amount) | (src_val >> (64 - shift_amount));
4885 int32_t width = end_bit - start_bit + 1;
4887 uint64_t selection_mask = 0;
4889 selection_mask = (
static_cast<uint64_t
>(1) << width) - 1;
4891 selection_mask =
static_cast<uint64_t
>(
static_cast<int64_t
>(-1));
4893 selection_mask = selection_mask << (63 - end_bit);
4895 uint64_t selected_val = rotated_val & selection_mask;
4897 if (!zero_remaining) {
4899 selected_val = (get_register(r1) & ~selection_mask) | selected_val;
4903 SetS390ConditionCode<int64_t>(selected_val, 0);
4904 set_register(r1, selected_val);
4909 DCHECK_OPCODE(AHIK);
4910 DECODE_RIE_D_INSTRUCTION(r1, r2, i2);
4911 int32_t r2_val = get_low_register<int32_t>(r2);
4913 bool isOF = CheckOverflowForIntAdd(r2_val, imm, int32_t);
4914 set_low_register(r1, r2_val + imm);
4915 SetS390ConditionCode<int32_t>(r2_val + imm, 0);
4916 SetS390OverflowCode(isOF);
4922 DCHECK_OPCODE(AGHIK);
4923 DECODE_RIE_D_INSTRUCTION(r1, r2, i2);
4924 int64_t r2_val = get_register(r2);
4925 int64_t imm =
static_cast<int64_t
>(i2);
4926 bool isOF = CheckOverflowForIntAdd(r2_val, imm, int64_t);
4927 set_register(r1, r2_val + imm);
4928 SetS390ConditionCode<int64_t>(r2_val + imm, 0);
4929 SetS390OverflowCode(isOF);
4934 DCHECK_OPCODE(BKPT);
4935 set_pc(get_pc() + 2);
4936 S390Debugger dbg(
this);
4962 DECODE_RR_INSTRUCTION(r1, r2);
4964 intptr_t r2_val = get_register(r2);
4990 DCHECK_OPCODE(BASR);
4991 DECODE_RR_INSTRUCTION(r1, r2);
4992 intptr_t link_addr = get_pc() + 2;
4994 int64_t r2_val = (r2 == 0) ? link_addr : get_register(r2);
4995 set_register(r1, link_addr);
5015 DECODE_RR_INSTRUCTION(r1, r2);
5016 int32_t r2_val = get_low_register<int32_t>(r2);
5017 SetS390ConditionCode<int32_t>(r2_val, 0);
5018 if (r2_val == (
static_cast<int32_t>(1) << 31)) {
5019 SetS390OverflowCode(
true);
5022 r2_val = (r2_val < 0) ? -r2_val : r2_val;
5024 set_low_register(r1, r2_val);
5031 DECODE_RR_INSTRUCTION(r1, r2);
5032 int32_t r2_val = get_low_register<int32_t>(r2);
5033 r2_val = (r2_val >= 0) ? -r2_val : r2_val;
5034 set_low_register(r1, r2_val);
5035 condition_reg_ = (r2_val == 0) ? CC_EQ :
CC_LT;
5042 DECODE_RR_INSTRUCTION(r1, r2);
5043 int32_t r2_val = get_low_register<int32_t>(r2);
5044 SetS390ConditionCode<int32_t>(r2_val, 0);
5045 set_low_register(r1, r2_val);
5051 DECODE_RR_INSTRUCTION(r1, r2);
5052 int32_t r2_val = get_low_register<int32_t>(r2);
5055 isOF = __builtin_ssub_overflow(0, r2_val, &
result);
5056 set_low_register(r1,
result);
5057 SetS390ConditionCode<int32_t>(r2_val, 0);
5063 SetS390OverflowCode(
true);
5070 DECODE_RR_INSTRUCTION(r1, r2);
5071 int32_t r1_val = get_low_register<int32_t>(r1);
5072 int32_t r2_val = get_low_register<int32_t>(r2);
5074 SetS390BitWiseConditionCode<uint32_t>(r1_val);
5075 set_low_register(r1, r1_val);
5081 DECODE_RR_INSTRUCTION(r1, r2);
5082 int32_t r1_val = get_low_register<int32_t>(r1);
5083 int32_t r2_val = get_low_register<int32_t>(r2);
5085 SetS390BitWiseConditionCode<uint32_t>(r1_val);
5086 set_low_register(r1, r1_val);
5092 DECODE_RR_INSTRUCTION(r1, r2);
5093 int32_t r1_val = get_low_register<int32_t>(r1);
5094 int32_t r2_val = get_low_register<int32_t>(r2);
5096 SetS390BitWiseConditionCode<uint32_t>(r1_val);
5097 set_low_register(r1, r1_val);
5103 DECODE_RR_INSTRUCTION(r1, r2);
5104 int32_t r1_val = get_low_register<int32_t>(r1);
5105 int32_t r2_val = get_low_register<int32_t>(r2);
5106 SetS390ConditionCode<int32_t>(r1_val, r2_val);
5112 DECODE_RR_INSTRUCTION(r1, r2);
5113 int32_t r1_val = get_low_register<int32_t>(r1);
5114 int32_t r2_val = get_low_register<int32_t>(r2);
5116 isOF = CheckOverflowForIntSub(r1_val, r2_val, int32_t);
5118 SetS390ConditionCode<int32_t>(r1_val, 0);
5119 SetS390OverflowCode(isOF);
5120 set_low_register(r1, r1_val);
5126 DECODE_RR_INSTRUCTION(r1, r2);
5127 int32_t r1_val = get_low_register<int32_t>(r1);
5128 int32_t r2_val = get_low_register<int32_t>(r2);
5130 r1_val = get_low_register<int32_t>(r1 + 1);
5131 int64_t product =
static_cast<int64_t
>(r1_val) *
static_cast<int64_t
>(r2_val);
5132 int32_t high_bits = product >> 32;
5134 int32_t low_bits = product & 0x00000000FFFFFFFF;
5135 set_low_register(r1, high_bits);
5136 set_low_register(r1 + 1, low_bits);
5142 DECODE_RR_INSTRUCTION(r1, r2);
5143 int32_t r1_val = get_low_register<int32_t>(r1);
5144 int32_t r2_val = get_low_register<int32_t>(r2);
5150 int64_t dividend =
static_cast<int64_t
>(r1_val) << 32;
5153 dividend += get_low_register<uint32_t>(r1 + 1);
5155 int32_t quotient = dividend / r2_val;
5158 set_low_register(r1 + 1, quotient);
5159 set_low_register(r1, r1_val);
5165 DECODE_RR_INSTRUCTION(r1, r2);
5166 uint32_t r1_val = get_low_register<uint32_t>(r1);
5167 uint32_t r2_val = get_low_register<uint32_t>(r2);
5168 uint32_t alu_out = 0;
5170 alu_out = r1_val + r2_val;
5171 isOF = CheckOverflowForUIntAdd(r1_val, r2_val);
5172 set_low_register(r1, alu_out);
5173 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
5179 DECODE_RR_INSTRUCTION(r1, r2);
5180 uint32_t r1_val = get_low_register<uint32_t>(r1);
5181 uint32_t r2_val = get_low_register<uint32_t>(r2);
5182 uint32_t alu_out = 0;
5184 alu_out = r1_val - r2_val;
5185 isOF = CheckOverflowForUIntSub(r1_val, r2_val);
5186 set_low_register(r1, alu_out);
5187 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
5193 DECODE_RR_INSTRUCTION(r1, r2);
5194 int64_t r2_val = get_fpr<int64_t>(r2);
5195 set_fpr(r1, r2_val);
5207 DECODE_RR_INSTRUCTION(r1, r2);
5208 int64_t r2_val = get_fpr<int64_t>(r2);
5209 set_fpr(r1, r2_val);
5215 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5216 int16_t r1_val = get_low_register<int32_t>(r1);
5217 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5218 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5219 intptr_t mem_addr = b2_val + x2_val + d2_val;
5220 WriteH(mem_addr, r1_val);
5227 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5228 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5229 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5230 intptr_t addr = b2_val + x2_val + d2_val;
5231 set_register(r1, addr);
5238 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5239 uint8_t r1_val = get_low_register<int32_t>(r1);
5240 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5241 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5242 intptr_t mem_addr = b2_val + x2_val + d2_val;
5243 WriteB(mem_addr, r1_val);
5255 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5256 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5257 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5258 int32_t r1_val = get_low_register<int32_t>(r1);
5261 reinterpret_cast<const uint8_t*
>(b2_val + x2_val + d2_val));
5262 int inst_length = Instruction::InstructionLength(
5263 reinterpret_cast<const uint8_t*
>(b2_val + x2_val + d2_val));
5265 char new_instr_buf[8];
5266 char* addr =
reinterpret_cast<char*
>(&new_instr_buf[0]);
5268 << (8 * inst_length - 16);
5269 Instruction::SetInstructionBits<SixByteInstr>(
5270 reinterpret_cast<uint8_t*
>(addr),
static_cast<SixByteInstr>(the_instr));
5271 ExecuteInstruction(
reinterpret_cast<Instruction*
>(addr),
false);
5296 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5298 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5299 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5300 intptr_t mem_addr = x2_val + b2_val + d2_val;
5303 set_low_register(r1,
result);
5315 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5316 int32_t r1_val = get_low_register<int32_t>(r1);
5317 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5318 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5319 intptr_t addr = b2_val + x2_val + d2_val;
5323 isOF = CheckOverflowForIntAdd(r1_val, mem_val, int32_t);
5324 alu_out = r1_val + mem_val;
5325 set_low_register(r1, alu_out);
5326 SetS390ConditionCode<int32_t>(alu_out, 0);
5327 SetS390OverflowCode(isOF);
5334 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5335 int32_t r1_val = get_low_register<int32_t>(r1);
5336 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5337 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5338 intptr_t addr = b2_val + x2_val + d2_val;
5342 isOF = CheckOverflowForIntSub(r1_val, mem_val, int32_t);
5343 alu_out = r1_val - mem_val;
5344 SetS390ConditionCode<int32_t>(alu_out, 0);
5345 SetS390OverflowCode(isOF);
5352 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5353 int32_t r1_val = get_low_register<int32_t>(r1);
5354 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5355 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5356 intptr_t addr = b2_val + x2_val + d2_val;
5359 alu_out = r1_val * mem_val;
5360 set_low_register(r1, alu_out);
5391 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5392 int32_t r1_val = get_low_register<int32_t>(r1);
5393 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5394 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5395 int32_t mem_val = ReadW(b2_val + x2_val + d2_val);
5397 alu_out = r1_val & mem_val;
5398 SetS390BitWiseConditionCode<uint32_t>(alu_out);
5399 set_low_register(r1, alu_out);
5405 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5406 int32_t r1_val = get_low_register<int32_t>(r1);
5407 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5408 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5409 intptr_t addr = b2_val + x2_val + d2_val;
5410 int32_t mem_val = ReadW(addr);
5411 SetS390ConditionCode<uint32_t>(r1_val, mem_val);
5418 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5419 int32_t r1_val = get_low_register<int32_t>(r1);
5420 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5421 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5422 int32_t mem_val = ReadW(b2_val + x2_val + d2_val);
5424 alu_out = r1_val | mem_val;
5425 SetS390BitWiseConditionCode<uint32_t>(alu_out);
5426 set_low_register(r1, alu_out);
5433 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5434 int32_t r1_val = get_low_register<int32_t>(r1);
5435 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5436 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5437 int32_t mem_val = ReadW(b2_val + x2_val + d2_val);
5439 alu_out = r1_val ^ mem_val;
5440 SetS390BitWiseConditionCode<uint32_t>(alu_out);
5441 set_low_register(r1, alu_out);
5447 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5448 int32_t r1_val = get_low_register<int32_t>(r1);
5449 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5450 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5451 intptr_t addr = b2_val + x2_val + d2_val;
5452 int32_t mem_val = ReadW(addr);
5453 SetS390ConditionCode<int32_t>(r1_val, mem_val);
5460 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5461 int32_t r1_val = get_low_register<int32_t>(r1);
5462 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5463 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5464 int32_t mem_val = ReadW(b2_val + x2_val + d2_val);
5467 isOF = CheckOverflowForIntAdd(r1_val, mem_val, int32_t);
5468 alu_out = r1_val + mem_val;
5469 SetS390ConditionCode<int32_t>(alu_out, 0);
5470 SetS390OverflowCode(isOF);
5471 set_low_register(r1, alu_out);
5478 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5479 int32_t r1_val = get_low_register<int32_t>(r1);
5480 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5481 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5482 int32_t mem_val = ReadW(b2_val + x2_val + d2_val);
5485 isOF = CheckOverflowForIntSub(r1_val, mem_val, int32_t);
5486 alu_out = r1_val - mem_val;
5487 SetS390ConditionCode<int32_t>(alu_out, 0);
5488 SetS390OverflowCode(isOF);
5489 set_low_register(r1, alu_out);
5495 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5496 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5497 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5498 intptr_t addr = b2_val + x2_val + d2_val;
5500 int32_t mem_val = ReadW(addr);
5501 int32_t r1_val = get_low_register<int32_t>(r1 + 1);
5503 static_cast<int64_t
>(r1_val) *
static_cast<int64_t
>(mem_val);
5504 int32_t high_bits = product >> 32;
5506 int32_t low_bits = product & 0x00000000FFFFFFFF;
5507 set_low_register(r1, high_bits);
5508 set_low_register(r1 + 1, low_bits);
5532 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5533 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5534 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5535 intptr_t addr = b2_val + x2_val + d2_val;
5536 int64_t frs_val = get_fpr<int64_t>(r1);
5537 WriteDW(addr, frs_val);
5543 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5544 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5545 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5546 intptr_t addr = b2_val + x2_val + d2_val;
5547 int64_t dbl_val = *
reinterpret_cast<int64_t*
>(addr);
5548 set_fpr(r1, dbl_val);
5560 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5561 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5562 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5563 intptr_t addr = b2_val + x2_val + d2_val;
5564 int32_t frs_val = get_fpr<int32_t>(r1);
5565 WriteW(addr, frs_val);
5571 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5572 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5573 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5574 int32_t mem_val = ReadW(b2_val + x2_val + d2_val);
5575 int32_t r1_val = get_low_register<int32_t>(r1);
5576 set_low_register(r1, r1_val * mem_val);
5582 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
5583 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5584 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
5585 intptr_t addr = b2_val + x2_val + d2_val;
5586 float float_val = *
reinterpret_cast<float*
>(addr);
5587 set_fpr(r1, float_val);
5592 DCHECK_OPCODE(BRXH);
5593 DECODE_RSI_INSTRUCTION(r1, r3, i2);
5595 int32_t r3_val = (r3 == 0) ? 0 : get_low_register<int32_t>(r3);
5596 intptr_t branch_address = get_pc() + (2 * i2);
5599 r3 % 2 == 0 ? get_low_register<int32_t>(r3 + 1) : r3_val;
5600 if (r1_val > compare_val) {
5601 set_pc(branch_address);
5603 set_low_register(r1, r1_val);
5615 DECODE_RS_A_INSTRUCTION(r1, r3, b2, d2);
5618 int32_t r1_val = (r1 == 0) ? 0 : get_register(r1);
5619 int32_t r3_val = (r3 == 0) ? 0 : get_register(r3);
5620 intptr_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5621 intptr_t branch_address = b2_val + d2;
5629 int32_t compare_val = r3 % 2 == 0 ? get_register(r3 + 1) : r3_val;
5630 if (r1_val > compare_val) {
5632 set_pc(branch_address);
5636 set_register(r1, r1_val);
5649 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
5651 uint32_t b2_val = b2 == 0 ? 0 : get_low_register<uint32_t>(b2);
5652 uint32_t shiftBits = (b2_val + d2) & 0x3F;
5653 uint32_t r1_val = get_low_register<uint32_t>(r1);
5654 uint32_t alu_out = 0;
5655 if (shiftBits < 32u) {
5656 alu_out = r1_val >> shiftBits;
5658 set_low_register(r1, alu_out);
5664 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2)
5666 uint32_t b2_val = b2 == 0 ? 0 : get_low_register<uint32_t>(b2);
5667 uint32_t shiftBits = (b2_val + d2) & 0x3F;
5668 uint32_t r1_val = get_low_register<uint32_t>(r1);
5669 uint32_t alu_out = 0;
5670 if (shiftBits < 32u) {
5671 alu_out = r1_val << shiftBits;
5673 set_low_register(r1, alu_out);
5679 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
5681 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
5682 int shiftBits = (b2_val + d2) & 0x3F;
5683 int32_t r1_val = get_low_register<int32_t>(r1);
5686 if (shiftBits < 32) {
5687 alu_out = r1_val >> shiftBits;
5689 set_low_register(r1, alu_out);
5690 SetS390ConditionCode<int32_t>(alu_out, 0);
5691 SetS390OverflowCode(isOF);
5697 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
5699 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
5700 int shiftBits = (b2_val + d2) & 0x3F;
5701 int32_t r1_val = get_low_register<int32_t>(r1);
5704 isOF = CheckOverflowForShiftLeft(r1_val, shiftBits);
5705 if (shiftBits < 32) {
5706 alu_out = r1_val << shiftBits;
5708 set_low_register(r1, alu_out);
5709 SetS390ConditionCode<int32_t>(alu_out, 0);
5710 SetS390OverflowCode(isOF);
5715 DCHECK_OPCODE(SRDL);
5716 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
5719 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
5720 int shiftBits = (b2_val + d2) & 0x3F;
5721 uint64_t opnd1 =
static_cast<uint64_t
>(get_low_register<uint32_t>(r1)) << 32;
5722 uint64_t opnd2 =
static_cast<uint64_t
>(get_low_register<uint32_t>(r1 + 1));
5723 uint64_t r1_val = opnd1 | opnd2;
5724 uint64_t alu_out = r1_val >> shiftBits;
5725 set_low_register(r1, alu_out >> 32);
5726 set_low_register(r1 + 1, alu_out & 0x00000000FFFFFFFF);
5727 SetS390ConditionCode<int32_t>(alu_out, 0);
5732 DCHECK_OPCODE(SLDL);
5733 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
5735 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
5736 int shiftBits = (b2_val + d2) & 0x3F;
5739 uint32_t r1_val = get_low_register<uint32_t>(r1);
5740 uint32_t r1_next_val = get_low_register<uint32_t>(r1 + 1);
5741 uint64_t alu_out = (
static_cast<uint64_t
>(r1_val) << 32) |
5742 (
static_cast<uint64_t
>(r1_next_val));
5743 alu_out <<= shiftBits;
5744 set_low_register(r1 + 1,
static_cast<uint32_t
>(alu_out));
5745 set_low_register(r1,
static_cast<uint32_t
>(alu_out >> 32));
5750 DCHECK_OPCODE(SRDA);
5751 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
5754 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
5755 int shiftBits = (b2_val + d2) & 0x3F;
5756 int64_t opnd1 =
static_cast<int64_t
>(get_low_register<int32_t>(r1)) << 32;
5757 int64_t opnd2 =
static_cast<uint64_t
>(get_low_register<uint32_t>(r1 + 1));
5758 int64_t r1_val = opnd1 + opnd2;
5759 int64_t alu_out = r1_val >> shiftBits;
5760 set_low_register(r1, alu_out >> 32);
5761 set_low_register(r1 + 1, alu_out & 0x00000000FFFFFFFF);
5762 SetS390ConditionCode<int32_t>(alu_out, 0);
5774 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2);
5780 if (r3 < r1) r3 += 16;
5785 for (
int i = 0;
i <= r3 - r1;
i++) {
5786 int32_t value = get_low_register<int32_t>((r1 +
i) % 16);
5787 WriteW(rb_val +
offset + 4 *
i, value);
5813 DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val)
5814 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
5815 intptr_t addr = b1_val + d1_val;
5816 uint8_t mem_val = ReadB(addr);
5817 SetS390ConditionCode<uint8_t>(mem_val, imm_val);
5835 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2);
5841 if (r3 < r1) r3 += 16;
5846 for (
int i = 0;
i <= r3 - r1;
i++) {
5848 set_low_register((r1 +
i) % 16, value);
5916 SSInstruction* ssInstr =
reinterpret_cast<SSInstruction*
>(
instr);
5917 int b1 = ssInstr->B1Value();
5918 intptr_t d1 = ssInstr->D1Value();
5919 int b2 = ssInstr->B2Value();
5920 intptr_t d2 = ssInstr->D2Value();
5921 int length = ssInstr->Length();
5922 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
5923 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
5924 intptr_t src_addr = b2_val + d2;
5925 intptr_t dst_addr = b1_val + d1;
5927 for (
int i = 0;
i < length + 1; ++
i) {
5928 WriteB(dst_addr++, ReadB(src_addr++));
6139 DCHECK_OPCODE(NILH);
6140 DECODE_RI_A_INSTRUCTION(
instr, r1,
i);
6141 int32_t r1_val = get_low_register<int32_t>(r1);
6143 SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) &
i);
6144 i = (
i << 16) | 0x0000FFFF;
6145 set_low_register(r1, r1_val &
i);
6150 DCHECK_OPCODE(NILL);
6151 DECODE_RI_A_INSTRUCTION(
instr, r1,
i);
6152 int32_t r1_val = get_low_register<int32_t>(r1);
6154 SetS390BitWiseConditionCode<uint16_t>(r1_val &
i);
6156 set_low_register(r1, r1_val &
i);
6173 DCHECK_OPCODE(OILH);
6174 DECODE_RI_A_INSTRUCTION(
instr, r1,
i);
6175 int32_t r1_val = get_low_register<int32_t>(r1);
6177 SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) |
i);
6179 set_low_register(r1, r1_val |
i);
6184 DCHECK_OPCODE(OILL);
6185 DECODE_RI_A_INSTRUCTION(
instr, r1,
i);
6186 int32_t r1_val = get_low_register<int32_t>(r1);
6188 SetS390BitWiseConditionCode<uint16_t>(r1_val |
i);
6189 set_low_register(r1, r1_val |
i);
6194 DCHECK_OPCODE(LLIHL);
6195 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6196 uint64_t imm =
static_cast<uint64_t
>(i2) & 0xffff;
6197 set_register(r1, imm << 48);
6202 DCHECK_OPCODE(LLIHL);
6203 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6204 uint64_t imm =
static_cast<uint64_t
>(i2) & 0xffff;
6205 set_register(r1, imm << 32);
6210 DCHECK_OPCODE(LLILH);
6211 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6212 uint64_t imm =
static_cast<uint64_t
>(i2) & 0xffff;
6213 set_register(r1, imm << 16);
6218 DCHECK_OPCODE(LLILL);
6219 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6220 uint64_t imm =
static_cast<uint64_t
>(i2) & 0xffff;
6221 set_register(r1, imm);
6225inline static int TestUnderMask(uint16_t val, uint16_t
mask,
6226 bool is_tm_or_tmy) {
6228 if (0 == (
mask & val)) {
6246#if defined(__GNUC__)
6247 int leadingZeros = __builtin_clz(
mask);
6248 mask = 0x80000000u >> leadingZeros;
6257 for (
int i = 15;
i >= 0;
i--) {
6258 if (
mask & (1 <<
i)) {
6259 if (val & (1 <<
i)) {
6273 DCHECK_OPCODE(TMLH);
6274 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6275 uint32_t value = get_low_register<uint32_t>(r1) >> 16;
6276 uint32_t
mask = i2 & 0x0000FFFF;
6277 bool is_tm_or_tmy = 0;
6278 condition_reg_ = TestUnderMask(value,
mask, is_tm_or_tmy);
6283 DCHECK_OPCODE(TMLL);
6284 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6285 uint32_t value = get_low_register<uint32_t>(r1) & 0x0000FFFF;
6286 uint32_t
mask = i2 & 0x0000FFFF;
6287 bool is_tm_or_tmy = 0;
6288 condition_reg_ = TestUnderMask(value,
mask, is_tm_or_tmy);
6293 DCHECK_OPCODE(TMHH);
6294 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6295 uint32_t value = get_high_register<uint32_t>(r1) >> 16;
6296 uint32_t
mask = i2 & 0x0000FFFF;
6297 bool is_tm_or_tmy = 0;
6298 condition_reg_ = TestUnderMask(value,
mask, is_tm_or_tmy);
6303 DCHECK_OPCODE(TMHL);
6304 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6305 uint32_t value = get_high_register<uint32_t>(r1) & 0x0000FFFF;
6306 uint32_t
mask = i2 & 0x0000FFFF;
6307 bool is_tm_or_tmy = 0;
6308 condition_reg_ = TestUnderMask(value,
mask, is_tm_or_tmy);
6313 DCHECK_OPCODE(BRAS);
6315 DECODE_RI_B_INSTRUCTION(
instr, r1, d2)
6316 intptr_t
pc = get_pc();
6318 set_register(r1,
pc +
sizeof(FourByteInstr));
6320 set_pc(
pc + d2 * 2);
6325 DCHECK_OPCODE(BRCT);
6327 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6328 int64_t value = get_low_register<int32_t>(r1);
6329 set_low_register(r1, --value);
6332 intptr_t
offset = i2 * 2;
6333 set_pc(get_pc() +
offset);
6339 DCHECK_OPCODE(BRCTG);
6341 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6342 int64_t value = get_register(r1);
6343 set_register(r1, --value);
6346 intptr_t
offset = i2 * 2;
6347 set_pc(get_pc() +
offset);
6354 DECODE_RI_A_INSTRUCTION(
instr, r1,
i);
6355 set_low_register(r1,
i);
6360 DCHECK_OPCODE(LGHI);
6361 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6362 int64_t
i =
static_cast<int64_t
>(i2);
6363 set_register(r1,
i);
6369 DECODE_RI_A_INSTRUCTION(
instr, r1,
i);
6370 int32_t r1_val = get_low_register<int32_t>(r1);
6372 isOF = CheckOverflowForMul(r1_val,
i);
6374 set_low_register(r1, r1_val);
6375 SetS390ConditionCode<int32_t>(r1_val, 0);
6376 SetS390OverflowCode(isOF);
6381 DCHECK_OPCODE(MGHI);
6382 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6383 int64_t
i =
static_cast<int64_t
>(i2);
6384 int64_t r1_val = get_register(r1);
6386 isOF = CheckOverflowForMul(r1_val,
i);
6388 set_register(r1, r1_val);
6389 SetS390ConditionCode<int32_t>(r1_val, 0);
6390 SetS390OverflowCode(isOF);
6396 DECODE_RI_A_INSTRUCTION(
instr, r1,
i);
6397 int32_t r1_val = get_low_register<int32_t>(r1);
6398 SetS390ConditionCode<int32_t>(r1_val,
i);
6403 DCHECK_OPCODE(CGHI);
6404 DECODE_RI_A_INSTRUCTION(
instr, r1, i2);
6405 int64_t
i =
static_cast<int64_t
>(i2);
6406 int64_t r1_val = get_register(r1);
6407 SetS390ConditionCode<int64_t>(r1_val,
i);
6412 DCHECK_OPCODE(LARL);
6413 DECODE_RIL_B_INSTRUCTION(r1, i2);
6414 intptr_t
offset = i2 * 2;
6415 set_register(r1, get_pc() +
offset);
6420 DCHECK_OPCODE(LGFI);
6421 DECODE_RIL_A_INSTRUCTION(r1, imm);
6422 set_register(r1,
static_cast<int64_t
>(
static_cast<int32_t>(imm)));
6427 DCHECK_OPCODE(BRASL);
6429 DECODE_RIL_B_INSTRUCTION(r1, i2);
6431 intptr_t
pc = get_pc();
6432 set_register(r1,
pc + 6);
6433 set_pc(
pc + d2 * 2);
6438 DCHECK_OPCODE(XIHF);
6439 DECODE_RIL_A_INSTRUCTION(r1, imm);
6440 uint32_t alu_out = 0;
6441 alu_out = get_high_register<uint32_t>(r1);
6442 alu_out = alu_out ^ imm;
6443 set_high_register(r1, alu_out);
6444 SetS390BitWiseConditionCode<uint32_t>(alu_out);
6449 DCHECK_OPCODE(XILF);
6450 DECODE_RIL_A_INSTRUCTION(r1, imm);
6451 uint32_t alu_out = 0;
6452 alu_out = get_low_register<uint32_t>(r1);
6453 alu_out = alu_out ^ imm;
6454 set_low_register(r1, alu_out);
6455 SetS390BitWiseConditionCode<uint32_t>(alu_out);
6460 DCHECK_OPCODE(NIHF);
6462 DECODE_RIL_A_INSTRUCTION(r1, imm);
6463 uint32_t alu_out = get_high_register<uint32_t>(r1);
6465 SetS390BitWiseConditionCode<uint32_t>(alu_out);
6466 set_high_register(r1, alu_out);
6471 DCHECK_OPCODE(NILF);
6473 DECODE_RIL_A_INSTRUCTION(r1, imm);
6474 uint32_t alu_out = get_low_register<uint32_t>(r1);
6476 SetS390BitWiseConditionCode<uint32_t>(alu_out);
6477 set_low_register(r1, alu_out);
6482 DCHECK_OPCODE(OIHF);
6484 DECODE_RIL_B_INSTRUCTION(r1, imm);
6485 uint32_t alu_out = get_high_register<uint32_t>(r1);
6487 SetS390BitWiseConditionCode<uint32_t>(alu_out);
6488 set_high_register(r1, alu_out);
6493 DCHECK_OPCODE(OILF);
6495 DECODE_RIL_B_INSTRUCTION(r1, imm);
6496 uint32_t alu_out = get_low_register<uint32_t>(r1);
6498 SetS390BitWiseConditionCode<uint32_t>(alu_out);
6499 set_low_register(r1, alu_out);
6504 DCHECK_OPCODE(LLIHF);
6506 DECODE_RIL_A_INSTRUCTION(r1, i2);
6507 uint64_t imm =
static_cast<uint64_t
>(i2);
6508 set_register(r1, imm << 32);
6513 DCHECK_OPCODE(LLILF);
6515 DECODE_RIL_A_INSTRUCTION(r1, i2);
6516 uint64_t imm =
static_cast<uint64_t
>(i2);
6517 set_register(r1, imm);
6522 DCHECK_OPCODE(MSGFI);
6523 DECODE_RIL_B_INSTRUCTION(r1, i2);
6524 int64_t alu_out = get_register(r1);
6525 alu_out = alu_out * i2;
6526 set_register(r1, alu_out);
6531 DCHECK_OPCODE(MSFI);
6532 DECODE_RIL_B_INSTRUCTION(r1, i2);
6533 int32_t alu_out = get_low_register<int32_t>(r1);
6534 alu_out = alu_out * i2;
6535 set_low_register(r1, alu_out);
6540 DCHECK_OPCODE(SLGFI);
6541 DECODE_RIL_A_INSTRUCTION(r1, i2);
6542 uint64_t r1_val = (uint64_t)(get_register(r1));
6544 alu_out = r1_val - i2;
6545 set_register(r1, (intptr_t)alu_out);
6546 SetS390ConditionCode<uint64_t>(alu_out, 0);
6551 DCHECK_OPCODE(SLFI);
6552 DECODE_RIL_A_INSTRUCTION(r1, imm);
6553 uint32_t alu_out = get_low_register<uint32_t>(r1);
6555 SetS390ConditionCode<uint32_t>(alu_out, 0);
6556 set_low_register(r1, alu_out);
6561 DCHECK_OPCODE(AGFI);
6563 DECODE_RIL_B_INSTRUCTION(r1, i2_val);
6566 int64_t r1_val = get_register(r1);
6567 int64_t i2 =
static_cast<int64_t
>(i2_val);
6568 isOF = CheckOverflowForIntAdd(r1_val, i2, int64_t);
6569 int64_t alu_out = r1_val + i2;
6570 set_register(r1, alu_out);
6571 SetS390ConditionCode<int64_t>(alu_out, 0);
6572 SetS390OverflowCode(isOF);
6579 DECODE_RIL_B_INSTRUCTION(r1, i2);
6582 int32_t r1_val = get_low_register<int32_t>(r1);
6583 isOF = CheckOverflowForIntAdd(r1_val, i2, int32_t);
6584 int32_t alu_out = r1_val + i2;
6585 set_low_register(r1, alu_out);
6586 SetS390ConditionCode<int32_t>(alu_out, 0);
6587 SetS390OverflowCode(isOF);
6592 DCHECK_OPCODE(ALGFI);
6593 DECODE_RIL_A_INSTRUCTION(r1, i2);
6594 uint64_t r1_val = (uint64_t)(get_register(r1));
6596 alu_out = r1_val + i2;
6597 set_register(r1, (intptr_t)alu_out);
6598 SetS390ConditionCode<uint64_t>(alu_out, 0);
6604 DCHECK_OPCODE(ALFI);
6605 DECODE_RIL_A_INSTRUCTION(r1, imm);
6606 uint32_t alu_out = get_low_register<uint32_t>(r1);
6608 SetS390ConditionCode<uint32_t>(alu_out, 0);
6609 set_low_register(r1, alu_out);
6614 DCHECK_OPCODE(CGFI);
6616 DECODE_RIL_B_INSTRUCTION(r1, i2);
6617 int64_t imm =
static_cast<int64_t
>(i2);
6618 SetS390ConditionCode<int64_t>(get_register(r1), imm);
6625 DECODE_RIL_B_INSTRUCTION(r1, imm);
6626 SetS390ConditionCode<int32_t>(get_low_register<int32_t>(r1), imm);
6631 DCHECK_OPCODE(CLGFI);
6633 DECODE_RIL_A_INSTRUCTION(r1, i2);
6634 uint64_t imm =
static_cast<uint64_t
>(i2);
6635 SetS390ConditionCode<uint64_t>(get_register(r1), imm);
6640 DCHECK_OPCODE(CLFI);
6642 DECODE_RIL_A_INSTRUCTION(r1, imm);
6643 SetS390ConditionCode<uint32_t>(get_low_register<uint32_t>(r1), imm);
6678 DCHECK_OPCODE(LGRL);
6679 DECODE_RIL_B_INSTRUCTION(r1, i2);
6680 intptr_t
offset = i2 * 2;
6681 int64_t mem_val = ReadDW(get_pc() +
offset);
6682 set_register(r1, mem_val);
6784 DECODE_RIL_A_INSTRUCTION(r1, i2);
6785 int32_t r1_val = get_high_register<int32_t>(r1);
6786 bool isOF = CheckOverflowForIntAdd(r1_val,
static_cast<int32_t>(i2), int32_t);
6787 r1_val +=
static_cast<int32_t>(i2);
6788 set_high_register(r1, r1_val);
6789 SetS390ConditionCode<int32_t>(r1_val, 0);
6790 SetS390OverflowCode(isOF);
6808 DECODE_RIL_A_INSTRUCTION(r1, imm);
6809 int32_t r1_val = get_high_register<int32_t>(r1);
6810 SetS390ConditionCode<int32_t>(r1_val,
static_cast<int32_t>(imm));
6815 DCHECK_OPCODE(CLIH);
6817 DECODE_RIL_A_INSTRUCTION(r1, imm);
6818 SetS390ConditionCode<uint32_t>(get_high_register<uint32_t>(r1), imm);
6932 DECODE_RRE_INSTRUCTION(r1, r2);
6933 int32_t r1_val = get_low_register<int32_t>(r1);
6934 int32_t r2_val = get_low_register<int32_t>(r2);
6935 set_low_register(r1, r1_val * r2_val);
6940 DCHECK_OPCODE(MSRKC);
6941 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
6942 int32_t r2_val = get_low_register<int32_t>(r2);
6943 int32_t r3_val = get_low_register<int32_t>(r3);
6945 static_cast<int64_t
>(r2_val) *
static_cast<int64_t
>(r3_val);
6947 bool isOF = (
static_cast<int64_t
>(result32) != result64);
6948 SetS390ConditionCode<int32_t>(result32, 0);
6949 SetS390OverflowCode(isOF);
6950 set_low_register(r1, result32);
7069 DCHECK_OPCODE(TRAP4);
7072 int64_t sp_addr = get_register(sp);
7075 if (
i != 14) (
reinterpret_cast<intptr_t*
>(sp_addr))[
i] = 0xDEADBABE;
7077 SoftwareInterrupt(
instr);
7082 DCHECK_OPCODE(LPEBR);
7083 DECODE_RRE_INSTRUCTION(r1, r2);
7084 float fr1_val = get_fpr<float>(r1);
7085 float fr2_val = get_fpr<float>(r2);
7086 fr1_val = std::fabs(fr2_val);
7087 set_fpr(r1, fr1_val);
7088 if (fr2_val != fr2_val) {
7089 condition_reg_ =
CC_OF;
7090 }
else if (fr2_val == 0) {
7091 condition_reg_ =
CC_EQ;
7093 condition_reg_ =
CC_GT;
7106 DCHECK_OPCODE(LTEBR);
7107 DECODE_RRE_INSTRUCTION(r1, r2);
7108 int64_t r2_val = get_fpr<int64_t>(r2);
7109 float fr2_val = get_fpr<float>(r2);
7110 SetS390ConditionCode<float>(fr2_val, 0.0);
7111 set_fpr(r1, r2_val);
7116 DCHECK_OPCODE(LCEBR);
7117 DECODE_RRE_INSTRUCTION(r1, r2);
7118 float fr1_val = get_fpr<float>(r1);
7119 float fr2_val = get_fpr<float>(r2);
7121 set_fpr(r1, fr1_val);
7122 if (fr2_val != fr2_val) {
7123 condition_reg_ =
CC_OF;
7124 }
else if (fr2_val == 0) {
7125 condition_reg_ =
CC_EQ;
7126 }
else if (fr2_val < 0) {
7127 condition_reg_ =
CC_LT;
7128 }
else if (fr2_val > 0) {
7129 condition_reg_ =
CC_GT;
7135 DCHECK_OPCODE(LDEBR);
7136 DECODE_RRE_INSTRUCTION(r1, r2);
7137 float fp_val = get_fpr<float>(r2);
7138 double db_val =
static_cast<double>(fp_val);
7139 set_fpr(r1, db_val);
7168 DCHECK_OPCODE(CEBR);
7169 DECODE_RRE_INSTRUCTION(r1, r2);
7170 float fr1_val = get_fpr<float>(r1);
7171 float fr2_val = get_fpr<float>(r2);
7172 if (isNaN(fr1_val) || isNaN(fr2_val)) {
7173 condition_reg_ =
CC_OF;
7175 SetS390ConditionCode<float>(fr1_val, fr2_val);
7182 DCHECK_OPCODE(AEBR);
7183 DECODE_RRE_INSTRUCTION(r1, r2);
7184 float fr1_val = get_fpr<float>(r1);
7185 float fr2_val = get_fpr<float>(r2);
7187 set_fpr(r1, fr1_val);
7188 SetS390ConditionCode<float>(fr1_val, 0);
7194 DCHECK_OPCODE(SEBR);
7195 DECODE_RRE_INSTRUCTION(r1, r2);
7196 float fr1_val = get_fpr<float>(r1);
7197 float fr2_val = get_fpr<float>(r2);
7199 set_fpr(r1, fr1_val);
7200 SetS390ConditionCode<float>(fr1_val, 0);
7212 DCHECK_OPCODE(DEBR);
7213 DECODE_RRE_INSTRUCTION(r1, r2);
7214 float fr1_val = get_fpr<float>(r1);
7215 float fr2_val = get_fpr<float>(r2);
7217 set_fpr(r1, fr1_val);
7234 DCHECK_OPCODE(LPDBR);
7235 DECODE_RRE_INSTRUCTION(r1, r2);
7236 double r1_val = get_fpr<double>(r1);
7237 double r2_val = get_fpr<double>(r2);
7238 r1_val = std::fabs(r2_val);
7239 set_fpr(r1, r1_val);
7240 if (r2_val != r2_val) {
7241 condition_reg_ =
CC_OF;
7242 }
else if (r2_val == 0) {
7243 condition_reg_ =
CC_EQ;
7245 condition_reg_ =
CC_GT;
7257 DCHECK_OPCODE(LTDBR);
7258 DECODE_RRE_INSTRUCTION(r1, r2);
7259 int64_t r2_val = get_fpr<int64_t>(r2);
7260 SetS390ConditionCode<double>(base::bit_cast<double, int64_t>(r2_val), 0.0);
7261 set_fpr(r1, r2_val);
7266 DCHECK_OPCODE(LCDBR);
7267 DECODE_RRE_INSTRUCTION(r1, r2);
7268 double r1_val = get_fpr<double>(r1);
7269 double r2_val = get_fpr<double>(r2);
7271 set_fpr(r1, r1_val);
7272 if (r2_val != r2_val) {
7273 condition_reg_ =
CC_OF;
7274 }
else if (r2_val == 0) {
7275 condition_reg_ =
CC_EQ;
7276 }
else if (r2_val < 0) {
7277 condition_reg_ =
CC_LT;
7278 }
else if (r2_val > 0) {
7279 condition_reg_ =
CC_GT;
7285 DCHECK_OPCODE(SQEBR);
7286 DECODE_RRE_INSTRUCTION(r1, r2);
7287 float fr1_val = get_fpr<float>(r1);
7288 float fr2_val = get_fpr<float>(r2);
7289 fr1_val = std::sqrt(fr2_val);
7290 set_fpr(r1, fr1_val);
7295 DCHECK_OPCODE(SQDBR);
7296 DECODE_RRE_INSTRUCTION(r1, r2);
7297 double r1_val = get_fpr<double>(r1);
7298 double r2_val = get_fpr<double>(r2);
7299 r1_val = std::sqrt(r2_val);
7300 set_fpr(r1, r1_val);
7311 DCHECK_OPCODE(MEEBR);
7312 DECODE_RRE_INSTRUCTION(r1, r2);
7313 float fr1_val = get_fpr<float>(r1);
7314 float fr2_val = get_fpr<float>(r2);
7316 set_fpr(r1, fr1_val);
7327 DCHECK_OPCODE(CDBR);
7328 DECODE_RRE_INSTRUCTION(r1, r2);
7329 double r1_val = get_fpr<double>(r1);
7330 double r2_val = get_fpr<double>(r2);
7331 if (isNaN(r1_val) || isNaN(r2_val)) {
7332 condition_reg_ =
CC_OF;
7334 SetS390ConditionCode<double>(r1_val, r2_val);
7340 DCHECK_OPCODE(ADBR);
7341 DECODE_RRE_INSTRUCTION(r1, r2);
7342 double r1_val = get_fpr<double>(r1);
7343 double r2_val = get_fpr<double>(r2);
7345 set_fpr(r1, r1_val);
7346 SetS390ConditionCode<double>(r1_val, 0);
7351 DCHECK_OPCODE(SDBR);
7352 DECODE_RRE_INSTRUCTION(r1, r2);
7353 double r1_val = get_fpr<double>(r1);
7354 double r2_val = get_fpr<double>(r2);
7356 set_fpr(r1, r1_val);
7357 SetS390ConditionCode<double>(r1_val, 0);
7362 DCHECK_OPCODE(MDBR);
7363 DECODE_RRE_INSTRUCTION(r1, r2);
7364 double r1_val = get_fpr<double>(r1);
7365 double r2_val = get_fpr<double>(r2);
7367 set_fpr(r1, r1_val);
7372 DCHECK_OPCODE(DDBR);
7373 DECODE_RRE_INSTRUCTION(r1, r2);
7374 double r1_val = get_fpr<double>(r1);
7375 double r2_val = get_fpr<double>(r2);
7377 set_fpr(r1, r1_val);
7382 DCHECK_OPCODE(MADBR);
7383 DECODE_RRD_INSTRUCTION(r1, r2, r3);
7384 double r1_val = get_fpr<double>(r1);
7385 double r2_val = get_fpr<double>(r2);
7386 double r3_val = get_fpr<double>(r3);
7387 r1_val += r2_val * r3_val;
7388 set_fpr(r1, r1_val);
7389 SetS390ConditionCode<double>(r1_val, 0);
7424 DCHECK_OPCODE(LEDBRA);
7425 DECODE_RRE_INSTRUCTION(r1, r2);
7426 double r2_val = get_fpr<double>(r2);
7427 set_fpr(r1,
static_cast<float>(r2_val));
7546 DCHECK_OPCODE(LZER);
7547 DECODE_RRE_INSTRUCTION_NO_R2(r1);
7548 set_fpr<float>(r1, 0.0);
7553 DCHECK_OPCODE(LZDR);
7554 DECODE_RRE_INSTRUCTION_NO_R2(r1);
7555 set_fpr<double>(r1, 0.0);
7584 DCHECK_OPCODE(CELFBR);
7585 DECODE_RRE_INSTRUCTION(r1, r2);
7586 uint32_t r2_val = get_low_register<uint32_t>(r2);
7587 float r1_val =
static_cast<float>(r2_val);
7588 set_fpr(r1, r1_val);
7593 DCHECK_OPCODE(CDLFBR);
7594 DECODE_RRE_INSTRUCTION(r1, r2);
7595 uint32_t r2_val = get_low_register<uint32_t>(r2);
7596 double r1_val =
static_cast<double>(r2_val);
7597 set_fpr(r1, r1_val);
7608 DCHECK_OPCODE(CEFBRA);
7609 DECODE_RRE_INSTRUCTION(r1, r2);
7610 int32_t fr2_val = get_low_register<int32_t>(r2);
7611 float fr1_val =
static_cast<float>(fr2_val);
7612 set_fpr(r1, fr1_val);
7617 DCHECK_OPCODE(CDFBRA);
7618 DECODE_RRE_INSTRUCTION(r1, r2);
7619 int32_t r2_val = get_low_register<int32_t>(r2);
7620 double r1_val =
static_cast<double>(r2_val);
7621 set_fpr(r1, r1_val);
7632 DCHECK_OPCODE(FIDBRA);
7633 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7636 double a = get_fpr<double>(r2);
7637 double n = ComputeRounding<double>(a, m3);
7643 DCHECK_OPCODE(FIEBRA);
7644 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7647 float a = get_fpr<float>(r2);
7648 float n = ComputeRounding<float>(a, m3);
7653template <
class T,
class R>
7654static int ComputeSignedRoundingConditionCode(T a, T n) {
7655 constexpr T NINF = -std::numeric_limits<T>::infinity();
7656 constexpr T PINF = std::numeric_limits<T>::infinity();
7657 constexpr long double MN =
7658 static_cast<long double>(std::numeric_limits<R>::min());
7659 constexpr long double MP =
7660 static_cast<long double>(std::numeric_limits<R>::max());
7662 if (NINF <= a && a < MN && n < MN) {
7664 }
else if (NINF < a && a < MN && n == MN) {
7666 }
else if (MN <= a && a < 0.0) {
7668 }
else if (a == 0.0) {
7670 }
else if (0.0 < a && a <= MP) {
7672 }
else if (MP < a && a <= PINF && n == MP) {
7676 }
else if (std::isnan(a)) {
7684 DCHECK_OPCODE(CFDBRA);
7685 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7688 double a = get_fpr<double>(r2);
7689 double n = ComputeRounding<double>(a, m3);
7690 int32_t r1_val = ComputeSignedRoundingResult<double, int32_t>(a, n);
7691 condition_reg_ = ComputeSignedRoundingConditionCode<double, int32_t>(a, n);
7693 set_low_register(r1, r1_val);
7698 DCHECK_OPCODE(CFEBRA);
7699 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7702 float a = get_fpr<float>(r2);
7703 float n = ComputeRounding<float>(a, m3);
7704 int32_t r1_val = ComputeSignedRoundingResult<float, int32_t>(a, n);
7705 condition_reg_ = ComputeSignedRoundingConditionCode<float, int32_t>(a, n);
7707 set_low_register(r1, r1_val);
7712 DCHECK_OPCODE(CGEBRA);
7713 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7716 float a = get_fpr<float>(r2);
7717 float n = ComputeRounding<float>(a, m3);
7718 int64_t r1_val = ComputeSignedRoundingResult<float, int64_t>(a, n);
7719 condition_reg_ = ComputeSignedRoundingConditionCode<float, int64_t>(a, n);
7721 set_register(r1, r1_val);
7726 DCHECK_OPCODE(CGDBRA);
7727 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7730 double a = get_fpr<double>(r2);
7731 double n = ComputeRounding<double>(a, m3);
7732 int64_t r1_val = ComputeSignedRoundingResult<double, int64_t>(a, n);
7733 condition_reg_ = ComputeSignedRoundingConditionCode<double, int64_t>(a, n);
7735 set_register(r1, r1_val);
7751template <
class T,
class R>
7752static int ComputeLogicalRoundingConditionCode(T a, T n) {
7753 constexpr T NINF = -std::numeric_limits<T>::infinity();
7754 constexpr T PINF = std::numeric_limits<T>::infinity();
7755 constexpr long double MP =
7756 static_cast<long double>(std::numeric_limits<R>::max());
7758 if (NINF <= a && a < 0.0) {
7759 return (n < 0.0) ? 0x1 : 0x4;
7760 }
else if (a == 0.0) {
7762 }
else if (0.0 < a && a <= MP) {
7764 }
else if (MP < a && a <= PINF) {
7765 return n == MP ? 0x2 : 0x1;
7766 }
else if (std::isnan(a)) {
7774 DCHECK_OPCODE(CLFEBR);
7775 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7778 float a = get_fpr<float>(r2);
7779 float n = ComputeRounding<float>(a, m3);
7780 uint32_t r1_val = ComputeLogicalRoundingResult<float, uint32_t>(a, n);
7781 condition_reg_ = ComputeLogicalRoundingConditionCode<float, uint32_t>(a, n);
7783 set_low_register(r1, r1_val);
7788 DCHECK_OPCODE(CLFDBR);
7789 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7792 double a = get_fpr<double>(r2);
7793 double n = ComputeRounding<double>(a, m3);
7794 uint32_t r1_val = ComputeLogicalRoundingResult<double, uint32_t>(a, n);
7795 condition_reg_ = ComputeLogicalRoundingConditionCode<double, uint32_t>(a, n);
7797 set_low_register(r1, r1_val);
7802 DCHECK_OPCODE(CLGDBR);
7803 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7806 double a = get_fpr<double>(r2);
7807 double n = ComputeRounding<double>(a, m3);
7808 uint64_t r1_val = ComputeLogicalRoundingResult<double, uint64_t>(a, n);
7809 condition_reg_ = ComputeLogicalRoundingConditionCode<double, uint64_t>(a, n);
7811 set_register(r1, r1_val);
7816 DCHECK_OPCODE(CLGEBR);
7817 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
7820 float a = get_fpr<float>(r2);
7821 float n = ComputeRounding<float>(a, m3);
7822 uint64_t r1_val = ComputeLogicalRoundingResult<float, uint64_t>(a, n);
7823 condition_reg_ = ComputeLogicalRoundingConditionCode<float, uint64_t>(a, n);
7825 set_register(r1, r1_val);
7836 DCHECK_OPCODE(CELGBR);
7837 DECODE_RRE_INSTRUCTION(r1, r2);
7838 uint64_t r2_val = get_register(r2);
7839 float r1_val =
static_cast<float>(r2_val);
7840 set_fpr(r1, r1_val);
7845 DCHECK_OPCODE(CDLGBR);
7846 DECODE_RRE_INSTRUCTION(r1, r2);
7847 uint64_t r2_val = get_register(r2);
7848 double r1_val =
static_cast<double>(r2_val);
7849 set_fpr(r1, r1_val);
7860 DCHECK_OPCODE(CEGBRA);
7861 DECODE_RRE_INSTRUCTION(r1, r2);
7862 int64_t fr2_val = get_register(r2);
7863 float fr1_val =
static_cast<float>(fr2_val);
7864 set_fpr(r1, fr1_val);
7869 DCHECK_OPCODE(CDGBRA);
7870 DECODE_RRE_INSTRUCTION(r1, r2);
7871 int64_t r2_val = get_register(r2);
7872 double r1_val =
static_cast<double>(r2_val);
7873 set_fpr(r1, r1_val);
7902 DCHECK_OPCODE(LDGR);
7904 DECODE_RRE_INSTRUCTION(r1, r2);
7905 uint64_t int_val = get_register(r2);
7906 set_fpr(r1, int_val);
7929 DCHECK_OPCODE(LGDR);
7930 DECODE_RRE_INSTRUCTION(r1, r2);
7932 int64_t double_val = get_fpr<int64_t>(r2);
7933 set_register(r1, double_val);
8196 DCHECK_OPCODE(LPGR);
8198 DECODE_RRE_INSTRUCTION(r1, r2);
8199 int64_t r2_val = get_register(r2);
8200 SetS390ConditionCode<int64_t>(r2_val, 0);
8201 if (r2_val == (
static_cast<int64_t
>(1) << 63)) {
8202 SetS390OverflowCode(
true);
8205 r2_val = (r2_val < 0) ? -r2_val : r2_val;
8207 set_register(r1, r2_val);
8212 DCHECK_OPCODE(LNGR);
8214 DECODE_RRE_INSTRUCTION(r1, r2);
8215 int64_t r2_val = get_register(r2);
8216 r2_val = (r2_val >= 0) ? -r2_val : r2_val;
8217 set_register(r1, r2_val);
8218 condition_reg_ = (r2_val == 0) ? CC_EQ :
CC_LT;
8224 DCHECK_OPCODE(LTGR);
8226 DECODE_RRE_INSTRUCTION(r1, r2);
8227 int64_t r2_val = get_register(r2);
8228 SetS390ConditionCode<int64_t>(r2_val, 0);
8229 set_register(r1, get_register(r2));
8234 DCHECK_OPCODE(LCGR);
8235 DECODE_RRE_INSTRUCTION(r1, r2);
8236 int64_t r2_val = get_register(r2);
8239 isOF = __builtin_ssubl_overflow(0L, r2_val, &
result);
8240 set_register(r1,
result);
8241 SetS390ConditionCode<int64_t>(
result, 0);
8243 SetS390OverflowCode(
true);
8250 DECODE_RRE_INSTRUCTION(r1, r2);
8251 int64_t r1_val = get_register(r1);
8252 int64_t r2_val = get_register(r2);
8254 isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t);
8256 SetS390ConditionCode<int64_t>(r1_val, 0);
8257 SetS390OverflowCode(isOF);
8258 set_register(r1, r1_val);
8263 DCHECK_OPCODE(ALGR);
8264 DECODE_RRE_INSTRUCTION(r1, r2);
8266 uint64_t r1_val = get_register(r1);
8267 uint64_t r2_val = get_register(r2);
8268 bool isOF = CheckOverflowForUIntAdd(r1_val, r2_val);
8269 SetS390ConditionCode<uint64_t>(r1_val + r2_val, 0);
8270 SetS390OverflowCode(isOF);
8271 set_register(r1, r1_val + r2_val);
8282 DCHECK_OPCODE(MSGR);
8283 DECODE_RRE_INSTRUCTION(r1, r2);
8284 int64_t r1_val = get_register(r1);
8285 int64_t r2_val = get_register(r2);
8286 set_register(r1, r1_val * r2_val);
8291 DCHECK_OPCODE(MSGRKC);
8292 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
8293 int64_t r2_val = get_register(r2);
8294 int64_t r3_val = get_register(r3);
8295 volatile int64_t result64 = r2_val * r3_val;
8296 bool isOF = ((r2_val == -1 && result64 == (
static_cast<int64_t
>(1L) << 63)) ||
8297 (r2_val != 0 && result64 / r2_val != r3_val));
8298 SetS390ConditionCode<int64_t>(result64, 0);
8299 SetS390OverflowCode(isOF);
8300 set_register(r1, result64);
8305 DCHECK_OPCODE(DSGR);
8306 DECODE_RRE_INSTRUCTION(r1, r2);
8310 int64_t dividend = get_register(r1 + 1);
8311 int64_t divisor = get_register(r2);
8312 set_register(r1, dividend % divisor);
8313 set_register(r1 + 1, dividend / divisor);
8318 DCHECK_OPCODE(LRVGR);
8319 DECODE_RRE_INSTRUCTION(r1, r2);
8320 int64_t r2_val = get_register(r2);
8321 int64_t r1_val = ByteReverse<int64_t>(r2_val);
8323 set_register(r1, r1_val);
8328 DCHECK_OPCODE(LPGFR);
8330 DECODE_RRE_INSTRUCTION(r1, r2);
8331 int32_t r2_val = get_low_register<int32_t>(r2);
8333 int64_t r1_val =
static_cast<int64_t
>((r2_val < 0) ? -r2_val : r2_val);
8334 set_register(r1, r1_val);
8335 SetS390ConditionCode<int64_t>(r1_val, 0);
8346 DCHECK_OPCODE(LTGFR);
8347 DECODE_RRE_INSTRUCTION(r1, r2);
8350 int32_t r2_val = get_low_register<int32_t>(r2);
8351 int64_t
result =
static_cast<int64_t
>(r2_val);
8352 set_register(r1,
result);
8353 SetS390ConditionCode<int64_t>(
result, 0);
8358 DCHECK_OPCODE(LCGFR);
8359 DECODE_RRE_INSTRUCTION(r1, r2);
8362 int32_t r2_val = get_low_register<int32_t>(r2);
8363 int64_t
result =
static_cast<int64_t
>(r2_val);
8364 set_register(r1,
result);
8369 DCHECK_OPCODE(LLGFR);
8370 DECODE_RRE_INSTRUCTION(r1, r2);
8371 int32_t r2_val = get_low_register<int32_t>(r2);
8372 uint64_t r2_finalval = (
static_cast<uint64_t
>(r2_val) & 0x00000000FFFFFFFF);
8373 set_register(r1, r2_finalval);
8384 DCHECK_OPCODE(AGFR);
8385 DECODE_RRE_INSTRUCTION(r1, r2);
8387 int64_t r1_val = get_register(r1);
8388 int64_t r2_val =
static_cast<int64_t
>(get_low_register<int32_t>(r2));
8389 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val, int64_t);
8391 SetS390ConditionCode<int64_t>(r1_val, 0);
8392 SetS390OverflowCode(isOF);
8393 set_register(r1, r1_val);
8398 DCHECK_OPCODE(SGFR);
8399 DECODE_RRE_INSTRUCTION(r1, r2);
8401 int64_t r1_val = get_register(r1);
8402 int64_t r2_val =
static_cast<int64_t
>(get_low_register<int32_t>(r2));
8404 isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t);
8406 SetS390ConditionCode<int64_t>(r1_val, 0);
8407 SetS390OverflowCode(isOF);
8408 set_register(r1, r1_val);
8425 DCHECK_OPCODE(MSGFR);
8426 DECODE_RRE_INSTRUCTION(r1, r2);
8427 int64_t r1_val = get_register(r1);
8428 int64_t r2_val =
static_cast<int64_t
>(get_low_register<int32_t>(r2));
8429 int64_t product = r1_val * r2_val;
8430 set_register(r1, product);
8435 DCHECK_OPCODE(DSGFR);
8436 DECODE_RRE_INSTRUCTION(r1, r2);
8438 int64_t r1_val = get_register(r1 + 1);
8439 int64_t r2_val =
static_cast<int64_t
>(get_low_register<int32_t>(r2));
8440 int64_t quotient = r1_val / r2_val;
8443 set_register(r1 + 1, quotient);
8454 DCHECK_OPCODE(LRVR);
8455 DECODE_RRE_INSTRUCTION(r1, r2);
8456 int32_t r2_val = get_low_register<int32_t>(r2);
8457 int32_t r1_val = ByteReverse<int32_t>(r2_val);
8459 set_low_register(r1, r1_val);
8465 DECODE_RRE_INSTRUCTION(r1, r2);
8467 int64_t r1_val = get_register(r1);
8468 int64_t r2_val = get_register(r2);
8469 SetS390ConditionCode<int64_t>(r1_val, r2_val);
8474 DCHECK_OPCODE(CLGR);
8475 DECODE_RRE_INSTRUCTION(r1, r2);
8477 uint64_t r1_val =
static_cast<uint64_t
>(get_register(r1));
8478 uint64_t r2_val =
static_cast<uint64_t
>(get_register(r2));
8479 SetS390ConditionCode<uint64_t>(r1_val, r2_val);
8520 DCHECK_OPCODE(CGFR);
8521 DECODE_RRE_INSTRUCTION(r1, r2);
8523 int64_t r1_val = get_register(r1);
8524 int64_t r2_val =
static_cast<int64_t
>(get_low_register<int32_t>(r2));
8525 SetS390ConditionCode<int64_t>(r1_val, r2_val);
8621 DECODE_RRE_INSTRUCTION(r1, r2);
8622 int64_t r1_val = get_register(r1);
8623 int64_t r2_val = get_register(r2);
8625 SetS390BitWiseConditionCode<uint64_t>(r1_val);
8626 set_register(r1, r1_val);
8632 DECODE_RRE_INSTRUCTION(r1, r2);
8633 int64_t r1_val = get_register(r1);
8634 int64_t r2_val = get_register(r2);
8636 SetS390BitWiseConditionCode<uint64_t>(r1_val);
8637 set_register(r1, r1_val);
8643 DECODE_RRE_INSTRUCTION(r1, r2);
8644 int64_t r1_val = get_register(r1);
8645 int64_t r2_val = get_register(r2);
8647 SetS390BitWiseConditionCode<uint64_t>(r1_val);
8648 set_register(r1, r1_val);
8653 DCHECK_OPCODE(FLOGR);
8654 DECODE_RRE_INSTRUCTION(r1, r2);
8658 int64_t r2_val = get_register(r2);
8661 for (;
i < 64;
i++) {
8662 if (r2_val < 0)
break;
8666 r2_val = get_register(r2);
8668 int64_t
mask = ~(1 << (63 -
i));
8669 set_register(r1,
i);
8670 set_register(r1 + 1, r2_val &
mask);
8675 DCHECK_OPCODE(LLGCR);
8676 DECODE_RRE_INSTRUCTION(r1, r2);
8677 uint64_t r2_val = get_low_register<uint64_t>(r2);
8680 set_register(r1, r2_val);
8685 DCHECK_OPCODE(LLGHR);
8686 DECODE_RRE_INSTRUCTION(r1, r2);
8687 uint64_t r2_val = get_low_register<uint64_t>(r2);
8690 set_register(r1, r2_val);
8701 DCHECK_OPCODE(MGRK);
8702 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
8704 int64_t r2_val = get_register(r2);
8705 int64_t r3_val = get_register(r3);
8706 set_register(r1, base::bits::SignedMulHigh64(r2_val, r3_val));
8707 set_register(r1 + 1, r2_val * r3_val);
8712 DCHECK_OPCODE(MLGR);
8713 DECODE_RRE_INSTRUCTION(r1, r2);
8716 uint64_t r1_plus_1_val = get_register(r1 + 1);
8717 uint64_t r2_val = get_register(r2);
8719 set_register(r1, base::bits::UnsignedMulHigh64(r2_val, r1_plus_1_val));
8720 set_register(r1 + 1, r2_val * r1_plus_1_val);
8731 DCHECK_OPCODE(DLGR);
8732 DECODE_RRE_INSTRUCTION(r1, r2);
8733 uint64_t r1_val = get_register(r1);
8734 uint64_t r2_val = get_register(r2);
8736 unsigned __int128 dividend =
static_cast<unsigned __int128
>(r1_val) << 64;
8737 dividend += get_register(r1 + 1);
8739 uint64_t quotient = dividend / r2_val;
8741 set_register(r1 + 1, quotient);
8788 DCHECK_OPCODE(LLCR);
8789 DECODE_RRE_INSTRUCTION(r1, r2);
8790 uint32_t r2_val = get_low_register<uint32_t>(r2);
8793 set_low_register(r1, r2_val);
8798 DCHECK_OPCODE(LLHR);
8799 DECODE_RRE_INSTRUCTION(r1, r2);
8800 uint32_t r2_val = get_low_register<uint32_t>(r2);
8803 set_low_register(r1, r2_val);
8809 DECODE_RRE_INSTRUCTION(r1, r2);
8812 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1);
8813 uint32_t r2_val = get_low_register<uint32_t>(r2);
8815 static_cast<uint64_t
>(r1_val) *
static_cast<uint64_t
>(r2_val);
8816 int32_t high_bits = product >> 32;
8817 int32_t low_bits = product & 0x00000000FFFFFFFF;
8818 set_low_register(r1, high_bits);
8819 set_low_register(r1 + 1, low_bits);
8825 DECODE_RRE_INSTRUCTION(r1, r2);
8826 uint32_t r1_val = get_low_register<uint32_t>(r1);
8827 uint32_t r2_val = get_low_register<uint32_t>(r2);
8829 uint64_t dividend =
static_cast<uint64_t
>(r1_val) << 32;
8830 dividend += get_low_register<uint32_t>(r1 + 1);
8832 uint32_t quotient = dividend / r2_val;
8835 set_low_register(r1 + 1, quotient);
8840 DCHECK_OPCODE(ALCR);
8841 DECODE_RRE_INSTRUCTION(r1, r2);
8842 uint32_t r1_val = get_low_register<uint32_t>(r1);
8843 uint32_t r2_val = get_low_register<uint32_t>(r2);
8844 uint32_t alu_out = 0;
8847 alu_out = r1_val + r2_val;
8848 bool isOF_original = CheckOverflowForUIntAdd(r1_val, r2_val);
8849 if (TestConditionCode((Condition)2) || TestConditionCode((Condition)3)) {
8850 alu_out = alu_out + 1;
8851 isOF = isOF_original || CheckOverflowForUIntAdd(alu_out, 1);
8853 isOF = isOF_original;
8855 set_low_register(r1, alu_out);
8856 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
8861 DCHECK_OPCODE(SLBR);
8862 DECODE_RRE_INSTRUCTION(r1, r2);
8863 uint32_t r1_val = get_low_register<uint32_t>(r1);
8864 uint32_t r2_val = get_low_register<uint32_t>(r2);
8865 uint32_t alu_out = 0;
8868 alu_out = r1_val - r2_val;
8869 bool isOF_original = CheckOverflowForUIntSub(r1_val, r2_val);
8870 if (TestConditionCode((Condition)2) || TestConditionCode((Condition)3)) {
8871 alu_out = alu_out - 1;
8872 isOF = isOF_original || CheckOverflowForUIntSub(alu_out, 1);
8874 isOF = isOF_original;
8876 set_low_register(r1, alu_out);
8877 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
8984 DCHECK_OPCODE(POPCNT_Z);
8985 DECODE_RRE_INSTRUCTION(r1, r2);
8986 int64_t r2_val = get_register(r2);
8989 uint8_t* r2_val_ptr =
reinterpret_cast<uint8_t*
>(&r2_val);
8990 uint8_t* r1_val_ptr =
reinterpret_cast<uint8_t*
>(&r1_val);
8991 for (
int i = 0;
i < 8;
i++) {
8992 uint32_t
x =
static_cast<uint32_t
>(r2_val_ptr[
i]);
8993#if defined(__GNUC__)
8994 r1_val_ptr[
i] = __builtin_popcount(
x);
8996#error unsupport __builtin_popcount
8999 set_register(r1,
static_cast<uint64_t
>(r1_val));
9004 DCHECK_OPCODE(LOCGR);
9005 DECODE_RRF_C_INSTRUCTION(r1, r2, m3);
9006 if (TestConditionCode(m3)) {
9007 set_register(r1, get_register(r2));
9013 DCHECK_OPCODE(NGRK);
9014 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9016 int64_t r2_val = get_register(r2);
9017 int64_t r3_val = get_register(r3);
9018 uint64_t bitwise_result = 0;
9019 bitwise_result = r2_val & r3_val;
9020 SetS390BitWiseConditionCode<uint64_t>(bitwise_result);
9021 set_register(r1, bitwise_result);
9026 DCHECK_OPCODE(OGRK);
9027 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9029 int64_t r2_val = get_register(r2);
9030 int64_t r3_val = get_register(r3);
9031 uint64_t bitwise_result = 0;
9032 bitwise_result = r2_val | r3_val;
9033 SetS390BitWiseConditionCode<uint64_t>(bitwise_result);
9034 set_register(r1, bitwise_result);
9039 DCHECK_OPCODE(XGRK);
9040 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9042 int64_t r2_val = get_register(r2);
9043 int64_t r3_val = get_register(r3);
9044 uint64_t bitwise_result = 0;
9045 bitwise_result = r2_val ^ r3_val;
9046 SetS390BitWiseConditionCode<uint64_t>(bitwise_result);
9047 set_register(r1, bitwise_result);
9052 DCHECK_OPCODE(AGRK);
9053 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9055 int64_t r2_val = get_register(r2);
9056 int64_t r3_val = get_register(r3);
9057 bool isOF = CheckOverflowForIntAdd(r2_val, r3_val, int64_t);
9058 SetS390ConditionCode<int64_t>(r2_val + r3_val, 0);
9059 SetS390OverflowCode(isOF);
9060 set_register(r1, r2_val + r3_val);
9065 DCHECK_OPCODE(SGRK);
9066 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9068 int64_t r2_val = get_register(r2);
9069 int64_t r3_val = get_register(r3);
9070 bool isOF = CheckOverflowForIntSub(r2_val, r3_val, int64_t);
9071 SetS390ConditionCode<int64_t>(r2_val - r3_val, 0);
9072 SetS390OverflowCode(isOF);
9073 set_register(r1, r2_val - r3_val);
9078 DCHECK_OPCODE(ALGRK);
9079 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9081 uint64_t r2_val = get_register(r2);
9082 uint64_t r3_val = get_register(r3);
9083 bool isOF = CheckOverflowForUIntAdd(r2_val, r3_val);
9084 SetS390ConditionCode<uint64_t>(r2_val + r3_val, 0);
9085 SetS390OverflowCode(isOF);
9086 set_register(r1, r2_val + r3_val);
9091 DCHECK_OPCODE(SLGRK);
9092 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9094 uint64_t r2_val = get_register(r2);
9095 uint64_t r3_val = get_register(r3);
9096 bool isOF = CheckOverflowForUIntSub(r2_val, r3_val);
9097 SetS390ConditionCode<uint64_t>(r2_val - r3_val, 0);
9098 SetS390OverflowCode(isOF);
9099 set_register(r1, r2_val - r3_val);
9104 DCHECK_OPCODE(LOCR);
9105 DECODE_RRF_C_INSTRUCTION(r1, r2, m3);
9106 if (TestConditionCode(m3)) {
9107 set_low_register(r1, get_low_register<int32_t>(r2));
9114 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9116 int32_t r2_val = get_low_register<int32_t>(r2);
9117 int32_t r3_val = get_low_register<int32_t>(r3);
9119 uint32_t bitwise_result = 0;
9120 bitwise_result = r2_val & r3_val;
9121 SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
9122 set_low_register(r1, bitwise_result);
9128 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9130 int32_t r2_val = get_low_register<int32_t>(r2);
9131 int32_t r3_val = get_low_register<int32_t>(r3);
9133 uint32_t bitwise_result = 0;
9134 bitwise_result = r2_val | r3_val;
9135 SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
9136 set_low_register(r1, bitwise_result);
9142 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9144 int32_t r2_val = get_low_register<int32_t>(r2);
9145 int32_t r3_val = get_low_register<int32_t>(r3);
9147 uint32_t bitwise_result = 0;
9148 bitwise_result = r2_val ^ r3_val;
9149 SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
9150 set_low_register(r1, bitwise_result);
9156 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9158 int32_t r2_val = get_low_register<int32_t>(r2);
9159 int32_t r3_val = get_low_register<int32_t>(r3);
9160 bool isOF = CheckOverflowForIntAdd(r2_val, r3_val, int32_t);
9161 SetS390ConditionCode<int32_t>(r2_val + r3_val, 0);
9162 SetS390OverflowCode(isOF);
9163 set_low_register(r1, r2_val + r3_val);
9169 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9171 int32_t r2_val = get_low_register<int32_t>(r2);
9172 int32_t r3_val = get_low_register<int32_t>(r3);
9173 bool isOF = CheckOverflowForIntSub(r2_val, r3_val, int32_t);
9174 SetS390ConditionCode<int32_t>(r2_val - r3_val, 0);
9175 SetS390OverflowCode(isOF);
9176 set_low_register(r1, r2_val - r3_val);
9181 DCHECK_OPCODE(ALRK);
9182 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9184 uint32_t r2_val = get_low_register<uint32_t>(r2);
9185 uint32_t r3_val = get_low_register<uint32_t>(r3);
9186 bool isOF = CheckOverflowForUIntAdd(r2_val, r3_val);
9187 SetS390ConditionCode<uint32_t>(r2_val + r3_val, 0);
9188 SetS390OverflowCode(isOF);
9189 set_low_register(r1, r2_val + r3_val);
9194 DCHECK_OPCODE(SLRK);
9195 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
9197 uint32_t r2_val = get_low_register<uint32_t>(r2);
9198 uint32_t r3_val = get_low_register<uint32_t>(r3);
9199 bool isOF = CheckOverflowForUIntSub(r2_val, r3_val);
9200 SetS390ConditionCode<uint32_t>(r2_val - r3_val, 0);
9201 SetS390OverflowCode(isOF);
9202 set_low_register(r1, r2_val - r3_val);
9208 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9209 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9210 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9211 intptr_t addr = x2_val + b2_val + d2;
9212 int64_t value = ReadDW(addr);
9213 set_register(r1, value);
9214 SetS390ConditionCode<int64_t>(value, 0);
9226 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9227 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9228 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9229 int64_t alu_out = get_register(r1);
9230 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
9231 bool isOF = CheckOverflowForIntAdd(alu_out, mem_val, int64_t);
9233 SetS390ConditionCode<int64_t>(alu_out, 0);
9234 SetS390OverflowCode(isOF);
9235 set_register(r1, alu_out);
9241 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9242 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9243 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9244 int64_t alu_out = get_register(r1);
9245 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
9246 bool isOF = CheckOverflowForIntSub(alu_out, mem_val, int64_t);
9248 SetS390ConditionCode<int32_t>(alu_out, 0);
9249 SetS390OverflowCode(isOF);
9250 set_register(r1, alu_out);
9256 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9257 uint64_t r1_val = get_register(r1);
9258 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9259 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9260 intptr_t d2_val = d2;
9261 uint64_t alu_out = r1_val;
9262 uint64_t mem_val =
static_cast<uint64_t
>(ReadDW(b2_val + d2_val + x2_val));
9264 SetS390ConditionCode<uint64_t>(alu_out, 0);
9265 set_register(r1, alu_out);
9271 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9272 uint64_t r1_val = get_register(r1);
9273 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9274 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9275 intptr_t d2_val = d2;
9276 uint64_t alu_out = r1_val;
9277 uint64_t mem_val =
static_cast<uint64_t
>(ReadDW(b2_val + d2_val + x2_val));
9279 SetS390ConditionCode<uint64_t>(alu_out, 0);
9280 set_register(r1, alu_out);
9286 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9287 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9288 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9289 intptr_t d2_val = d2;
9290 int64_t mem_val = ReadDW(b2_val + d2_val + x2_val);
9291 int64_t r1_val = get_register(r1);
9292 set_register(r1, mem_val * r1_val);
9298 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9300 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9301 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9302 intptr_t d2_val = d2;
9303 int64_t mem_val = ReadDW(b2_val + d2_val + x2_val);
9304 int64_t r1_val = get_register(r1 + 1);
9305 int64_t quotient = r1_val / mem_val;
9308 set_register(r1 + 1, quotient);
9320 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9321 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9322 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9323 intptr_t addr = x2_val + b2_val + d2;
9325 set_low_register(r1, value);
9326 SetS390ConditionCode<int32_t>(value, 0);
9332 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9334 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9335 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9336 intptr_t addr = x2_val + b2_val + d2;
9337 int64_t mem_val =
static_cast<int64_t
>(ReadH(addr));
9338 set_register(r1, mem_val);
9343 DCHECK_OPCODE(LLGF);
9344 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9346 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9347 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9348 intptr_t addr = x2_val + b2_val + d2;
9349 uint64_t mem_val =
static_cast<uint64_t
>(ReadWU(addr));
9350 set_register(r1, mem_val);
9362 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9363 uint64_t r1_val = get_register(r1);
9364 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9365 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9366 intptr_t d2_val = d2;
9367 uint64_t alu_out = r1_val;
9368 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val);
9370 SetS390ConditionCode<int64_t>(alu_out, 0);
9371 set_register(r1, alu_out);
9377 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9378 uint64_t r1_val = get_register(r1);
9379 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9380 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9381 intptr_t d2_val = d2;
9382 uint64_t alu_out = r1_val;
9383 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val);
9385 SetS390ConditionCode<int64_t>(alu_out, 0);
9386 set_register(r1, alu_out);
9403 DCHECK_OPCODE(MSGF);
9404 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9405 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9406 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9407 intptr_t d2_val = d2;
9408 int64_t mem_val =
static_cast<int64_t
>(ReadW(b2_val + d2_val + x2_val));
9409 int64_t r1_val = get_register(r1);
9410 int64_t product = r1_val * mem_val;
9411 set_register(r1, product);
9416 DCHECK_OPCODE(DSGF);
9417 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9419 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9420 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9421 intptr_t d2_val = d2;
9422 int64_t mem_val =
static_cast<int64_t
>(ReadW(b2_val + d2_val + x2_val));
9423 int64_t r1_val = get_register(r1 + 1);
9424 int64_t quotient = r1_val / mem_val;
9427 set_register(r1 + 1, quotient);
9432 DCHECK_OPCODE(LRVG);
9433 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9434 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9435 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9436 intptr_t mem_addr = b2_val + x2_val + d2;
9437 int64_t mem_val = ReadW64(mem_addr);
9438 set_register(r1, ByteReverse<int64_t>(mem_val));
9444 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9445 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9446 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9447 intptr_t mem_addr = b2_val + x2_val + d2;
9448 int32_t mem_val = ReadW(mem_addr);
9449 set_low_register(r1, ByteReverse<int32_t>(mem_val));
9454 DCHECK_OPCODE(LRVH);
9455 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9456 int32_t r1_val = get_low_register<int32_t>(r1);
9457 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9458 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9459 intptr_t mem_addr = b2_val + x2_val + d2;
9460 int16_t mem_val = ReadH(mem_addr);
9461 int32_t result = ByteReverse<int16_t>(mem_val) & 0x0000FFFF;
9462 result |= r1_val & 0xFFFF0000;
9463 set_low_register(r1,
result);
9469 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9470 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9471 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9472 int64_t alu_out = get_register(r1);
9473 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
9474 SetS390ConditionCode<int64_t>(alu_out, mem_val);
9475 set_register(r1, alu_out);
9481 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9482 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9483 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9484 int64_t alu_out = get_register(r1);
9485 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
9486 SetS390ConditionCode<uint64_t>(alu_out, mem_val);
9487 set_register(r1, alu_out);
9540 DCHECK_OPCODE(STRV);
9541 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9542 int32_t r1_val = get_low_register<int32_t>(r1);
9543 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9544 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9545 intptr_t mem_addr = b2_val + x2_val + d2;
9546 WriteW(mem_addr, ByteReverse<int32_t>(r1_val));
9551 DCHECK_OPCODE(STRVG);
9552 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9553 int64_t r1_val = get_register(r1);
9554 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9555 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9556 intptr_t mem_addr = b2_val + x2_val + d2;
9557 WriteDW(mem_addr, ByteReverse<int64_t>(r1_val));
9562 DCHECK_OPCODE(STRVH);
9563 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9564 int32_t r1_val = get_low_register<int32_t>(r1);
9565 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9566 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9567 intptr_t mem_addr = b2_val + x2_val + d2;
9569 WriteH(mem_addr, ByteReverse<int16_t>(
result));
9581 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9582 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9583 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9584 intptr_t d2_val = d2;
9585 int32_t mem_val = ReadW(b2_val + d2_val + x2_val);
9586 int32_t r1_val = get_low_register<int32_t>(r1);
9587 set_low_register(r1, mem_val * r1_val);
9593 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9594 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9595 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9596 intptr_t d2_val = d2;
9597 int32_t mem_val = ReadW(b2_val + d2_val + x2_val);
9598 int32_t r1_val = get_low_register<int32_t>(r1);
9600 static_cast<int64_t
>(r1_val) *
static_cast<int64_t
>(mem_val);
9602 bool isOF = (
static_cast<int64_t
>(result32) != result64);
9603 SetS390ConditionCode<int32_t>(result32, 0);
9604 SetS390OverflowCode(isOF);
9605 set_low_register(r1, result32);
9606 set_low_register(r1, mem_val * r1_val);
9612 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9613 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9614 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9615 int32_t alu_out = get_low_register<int32_t>(r1);
9616 int32_t mem_val = ReadW(b2_val + x2_val + d2);
9618 SetS390BitWiseConditionCode<uint32_t>(alu_out);
9619 set_low_register(r1, alu_out);
9625 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9626 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9627 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9628 uint32_t alu_out = get_low_register<uint32_t>(r1);
9629 uint32_t mem_val = ReadWU(b2_val + x2_val + d2);
9630 SetS390ConditionCode<uint32_t>(alu_out, mem_val);
9636 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9637 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9638 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9639 int32_t alu_out = get_low_register<int32_t>(r1);
9640 int32_t mem_val = ReadW(b2_val + x2_val + d2);
9642 SetS390BitWiseConditionCode<uint32_t>(alu_out);
9643 set_low_register(r1, alu_out);
9649 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9650 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9651 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9652 int32_t alu_out = get_low_register<int32_t>(r1);
9653 int32_t mem_val = ReadW(b2_val + x2_val + d2);
9655 SetS390BitWiseConditionCode<uint32_t>(alu_out);
9656 set_low_register(r1, alu_out);
9662 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9663 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9664 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9665 int32_t alu_out = get_low_register<int32_t>(r1);
9666 int32_t mem_val = ReadW(b2_val + x2_val + d2);
9667 SetS390ConditionCode<int32_t>(alu_out, mem_val);
9673 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9674 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9675 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9676 int32_t alu_out = get_low_register<int32_t>(r1);
9677 int32_t mem_val = ReadW(b2_val + x2_val + d2);
9679 isOF = CheckOverflowForIntAdd(alu_out, mem_val, int32_t);
9681 SetS390ConditionCode<int32_t>(alu_out, 0);
9682 SetS390OverflowCode(isOF);
9683 set_low_register(r1, alu_out);
9689 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9690 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9691 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9692 int32_t alu_out = get_low_register<int32_t>(r1);
9693 int32_t mem_val = ReadW(b2_val + x2_val + d2);
9695 isOF = CheckOverflowForIntSub(alu_out, mem_val, int32_t);
9697 SetS390ConditionCode<int32_t>(alu_out, 0);
9698 SetS390OverflowCode(isOF);
9699 set_low_register(r1, alu_out);
9705 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9706 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9707 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9709 int32_t mem_val = ReadW(b2_val + x2_val + d2);
9710 int32_t r1_val = get_low_register<int32_t>(r1 + 1);
9712 static_cast<int64_t
>(r1_val) *
static_cast<int64_t
>(mem_val);
9713 int32_t high_bits = product >> 32;
9715 int32_t low_bits = product & 0x00000000FFFFFFFF;
9716 set_low_register(r1, high_bits);
9717 set_low_register(r1 + 1, low_bits);
9723 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9724 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9725 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9726 uint32_t alu_out = get_low_register<uint32_t>(r1);
9727 uint32_t mem_val = ReadWU(b2_val + x2_val + d2);
9729 set_low_register(r1, alu_out);
9730 SetS390ConditionCode<uint32_t>(alu_out, 0);
9736 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9737 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9738 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9739 uint32_t alu_out = get_low_register<uint32_t>(r1);
9740 uint32_t mem_val = ReadWU(b2_val + x2_val + d2);
9742 set_low_register(r1, alu_out);
9743 SetS390ConditionCode<uint32_t>(alu_out, 0);
9748 DCHECK_OPCODE(STHY);
9749 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9751 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9752 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9753 intptr_t addr = x2_val + b2_val + d2;
9754 uint16_t value = get_low_register<uint32_t>(r1);
9755 WriteH(addr, value);
9761 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9766 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
9767 int64_t rx_val = (rx == 0) ? 0 : get_register(rx);
9768 set_register(r1, rx_val + rb_val +
offset);
9773 DCHECK_OPCODE(STCY);
9774 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9776 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9777 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9778 intptr_t addr = x2_val + b2_val + d2;
9779 uint8_t value = get_low_register<uint32_t>(r1);
9780 WriteB(addr, value);
9799 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9800 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9801 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9802 intptr_t addr = x2_val + b2_val + d2;
9803 int32_t mem_val = ReadB(addr);
9804 set_low_register(r1, mem_val);
9810 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9812 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9813 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9814 intptr_t addr = x2_val + b2_val + d2;
9815 int64_t mem_val = ReadB(addr);
9816 set_register(r1, mem_val);
9822 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9824 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9825 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9826 intptr_t addr = x2_val + b2_val + d2;
9828 set_low_register(r1,
result);
9840 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9841 int32_t r1_val = get_low_register<int32_t>(r1);
9842 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9843 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9844 intptr_t d2_val = d2;
9845 int32_t mem_val =
static_cast<int32_t>(ReadH(b2_val + d2_val + x2_val));
9848 alu_out = r1_val + mem_val;
9849 isOF = CheckOverflowForIntAdd(r1_val, mem_val, int32_t);
9850 set_low_register(r1, alu_out);
9851 SetS390ConditionCode<int32_t>(alu_out, 0);
9852 SetS390OverflowCode(isOF);
9858 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9859 int32_t r1_val = get_low_register<int32_t>(r1);
9860 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9861 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9862 intptr_t d2_val = d2;
9863 int32_t mem_val =
static_cast<int32_t>(ReadH(b2_val + d2_val + x2_val));
9866 alu_out = r1_val - mem_val;
9867 isOF = CheckOverflowForIntSub(r1_val, mem_val, int64_t);
9868 set_low_register(r1, alu_out);
9869 SetS390ConditionCode<int32_t>(alu_out, 0);
9870 SetS390OverflowCode(isOF);
9882 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9883 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9884 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9885 int64_t alu_out = get_register(r1);
9886 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
9888 SetS390BitWiseConditionCode<uint32_t>(alu_out);
9889 set_register(r1, alu_out);
9895 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9896 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9897 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9898 int64_t alu_out = get_register(r1);
9899 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
9901 SetS390BitWiseConditionCode<uint32_t>(alu_out);
9902 set_register(r1, alu_out);
9908 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9909 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9910 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9911 int64_t alu_out = get_register(r1);
9912 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
9914 SetS390BitWiseConditionCode<uint32_t>(alu_out);
9915 set_register(r1, alu_out);
9927 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9928 uint64_t r1_val = get_register(r1);
9929 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9930 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9932 unsigned __int128 dividend =
static_cast<unsigned __int128
>(r1_val) << 64;
9933 dividend += get_register(r1 + 1);
9934 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
9935 uint64_t
remainder = dividend % mem_val;
9936 uint64_t quotient = dividend / mem_val;
9938 set_register(r1 + 1, quotient);
9967 DCHECK_OPCODE(LLGH);
9969 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9970 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9971 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9972 intptr_t d2_val = d2;
9973 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val);
9974 set_register(r1, mem_val);
9981 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9982 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9983 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9984 intptr_t d2_val = d2;
9985 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val);
9986 set_low_register(r1, mem_val);
9992 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9993 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9994 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9996 uint32_t mem_val = ReadWU(b2_val + x2_val + d2);
9997 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1);
9999 static_cast<uint64_t
>(r1_val) *
static_cast<uint64_t
>(mem_val);
10000 uint32_t high_bits = product >> 32;
10001 r1_val = high_bits;
10002 uint32_t low_bits = product & 0x00000000FFFFFFFF;
10003 set_low_register(r1, high_bits);
10004 set_low_register(r1 + 1, low_bits);
10010 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
10011 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
10012 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10014 uint32_t mem_val = ReadWU(b2_val + x2_val + d2);
10015 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1);
10016 uint64_t quotient =
10017 static_cast<uint64_t
>(r1_val) /
static_cast<uint64_t
>(mem_val);
10019 static_cast<uint64_t
>(r1_val) %
static_cast<uint64_t
>(mem_val);
10021 set_low_register(r1 + 1, quotient);
10128 DCHECK_OPCODE(MVGHI);
10130 DECODE_SIL_INSTRUCTION(b1, d1, i2);
10131 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
10132 intptr_t src_addr = b1_val + d1;
10133 WriteDW(src_addr, i2);
10138 DCHECK_OPCODE(MVHI);
10140 DECODE_SIL_INSTRUCTION(b1, d1, i2);
10141 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
10142 intptr_t src_addr = b1_val + d1;
10143 WriteW(src_addr, i2);
10184 DCHECK_OPCODE(LMG);
10186 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10193 if (r3 < r1) r3 += 16;
10195 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
10198 for (
int i = 0;
i <= r3 - r1;
i++) {
10199 int64_t value = ReadDW(rb_val +
offset + 8 *
i);
10200 set_register((r1 +
i) % 16, value);
10206 DCHECK_OPCODE(SRAG);
10208 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10210 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10211 int shiftBits = (b2_val + d2) & 0x3F;
10212 int64_t r3_val = get_register(r3);
10213 intptr_t alu_out = 0;
10215 alu_out = r3_val >> shiftBits;
10216 set_register(r1, alu_out);
10217 SetS390ConditionCode<intptr_t>(alu_out, 0);
10218 SetS390OverflowCode(isOF);
10223 DCHECK_OPCODE(SLAG);
10225 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10227 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10228 int shiftBits = (b2_val + d2) & 0x3F;
10229 int64_t r3_val = get_register(r3);
10230 intptr_t alu_out = 0;
10232 isOF = CheckOverflowForShiftLeft(r3_val, shiftBits);
10233 alu_out = r3_val << shiftBits;
10234 set_register(r1, alu_out);
10235 SetS390ConditionCode<intptr_t>(alu_out, 0);
10236 SetS390OverflowCode(isOF);
10241 DCHECK_OPCODE(SRLG);
10247 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10249 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10250 int shiftBits = (b2_val + d2) & 0x3F;
10252 uint64_t r3_val = get_register(r3);
10253 uint64_t alu_out = 0;
10254 alu_out = r3_val >> shiftBits;
10255 set_register(r1, alu_out);
10260 DCHECK_OPCODE(SLLG);
10266 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10268 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10269 int shiftBits = (b2_val + d2) & 0x3F;
10271 uint64_t r3_val = get_register(r3);
10272 uint64_t alu_out = 0;
10273 alu_out = r3_val << shiftBits;
10274 set_register(r1, alu_out);
10280 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2);
10282 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
10283 intptr_t target_addr =
static_cast<intptr_t
>(rb_val) +
offset;
10285 int32_t r1_val = get_low_register<int32_t>(r1);
10286 int32_t r3_val = get_low_register<int32_t>(r3);
10289 bool is_success = __atomic_compare_exchange_n(
10290 reinterpret_cast<int32_t*
>(target_addr), &r1_val, r3_val,
true,
10291 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
10293 set_low_register(r1, r1_val);
10294 condition_reg_ = 0x4;
10296 condition_reg_ = 0x8;
10302 DCHECK_OPCODE(CSY);
10303 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10305 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10306 intptr_t target_addr =
static_cast<intptr_t
>(b2_val) +
offset;
10308 int32_t r1_val = get_low_register<int32_t>(r1);
10309 int32_t r3_val = get_low_register<int32_t>(r3);
10312 bool is_success = __atomic_compare_exchange_n(
10313 reinterpret_cast<int32_t*
>(target_addr), &r1_val, r3_val,
true,
10314 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
10316 set_low_register(r1, r1_val);
10317 condition_reg_ = 0x4;
10319 condition_reg_ = 0x8;
10325 DCHECK_OPCODE(CSG);
10326 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10328 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10329 intptr_t target_addr =
static_cast<intptr_t
>(b2_val) +
offset;
10331 int64_t r1_val = get_register(r1);
10332 int64_t r3_val = get_register(r3);
10335 bool is_success = __atomic_compare_exchange_n(
10336 reinterpret_cast<int64_t*
>(target_addr), &r1_val, r3_val,
true,
10337 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
10339 set_register(r1, r1_val);
10340 condition_reg_ = 0x4;
10342 condition_reg_ = 0x8;
10348 DCHECK_OPCODE(RLLG);
10354 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10356 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10357 int shiftBits = (b2_val + d2) & 0x3F;
10359 uint64_t r3_val = get_register(r3);
10360 uint64_t alu_out = 0;
10361 uint64_t rotateBits = r3_val >> (64 - shiftBits);
10362 alu_out = (r3_val << shiftBits) | (rotateBits);
10363 set_register(r1, alu_out);
10368 DCHECK_OPCODE(STMG);
10369 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10376 if (r3 < r1) r3 += 16;
10378 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
10381 for (
int i = 0;
i <= r3 - r1;
i++) {
10382 int64_t value = get_register((r1 +
i) % 16);
10383 WriteDW(rb_val +
offset + 8 *
i, value);
10439 DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val)
10440 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
10441 intptr_t addr = b1_val + d1_val;
10442 uint8_t mem_val = ReadB(addr);
10443 uint8_t selected_bits = mem_val & imm_val;
10445 bool is_tm_or_tmy = 1;
10446 condition_reg_ = TestUnderMask(selected_bits, imm_val, is_tm_or_tmy);
10451 DCHECK_OPCODE(TMY);
10453 DECODE_SIY_INSTRUCTION(b1, d1_val, imm_val);
10454 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
10455 intptr_t addr = b1_val + d1_val;
10456 uint8_t mem_val = ReadB(addr);
10457 uint8_t selected_bits = mem_val & imm_val;
10459 bool is_tm_or_tmy = 1;
10460 condition_reg_ = TestUnderMask(selected_bits, imm_val, is_tm_or_tmy);
10477 DCHECK_OPCODE(CLIY);
10478 DECODE_SIY_INSTRUCTION(b1, d1, i2);
10480 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
10481 intptr_t d1_val = d1;
10482 intptr_t addr = b1_val + d1_val;
10483 uint8_t mem_val = ReadB(addr);
10484 uint8_t imm_val = i2;
10485 SetS390ConditionCode<uint8_t>(mem_val, imm_val);
10502 DCHECK_OPCODE(ASI);
10507 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned);
10508 int8_t i2_8bit =
static_cast<int8_t
>(i2_unsigned);
10510 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1);
10513 intptr_t addr = b1_val + d1_val;
10515 int32_t mem_val = ReadW(addr);
10516 bool isOF = CheckOverflowForIntAdd(mem_val, i2, int32_t);
10517 int32_t alu_out = mem_val + i2;
10518 SetS390ConditionCode<int32_t>(alu_out, 0);
10519 SetS390OverflowCode(isOF);
10520 WriteW(addr, alu_out);
10531 DCHECK_OPCODE(AGSI);
10536 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned);
10537 int8_t i2_8bit =
static_cast<int8_t
>(i2_unsigned);
10538 int64_t i2 =
static_cast<int64_t
>(i2_8bit);
10539 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1);
10542 intptr_t addr = b1_val + d1_val;
10544 int64_t mem_val = ReadDW(addr);
10545 int isOF = CheckOverflowForIntAdd(mem_val, i2, int64_t);
10546 int64_t alu_out = mem_val + i2;
10547 SetS390ConditionCode<uint64_t>(alu_out, 0);
10548 SetS390OverflowCode(isOF);
10549 WriteDW(addr, alu_out);
10584 DCHECK_OPCODE(STMY);
10585 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10592 if (r3 < r1) r3 += 16;
10597 for (
int i = 0;
i <= r3 - r1;
i++) {
10598 int32_t value = get_low_register<int32_t>((r1 +
i) % 16);
10599 WriteW(b2_val +
offset + 4 *
i, value);
10611 DCHECK_OPCODE(LMY);
10612 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10619 if (r3 < r1) r3 += 16;
10624 for (
int i = 0;
i <= r3 - r1;
i++) {
10626 set_low_register((r1 +
i) % 16, value);
10638 DCHECK_OPCODE(SRAK);
10639 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10642 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10643 int shiftBits = (b2_val + d2) & 0x3F;
10644 int32_t r3_val = get_low_register<int32_t>(r3);
10647 if (shiftBits < 32) {
10648 alu_out = r3_val >> shiftBits;
10650 set_low_register(r1, alu_out);
10651 SetS390ConditionCode<int32_t>(alu_out, 0);
10652 SetS390OverflowCode(isOF);
10657 DCHECK_OPCODE(SLAK);
10658 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10661 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10662 int shiftBits = (b2_val + d2) & 0x3F;
10663 int32_t r3_val = get_low_register<int32_t>(r3);
10666 isOF = CheckOverflowForShiftLeft(r3_val, shiftBits);
10667 if (shiftBits < 32) {
10668 alu_out = r3_val << shiftBits;
10670 set_low_register(r1, alu_out);
10671 SetS390ConditionCode<int32_t>(alu_out, 0);
10672 SetS390OverflowCode(isOF);
10677 DCHECK_OPCODE(SRLK);
10683 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10685 uint32_t b2_val = b2 == 0 ? 0 : get_low_register<uint32_t>(b2);
10686 uint32_t shiftBits = (b2_val + d2) & 0x3F;
10688 uint32_t r3_val = get_low_register<uint32_t>(r3);
10689 uint32_t alu_out = 0;
10690 if (shiftBits < 32u) {
10691 alu_out = r3_val >> shiftBits;
10693 set_low_register(r1, alu_out);
10698 DCHECK_OPCODE(SLLK);
10704 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
10706 uint32_t b2_val = b2 == 0 ? 0 : get_low_register<uint32_t>(b2);
10707 uint32_t shiftBits = (b2_val + d2) & 0x3F;
10709 uint32_t r3_val = get_low_register<uint32_t>(r3);
10710 uint32_t alu_out = 0;
10711 if (shiftBits < 32u) {
10712 alu_out = r3_val << shiftBits;
10714 set_low_register(r1, alu_out);
10730#define ATOMIC_LOAD_AND_UPDATE_WORD64(op) \
10731 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); \
10732 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); \
10733 intptr_t addr = static_cast<intptr_t>(b2_val) + d2; \
10734 int64_t r3_val = get_register(r3); \
10735 DCHECK_EQ(addr & 0x3, 0); \
10737 op(reinterpret_cast<int64_t*>(addr), r3_val, __ATOMIC_SEQ_CST); \
10738 set_register(r1, r1_val);
10741 DCHECK_OPCODE(LANG);
10742 ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_and);
10747 DCHECK_OPCODE(LAOG);
10748 ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_or);
10753 DCHECK_OPCODE(LAXG);
10754 ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_xor);
10759 DCHECK_OPCODE(LAAG);
10760 ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_add);
10770#undef ATOMIC_LOAD_AND_UPDATE_WORD64
10784#define ATOMIC_LOAD_AND_UPDATE_WORD32(op) \
10785 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); \
10786 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); \
10787 intptr_t addr = static_cast<intptr_t>(b2_val) + d2; \
10788 int32_t r3_val = get_low_register<int32_t>(r3); \
10789 DCHECK_EQ(addr & 0x3, 0); \
10791 op(reinterpret_cast<int32_t*>(addr), r3_val, __ATOMIC_SEQ_CST); \
10792 set_low_register(r1, r1_val);
10795 DCHECK_OPCODE(LAN);
10796 ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_and);
10801 DCHECK_OPCODE(LAO);
10802 ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_or);
10807 DCHECK_OPCODE(LAX);
10808 ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_xor);
10813 DCHECK_OPCODE(LAA);
10814 ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_add);
10824#undef ATOMIC_LOAD_AND_UPDATE_WORD32
10827 DCHECK_OPCODE(BRXHG);
10828 DECODE_RIE_E_INSTRUCTION(r1, r3, i2);
10829 int64_t r1_val = (r1 == 0) ? 0 : get_register(r1);
10830 int64_t r3_val = (r3 == 0) ? 0 : get_register(r3);
10831 intptr_t branch_address = get_pc() + (2 * i2);
10833 int64_t compare_val = r3 % 2 == 0 ? get_register(r3 + 1) : r3_val;
10834 if (r1_val > compare_val) {
10835 set_pc(branch_address);
10837 set_register(r1, r1_val);
10950 DCHECK_OPCODE(LDEB);
10951 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
10955 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
10956 int64_t rx_val = (rx == 0) ? 0 : get_register(rx);
10957 float fval = ReadFloat(rx_val + rb_val +
offset);
10958 set_fpr(r1,
static_cast<double>(fval));
10987 DCHECK_OPCODE(CEB);
10989 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
10990 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
10991 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
10992 intptr_t d2_val = d2;
10993 float r1_val = get_fpr<float>(r1);
10994 float fval = ReadFloat(b2_val + x2_val + d2_val);
10995 SetS390ConditionCode<float>(r1_val, fval);
11000 DCHECK_OPCODE(AEB);
11001 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11002 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11003 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11004 intptr_t d2_val = d2;
11005 float r1_val = get_fpr<float>(r1);
11006 float fval = ReadFloat(b2_val + x2_val + d2_val);
11008 set_fpr(r1, r1_val);
11009 SetS390ConditionCode<float>(r1_val, 0);
11014 DCHECK_OPCODE(SEB);
11015 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11016 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11017 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11018 intptr_t d2_val = d2;
11019 float r1_val = get_fpr<float>(r1);
11020 float fval = ReadFloat(b2_val + x2_val + d2_val);
11022 set_fpr(r1, r1_val);
11023 SetS390ConditionCode<float>(r1_val, 0);
11034 DCHECK_OPCODE(DEB);
11035 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11036 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11037 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11038 intptr_t d2_val = d2;
11039 float r1_val = get_fpr<float>(r1);
11040 float fval = ReadFloat(b2_val + x2_val + d2_val);
11042 set_fpr(r1, r1_val);
11083 DCHECK_OPCODE(SQDB);
11084 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11085 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11086 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11087 intptr_t d2_val = d2;
11088 double r1_val = get_fpr<double>(r1);
11089 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
11090 r1_val = std::sqrt(dbl_val);
11091 set_fpr(r1, r1_val);
11096 DCHECK_OPCODE(MEEB);
11097 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11098 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11099 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11100 intptr_t d2_val = d2;
11101 float r1_val = get_fpr<float>(r1);
11102 float fval = ReadFloat(b2_val + x2_val + d2_val);
11104 set_fpr(r1, r1_val);
11115 DCHECK_OPCODE(CDB);
11117 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11118 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11119 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11120 intptr_t d2_val = d2;
11121 double r1_val = get_fpr<double>(r1);
11122 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
11123 SetS390ConditionCode<double>(r1_val, dbl_val);
11128 DCHECK_OPCODE(ADB);
11130 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11131 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11132 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11133 intptr_t d2_val = d2;
11134 double r1_val = get_fpr<double>(r1);
11135 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
11137 set_fpr(r1, r1_val);
11138 SetS390ConditionCode<double>(r1_val, 0);
11143 DCHECK_OPCODE(SDB);
11144 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11145 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11146 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11147 intptr_t d2_val = d2;
11148 double r1_val = get_fpr<double>(r1);
11149 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
11151 set_fpr(r1, r1_val);
11152 SetS390ConditionCode<double>(r1_val, 0);
11157 DCHECK_OPCODE(MDB);
11158 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11159 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11160 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11161 intptr_t d2_val = d2;
11162 double r1_val = get_fpr<double>(r1);
11163 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
11165 set_fpr(r1, r1_val);
11170 DCHECK_OPCODE(DDB);
11171 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
11172 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11173 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11174 intptr_t d2_val = d2;
11175 double r1_val = get_fpr<double>(r1);
11176 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
11178 set_fpr(r1, r1_val);
11255 DCHECK_OPCODE(LEY);
11256 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
11258 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11259 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11260 intptr_t addr = x2_val + b2_val + d2;
11261 float float_val = *
reinterpret_cast<float*
>(addr);
11262 set_fpr(r1, float_val);
11267 DCHECK_OPCODE(LDY);
11268 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
11270 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11271 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11272 intptr_t addr = x2_val + b2_val + d2;
11273 uint64_t dbl_val = *
reinterpret_cast<uint64_t*
>(addr);
11274 set_fpr(r1, dbl_val);
11279 DCHECK_OPCODE(STEY);
11280 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
11282 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11283 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11284 intptr_t addr = x2_val + b2_val + d2;
11285 int32_t frs_val = get_fpr<int32_t>(r1);
11286 WriteW(addr, frs_val);
11291 DCHECK_OPCODE(STDY);
11292 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
11294 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
11295 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
11296 intptr_t addr = x2_val + b2_val + d2;
11297 int64_t frs_val = get_fpr<int64_t>(r1);
11298 WriteDW(addr, frs_val);
11328#undef S390_SUPPORTED_VECTOR_OPCODE_LIST
11329#undef CheckOverflowForIntAdd
11330#undef CheckOverflowForIntSub
11331#undef CheckOverflowForUIntAdd
11332#undef CheckOverflowForUIntSub
11333#undef CheckOverflowForMul
11334#undef CheckOverflowForShiftRight
11335#undef CheckOverflowForShiftLeft
11336#undef DCHECK_OPCODE
11338#undef DECODE_RIL_A_INSTRUCTION
11339#undef DECODE_RIL_B_INSTRUCTION
11340#undef DECODE_RIL_C_INSTRUCTION
11341#undef DECODE_RXY_A_INSTRUCTION
11342#undef DECODE_RX_A_INSTRUCTION
11343#undef DECODE_RS_A_INSTRUCTION
11344#undef DECODE_RS_A_INSTRUCTION_NO_R3
11345#undef DECODE_RSI_INSTRUCTION
11346#undef DECODE_SI_INSTRUCTION_I_UINT8
11347#undef DECODE_SIL_INSTRUCTION
11348#undef DECODE_SIY_INSTRUCTION
11349#undef DECODE_RRE_INSTRUCTION
11350#undef DECODE_RRE_INSTRUCTION_M3
11351#undef DECODE_RRE_INSTRUCTION_NO_R2
11352#undef DECODE_RRD_INSTRUCTION
11353#undef DECODE_RRF_E_INSTRUCTION
11354#undef DECODE_RRF_A_INSTRUCTION
11355#undef DECODE_RRF_C_INSTRUCTION
11356#undef DECODE_RR_INSTRUCTION
11357#undef DECODE_RIE_D_INSTRUCTION
11358#undef DECODE_RIE_E_INSTRUCTION
11359#undef DECODE_RIE_F_INSTRUCTION
11360#undef DECODE_RSY_A_INSTRUCTION
11361#undef DECODE_RI_A_INSTRUCTION
11362#undef DECODE_RI_B_INSTRUCTION
11363#undef DECODE_RI_C_INSTRUCTION
11364#undef DECODE_RXE_INSTRUCTION
11365#undef DECODE_VRR_A_INSTRUCTION
11366#undef DECODE_VRR_B_INSTRUCTION
11367#undef DECODE_VRR_C_INSTRUCTION
11368#undef DECODE_VRR_E_INSTRUCTION
11369#undef DECODE_VRR_F_INSTRUCTION
11370#undef DECODE_VRX_INSTRUCTION
11371#undef DECODE_VRS_INSTRUCTION
11372#undef DECODE_VRI_A_INSTRUCTION
11373#undef DECODE_VRI_C_INSTRUCTION
11375#undef VECTOR_BINARY_OP_FOR_TYPE
11376#undef VECTOR_BINARY_OP
11377#undef VECTOR_MAX_MIN_FOR_TYPE
11378#undef VECTOR_MAX_MIN
11379#undef VECTOR_COMPARE_FOR_TYPE
11380#undef VECTOR_COMPARE
11381#undef VECTOR_SHIFT_FOR_TYPE
11383#undef VECTOR_FP_BINARY_OP
11384#undef VECTOR_FP_MAX_MIN_FOR_TYPE
11385#undef VECTOR_FP_MAX_MIN
11386#undef VECTOR_FP_COMPARE_FOR_TYPE
11387#undef VECTOR_FP_COMPARE
virtual void VisitPointer(const void *address)=0
TemplateHashMapEntry< void *, void * > Entry
constexpr T * begin() const
static int Number(const char *name)
V8_EXPORT_PRIVATE void SetInstructionBits(Instr value, WritableJitAllocation *jit_allocation=nullptr)
static constexpr int8_t kNumRegisters
static constexpr DwVfpRegister from_code(int8_t code)
static constexpr Register from_code(int code)
static int Number(const char *name)
static constexpr int ToInt(const Tagged< Object > object)
#define ABI_USES_FUNCTION_DESCRIPTORS
#define ABI_PASSES_HANDLES_IN_REGS
#define ABI_RETURNS_OBJECTPAIR_IN_REGS
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in allocation gc speed threshold for starting incremental marking via a task in percent of available threshold for starting incremental marking immediately in percent of available Use a single schedule for determining a marking schedule between JS and C objects schedules the minor GC task with kUserVisible priority max worker number of concurrent for NumberOfWorkerThreads start background threads that allocate memory concurrent_array_buffer_sweeping use parallel threads to clear weak refs in the atomic pause trace progress of the incremental marking trace object counts and memory usage report a tick only when allocated zone memory changes by this amount TracingFlags::gc_stats TracingFlags::gc_stats track native contexts that are expected to be garbage collected verify heap pointers before and after GC memory reducer runs GC with ReduceMemoryFootprint flag Maximum number of memory reducer GCs scheduled Old gen GC speed is computed directly from gc tracer counters Perform compaction on full GCs based on V8 s default heuristics Perform compaction on every full GC Perform code space compaction when finalizing a full GC with stack Stress GC compaction to flush out bugs with moving objects flush of baseline code when it has not been executed recently Use time base code flushing instead of age Use a progress bar to scan large objects in increments when incremental marking is active force incremental marking for small heaps and run it more often force marking at random points between and X(inclusive) percent " "of the regular marking start limit") DEFINE_INT(stress_scavenge
std::optional< TNode< JSArray > > a
ZoneVector< RpoNumber > & result
V8_INLINE Dest bit_cast(Source const &source)
CustomMatcherTemplateHashMapImpl< DefaultAllocationPolicy > CustomMatcherHashMap
void DeleteArray(T *array)
constexpr int kSimd128Size
constexpr int kBitsPerByte
const int kStackFrameRASlot
constexpr BarrierOption LD
constexpr BarrierOption ST
void PrintF(const char *format,...)
char * ReadLine(const char *prompt)
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
constexpr MiscInstructionsBits74 BKPT
constexpr SoftwareInterruptCodes kBreakpoint
void Print(Tagged< Object > obj)
constexpr SystemSysRegOp MSR
constexpr int kSystemPointerSize
constexpr SoftwareInterruptCodes kCallRtRedirected
void ShortPrint(Tagged< Object > obj, FILE *out)
constexpr int kNoRegister
const int kCalleeRegisterSaveAreaSize
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr BarrierOption SY
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in allocation gc speed threshold for starting incremental marking via a task in percent of available threshold for starting incremental marking immediately in percent of available Use a single schedule for determining a marking schedule between JS and C objects schedules the minor GC task with kUserVisible priority max worker number of concurrent for NumberOfWorkerThreads start background threads that allocate memory concurrent_array_buffer_sweeping use parallel threads to clear weak refs in the atomic pause trace progress of the incremental marking trace object counts and memory usage report a tick only when allocated zone memory changes by this amount TracingFlags::gc_stats TracingFlags::gc_stats track native contexts that are expected to be garbage collected verify heap pointers before and after GC memory reducer runs GC with ReduceMemoryFootprint flag Maximum number of memory reducer GCs scheduled Old gen GC speed is computed directly from gc tracer counters Perform compaction on full GCs based on V8 s default heuristics Perform compaction on every full GC Perform code space compaction when finalizing a full GC with stack Stress GC compaction to flush out bugs with moving objects flush of baseline code when it has not been executed recently Use time base code flushing instead of age Use a progress bar to scan large objects in increments when incremental marking is active force incremental marking for small heaps and run it more often force marking at random points between and X(inclusive) percent " "of the regular marking start limit") DEFINE_INT(stress_scavenge
constexpr ExceptionOp SVC
V8_WARN_UNUSED_RESULT bool IsValidHeapObject(Heap *heap, Tagged< HeapObject > object)
constexpr uint32_t kStopCodeMask
constexpr int kNumRegisters
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
base::SmallVector< RegisterT, kStaticCapacity > registers_
#define DCHECK_LE(v1, v2)
#define DCHECK_NOT_NULL(val)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define T1(name, string, precedence)
std::unique_ptr< ValueMirror > value