9 #if V8_TARGET_ARCH_S390 11 #include "src/assembler.h" 12 #include "src/base/bits.h" 13 #include "src/base/once.h" 14 #include "src/codegen.h" 15 #include "src/disasm.h" 16 #include "src/macro-assembler.h" 17 #include "src/ostreams.h" 18 #include "src/register-configuration.h" 19 #include "src/runtime/runtime-utils.h" 20 #include "src/s390/constants-s390.h" 21 #include "src/s390/simulator-s390.h" 22 #if defined(USE_SIMULATOR) 32 #define SScanF sscanf // NOLINT 38 explicit S390Debugger(Simulator* sim) : sim_(sim) {}
40 void Stop(Instruction* instr);
44 #if V8_TARGET_LITTLE_ENDIAN 45 static const Instr kBreakpointInstr = (0x0000FFB2);
46 static const Instr kNopInstr = (0x00160016);
48 static const Instr kBreakpointInstr = (0xB2FF0000);
49 static const Instr kNopInstr = (0x16001600);
54 intptr_t GetRegisterValue(
int regnum);
55 double GetRegisterPairDoubleValue(
int regnum);
56 double GetFPDoubleRegisterValue(
int regnum);
57 float GetFPFloatRegisterValue(
int regnum);
58 bool GetValue(
const char* desc, intptr_t* value);
59 bool GetFPDoubleValue(
const char* desc,
double* value);
62 bool SetBreakpoint(Instruction* break_pc);
63 bool DeleteBreakpoint(Instruction* break_pc);
67 void UndoBreakpoints();
68 void RedoBreakpoints();
71 void S390Debugger::Stop(Instruction* instr) {
74 uint32_t code = instr->SvcValue() & kStopCodeMask;
76 char* msg = *
reinterpret_cast<char**
>(sim_->get_pc() +
sizeof(FourByteInstr));
78 if (sim_->isWatchedStop(code) && !sim_->watched_stops_[code].desc) {
79 sim_->watched_stops_[code].desc = msg;
82 if (code != kMaxStopCode) {
83 PrintF(
"Simulator hit stop %u: %s\n", code, msg);
85 PrintF(
"Simulator hit %s\n", msg);
87 sim_->set_pc(sim_->get_pc() +
sizeof(FourByteInstr) + kPointerSize);
91 intptr_t S390Debugger::GetRegisterValue(
int regnum) {
92 return sim_->get_register(regnum);
95 double S390Debugger::GetRegisterPairDoubleValue(
int regnum) {
96 return sim_->get_double_from_register_pair(regnum);
99 double S390Debugger::GetFPDoubleRegisterValue(
int regnum) {
100 return sim_->get_double_from_d_register(regnum);
103 float S390Debugger::GetFPFloatRegisterValue(
int regnum) {
104 return sim_->get_float32_from_d_register(regnum);
107 bool S390Debugger::GetValue(
const char* desc, intptr_t* value) {
108 int regnum = Registers::Number(desc);
109 if (regnum != kNoRegister) {
110 *value = GetRegisterValue(regnum);
113 if (strncmp(desc,
"0x", 2) == 0) {
114 return SScanF(desc + 2,
"%" V8PRIxPTR,
115 reinterpret_cast<uintptr_t*>(value)) == 1;
117 return SScanF(desc,
"%" V8PRIuPTR, reinterpret_cast<uintptr_t*>(value)) ==
124 bool S390Debugger::GetFPDoubleValue(
const char* desc,
double* value) {
125 int regnum = DoubleRegisters::Number(desc);
126 if (regnum != kNoRegister) {
127 *value = sim_->get_double_from_d_register(regnum);
133 bool S390Debugger::SetBreakpoint(Instruction* break_pc) {
135 if (sim_->break_pc_ !=
nullptr) {
140 sim_->break_pc_ = break_pc;
141 sim_->break_instr_ = break_pc->InstructionBits();
147 bool S390Debugger::DeleteBreakpoint(Instruction* break_pc) {
148 if (sim_->break_pc_ !=
nullptr) {
149 sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
152 sim_->break_pc_ =
nullptr;
153 sim_->break_instr_ = 0;
157 void S390Debugger::UndoBreakpoints() {
158 if (sim_->break_pc_ !=
nullptr) {
159 sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
163 void S390Debugger::RedoBreakpoints() {
164 if (sim_->break_pc_ !=
nullptr) {
165 sim_->break_pc_->SetInstructionBits(kBreakpointInstr);
169 void S390Debugger::Debug() {
170 intptr_t last_pc = -1;
173 #define COMMAND_SIZE 63 177 #define XSTR(a) STR(a) 179 char cmd[COMMAND_SIZE + 1];
180 char arg1[ARG_SIZE + 1];
181 char arg2[ARG_SIZE + 1];
182 char* argv[3] = {cmd, arg1, arg2};
185 cmd[COMMAND_SIZE] = 0;
193 bool trace = ::v8::internal::FLAG_trace_sim;
194 ::v8::internal::FLAG_trace_sim =
false;
196 while (!done && !sim_->has_bad_pc()) {
197 if (last_pc != sim_->get_pc()) {
202 dasm.InstructionDecode(buffer, reinterpret_cast<byte*>(sim_->get_pc()));
203 PrintF(
" 0x%08" V8PRIxPTR
" %s\n", sim_->get_pc(), buffer.start());
204 last_pc = sim_->get_pc();
206 char* line = ReadLine(
"sim> ");
207 if (line ==
nullptr) {
210 char* last_input = sim_->last_debugger_input();
211 if (strcmp(line,
"\n") == 0 && last_input !=
nullptr) {
215 sim_->set_last_debugger_input(line);
219 int argc = SScanF(line,
220 "%" XSTR(COMMAND_SIZE)
"s " 221 "%" XSTR(ARG_SIZE)
"s " 222 "%" XSTR(ARG_SIZE)
"s",
224 if ((strcmp(cmd,
"si") == 0) || (strcmp(cmd,
"stepi") == 0)) {
228 if ((reinterpret_cast<Instruction*>(sim_->get_pc()))
229 ->InstructionBits() == 0x7D821008) {
230 sim_->set_pc(sim_->get_pc() +
sizeof(FourByteInstr));
232 sim_->ExecuteInstruction(
233 reinterpret_cast<Instruction*>(sim_->get_pc()));
236 if (argc == 2 && last_pc != sim_->get_pc()) {
242 if (GetValue(arg1, &value)) {
245 for (
int i = 1; (!sim_->has_bad_pc()) &&
i < value;
i++) {
246 dasm.InstructionDecode(buffer,
247 reinterpret_cast<byte*>(sim_->get_pc()));
248 PrintF(
" 0x%08" V8PRIxPTR
" %s\n", sim_->get_pc(),
250 sim_->ExecuteInstruction(
251 reinterpret_cast<Instruction*>(sim_->get_pc()));
256 while (!sim_->has_bad_pc()) {
257 dasm.InstructionDecode(buffer,
258 reinterpret_cast<byte*>(sim_->get_pc()));
259 char* mnemonicStart = buffer.start();
260 while (*mnemonicStart != 0 && *mnemonicStart !=
' ')
262 SScanF(mnemonicStart,
"%s", mnemonic);
263 if (!strcmp(arg1, mnemonic))
break;
265 PrintF(
" 0x%08" V8PRIxPTR
" %s\n", sim_->get_pc(),
267 sim_->ExecuteInstruction(
268 reinterpret_cast<Instruction*>(sim_->get_pc()));
272 }
else if ((strcmp(cmd,
"c") == 0) || (strcmp(cmd,
"cont") == 0)) {
274 if ((reinterpret_cast<Instruction*>(sim_->get_pc()))
275 ->InstructionBits() == 0x7D821008) {
276 sim_->set_pc(sim_->get_pc() +
sizeof(FourByteInstr));
279 sim_->ExecuteInstruction(
280 reinterpret_cast<Instruction*>(sim_->get_pc()));
284 }
else if ((strcmp(cmd,
"p") == 0) || (strcmp(cmd,
"print") == 0)) {
285 if (argc == 2 || (argc == 3 && strcmp(arg2,
"fp") == 0)) {
288 if (strcmp(arg1,
"all") == 0) {
289 for (
int i = 0;
i < kNumRegisters;
i++) {
290 value = GetRegisterValue(
i);
291 PrintF(
" %3s: %08" V8PRIxPTR,
292 RegisterName(Register::from_code(
i)), value);
293 if ((argc == 3 && strcmp(arg2,
"fp") == 0) &&
i < 8 &&
295 dvalue = GetRegisterPairDoubleValue(
i);
296 PrintF(
" (%f)\n", dvalue);
297 }
else if (
i != 0 && !((
i + 1) & 3)) {
301 PrintF(
" pc: %08" V8PRIxPTR
" cr: %08x\n", sim_->special_reg_pc_,
302 sim_->condition_reg_);
303 }
else if (strcmp(arg1,
"alld") == 0) {
304 for (
int i = 0;
i < kNumRegisters;
i++) {
305 value = GetRegisterValue(
i);
306 PrintF(
" %3s: %08" V8PRIxPTR
" %11" V8PRIdPTR,
307 RegisterName(Register::from_code(
i)), value, value);
308 if ((argc == 3 && strcmp(arg2,
"fp") == 0) &&
i < 8 &&
310 dvalue = GetRegisterPairDoubleValue(
i);
311 PrintF(
" (%f)\n", dvalue);
312 }
else if (!((
i + 1) % 2)) {
316 PrintF(
" pc: %08" V8PRIxPTR
" cr: %08x\n", sim_->special_reg_pc_,
317 sim_->condition_reg_);
318 }
else if (strcmp(arg1,
"allf") == 0) {
319 for (
int i = 0;
i < DoubleRegister::kNumRegisters;
i++) {
320 float fvalue = GetFPFloatRegisterValue(
i);
322 PrintF(
"%3s: %f 0x%08x\n",
323 RegisterName(DoubleRegister::from_code(
i)), fvalue,
326 }
else if (strcmp(arg1,
"alld") == 0) {
327 for (
int i = 0;
i < DoubleRegister::kNumRegisters;
i++) {
328 dvalue = GetFPDoubleRegisterValue(
i);
329 uint64_t as_words = bit_cast<uint64_t>(dvalue);
330 PrintF(
"%3s: %f 0x%08x %08x\n",
331 RegisterName(DoubleRegister::from_code(
i)), dvalue,
332 static_cast<uint32_t>(as_words >> 32),
333 static_cast<uint32_t>(as_words & 0xFFFFFFFF));
335 }
else if (arg1[0] ==
'r' &&
336 (arg1[1] >=
'0' && arg1[1] <=
'2' &&
337 (arg1[2] ==
'\0' || (arg1[2] >=
'0' && arg1[2] <=
'5' &&
338 arg1[3] ==
'\0')))) {
339 int regnum = strtoul(&arg1[1], 0, 10);
340 if (regnum != kNoRegister) {
341 value = GetRegisterValue(regnum);
342 PrintF(
"%s: 0x%08" V8PRIxPTR
" %" V8PRIdPTR
"\n", arg1, value,
345 PrintF(
"%s unrecognized\n", arg1);
348 if (GetValue(arg1, &value)) {
349 PrintF(
"%s: 0x%08" V8PRIxPTR
" %" V8PRIdPTR
"\n", arg1, value,
351 }
else if (GetFPDoubleValue(arg1, &dvalue)) {
352 uint64_t as_words = bit_cast<uint64_t>(dvalue);
353 PrintF(
"%s: %f 0x%08x %08x\n", arg1, dvalue,
354 static_cast<uint32_t>(as_words >> 32),
355 static_cast<uint32_t>(as_words & 0xFFFFFFFF));
357 PrintF(
"%s unrecognized\n", arg1);
361 PrintF(
"print <register>\n");
363 }
else if ((strcmp(cmd,
"po") == 0) ||
364 (strcmp(cmd,
"printobject") == 0)) {
368 if (GetValue(arg1, &value)) {
369 Object* obj =
reinterpret_cast<Object*
>(value);
370 os << arg1 <<
": \n";
375 os << Brief(obj) <<
"\n";
378 os << arg1 <<
" unrecognized\n";
381 PrintF(
"printobject <value>\n");
383 }
else if (strcmp(cmd,
"setpc") == 0) {
386 if (!GetValue(arg1, &value)) {
387 PrintF(
"%s unrecognized\n", arg1);
391 }
else if (strcmp(cmd,
"stack") == 0 || strcmp(cmd,
"mem") == 0) {
392 intptr_t* cur =
nullptr;
393 intptr_t* end =
nullptr;
396 if (strcmp(cmd,
"stack") == 0) {
397 cur =
reinterpret_cast<intptr_t*
>(sim_->get_register(Simulator::sp));
400 if (!GetValue(arg1, &value)) {
401 PrintF(
"%s unrecognized\n", arg1);
404 cur =
reinterpret_cast<intptr_t*
>(value);
409 if (argc == next_arg) {
412 if (!GetValue(argv[next_arg], &words)) {
419 PrintF(
" 0x%08" V8PRIxPTR
": 0x%08" V8PRIxPTR
" %10" V8PRIdPTR,
420 reinterpret_cast<intptr_t>(cur), *cur, *cur);
421 HeapObject* obj =
reinterpret_cast<HeapObject*
>(*cur);
422 intptr_t value = *cur;
423 Heap* current_heap = sim_->isolate_->heap();
424 if (((value & 1) == 0) || current_heap->Contains(obj)) {
425 PrintF(
"(smi %d)", PlatformSmiTagging::SmiToInt(
426 reinterpret_cast<Address>(obj)));
427 }
else if (current_heap->Contains(obj)) {
435 }
else if (strcmp(cmd,
"disasm") == 0 || strcmp(cmd,
"di") == 0) {
441 byte* prev =
nullptr;
444 int32_t numInstructions = 10;
447 cur =
reinterpret_cast<byte*
>(sim_->get_pc());
448 }
else if (argc == 2) {
449 int regnum = Registers::Number(arg1);
450 if (regnum != kNoRegister || strncmp(arg1,
"0x", 2) == 0) {
453 if (GetValue(arg1, &value)) {
454 cur =
reinterpret_cast<byte*
>(value);
459 if (GetValue(arg1, &value)) {
460 cur =
reinterpret_cast<byte*
>(sim_->get_pc());
462 numInstructions =
static_cast<int32_t
>(value);
468 if (GetValue(arg1, &value1) && GetValue(arg2, &value2)) {
469 cur =
reinterpret_cast<byte*
>(value1);
471 numInstructions =
static_cast<int32_t
>(value2);
475 while (numInstructions > 0) {
477 cur += dasm.InstructionDecode(buffer, cur);
478 PrintF(
" 0x%08" V8PRIxPTR
" %s\n", reinterpret_cast<intptr_t>(prev),
482 }
else if (strcmp(cmd,
"gdb") == 0) {
483 PrintF(
"relinquishing control to gdb\n");
484 v8::base::OS::DebugBreak();
485 PrintF(
"regaining control from gdb\n");
486 }
else if (strcmp(cmd,
"break") == 0) {
489 if (GetValue(arg1, &value)) {
490 if (!SetBreakpoint(reinterpret_cast<Instruction*>(value))) {
491 PrintF(
"setting breakpoint failed\n");
494 PrintF(
"%s unrecognized\n", arg1);
497 PrintF(
"break <address>\n");
499 }
else if (strcmp(cmd,
"del") == 0) {
500 if (!DeleteBreakpoint(
nullptr)) {
501 PrintF(
"deleting breakpoint failed\n");
503 }
else if (strcmp(cmd,
"cr") == 0) {
504 PrintF(
"Condition reg: %08x\n", sim_->condition_reg_);
505 }
else if (strcmp(cmd,
"stop") == 0) {
508 sim_->get_pc() - (
sizeof(FourByteInstr) + kPointerSize);
509 Instruction* stop_instr =
reinterpret_cast<Instruction*
>(stop_pc);
510 Instruction* msg_address =
511 reinterpret_cast<Instruction*
>(stop_pc +
sizeof(FourByteInstr));
512 if ((argc == 2) && (strcmp(arg1,
"unstop") == 0)) {
514 if (sim_->isStopInstruction(stop_instr)) {
515 stop_instr->SetInstructionBits(kNopInstr);
516 msg_address->SetInstructionBits(kNopInstr);
518 PrintF(
"Not at debugger stop.\n");
520 }
else if (argc == 3) {
522 if (strcmp(arg1,
"info") == 0) {
523 if (strcmp(arg2,
"all") == 0) {
524 PrintF(
"Stop information:\n");
525 for (
uint32_t i = 0;
i < sim_->kNumOfWatchedStops;
i++) {
526 sim_->PrintStopInfo(
i);
528 }
else if (GetValue(arg2, &value)) {
529 sim_->PrintStopInfo(value);
531 PrintF(
"Unrecognized argument.\n");
533 }
else if (strcmp(arg1,
"enable") == 0) {
535 if (strcmp(arg2,
"all") == 0) {
536 for (
uint32_t i = 0;
i < sim_->kNumOfWatchedStops;
i++) {
539 }
else if (GetValue(arg2, &value)) {
540 sim_->EnableStop(value);
542 PrintF(
"Unrecognized argument.\n");
544 }
else if (strcmp(arg1,
"disable") == 0) {
546 if (strcmp(arg2,
"all") == 0) {
547 for (
uint32_t i = 0;
i < sim_->kNumOfWatchedStops;
i++) {
548 sim_->DisableStop(
i);
550 }
else if (GetValue(arg2, &value)) {
551 sim_->DisableStop(value);
553 PrintF(
"Unrecognized argument.\n");
557 PrintF(
"Wrong usage. Use help command for more information.\n");
559 }
else if (strcmp(cmd,
"icount") == 0) {
560 PrintF(
"%05" PRId64
"\n", sim_->icount_);
561 }
else if ((strcmp(cmd,
"t") == 0) || strcmp(cmd,
"trace") == 0) {
562 ::v8::internal::FLAG_trace_sim = !::v8::internal::FLAG_trace_sim;
563 PrintF(
"Trace of executed instructions is %s\n",
564 ::v8::internal::FLAG_trace_sim ?
"on" :
"off");
565 }
else if ((strcmp(cmd,
"h") == 0) || (strcmp(cmd,
"help") == 0)) {
567 PrintF(
" continue execution (alias 'c')\n");
568 PrintF(
"stepi [num instructions]\n");
569 PrintF(
" step one/num instruction(s) (alias 'si')\n");
570 PrintF(
"print <register>\n");
571 PrintF(
" print register content (alias 'p')\n");
572 PrintF(
" use register name 'all' to display all integer registers\n");
574 " use register name 'alld' to display integer registers " 575 "with decimal values\n");
576 PrintF(
" use register name 'rN' to display register number 'N'\n");
577 PrintF(
" add argument 'fp' to print register pair double values\n");
579 " use register name 'allf' to display floating-point " 581 PrintF(
"printobject <register>\n");
582 PrintF(
" print an object from a register (alias 'po')\n");
584 PrintF(
" print condition register\n");
585 PrintF(
"stack [<num words>]\n");
586 PrintF(
" dump stack content, default dump 10 words)\n");
587 PrintF(
"mem <address> [<num words>]\n");
588 PrintF(
" dump memory content, default dump 10 words)\n");
589 PrintF(
"disasm [<instructions>]\n");
590 PrintF(
"disasm [<address/register>]\n");
591 PrintF(
"disasm [[<address/register>] <instructions>]\n");
592 PrintF(
" disassemble code, default is 10 instructions\n");
593 PrintF(
" from pc (alias 'di')\n");
595 PrintF(
" enter gdb\n");
596 PrintF(
"break <address>\n");
597 PrintF(
" set a break point on the address\n");
599 PrintF(
" delete the breakpoint\n");
600 PrintF(
"trace (alias 't')\n");
601 PrintF(
" toogle the tracing of all executed statements\n");
602 PrintF(
"stop feature:\n");
603 PrintF(
" Description:\n");
604 PrintF(
" Stops are debug instructions inserted by\n");
605 PrintF(
" the Assembler::stop() function.\n");
606 PrintF(
" When hitting a stop, the Simulator will\n");
607 PrintF(
" stop and give control to the S390Debugger.\n");
608 PrintF(
" The first %d stop codes are watched:\n",
609 Simulator::kNumOfWatchedStops);
610 PrintF(
" - They can be enabled / disabled: the Simulator\n");
611 PrintF(
" will / won't stop when hitting them.\n");
612 PrintF(
" - The Simulator keeps track of how many times they \n");
613 PrintF(
" are met. (See the info command.) Going over a\n");
614 PrintF(
" disabled stop still increases its counter. \n");
615 PrintF(
" Commands:\n");
616 PrintF(
" stop info all/<code> : print infos about number <code>\n");
617 PrintF(
" or all stop(s).\n");
618 PrintF(
" stop enable/disable all/<code> : enables / disables\n");
619 PrintF(
" all or number <code> stop(s)\n");
620 PrintF(
" stop unstop\n");
621 PrintF(
" ignore the stop instruction at the current location\n");
622 PrintF(
" from now on\n");
624 PrintF(
"Unknown command: %s\n", cmd);
633 ::v8::internal::FLAG_trace_sim = trace;
642 bool Simulator::ICacheMatch(
void* one,
void* two) {
643 DCHECK_EQ(reinterpret_cast<intptr_t>(one) & CachePage::kPageMask, 0);
644 DCHECK_EQ(reinterpret_cast<intptr_t>(two) & CachePage::kPageMask, 0);
648 static uint32_t ICacheHash(
void* key) {
652 static bool AllOnOnePage(
uintptr_t start,
int size) {
653 intptr_t start_page = (start & ~CachePage::kPageMask);
654 intptr_t end_page = ((start + size) & ~CachePage::kPageMask);
655 return start_page == end_page;
658 void Simulator::set_last_debugger_input(
char* input) {
659 DeleteArray(last_debugger_input_);
660 last_debugger_input_ = input;
663 void Simulator::SetRedirectInstruction(Instruction* instruction) {
665 #if V8_TARGET_LITTLE_ENDIAN 666 instruction->SetInstructionBits(0x1000FFB2);
668 instruction->SetInstructionBits(0xB2FF0000 | kCallRtRedirected);
672 void Simulator::FlushICache(base::CustomMatcherHashMap* i_cache,
673 void* start_addr,
size_t size) {
674 intptr_t start =
reinterpret_cast<intptr_t
>(start_addr);
675 int intra_line = (start & CachePage::kLineMask);
678 size = ((size - 1) | CachePage::kLineMask) + 1;
679 int offset = (start & CachePage::kPageMask);
680 while (!AllOnOnePage(start, size - 1)) {
681 int bytes_to_flush = CachePage::kPageSize - offset;
682 FlushOnePage(i_cache, start, bytes_to_flush);
683 start += bytes_to_flush;
684 size -= bytes_to_flush;
685 DCHECK_EQ(0, static_cast<int>(start & CachePage::kPageMask));
689 FlushOnePage(i_cache, start, size);
693 CachePage* Simulator::GetCachePage(base::CustomMatcherHashMap* i_cache,
695 base::HashMap::Entry* entry = i_cache->LookupOrInsert(page, ICacheHash(page));
696 if (entry->value ==
nullptr) {
697 CachePage* new_page =
new CachePage();
698 entry->value = new_page;
700 return reinterpret_cast<CachePage*
>(entry->value);
704 void Simulator::FlushOnePage(base::CustomMatcherHashMap* i_cache,
705 intptr_t start,
int size) {
706 DCHECK_LE(size, CachePage::kPageSize);
707 DCHECK(AllOnOnePage(start, size - 1));
708 DCHECK_EQ(start & CachePage::kLineMask, 0);
709 DCHECK_EQ(size & CachePage::kLineMask, 0);
710 void* page =
reinterpret_cast<void*
>(start & (~CachePage::kPageMask));
711 int offset = (start & CachePage::kPageMask);
712 CachePage* cache_page = GetCachePage(i_cache, page);
713 char* valid_bytemap = cache_page->ValidityByte(offset);
714 memset(valid_bytemap, CachePage::LINE_INVALID, size >> CachePage::kLineShift);
717 void Simulator::CheckICache(base::CustomMatcherHashMap* i_cache,
718 Instruction* instr) {
719 intptr_t address =
reinterpret_cast<intptr_t
>(instr);
720 void* page =
reinterpret_cast<void*
>(address & (~CachePage::kPageMask));
721 void* line =
reinterpret_cast<void*
>(address & (~CachePage::kLineMask));
722 int offset = (address & CachePage::kPageMask);
723 CachePage* cache_page = GetCachePage(i_cache, page);
724 char* cache_valid_byte = cache_page->ValidityByte(offset);
725 bool cache_hit = (*cache_valid_byte == CachePage::LINE_VALID);
726 char* cached_line = cache_page->CachedData(offset & ~CachePage::kLineMask);
729 CHECK_EQ(memcmp(reinterpret_cast<void*>(instr),
730 cache_page->CachedData(offset),
sizeof(FourByteInstr)),
734 memcpy(cached_line, line, CachePage::kLineLength);
735 *cache_valid_byte = CachePage::LINE_VALID;
739 Simulator::EvaluateFuncType Simulator::EvalTable[] = {
nullptr};
741 void Simulator::EvalTableInit() {
742 for (
int i = 0;
i < MAX_NUM_OPCODES;
i++) {
743 EvalTable[
i] = &Simulator::Evaluate_Unknown;
746 #define S390_SUPPORTED_VECTOR_OPCODE_LIST(V) \ 747 V(vfs, VFS, 0xE7E2) \ 748 V(vfa, VFA, 0xE7E3) \ 749 V(vfd, VFD, 0xE7E5) \ 752 #define CREATE_EVALUATE_TABLE(name, op_name, op_value) \ 753 EvalTable[op_name] = &Simulator::Evaluate_##op_name; 754 S390_SUPPORTED_VECTOR_OPCODE_LIST(CREATE_EVALUATE_TABLE);
755 #undef CREATE_EVALUATE_TABLE 757 EvalTable[DUMY] = &Simulator::Evaluate_DUMY;
758 EvalTable[BKPT] = &Simulator::Evaluate_BKPT;
759 EvalTable[SPM] = &Simulator::Evaluate_SPM;
760 EvalTable[BALR] = &Simulator::Evaluate_BALR;
761 EvalTable[BCTR] = &Simulator::Evaluate_BCTR;
762 EvalTable[BCR] = &Simulator::Evaluate_BCR;
763 EvalTable[SVC] = &Simulator::Evaluate_SVC;
764 EvalTable[BSM] = &Simulator::Evaluate_BSM;
765 EvalTable[BASSM] = &Simulator::Evaluate_BASSM;
766 EvalTable[BASR] = &Simulator::Evaluate_BASR;
767 EvalTable[MVCL] = &Simulator::Evaluate_MVCL;
768 EvalTable[CLCL] = &Simulator::Evaluate_CLCL;
769 EvalTable[LPR] = &Simulator::Evaluate_LPR;
770 EvalTable[LNR] = &Simulator::Evaluate_LNR;
771 EvalTable[LTR] = &Simulator::Evaluate_LTR;
772 EvalTable[LCR] = &Simulator::Evaluate_LCR;
773 EvalTable[NR] = &Simulator::Evaluate_NR;
774 EvalTable[CLR] = &Simulator::Evaluate_CLR;
775 EvalTable[OR] = &Simulator::Evaluate_OR;
776 EvalTable[XR] = &Simulator::Evaluate_XR;
777 EvalTable[LR] = &Simulator::Evaluate_LR;
778 EvalTable[CR] = &Simulator::Evaluate_CR;
779 EvalTable[AR] = &Simulator::Evaluate_AR;
780 EvalTable[SR] = &Simulator::Evaluate_SR;
781 EvalTable[MR] = &Simulator::Evaluate_MR;
782 EvalTable[DR] = &Simulator::Evaluate_DR;
783 EvalTable[ALR] = &Simulator::Evaluate_ALR;
784 EvalTable[SLR] = &Simulator::Evaluate_SLR;
785 EvalTable[LDR] = &Simulator::Evaluate_LDR;
786 EvalTable[CDR] = &Simulator::Evaluate_CDR;
787 EvalTable[LER] = &Simulator::Evaluate_LER;
788 EvalTable[STH] = &Simulator::Evaluate_STH;
789 EvalTable[LA] = &Simulator::Evaluate_LA;
790 EvalTable[STC] = &Simulator::Evaluate_STC;
791 EvalTable[IC_z] = &Simulator::Evaluate_IC_z;
792 EvalTable[EX] = &Simulator::Evaluate_EX;
793 EvalTable[BAL] = &Simulator::Evaluate_BAL;
794 EvalTable[BCT] = &Simulator::Evaluate_BCT;
795 EvalTable[BC] = &Simulator::Evaluate_BC;
796 EvalTable[LH] = &Simulator::Evaluate_LH;
797 EvalTable[CH] = &Simulator::Evaluate_CH;
798 EvalTable[AH] = &Simulator::Evaluate_AH;
799 EvalTable[SH] = &Simulator::Evaluate_SH;
800 EvalTable[MH] = &Simulator::Evaluate_MH;
801 EvalTable[BAS] = &Simulator::Evaluate_BAS;
802 EvalTable[CVD] = &Simulator::Evaluate_CVD;
803 EvalTable[CVB] = &Simulator::Evaluate_CVB;
804 EvalTable[ST] = &Simulator::Evaluate_ST;
805 EvalTable[LAE] = &Simulator::Evaluate_LAE;
806 EvalTable[N] = &Simulator::Evaluate_N;
807 EvalTable[CL] = &Simulator::Evaluate_CL;
808 EvalTable[O] = &Simulator::Evaluate_O;
809 EvalTable[X] = &Simulator::Evaluate_X;
810 EvalTable[L] = &Simulator::Evaluate_L;
811 EvalTable[C] = &Simulator::Evaluate_C;
812 EvalTable[A] = &Simulator::Evaluate_A;
813 EvalTable[S] = &Simulator::Evaluate_S;
814 EvalTable[M] = &Simulator::Evaluate_M;
815 EvalTable[D] = &Simulator::Evaluate_D;
816 EvalTable[AL] = &Simulator::Evaluate_AL;
817 EvalTable[SL] = &Simulator::Evaluate_SL;
818 EvalTable[STD] = &Simulator::Evaluate_STD;
819 EvalTable[LD] = &Simulator::Evaluate_LD;
820 EvalTable[CD] = &Simulator::Evaluate_CD;
821 EvalTable[STE] = &Simulator::Evaluate_STE;
822 EvalTable[MS] = &Simulator::Evaluate_MS;
823 EvalTable[LE] = &Simulator::Evaluate_LE;
824 EvalTable[BRXH] = &Simulator::Evaluate_BRXH;
825 EvalTable[BRXLE] = &Simulator::Evaluate_BRXLE;
826 EvalTable[BXH] = &Simulator::Evaluate_BXH;
827 EvalTable[BXLE] = &Simulator::Evaluate_BXLE;
828 EvalTable[SRL] = &Simulator::Evaluate_SRL;
829 EvalTable[SLL] = &Simulator::Evaluate_SLL;
830 EvalTable[SRA] = &Simulator::Evaluate_SRA;
831 EvalTable[SLA] = &Simulator::Evaluate_SLA;
832 EvalTable[SRDL] = &Simulator::Evaluate_SRDL;
833 EvalTable[SLDL] = &Simulator::Evaluate_SLDL;
834 EvalTable[SRDA] = &Simulator::Evaluate_SRDA;
835 EvalTable[SLDA] = &Simulator::Evaluate_SLDA;
836 EvalTable[STM] = &Simulator::Evaluate_STM;
837 EvalTable[TM] = &Simulator::Evaluate_TM;
838 EvalTable[MVI] = &Simulator::Evaluate_MVI;
839 EvalTable[TS] = &Simulator::Evaluate_TS;
840 EvalTable[NI] = &Simulator::Evaluate_NI;
841 EvalTable[CLI] = &Simulator::Evaluate_CLI;
842 EvalTable[OI] = &Simulator::Evaluate_OI;
843 EvalTable[XI] = &Simulator::Evaluate_XI;
844 EvalTable[LM] = &Simulator::Evaluate_LM;
845 EvalTable[CS] = &Simulator::Evaluate_CS;
846 EvalTable[MVCLE] = &Simulator::Evaluate_MVCLE;
847 EvalTable[CLCLE] = &Simulator::Evaluate_CLCLE;
848 EvalTable[MC] = &Simulator::Evaluate_MC;
849 EvalTable[CDS] = &Simulator::Evaluate_CDS;
850 EvalTable[STCM] = &Simulator::Evaluate_STCM;
851 EvalTable[ICM] = &Simulator::Evaluate_ICM;
852 EvalTable[BPRP] = &Simulator::Evaluate_BPRP;
853 EvalTable[BPP] = &Simulator::Evaluate_BPP;
854 EvalTable[TRTR] = &Simulator::Evaluate_TRTR;
855 EvalTable[MVN] = &Simulator::Evaluate_MVN;
856 EvalTable[MVC] = &Simulator::Evaluate_MVC;
857 EvalTable[MVZ] = &Simulator::Evaluate_MVZ;
858 EvalTable[NC] = &Simulator::Evaluate_NC;
859 EvalTable[CLC] = &Simulator::Evaluate_CLC;
860 EvalTable[OC] = &Simulator::Evaluate_OC;
861 EvalTable[XC] = &Simulator::Evaluate_XC;
862 EvalTable[MVCP] = &Simulator::Evaluate_MVCP;
863 EvalTable[TR] = &Simulator::Evaluate_TR;
864 EvalTable[TRT] = &Simulator::Evaluate_TRT;
865 EvalTable[ED] = &Simulator::Evaluate_ED;
866 EvalTable[EDMK] = &Simulator::Evaluate_EDMK;
867 EvalTable[PKU] = &Simulator::Evaluate_PKU;
868 EvalTable[UNPKU] = &Simulator::Evaluate_UNPKU;
869 EvalTable[MVCIN] = &Simulator::Evaluate_MVCIN;
870 EvalTable[PKA] = &Simulator::Evaluate_PKA;
871 EvalTable[UNPKA] = &Simulator::Evaluate_UNPKA;
872 EvalTable[PLO] = &Simulator::Evaluate_PLO;
873 EvalTable[LMD] = &Simulator::Evaluate_LMD;
874 EvalTable[SRP] = &Simulator::Evaluate_SRP;
875 EvalTable[MVO] = &Simulator::Evaluate_MVO;
876 EvalTable[PACK] = &Simulator::Evaluate_PACK;
877 EvalTable[UNPK] = &Simulator::Evaluate_UNPK;
878 EvalTable[ZAP] = &Simulator::Evaluate_ZAP;
879 EvalTable[AP] = &Simulator::Evaluate_AP;
880 EvalTable[SP] = &Simulator::Evaluate_SP;
881 EvalTable[MP] = &Simulator::Evaluate_MP;
882 EvalTable[DP] = &Simulator::Evaluate_DP;
883 EvalTable[UPT] = &Simulator::Evaluate_UPT;
884 EvalTable[PFPO] = &Simulator::Evaluate_PFPO;
885 EvalTable[IIHH] = &Simulator::Evaluate_IIHH;
886 EvalTable[IIHL] = &Simulator::Evaluate_IIHL;
887 EvalTable[IILH] = &Simulator::Evaluate_IILH;
888 EvalTable[IILL] = &Simulator::Evaluate_IILL;
889 EvalTable[NIHH] = &Simulator::Evaluate_NIHH;
890 EvalTable[NIHL] = &Simulator::Evaluate_NIHL;
891 EvalTable[NILH] = &Simulator::Evaluate_NILH;
892 EvalTable[NILL] = &Simulator::Evaluate_NILL;
893 EvalTable[OIHH] = &Simulator::Evaluate_OIHH;
894 EvalTable[OIHL] = &Simulator::Evaluate_OIHL;
895 EvalTable[OILH] = &Simulator::Evaluate_OILH;
896 EvalTable[OILL] = &Simulator::Evaluate_OILL;
897 EvalTable[LLIHH] = &Simulator::Evaluate_LLIHH;
898 EvalTable[LLIHL] = &Simulator::Evaluate_LLIHL;
899 EvalTable[LLILH] = &Simulator::Evaluate_LLILH;
900 EvalTable[LLILL] = &Simulator::Evaluate_LLILL;
901 EvalTable[TMLH] = &Simulator::Evaluate_TMLH;
902 EvalTable[TMLL] = &Simulator::Evaluate_TMLL;
903 EvalTable[TMHH] = &Simulator::Evaluate_TMHH;
904 EvalTable[TMHL] = &Simulator::Evaluate_TMHL;
905 EvalTable[BRC] = &Simulator::Evaluate_BRC;
906 EvalTable[BRAS] = &Simulator::Evaluate_BRAS;
907 EvalTable[BRCT] = &Simulator::Evaluate_BRCT;
908 EvalTable[BRCTG] = &Simulator::Evaluate_BRCTG;
909 EvalTable[LHI] = &Simulator::Evaluate_LHI;
910 EvalTable[LGHI] = &Simulator::Evaluate_LGHI;
911 EvalTable[AHI] = &Simulator::Evaluate_AHI;
912 EvalTable[AGHI] = &Simulator::Evaluate_AGHI;
913 EvalTable[MHI] = &Simulator::Evaluate_MHI;
914 EvalTable[MGHI] = &Simulator::Evaluate_MGHI;
915 EvalTable[CHI] = &Simulator::Evaluate_CHI;
916 EvalTable[CGHI] = &Simulator::Evaluate_CGHI;
917 EvalTable[LARL] = &Simulator::Evaluate_LARL;
918 EvalTable[LGFI] = &Simulator::Evaluate_LGFI;
919 EvalTable[BRCL] = &Simulator::Evaluate_BRCL;
920 EvalTable[BRASL] = &Simulator::Evaluate_BRASL;
921 EvalTable[XIHF] = &Simulator::Evaluate_XIHF;
922 EvalTable[XILF] = &Simulator::Evaluate_XILF;
923 EvalTable[IIHF] = &Simulator::Evaluate_IIHF;
924 EvalTable[IILF] = &Simulator::Evaluate_IILF;
925 EvalTable[NIHF] = &Simulator::Evaluate_NIHF;
926 EvalTable[NILF] = &Simulator::Evaluate_NILF;
927 EvalTable[OIHF] = &Simulator::Evaluate_OIHF;
928 EvalTable[OILF] = &Simulator::Evaluate_OILF;
929 EvalTable[LLIHF] = &Simulator::Evaluate_LLIHF;
930 EvalTable[LLILF] = &Simulator::Evaluate_LLILF;
931 EvalTable[MSGFI] = &Simulator::Evaluate_MSGFI;
932 EvalTable[MSFI] = &Simulator::Evaluate_MSFI;
933 EvalTable[SLGFI] = &Simulator::Evaluate_SLGFI;
934 EvalTable[SLFI] = &Simulator::Evaluate_SLFI;
935 EvalTable[AGFI] = &Simulator::Evaluate_AGFI;
936 EvalTable[AFI] = &Simulator::Evaluate_AFI;
937 EvalTable[ALGFI] = &Simulator::Evaluate_ALGFI;
938 EvalTable[ALFI] = &Simulator::Evaluate_ALFI;
939 EvalTable[CGFI] = &Simulator::Evaluate_CGFI;
940 EvalTable[CFI] = &Simulator::Evaluate_CFI;
941 EvalTable[CLGFI] = &Simulator::Evaluate_CLGFI;
942 EvalTable[CLFI] = &Simulator::Evaluate_CLFI;
943 EvalTable[LLHRL] = &Simulator::Evaluate_LLHRL;
944 EvalTable[LGHRL] = &Simulator::Evaluate_LGHRL;
945 EvalTable[LHRL] = &Simulator::Evaluate_LHRL;
946 EvalTable[LLGHRL] = &Simulator::Evaluate_LLGHRL;
947 EvalTable[STHRL] = &Simulator::Evaluate_STHRL;
948 EvalTable[LGRL] = &Simulator::Evaluate_LGRL;
949 EvalTable[STGRL] = &Simulator::Evaluate_STGRL;
950 EvalTable[LGFRL] = &Simulator::Evaluate_LGFRL;
951 EvalTable[LRL] = &Simulator::Evaluate_LRL;
952 EvalTable[LLGFRL] = &Simulator::Evaluate_LLGFRL;
953 EvalTable[STRL] = &Simulator::Evaluate_STRL;
954 EvalTable[EXRL] = &Simulator::Evaluate_EXRL;
955 EvalTable[PFDRL] = &Simulator::Evaluate_PFDRL;
956 EvalTable[CGHRL] = &Simulator::Evaluate_CGHRL;
957 EvalTable[CHRL] = &Simulator::Evaluate_CHRL;
958 EvalTable[CGRL] = &Simulator::Evaluate_CGRL;
959 EvalTable[CGFRL] = &Simulator::Evaluate_CGFRL;
960 EvalTable[ECTG] = &Simulator::Evaluate_ECTG;
961 EvalTable[CSST] = &Simulator::Evaluate_CSST;
962 EvalTable[LPD] = &Simulator::Evaluate_LPD;
963 EvalTable[LPDG] = &Simulator::Evaluate_LPDG;
964 EvalTable[BRCTH] = &Simulator::Evaluate_BRCTH;
965 EvalTable[AIH] = &Simulator::Evaluate_AIH;
966 EvalTable[ALSIH] = &Simulator::Evaluate_ALSIH;
967 EvalTable[ALSIHN] = &Simulator::Evaluate_ALSIHN;
968 EvalTable[CIH] = &Simulator::Evaluate_CIH;
969 EvalTable[CLIH] = &Simulator::Evaluate_CLIH;
970 EvalTable[STCK] = &Simulator::Evaluate_STCK;
971 EvalTable[CFC] = &Simulator::Evaluate_CFC;
972 EvalTable[IPM] = &Simulator::Evaluate_IPM;
973 EvalTable[HSCH] = &Simulator::Evaluate_HSCH;
974 EvalTable[MSCH] = &Simulator::Evaluate_MSCH;
975 EvalTable[SSCH] = &Simulator::Evaluate_SSCH;
976 EvalTable[STSCH] = &Simulator::Evaluate_STSCH;
977 EvalTable[TSCH] = &Simulator::Evaluate_TSCH;
978 EvalTable[TPI] = &Simulator::Evaluate_TPI;
979 EvalTable[SAL] = &Simulator::Evaluate_SAL;
980 EvalTable[RSCH] = &Simulator::Evaluate_RSCH;
981 EvalTable[STCRW] = &Simulator::Evaluate_STCRW;
982 EvalTable[STCPS] = &Simulator::Evaluate_STCPS;
983 EvalTable[RCHP] = &Simulator::Evaluate_RCHP;
984 EvalTable[SCHM] = &Simulator::Evaluate_SCHM;
985 EvalTable[CKSM] = &Simulator::Evaluate_CKSM;
986 EvalTable[SAR] = &Simulator::Evaluate_SAR;
987 EvalTable[EAR] = &Simulator::Evaluate_EAR;
988 EvalTable[MSR] = &Simulator::Evaluate_MSR;
989 EvalTable[MSRKC] = &Simulator::Evaluate_MSRKC;
990 EvalTable[MVST] = &Simulator::Evaluate_MVST;
991 EvalTable[CUSE] = &Simulator::Evaluate_CUSE;
992 EvalTable[SRST] = &Simulator::Evaluate_SRST;
993 EvalTable[XSCH] = &Simulator::Evaluate_XSCH;
994 EvalTable[STCKE] = &Simulator::Evaluate_STCKE;
995 EvalTable[STCKF] = &Simulator::Evaluate_STCKF;
996 EvalTable[SRNM] = &Simulator::Evaluate_SRNM;
997 EvalTable[STFPC] = &Simulator::Evaluate_STFPC;
998 EvalTable[LFPC] = &Simulator::Evaluate_LFPC;
999 EvalTable[TRE] = &Simulator::Evaluate_TRE;
1000 EvalTable[STFLE] = &Simulator::Evaluate_STFLE;
1001 EvalTable[SRNMB] = &Simulator::Evaluate_SRNMB;
1002 EvalTable[SRNMT] = &Simulator::Evaluate_SRNMT;
1003 EvalTable[LFAS] = &Simulator::Evaluate_LFAS;
1004 EvalTable[PPA] = &Simulator::Evaluate_PPA;
1005 EvalTable[ETND] = &Simulator::Evaluate_ETND;
1006 EvalTable[TEND] = &Simulator::Evaluate_TEND;
1007 EvalTable[NIAI] = &Simulator::Evaluate_NIAI;
1008 EvalTable[TABORT] = &Simulator::Evaluate_TABORT;
1009 EvalTable[TRAP4] = &Simulator::Evaluate_TRAP4;
1010 EvalTable[LPEBR] = &Simulator::Evaluate_LPEBR;
1011 EvalTable[LNEBR] = &Simulator::Evaluate_LNEBR;
1012 EvalTable[LTEBR] = &Simulator::Evaluate_LTEBR;
1013 EvalTable[LCEBR] = &Simulator::Evaluate_LCEBR;
1014 EvalTable[LDEBR] = &Simulator::Evaluate_LDEBR;
1015 EvalTable[LXDBR] = &Simulator::Evaluate_LXDBR;
1016 EvalTable[LXEBR] = &Simulator::Evaluate_LXEBR;
1017 EvalTable[MXDBR] = &Simulator::Evaluate_MXDBR;
1018 EvalTable[KEBR] = &Simulator::Evaluate_KEBR;
1019 EvalTable[CEBR] = &Simulator::Evaluate_CEBR;
1020 EvalTable[AEBR] = &Simulator::Evaluate_AEBR;
1021 EvalTable[SEBR] = &Simulator::Evaluate_SEBR;
1022 EvalTable[MDEBR] = &Simulator::Evaluate_MDEBR;
1023 EvalTable[DEBR] = &Simulator::Evaluate_DEBR;
1024 EvalTable[MAEBR] = &Simulator::Evaluate_MAEBR;
1025 EvalTable[MSEBR] = &Simulator::Evaluate_MSEBR;
1026 EvalTable[LPDBR] = &Simulator::Evaluate_LPDBR;
1027 EvalTable[LNDBR] = &Simulator::Evaluate_LNDBR;
1028 EvalTable[LTDBR] = &Simulator::Evaluate_LTDBR;
1029 EvalTable[LCDBR] = &Simulator::Evaluate_LCDBR;
1030 EvalTable[SQEBR] = &Simulator::Evaluate_SQEBR;
1031 EvalTable[SQDBR] = &Simulator::Evaluate_SQDBR;
1032 EvalTable[SQXBR] = &Simulator::Evaluate_SQXBR;
1033 EvalTable[MEEBR] = &Simulator::Evaluate_MEEBR;
1034 EvalTable[KDBR] = &Simulator::Evaluate_KDBR;
1035 EvalTable[CDBR] = &Simulator::Evaluate_CDBR;
1036 EvalTable[ADBR] = &Simulator::Evaluate_ADBR;
1037 EvalTable[SDBR] = &Simulator::Evaluate_SDBR;
1038 EvalTable[MDBR] = &Simulator::Evaluate_MDBR;
1039 EvalTable[DDBR] = &Simulator::Evaluate_DDBR;
1040 EvalTable[MADBR] = &Simulator::Evaluate_MADBR;
1041 EvalTable[MSDBR] = &Simulator::Evaluate_MSDBR;
1042 EvalTable[LPXBR] = &Simulator::Evaluate_LPXBR;
1043 EvalTable[LNXBR] = &Simulator::Evaluate_LNXBR;
1044 EvalTable[LTXBR] = &Simulator::Evaluate_LTXBR;
1045 EvalTable[LCXBR] = &Simulator::Evaluate_LCXBR;
1046 EvalTable[LEDBRA] = &Simulator::Evaluate_LEDBRA;
1047 EvalTable[LDXBRA] = &Simulator::Evaluate_LDXBRA;
1048 EvalTable[LEXBRA] = &Simulator::Evaluate_LEXBRA;
1049 EvalTable[FIXBRA] = &Simulator::Evaluate_FIXBRA;
1050 EvalTable[KXBR] = &Simulator::Evaluate_KXBR;
1051 EvalTable[CXBR] = &Simulator::Evaluate_CXBR;
1052 EvalTable[AXBR] = &Simulator::Evaluate_AXBR;
1053 EvalTable[SXBR] = &Simulator::Evaluate_SXBR;
1054 EvalTable[MXBR] = &Simulator::Evaluate_MXBR;
1055 EvalTable[DXBR] = &Simulator::Evaluate_DXBR;
1056 EvalTable[TBEDR] = &Simulator::Evaluate_TBEDR;
1057 EvalTable[TBDR] = &Simulator::Evaluate_TBDR;
1058 EvalTable[DIEBR] = &Simulator::Evaluate_DIEBR;
1059 EvalTable[FIEBRA] = &Simulator::Evaluate_FIEBRA;
1060 EvalTable[THDER] = &Simulator::Evaluate_THDER;
1061 EvalTable[THDR] = &Simulator::Evaluate_THDR;
1062 EvalTable[DIDBR] = &Simulator::Evaluate_DIDBR;
1063 EvalTable[FIDBRA] = &Simulator::Evaluate_FIDBRA;
1064 EvalTable[LXR] = &Simulator::Evaluate_LXR;
1065 EvalTable[LPDFR] = &Simulator::Evaluate_LPDFR;
1066 EvalTable[LNDFR] = &Simulator::Evaluate_LNDFR;
1067 EvalTable[LCDFR] = &Simulator::Evaluate_LCDFR;
1068 EvalTable[LZER] = &Simulator::Evaluate_LZER;
1069 EvalTable[LZDR] = &Simulator::Evaluate_LZDR;
1070 EvalTable[LZXR] = &Simulator::Evaluate_LZXR;
1071 EvalTable[SFPC] = &Simulator::Evaluate_SFPC;
1072 EvalTable[SFASR] = &Simulator::Evaluate_SFASR;
1073 EvalTable[EFPC] = &Simulator::Evaluate_EFPC;
1074 EvalTable[CELFBR] = &Simulator::Evaluate_CELFBR;
1075 EvalTable[CDLFBR] = &Simulator::Evaluate_CDLFBR;
1076 EvalTable[CXLFBR] = &Simulator::Evaluate_CXLFBR;
1077 EvalTable[CEFBRA] = &Simulator::Evaluate_CEFBRA;
1078 EvalTable[CDFBRA] = &Simulator::Evaluate_CDFBRA;
1079 EvalTable[CXFBRA] = &Simulator::Evaluate_CXFBRA;
1080 EvalTable[CFEBRA] = &Simulator::Evaluate_CFEBRA;
1081 EvalTable[CFDBRA] = &Simulator::Evaluate_CFDBRA;
1082 EvalTable[CFXBRA] = &Simulator::Evaluate_CFXBRA;
1083 EvalTable[CLFEBR] = &Simulator::Evaluate_CLFEBR;
1084 EvalTable[CLFDBR] = &Simulator::Evaluate_CLFDBR;
1085 EvalTable[CLFXBR] = &Simulator::Evaluate_CLFXBR;
1086 EvalTable[CELGBR] = &Simulator::Evaluate_CELGBR;
1087 EvalTable[CDLGBR] = &Simulator::Evaluate_CDLGBR;
1088 EvalTable[CXLGBR] = &Simulator::Evaluate_CXLGBR;
1089 EvalTable[CEGBRA] = &Simulator::Evaluate_CEGBRA;
1090 EvalTable[CDGBRA] = &Simulator::Evaluate_CDGBRA;
1091 EvalTable[CXGBRA] = &Simulator::Evaluate_CXGBRA;
1092 EvalTable[CGEBRA] = &Simulator::Evaluate_CGEBRA;
1093 EvalTable[CGDBRA] = &Simulator::Evaluate_CGDBRA;
1094 EvalTable[CGXBRA] = &Simulator::Evaluate_CGXBRA;
1095 EvalTable[CLGEBR] = &Simulator::Evaluate_CLGEBR;
1096 EvalTable[CLGDBR] = &Simulator::Evaluate_CLGDBR;
1097 EvalTable[CFER] = &Simulator::Evaluate_CFER;
1098 EvalTable[CFDR] = &Simulator::Evaluate_CFDR;
1099 EvalTable[CFXR] = &Simulator::Evaluate_CFXR;
1100 EvalTable[LDGR] = &Simulator::Evaluate_LDGR;
1101 EvalTable[CGER] = &Simulator::Evaluate_CGER;
1102 EvalTable[CGDR] = &Simulator::Evaluate_CGDR;
1103 EvalTable[CGXR] = &Simulator::Evaluate_CGXR;
1104 EvalTable[LGDR] = &Simulator::Evaluate_LGDR;
1105 EvalTable[MDTRA] = &Simulator::Evaluate_MDTRA;
1106 EvalTable[DDTRA] = &Simulator::Evaluate_DDTRA;
1107 EvalTable[ADTRA] = &Simulator::Evaluate_ADTRA;
1108 EvalTable[SDTRA] = &Simulator::Evaluate_SDTRA;
1109 EvalTable[LDETR] = &Simulator::Evaluate_LDETR;
1110 EvalTable[LEDTR] = &Simulator::Evaluate_LEDTR;
1111 EvalTable[LTDTR] = &Simulator::Evaluate_LTDTR;
1112 EvalTable[FIDTR] = &Simulator::Evaluate_FIDTR;
1113 EvalTable[MXTRA] = &Simulator::Evaluate_MXTRA;
1114 EvalTable[DXTRA] = &Simulator::Evaluate_DXTRA;
1115 EvalTable[AXTRA] = &Simulator::Evaluate_AXTRA;
1116 EvalTable[SXTRA] = &Simulator::Evaluate_SXTRA;
1117 EvalTable[LXDTR] = &Simulator::Evaluate_LXDTR;
1118 EvalTable[LDXTR] = &Simulator::Evaluate_LDXTR;
1119 EvalTable[LTXTR] = &Simulator::Evaluate_LTXTR;
1120 EvalTable[FIXTR] = &Simulator::Evaluate_FIXTR;
1121 EvalTable[KDTR] = &Simulator::Evaluate_KDTR;
1122 EvalTable[CGDTRA] = &Simulator::Evaluate_CGDTRA;
1123 EvalTable[CUDTR] = &Simulator::Evaluate_CUDTR;
1124 EvalTable[CDTR] = &Simulator::Evaluate_CDTR;
1125 EvalTable[EEDTR] = &Simulator::Evaluate_EEDTR;
1126 EvalTable[ESDTR] = &Simulator::Evaluate_ESDTR;
1127 EvalTable[KXTR] = &Simulator::Evaluate_KXTR;
1128 EvalTable[CGXTRA] = &Simulator::Evaluate_CGXTRA;
1129 EvalTable[CUXTR] = &Simulator::Evaluate_CUXTR;
1130 EvalTable[CSXTR] = &Simulator::Evaluate_CSXTR;
1131 EvalTable[CXTR] = &Simulator::Evaluate_CXTR;
1132 EvalTable[EEXTR] = &Simulator::Evaluate_EEXTR;
1133 EvalTable[ESXTR] = &Simulator::Evaluate_ESXTR;
1134 EvalTable[CDGTRA] = &Simulator::Evaluate_CDGTRA;
1135 EvalTable[CDUTR] = &Simulator::Evaluate_CDUTR;
1136 EvalTable[CDSTR] = &Simulator::Evaluate_CDSTR;
1137 EvalTable[CEDTR] = &Simulator::Evaluate_CEDTR;
1138 EvalTable[QADTR] = &Simulator::Evaluate_QADTR;
1139 EvalTable[IEDTR] = &Simulator::Evaluate_IEDTR;
1140 EvalTable[RRDTR] = &Simulator::Evaluate_RRDTR;
1141 EvalTable[CXGTRA] = &Simulator::Evaluate_CXGTRA;
1142 EvalTable[CXUTR] = &Simulator::Evaluate_CXUTR;
1143 EvalTable[CXSTR] = &Simulator::Evaluate_CXSTR;
1144 EvalTable[CEXTR] = &Simulator::Evaluate_CEXTR;
1145 EvalTable[QAXTR] = &Simulator::Evaluate_QAXTR;
1146 EvalTable[IEXTR] = &Simulator::Evaluate_IEXTR;
1147 EvalTable[RRXTR] = &Simulator::Evaluate_RRXTR;
1148 EvalTable[LPGR] = &Simulator::Evaluate_LPGR;
1149 EvalTable[LNGR] = &Simulator::Evaluate_LNGR;
1150 EvalTable[LTGR] = &Simulator::Evaluate_LTGR;
1151 EvalTable[LCGR] = &Simulator::Evaluate_LCGR;
1152 EvalTable[LGR] = &Simulator::Evaluate_LGR;
1153 EvalTable[LGBR] = &Simulator::Evaluate_LGBR;
1154 EvalTable[LGHR] = &Simulator::Evaluate_LGHR;
1155 EvalTable[AGR] = &Simulator::Evaluate_AGR;
1156 EvalTable[SGR] = &Simulator::Evaluate_SGR;
1157 EvalTable[ALGR] = &Simulator::Evaluate_ALGR;
1158 EvalTable[SLGR] = &Simulator::Evaluate_SLGR;
1159 EvalTable[MSGR] = &Simulator::Evaluate_MSGR;
1160 EvalTable[MSGRKC] = &Simulator::Evaluate_MSGRKC;
1161 EvalTable[DSGR] = &Simulator::Evaluate_DSGR;
1162 EvalTable[LRVGR] = &Simulator::Evaluate_LRVGR;
1163 EvalTable[LPGFR] = &Simulator::Evaluate_LPGFR;
1164 EvalTable[LNGFR] = &Simulator::Evaluate_LNGFR;
1165 EvalTable[LTGFR] = &Simulator::Evaluate_LTGFR;
1166 EvalTable[LCGFR] = &Simulator::Evaluate_LCGFR;
1167 EvalTable[LGFR] = &Simulator::Evaluate_LGFR;
1168 EvalTable[LLGFR] = &Simulator::Evaluate_LLGFR;
1169 EvalTable[LLGTR] = &Simulator::Evaluate_LLGTR;
1170 EvalTable[AGFR] = &Simulator::Evaluate_AGFR;
1171 EvalTable[SGFR] = &Simulator::Evaluate_SGFR;
1172 EvalTable[ALGFR] = &Simulator::Evaluate_ALGFR;
1173 EvalTable[SLGFR] = &Simulator::Evaluate_SLGFR;
1174 EvalTable[MSGFR] = &Simulator::Evaluate_MSGFR;
1175 EvalTable[DSGFR] = &Simulator::Evaluate_DSGFR;
1176 EvalTable[KMAC] = &Simulator::Evaluate_KMAC;
1177 EvalTable[LRVR] = &Simulator::Evaluate_LRVR;
1178 EvalTable[CGR] = &Simulator::Evaluate_CGR;
1179 EvalTable[CLGR] = &Simulator::Evaluate_CLGR;
1180 EvalTable[LBR] = &Simulator::Evaluate_LBR;
1181 EvalTable[LHR] = &Simulator::Evaluate_LHR;
1182 EvalTable[KMF] = &Simulator::Evaluate_KMF;
1183 EvalTable[KMO] = &Simulator::Evaluate_KMO;
1184 EvalTable[PCC] = &Simulator::Evaluate_PCC;
1185 EvalTable[KMCTR] = &Simulator::Evaluate_KMCTR;
1186 EvalTable[KM] = &Simulator::Evaluate_KM;
1187 EvalTable[KMC] = &Simulator::Evaluate_KMC;
1188 EvalTable[CGFR] = &Simulator::Evaluate_CGFR;
1189 EvalTable[KIMD] = &Simulator::Evaluate_KIMD;
1190 EvalTable[KLMD] = &Simulator::Evaluate_KLMD;
1191 EvalTable[CFDTR] = &Simulator::Evaluate_CFDTR;
1192 EvalTable[CLGDTR] = &Simulator::Evaluate_CLGDTR;
1193 EvalTable[CLFDTR] = &Simulator::Evaluate_CLFDTR;
1194 EvalTable[BCTGR] = &Simulator::Evaluate_BCTGR;
1195 EvalTable[CFXTR] = &Simulator::Evaluate_CFXTR;
1196 EvalTable[CLFXTR] = &Simulator::Evaluate_CLFXTR;
1197 EvalTable[CDFTR] = &Simulator::Evaluate_CDFTR;
1198 EvalTable[CDLGTR] = &Simulator::Evaluate_CDLGTR;
1199 EvalTable[CDLFTR] = &Simulator::Evaluate_CDLFTR;
1200 EvalTable[CXFTR] = &Simulator::Evaluate_CXFTR;
1201 EvalTable[CXLGTR] = &Simulator::Evaluate_CXLGTR;
1202 EvalTable[CXLFTR] = &Simulator::Evaluate_CXLFTR;
1203 EvalTable[CGRT] = &Simulator::Evaluate_CGRT;
1204 EvalTable[NGR] = &Simulator::Evaluate_NGR;
1205 EvalTable[OGR] = &Simulator::Evaluate_OGR;
1206 EvalTable[XGR] = &Simulator::Evaluate_XGR;
1207 EvalTable[FLOGR] = &Simulator::Evaluate_FLOGR;
1208 EvalTable[LLGCR] = &Simulator::Evaluate_LLGCR;
1209 EvalTable[LLGHR] = &Simulator::Evaluate_LLGHR;
1210 EvalTable[MLGR] = &Simulator::Evaluate_MLGR;
1211 EvalTable[DLGR] = &Simulator::Evaluate_DLGR;
1212 EvalTable[ALCGR] = &Simulator::Evaluate_ALCGR;
1213 EvalTable[SLBGR] = &Simulator::Evaluate_SLBGR;
1214 EvalTable[EPSW] = &Simulator::Evaluate_EPSW;
1215 EvalTable[TRTT] = &Simulator::Evaluate_TRTT;
1216 EvalTable[TRTO] = &Simulator::Evaluate_TRTO;
1217 EvalTable[TROT] = &Simulator::Evaluate_TROT;
1218 EvalTable[TROO] = &Simulator::Evaluate_TROO;
1219 EvalTable[LLCR] = &Simulator::Evaluate_LLCR;
1220 EvalTable[LLHR] = &Simulator::Evaluate_LLHR;
1221 EvalTable[MLR] = &Simulator::Evaluate_MLR;
1222 EvalTable[DLR] = &Simulator::Evaluate_DLR;
1223 EvalTable[ALCR] = &Simulator::Evaluate_ALCR;
1224 EvalTable[SLBR] = &Simulator::Evaluate_SLBR;
1225 EvalTable[CU14] = &Simulator::Evaluate_CU14;
1226 EvalTable[CU24] = &Simulator::Evaluate_CU24;
1227 EvalTable[CU41] = &Simulator::Evaluate_CU41;
1228 EvalTable[CU42] = &Simulator::Evaluate_CU42;
1229 EvalTable[TRTRE] = &Simulator::Evaluate_TRTRE;
1230 EvalTable[SRSTU] = &Simulator::Evaluate_SRSTU;
1231 EvalTable[TRTE] = &Simulator::Evaluate_TRTE;
1232 EvalTable[AHHHR] = &Simulator::Evaluate_AHHHR;
1233 EvalTable[SHHHR] = &Simulator::Evaluate_SHHHR;
1234 EvalTable[ALHHHR] = &Simulator::Evaluate_ALHHHR;
1235 EvalTable[SLHHHR] = &Simulator::Evaluate_SLHHHR;
1236 EvalTable[CHHR] = &Simulator::Evaluate_CHHR;
1237 EvalTable[AHHLR] = &Simulator::Evaluate_AHHLR;
1238 EvalTable[SHHLR] = &Simulator::Evaluate_SHHLR;
1239 EvalTable[ALHHLR] = &Simulator::Evaluate_ALHHLR;
1240 EvalTable[SLHHLR] = &Simulator::Evaluate_SLHHLR;
1241 EvalTable[CHLR] = &Simulator::Evaluate_CHLR;
1242 EvalTable[POPCNT_Z] = &Simulator::Evaluate_POPCNT_Z;
1243 EvalTable[LOCGR] = &Simulator::Evaluate_LOCGR;
1244 EvalTable[NGRK] = &Simulator::Evaluate_NGRK;
1245 EvalTable[OGRK] = &Simulator::Evaluate_OGRK;
1246 EvalTable[XGRK] = &Simulator::Evaluate_XGRK;
1247 EvalTable[AGRK] = &Simulator::Evaluate_AGRK;
1248 EvalTable[SGRK] = &Simulator::Evaluate_SGRK;
1249 EvalTable[ALGRK] = &Simulator::Evaluate_ALGRK;
1250 EvalTable[SLGRK] = &Simulator::Evaluate_SLGRK;
1251 EvalTable[LOCR] = &Simulator::Evaluate_LOCR;
1252 EvalTable[NRK] = &Simulator::Evaluate_NRK;
1253 EvalTable[ORK] = &Simulator::Evaluate_ORK;
1254 EvalTable[XRK] = &Simulator::Evaluate_XRK;
1255 EvalTable[ARK] = &Simulator::Evaluate_ARK;
1256 EvalTable[SRK] = &Simulator::Evaluate_SRK;
1257 EvalTable[ALRK] = &Simulator::Evaluate_ALRK;
1258 EvalTable[SLRK] = &Simulator::Evaluate_SLRK;
1259 EvalTable[LTG] = &Simulator::Evaluate_LTG;
1260 EvalTable[LG] = &Simulator::Evaluate_LG;
1261 EvalTable[CVBY] = &Simulator::Evaluate_CVBY;
1262 EvalTable[AG] = &Simulator::Evaluate_AG;
1263 EvalTable[SG] = &Simulator::Evaluate_SG;
1264 EvalTable[ALG] = &Simulator::Evaluate_ALG;
1265 EvalTable[SLG] = &Simulator::Evaluate_SLG;
1266 EvalTable[MSG] = &Simulator::Evaluate_MSG;
1267 EvalTable[DSG] = &Simulator::Evaluate_DSG;
1268 EvalTable[CVBG] = &Simulator::Evaluate_CVBG;
1269 EvalTable[LRVG] = &Simulator::Evaluate_LRVG;
1270 EvalTable[LT] = &Simulator::Evaluate_LT;
1271 EvalTable[LGF] = &Simulator::Evaluate_LGF;
1272 EvalTable[LGH] = &Simulator::Evaluate_LGH;
1273 EvalTable[LLGF] = &Simulator::Evaluate_LLGF;
1274 EvalTable[LLGT] = &Simulator::Evaluate_LLGT;
1275 EvalTable[AGF] = &Simulator::Evaluate_AGF;
1276 EvalTable[SGF] = &Simulator::Evaluate_SGF;
1277 EvalTable[ALGF] = &Simulator::Evaluate_ALGF;
1278 EvalTable[SLGF] = &Simulator::Evaluate_SLGF;
1279 EvalTable[MSGF] = &Simulator::Evaluate_MSGF;
1280 EvalTable[DSGF] = &Simulator::Evaluate_DSGF;
1281 EvalTable[LRV] = &Simulator::Evaluate_LRV;
1282 EvalTable[LRVH] = &Simulator::Evaluate_LRVH;
1283 EvalTable[CG] = &Simulator::Evaluate_CG;
1284 EvalTable[CLG] = &Simulator::Evaluate_CLG;
1285 EvalTable[STG] = &Simulator::Evaluate_STG;
1286 EvalTable[NTSTG] = &Simulator::Evaluate_NTSTG;
1287 EvalTable[CVDY] = &Simulator::Evaluate_CVDY;
1288 EvalTable[CVDG] = &Simulator::Evaluate_CVDG;
1289 EvalTable[STRVG] = &Simulator::Evaluate_STRVG;
1290 EvalTable[CGF] = &Simulator::Evaluate_CGF;
1291 EvalTable[CLGF] = &Simulator::Evaluate_CLGF;
1292 EvalTable[LTGF] = &Simulator::Evaluate_LTGF;
1293 EvalTable[CGH] = &Simulator::Evaluate_CGH;
1294 EvalTable[PFD] = &Simulator::Evaluate_PFD;
1295 EvalTable[STRV] = &Simulator::Evaluate_STRV;
1296 EvalTable[STRVH] = &Simulator::Evaluate_STRVH;
1297 EvalTable[BCTG] = &Simulator::Evaluate_BCTG;
1298 EvalTable[STY] = &Simulator::Evaluate_STY;
1299 EvalTable[MSY] = &Simulator::Evaluate_MSY;
1300 EvalTable[MSC] = &Simulator::Evaluate_MSC;
1301 EvalTable[NY] = &Simulator::Evaluate_NY;
1302 EvalTable[CLY] = &Simulator::Evaluate_CLY;
1303 EvalTable[OY] = &Simulator::Evaluate_OY;
1304 EvalTable[XY] = &Simulator::Evaluate_XY;
1305 EvalTable[LY] = &Simulator::Evaluate_LY;
1306 EvalTable[CY] = &Simulator::Evaluate_CY;
1307 EvalTable[AY] = &Simulator::Evaluate_AY;
1308 EvalTable[SY] = &Simulator::Evaluate_SY;
1309 EvalTable[MFY] = &Simulator::Evaluate_MFY;
1310 EvalTable[ALY] = &Simulator::Evaluate_ALY;
1311 EvalTable[SLY] = &Simulator::Evaluate_SLY;
1312 EvalTable[STHY] = &Simulator::Evaluate_STHY;
1313 EvalTable[LAY] = &Simulator::Evaluate_LAY;
1314 EvalTable[STCY] = &Simulator::Evaluate_STCY;
1315 EvalTable[ICY] = &Simulator::Evaluate_ICY;
1316 EvalTable[LAEY] = &Simulator::Evaluate_LAEY;
1317 EvalTable[LB] = &Simulator::Evaluate_LB;
1318 EvalTable[LGB] = &Simulator::Evaluate_LGB;
1319 EvalTable[LHY] = &Simulator::Evaluate_LHY;
1320 EvalTable[CHY] = &Simulator::Evaluate_CHY;
1321 EvalTable[AHY] = &Simulator::Evaluate_AHY;
1322 EvalTable[SHY] = &Simulator::Evaluate_SHY;
1323 EvalTable[MHY] = &Simulator::Evaluate_MHY;
1324 EvalTable[NG] = &Simulator::Evaluate_NG;
1325 EvalTable[OG] = &Simulator::Evaluate_OG;
1326 EvalTable[XG] = &Simulator::Evaluate_XG;
1327 EvalTable[LGAT] = &Simulator::Evaluate_LGAT;
1328 EvalTable[MLG] = &Simulator::Evaluate_MLG;
1329 EvalTable[DLG] = &Simulator::Evaluate_DLG;
1330 EvalTable[ALCG] = &Simulator::Evaluate_ALCG;
1331 EvalTable[SLBG] = &Simulator::Evaluate_SLBG;
1332 EvalTable[STPQ] = &Simulator::Evaluate_STPQ;
1333 EvalTable[LPQ] = &Simulator::Evaluate_LPQ;
1334 EvalTable[LLGC] = &Simulator::Evaluate_LLGC;
1335 EvalTable[LLGH] = &Simulator::Evaluate_LLGH;
1336 EvalTable[LLC] = &Simulator::Evaluate_LLC;
1337 EvalTable[LLH] = &Simulator::Evaluate_LLH;
1338 EvalTable[ML] = &Simulator::Evaluate_ML;
1339 EvalTable[DL] = &Simulator::Evaluate_DL;
1340 EvalTable[ALC] = &Simulator::Evaluate_ALC;
1341 EvalTable[SLB] = &Simulator::Evaluate_SLB;
1342 EvalTable[LLGTAT] = &Simulator::Evaluate_LLGTAT;
1343 EvalTable[LLGFAT] = &Simulator::Evaluate_LLGFAT;
1344 EvalTable[LAT] = &Simulator::Evaluate_LAT;
1345 EvalTable[LBH] = &Simulator::Evaluate_LBH;
1346 EvalTable[LLCH] = &Simulator::Evaluate_LLCH;
1347 EvalTable[STCH] = &Simulator::Evaluate_STCH;
1348 EvalTable[LHH] = &Simulator::Evaluate_LHH;
1349 EvalTable[LLHH] = &Simulator::Evaluate_LLHH;
1350 EvalTable[STHH] = &Simulator::Evaluate_STHH;
1351 EvalTable[LFHAT] = &Simulator::Evaluate_LFHAT;
1352 EvalTable[LFH] = &Simulator::Evaluate_LFH;
1353 EvalTable[STFH] = &Simulator::Evaluate_STFH;
1354 EvalTable[CHF] = &Simulator::Evaluate_CHF;
1355 EvalTable[MVCDK] = &Simulator::Evaluate_MVCDK;
1356 EvalTable[MVHHI] = &Simulator::Evaluate_MVHHI;
1357 EvalTable[MVGHI] = &Simulator::Evaluate_MVGHI;
1358 EvalTable[MVHI] = &Simulator::Evaluate_MVHI;
1359 EvalTable[CHHSI] = &Simulator::Evaluate_CHHSI;
1360 EvalTable[CGHSI] = &Simulator::Evaluate_CGHSI;
1361 EvalTable[CHSI] = &Simulator::Evaluate_CHSI;
1362 EvalTable[CLFHSI] = &Simulator::Evaluate_CLFHSI;
1363 EvalTable[TBEGIN] = &Simulator::Evaluate_TBEGIN;
1364 EvalTable[TBEGINC] = &Simulator::Evaluate_TBEGINC;
1365 EvalTable[LMG] = &Simulator::Evaluate_LMG;
1366 EvalTable[SRAG] = &Simulator::Evaluate_SRAG;
1367 EvalTable[SLAG] = &Simulator::Evaluate_SLAG;
1368 EvalTable[SRLG] = &Simulator::Evaluate_SRLG;
1369 EvalTable[SLLG] = &Simulator::Evaluate_SLLG;
1370 EvalTable[CSY] = &Simulator::Evaluate_CSY;
1371 EvalTable[CSG] = &Simulator::Evaluate_CSG;
1372 EvalTable[RLLG] = &Simulator::Evaluate_RLLG;
1373 EvalTable[RLL] = &Simulator::Evaluate_RLL;
1374 EvalTable[STMG] = &Simulator::Evaluate_STMG;
1375 EvalTable[STMH] = &Simulator::Evaluate_STMH;
1376 EvalTable[STCMH] = &Simulator::Evaluate_STCMH;
1377 EvalTable[STCMY] = &Simulator::Evaluate_STCMY;
1378 EvalTable[CDSY] = &Simulator::Evaluate_CDSY;
1379 EvalTable[CDSG] = &Simulator::Evaluate_CDSG;
1380 EvalTable[BXHG] = &Simulator::Evaluate_BXHG;
1381 EvalTable[BXLEG] = &Simulator::Evaluate_BXLEG;
1382 EvalTable[ECAG] = &Simulator::Evaluate_ECAG;
1383 EvalTable[TMY] = &Simulator::Evaluate_TMY;
1384 EvalTable[MVIY] = &Simulator::Evaluate_MVIY;
1385 EvalTable[NIY] = &Simulator::Evaluate_NIY;
1386 EvalTable[CLIY] = &Simulator::Evaluate_CLIY;
1387 EvalTable[OIY] = &Simulator::Evaluate_OIY;
1388 EvalTable[XIY] = &Simulator::Evaluate_XIY;
1389 EvalTable[ASI] = &Simulator::Evaluate_ASI;
1390 EvalTable[ALSI] = &Simulator::Evaluate_ALSI;
1391 EvalTable[AGSI] = &Simulator::Evaluate_AGSI;
1392 EvalTable[ALGSI] = &Simulator::Evaluate_ALGSI;
1393 EvalTable[ICMH] = &Simulator::Evaluate_ICMH;
1394 EvalTable[ICMY] = &Simulator::Evaluate_ICMY;
1395 EvalTable[MVCLU] = &Simulator::Evaluate_MVCLU;
1396 EvalTable[CLCLU] = &Simulator::Evaluate_CLCLU;
1397 EvalTable[STMY] = &Simulator::Evaluate_STMY;
1398 EvalTable[LMH] = &Simulator::Evaluate_LMH;
1399 EvalTable[LMY] = &Simulator::Evaluate_LMY;
1400 EvalTable[TP] = &Simulator::Evaluate_TP;
1401 EvalTable[SRAK] = &Simulator::Evaluate_SRAK;
1402 EvalTable[SLAK] = &Simulator::Evaluate_SLAK;
1403 EvalTable[SRLK] = &Simulator::Evaluate_SRLK;
1404 EvalTable[SLLK] = &Simulator::Evaluate_SLLK;
1405 EvalTable[LOCG] = &Simulator::Evaluate_LOCG;
1406 EvalTable[STOCG] = &Simulator::Evaluate_STOCG;
1407 EvalTable[LANG] = &Simulator::Evaluate_LANG;
1408 EvalTable[LAOG] = &Simulator::Evaluate_LAOG;
1409 EvalTable[LAXG] = &Simulator::Evaluate_LAXG;
1410 EvalTable[LAAG] = &Simulator::Evaluate_LAAG;
1411 EvalTable[LAALG] = &Simulator::Evaluate_LAALG;
1412 EvalTable[LOC] = &Simulator::Evaluate_LOC;
1413 EvalTable[STOC] = &Simulator::Evaluate_STOC;
1414 EvalTable[LAN] = &Simulator::Evaluate_LAN;
1415 EvalTable[LAO] = &Simulator::Evaluate_LAO;
1416 EvalTable[LAX] = &Simulator::Evaluate_LAX;
1417 EvalTable[LAA] = &Simulator::Evaluate_LAA;
1418 EvalTable[LAAL] = &Simulator::Evaluate_LAAL;
1419 EvalTable[BRXHG] = &Simulator::Evaluate_BRXHG;
1420 EvalTable[BRXLG] = &Simulator::Evaluate_BRXLG;
1421 EvalTable[RISBLG] = &Simulator::Evaluate_RISBLG;
1422 EvalTable[RNSBG] = &Simulator::Evaluate_RNSBG;
1423 EvalTable[RISBG] = &Simulator::Evaluate_RISBG;
1424 EvalTable[ROSBG] = &Simulator::Evaluate_ROSBG;
1425 EvalTable[RXSBG] = &Simulator::Evaluate_RXSBG;
1426 EvalTable[RISBGN] = &Simulator::Evaluate_RISBGN;
1427 EvalTable[RISBHG] = &Simulator::Evaluate_RISBHG;
1428 EvalTable[CGRJ] = &Simulator::Evaluate_CGRJ;
1429 EvalTable[CGIT] = &Simulator::Evaluate_CGIT;
1430 EvalTable[CIT] = &Simulator::Evaluate_CIT;
1431 EvalTable[CLFIT] = &Simulator::Evaluate_CLFIT;
1432 EvalTable[CGIJ] = &Simulator::Evaluate_CGIJ;
1433 EvalTable[CIJ] = &Simulator::Evaluate_CIJ;
1434 EvalTable[AHIK] = &Simulator::Evaluate_AHIK;
1435 EvalTable[AGHIK] = &Simulator::Evaluate_AGHIK;
1436 EvalTable[ALHSIK] = &Simulator::Evaluate_ALHSIK;
1437 EvalTable[ALGHSIK] = &Simulator::Evaluate_ALGHSIK;
1438 EvalTable[CGRB] = &Simulator::Evaluate_CGRB;
1439 EvalTable[CGIB] = &Simulator::Evaluate_CGIB;
1440 EvalTable[CIB] = &Simulator::Evaluate_CIB;
1441 EvalTable[LDEB] = &Simulator::Evaluate_LDEB;
1442 EvalTable[LXDB] = &Simulator::Evaluate_LXDB;
1443 EvalTable[LXEB] = &Simulator::Evaluate_LXEB;
1444 EvalTable[MXDB] = &Simulator::Evaluate_MXDB;
1445 EvalTable[KEB] = &Simulator::Evaluate_KEB;
1446 EvalTable[CEB] = &Simulator::Evaluate_CEB;
1447 EvalTable[AEB] = &Simulator::Evaluate_AEB;
1448 EvalTable[SEB] = &Simulator::Evaluate_SEB;
1449 EvalTable[MDEB] = &Simulator::Evaluate_MDEB;
1450 EvalTable[DEB] = &Simulator::Evaluate_DEB;
1451 EvalTable[MAEB] = &Simulator::Evaluate_MAEB;
1452 EvalTable[MSEB] = &Simulator::Evaluate_MSEB;
1453 EvalTable[TCEB] = &Simulator::Evaluate_TCEB;
1454 EvalTable[TCDB] = &Simulator::Evaluate_TCDB;
1455 EvalTable[TCXB] = &Simulator::Evaluate_TCXB;
1456 EvalTable[SQEB] = &Simulator::Evaluate_SQEB;
1457 EvalTable[SQDB] = &Simulator::Evaluate_SQDB;
1458 EvalTable[MEEB] = &Simulator::Evaluate_MEEB;
1459 EvalTable[KDB] = &Simulator::Evaluate_KDB;
1460 EvalTable[CDB] = &Simulator::Evaluate_CDB;
1461 EvalTable[ADB] = &Simulator::Evaluate_ADB;
1462 EvalTable[SDB] = &Simulator::Evaluate_SDB;
1463 EvalTable[MDB] = &Simulator::Evaluate_MDB;
1464 EvalTable[DDB] = &Simulator::Evaluate_DDB;
1465 EvalTable[MADB] = &Simulator::Evaluate_MADB;
1466 EvalTable[MSDB] = &Simulator::Evaluate_MSDB;
1467 EvalTable[SLDT] = &Simulator::Evaluate_SLDT;
1468 EvalTable[SRDT] = &Simulator::Evaluate_SRDT;
1469 EvalTable[SLXT] = &Simulator::Evaluate_SLXT;
1470 EvalTable[SRXT] = &Simulator::Evaluate_SRXT;
1471 EvalTable[TDCET] = &Simulator::Evaluate_TDCET;
1472 EvalTable[TDGET] = &Simulator::Evaluate_TDGET;
1473 EvalTable[TDCDT] = &Simulator::Evaluate_TDCDT;
1474 EvalTable[TDGDT] = &Simulator::Evaluate_TDGDT;
1475 EvalTable[TDCXT] = &Simulator::Evaluate_TDCXT;
1476 EvalTable[TDGXT] = &Simulator::Evaluate_TDGXT;
1477 EvalTable[LEY] = &Simulator::Evaluate_LEY;
1478 EvalTable[LDY] = &Simulator::Evaluate_LDY;
1479 EvalTable[STEY] = &Simulator::Evaluate_STEY;
1480 EvalTable[STDY] = &Simulator::Evaluate_STDY;
1481 EvalTable[CZDT] = &Simulator::Evaluate_CZDT;
1482 EvalTable[CZXT] = &Simulator::Evaluate_CZXT;
1483 EvalTable[CDZT] = &Simulator::Evaluate_CDZT;
1484 EvalTable[CXZT] = &Simulator::Evaluate_CXZT;
1487 Simulator::Simulator(Isolate* isolate) : isolate_(isolate) {
1488 static base::OnceType once = V8_ONCE_INIT;
1489 base::CallOnce(&once, &Simulator::EvalTableInit);
1492 #if V8_TARGET_ARCH_S390X 1493 size_t stack_size = FLAG_sim_stack_size * KB;
1495 size_t stack_size = MB;
1497 stack_size += 2 * stack_protection_size_;
1498 stack_ =
reinterpret_cast<char*
>(malloc(stack_size));
1499 pc_modified_ =
false;
1501 break_pc_ =
nullptr;
1505 #ifdef V8_TARGET_ARCH_S390X 1506 DCHECK_EQ(
sizeof(intptr_t), 8);
1508 DCHECK_EQ(
sizeof(intptr_t), 4);
1512 for (
int i = 0;
i < kNumGPRs;
i++) {
1516 special_reg_pc_ = 0;
1519 for (
int i = 0;
i < kNumFPRs;
i++) {
1520 fp_registers_[
i] = 0.0;
1527 reinterpret_cast<intptr_t
>(stack_) + stack_size - stack_protection_size_;
1529 last_debugger_input_ =
nullptr;
1532 Simulator::~Simulator() { free(stack_); }
1535 Simulator* Simulator::current(Isolate* isolate) {
1537 isolate->FindOrAllocatePerThreadDataForThisThread();
1538 DCHECK_NOT_NULL(isolate_data);
1540 Simulator* sim = isolate_data->simulator();
1541 if (sim ==
nullptr) {
1543 sim =
new Simulator(isolate);
1544 isolate_data->set_simulator(sim);
1550 void Simulator::set_register(
int reg, uint64_t value) {
1551 DCHECK((reg >= 0) && (reg < kNumGPRs));
1552 registers_[reg] = value;
1556 uint64_t Simulator::get_register(
int reg)
const {
1557 DCHECK((reg >= 0) && (reg < kNumGPRs));
1560 if (reg >= kNumGPRs)
return 0;
1562 return registers_[reg];
1565 template <
typename T>
1566 T Simulator::get_low_register(
int reg)
const {
1567 DCHECK((reg >= 0) && (reg < kNumGPRs));
1570 if (reg >= kNumGPRs)
return 0;
1572 return static_cast<T
>(registers_[reg] & 0xFFFFFFFF);
1575 template <
typename T>
1576 T Simulator::get_high_register(
int reg)
const {
1577 DCHECK((reg >= 0) && (reg < kNumGPRs));
1580 if (reg >= kNumGPRs)
return 0;
1582 return static_cast<T
>(registers_[reg] >> 32);
1585 void Simulator::set_low_register(
int reg,
uint32_t value) {
1586 uint64_t shifted_val =
static_cast<uint64_t
>(value);
1587 uint64_t orig_val =
static_cast<uint64_t
>(registers_[reg]);
1588 uint64_t result = (orig_val >> 32 << 32) | shifted_val;
1589 registers_[reg] = result;
1592 void Simulator::set_high_register(
int reg,
uint32_t value) {
1593 uint64_t shifted_val =
static_cast<uint64_t
>(value) << 32;
1594 uint64_t orig_val =
static_cast<uint64_t
>(registers_[reg]);
1595 uint64_t result = (orig_val & 0xFFFFFFFF) | shifted_val;
1596 registers_[reg] = result;
1599 double Simulator::get_double_from_register_pair(
int reg) {
1600 DCHECK((reg >= 0) && (reg < kNumGPRs) && ((reg % 2) == 0));
1602 double dm_val = 0.0;
1603 #if 0 && !V8_TARGET_ARCH_S390X // doesn't make sense in 64bit mode 1606 char buffer[
sizeof(fp_registers_[0])];
1607 memcpy(buffer, ®isters_[reg], 2 *
sizeof(registers_[0]));
1608 memcpy(&dm_val, buffer, 2 *
sizeof(registers_[0]));
1614 void Simulator::set_pc(intptr_t value) {
1615 pc_modified_ =
true;
1616 special_reg_pc_ = value;
1619 bool Simulator::has_bad_pc()
const {
1620 return ((special_reg_pc_ == bad_lr) || (special_reg_pc_ == end_sim_pc));
1624 intptr_t Simulator::get_pc()
const {
return special_reg_pc_; }
1630 void Simulator::GetFpArgs(
double* x,
double* y, intptr_t* z) {
1631 *x = get_double_from_d_register(0);
1632 *y = get_double_from_d_register(2);
1633 *z = get_register(2);
1637 void Simulator::SetFpResult(
const double& result) {
1638 set_d_register_from_double(0, result);
1641 void Simulator::TrashCallerSaveRegisters() {
1643 #if 0 // A good idea to trash volatile registers, needs to be done 1644 registers_[2] = 0x50BAD4U;
1645 registers_[3] = 0x50BAD4U;
1646 registers_[12] = 0x50BAD4U;
1650 uint32_t Simulator::ReadWU(intptr_t addr, Instruction* instr) {
1655 int64_t Simulator::ReadW64(intptr_t addr, Instruction* instr) {
1660 int32_t Simulator::ReadW(intptr_t addr, Instruction* instr) {
1661 int32_t* ptr =
reinterpret_cast<int32_t*
>(addr);
1665 void Simulator::WriteW(intptr_t addr,
uint32_t value, Instruction* instr) {
1671 void Simulator::WriteW(intptr_t addr, int32_t value, Instruction* instr) {
1672 int32_t* ptr =
reinterpret_cast<int32_t*
>(addr);
1677 uint16_t Simulator::ReadHU(intptr_t addr, Instruction* instr) {
1678 uint16_t* ptr =
reinterpret_cast<uint16_t*
>(addr);
1682 int16_t Simulator::ReadH(intptr_t addr, Instruction* instr) {
1683 int16_t* ptr =
reinterpret_cast<int16_t*
>(addr);
1687 void Simulator::WriteH(intptr_t addr, uint16_t value, Instruction* instr) {
1688 uint16_t* ptr =
reinterpret_cast<uint16_t*
>(addr);
1693 void Simulator::WriteH(intptr_t addr, int16_t value, Instruction* instr) {
1694 int16_t* ptr =
reinterpret_cast<int16_t*
>(addr);
1699 uint8_t Simulator::ReadBU(intptr_t addr) {
1700 uint8_t* ptr =
reinterpret_cast<uint8_t*
>(addr);
1704 int8_t Simulator::ReadB(intptr_t addr) {
1705 int8_t* ptr =
reinterpret_cast<int8_t*
>(addr);
1709 void Simulator::WriteB(intptr_t addr, uint8_t value) {
1710 uint8_t* ptr =
reinterpret_cast<uint8_t*
>(addr);
1714 void Simulator::WriteB(intptr_t addr, int8_t value) {
1715 int8_t* ptr =
reinterpret_cast<int8_t*
>(addr);
1719 int64_t Simulator::ReadDW(intptr_t addr) {
1724 void Simulator::WriteDW(intptr_t addr,
int64_t value) {
1733 double Simulator::ReadDouble(intptr_t addr) {
1734 double* ptr =
reinterpret_cast<double*
>(addr);
1738 float Simulator::ReadFloat(intptr_t addr) {
1739 float* ptr =
reinterpret_cast<float*
>(addr);
1747 if (GetCurrentStackPosition() < c_limit) {
1748 return reinterpret_cast<uintptr_t>(get_sp());
1753 return reinterpret_cast<uintptr_t>(stack_) + stack_protection_size_;
1757 void Simulator::Format(Instruction* instr,
const char* format) {
1758 PrintF(
"Simulator found unsupported instruction:\n 0x%08" V8PRIxPTR
": %s\n",
1759 reinterpret_cast<intptr_t>(instr), format);
1764 bool Simulator::CarryFrom(int32_t left, int32_t right, int32_t carry) {
1767 uint32_t urest = 0xFFFFFFFFU - uleft;
1769 return (uright > urest) ||
1770 (carry && (((uright + 1) > urest) || (uright > (urest - 1))));
1774 bool Simulator::BorrowFrom(int32_t left, int32_t right) {
1778 return (uright > uleft);
1782 template <
typename T1>
1783 bool Simulator::OverflowFromSigned(T1 alu_out, T1 left, T1 right,
1788 overflow = ((left >= 0 && right >= 0) || (left < 0 && right < 0))
1790 && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
1793 overflow = ((left < 0 && right >= 0) || (left >= 0 && right < 0))
1795 && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
1800 #if V8_TARGET_ARCH_S390X 1801 static void decodeObjectPair(ObjectPair* pair, intptr_t* x, intptr_t* y) {
1802 *x =
reinterpret_cast<intptr_t
>(pair->x);
1803 *y =
reinterpret_cast<intptr_t
>(pair->y);
1806 static void decodeObjectPair(ObjectPair* pair, intptr_t* x, intptr_t* y) {
1807 #if V8_TARGET_BIG_ENDIAN 1808 *x =
static_cast<int32_t
>(*pair >> 32);
1809 *y =
static_cast<int32_t
>(*pair);
1811 *x =
static_cast<int32_t
>(*pair);
1812 *y =
static_cast<int32_t
>(*pair >> 32);
1818 typedef intptr_t (*SimulatorRuntimeCall)(intptr_t arg0, intptr_t arg1,
1819 intptr_t arg2, intptr_t arg3,
1820 intptr_t arg4, intptr_t arg5,
1821 intptr_t arg6, intptr_t arg7,
1823 typedef ObjectPair (*SimulatorRuntimePairCall)(intptr_t arg0, intptr_t arg1,
1824 intptr_t arg2, intptr_t arg3,
1825 intptr_t arg4, intptr_t arg5);
1828 typedef int (*SimulatorRuntimeCompareCall)(
double darg0,
double darg1);
1829 typedef double (*SimulatorRuntimeFPFPCall)(
double darg0,
double darg1);
1830 typedef double (*SimulatorRuntimeFPCall)(
double darg0);
1831 typedef double (*SimulatorRuntimeFPIntCall)(
double darg0, intptr_t arg0);
1835 typedef void (*SimulatorRuntimeDirectApiCall)(intptr_t arg0);
1836 typedef void (*SimulatorRuntimeProfilingApiCall)(intptr_t arg0,
void* arg1);
1839 typedef void (*SimulatorRuntimeDirectGetterCall)(intptr_t arg0, intptr_t arg1);
1840 typedef void (*SimulatorRuntimeProfilingGetterCall)(intptr_t arg0,
1841 intptr_t arg1,
void* arg2);
1845 void Simulator::SoftwareInterrupt(Instruction* instr) {
1846 int svc = instr->SvcValue();
1848 case kCallRtRedirected: {
1851 bool stack_aligned =
1852 (get_register(sp) & (::v8::internal::FLAG_sim_stack_alignment - 1)) ==
1854 Redirection* redirection = Redirection::FromInstruction(instr);
1855 const int kArgCount = 9;
1856 const int kRegisterArgCount = 5;
1857 int arg0_regnum = 2;
1858 intptr_t result_buffer = 0;
1859 bool uses_result_buffer =
1860 redirection->type() == ExternalReference::BUILTIN_CALL_PAIR &&
1861 !ABI_RETURNS_OBJECTPAIR_IN_REGS;
1862 if (uses_result_buffer) {
1863 result_buffer = get_register(r2);
1866 intptr_t arg[kArgCount];
1868 for (
int i = 0;
i < kRegisterArgCount;
i++) {
1869 arg[
i] = get_register(arg0_regnum +
i);
1872 intptr_t* stack_pointer =
reinterpret_cast<intptr_t*
>(get_register(sp));
1873 for (
int i = kRegisterArgCount;
i < kArgCount;
i++) {
1874 arg[
i] = stack_pointer[(kCalleeRegisterSaveAreaSize / kPointerSize) +
1875 (
i - kRegisterArgCount)];
1877 STATIC_ASSERT(kArgCount == kRegisterArgCount + 4);
1878 STATIC_ASSERT(kMaxCParameters == 9);
1880 (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) ||
1881 (redirection->type() == ExternalReference::BUILTIN_COMPARE_CALL) ||
1882 (redirection->type() == ExternalReference::BUILTIN_FP_CALL) ||
1883 (redirection->type() == ExternalReference::BUILTIN_FP_INT_CALL);
1886 *
reinterpret_cast<intptr_t*
>(get_register(sp) +
1887 kStackFrameRASlot * kPointerSize) =
1891 reinterpret_cast<intptr_t
>(redirection->external_function());
1893 double dval0, dval1;
1897 GetFpArgs(&dval0, &dval1, &ival);
1898 if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
1899 SimulatorRuntimeCall generic_target =
1900 reinterpret_cast<SimulatorRuntimeCall
>(external);
1901 switch (redirection->type()) {
1902 case ExternalReference::BUILTIN_FP_FP_CALL:
1903 case ExternalReference::BUILTIN_COMPARE_CALL:
1904 PrintF(
"Call to host function at %p with args %f, %f",
1905 reinterpret_cast<void*>(FUNCTION_ADDR(generic_target)),
1908 case ExternalReference::BUILTIN_FP_CALL:
1909 PrintF(
"Call to host function at %p with arg %f",
1910 reinterpret_cast<void*>(FUNCTION_ADDR(generic_target)),
1913 case ExternalReference::BUILTIN_FP_INT_CALL:
1914 PrintF(
"Call to host function at %p with args %f, %" V8PRIdPTR,
1915 reinterpret_cast<void*>(FUNCTION_ADDR(generic_target)),
1922 if (!stack_aligned) {
1923 PrintF(
" with unaligned stack %08" V8PRIxPTR
"\n",
1924 static_cast<intptr_t>(get_register(sp)));
1928 CHECK(stack_aligned);
1929 switch (redirection->type()) {
1930 case ExternalReference::BUILTIN_COMPARE_CALL: {
1931 SimulatorRuntimeCompareCall target =
1932 reinterpret_cast<SimulatorRuntimeCompareCall
>(external);
1933 iresult = target(dval0, dval1);
1934 set_register(r2, iresult);
1937 case ExternalReference::BUILTIN_FP_FP_CALL: {
1938 SimulatorRuntimeFPFPCall target =
1939 reinterpret_cast<SimulatorRuntimeFPFPCall
>(external);
1940 dresult = target(dval0, dval1);
1941 SetFpResult(dresult);
1944 case ExternalReference::BUILTIN_FP_CALL: {
1945 SimulatorRuntimeFPCall target =
1946 reinterpret_cast<SimulatorRuntimeFPCall
>(external);
1947 dresult = target(dval0);
1948 SetFpResult(dresult);
1951 case ExternalReference::BUILTIN_FP_INT_CALL: {
1952 SimulatorRuntimeFPIntCall target =
1953 reinterpret_cast<SimulatorRuntimeFPIntCall
>(external);
1954 dresult = target(dval0, ival);
1955 SetFpResult(dresult);
1962 if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
1963 switch (redirection->type()) {
1964 case ExternalReference::BUILTIN_COMPARE_CALL:
1965 PrintF(
"Returned %08x\n", iresult);
1967 case ExternalReference::BUILTIN_FP_FP_CALL:
1968 case ExternalReference::BUILTIN_FP_CALL:
1969 case ExternalReference::BUILTIN_FP_INT_CALL:
1970 PrintF(
"Returned %f\n", dresult);
1977 }
else if (redirection->type() == ExternalReference::DIRECT_API_CALL) {
1980 if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
1981 PrintF(
"Call to host function at %p args %08" V8PRIxPTR,
1982 reinterpret_cast<void*>(external), arg[0]);
1983 if (!stack_aligned) {
1984 PrintF(
" with unaligned stack %08" V8PRIxPTR
"\n",
1985 static_cast<intptr_t>(get_register(sp)));
1989 CHECK(stack_aligned);
1990 SimulatorRuntimeDirectApiCall target =
1991 reinterpret_cast<SimulatorRuntimeDirectApiCall
>(external);
1993 }
else if (redirection->type() == ExternalReference::PROFILING_API_CALL) {
1996 if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
1997 PrintF(
"Call to host function at %p args %08" V8PRIxPTR
1999 reinterpret_cast<void*>(external), arg[0], arg[1]);
2000 if (!stack_aligned) {
2001 PrintF(
" with unaligned stack %08" V8PRIxPTR
"\n",
2002 static_cast<intptr_t>(get_register(sp)));
2006 CHECK(stack_aligned);
2007 SimulatorRuntimeProfilingApiCall target =
2008 reinterpret_cast<SimulatorRuntimeProfilingApiCall
>(external);
2009 target(arg[0], Redirection::ReverseRedirection(arg[1]));
2010 }
else if (redirection->type() == ExternalReference::DIRECT_GETTER_CALL) {
2013 if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
2014 PrintF(
"Call to host function at %p args %08" V8PRIxPTR
2016 reinterpret_cast<void*>(external), arg[0], arg[1]);
2017 if (!stack_aligned) {
2018 PrintF(
" with unaligned stack %08" V8PRIxPTR
"\n",
2019 static_cast<intptr_t>(get_register(sp)));
2023 CHECK(stack_aligned);
2024 SimulatorRuntimeDirectGetterCall target =
2025 reinterpret_cast<SimulatorRuntimeDirectGetterCall
>(external);
2026 if (!ABI_PASSES_HANDLES_IN_REGS) {
2027 arg[0] = *(
reinterpret_cast<intptr_t*
>(arg[0]));
2029 target(arg[0], arg[1]);
2030 }
else if (redirection->type() ==
2031 ExternalReference::PROFILING_GETTER_CALL) {
2032 if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
2033 PrintF(
"Call to host function at %p args %08" V8PRIxPTR
2034 " %08" V8PRIxPTR
" %08" V8PRIxPTR,
2035 reinterpret_cast<void*>(external), arg[0], arg[1], arg[2]);
2036 if (!stack_aligned) {
2037 PrintF(
" with unaligned stack %08" V8PRIxPTR
"\n",
2038 static_cast<intptr_t>(get_register(sp)));
2042 CHECK(stack_aligned);
2043 SimulatorRuntimeProfilingGetterCall target =
2044 reinterpret_cast<SimulatorRuntimeProfilingGetterCall
>(external);
2045 if (!ABI_PASSES_HANDLES_IN_REGS) {
2046 arg[0] = *(
reinterpret_cast<intptr_t*
>(arg[0]));
2048 target(arg[0], arg[1], Redirection::ReverseRedirection(arg[2]));
2051 if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
2052 SimulatorRuntimeCall target =
2053 reinterpret_cast<SimulatorRuntimeCall
>(external);
2055 "Call to host function at %p,\n" 2056 "\t\t\t\targs %08" V8PRIxPTR
", %08" V8PRIxPTR
", %08" V8PRIxPTR
2057 ", %08" V8PRIxPTR
", %08" V8PRIxPTR
", %08" V8PRIxPTR
2058 ", %08" V8PRIxPTR
", %08" V8PRIxPTR
", %08" V8PRIxPTR,
2059 reinterpret_cast<void*>(FUNCTION_ADDR(target)), arg[0], arg[1],
2060 arg[2], arg[3], arg[4], arg[5], arg[6], arg[7], arg[8]);
2061 if (!stack_aligned) {
2062 PrintF(
" with unaligned stack %08" V8PRIxPTR
"\n",
2063 static_cast<intptr_t>(get_register(sp)));
2067 CHECK(stack_aligned);
2068 if (redirection->type() == ExternalReference::BUILTIN_CALL_PAIR) {
2069 SimulatorRuntimePairCall target =
2070 reinterpret_cast<SimulatorRuntimePairCall
>(external);
2072 target(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);
2075 decodeObjectPair(&result, &x, &y);
2076 if (::v8::internal::FLAG_trace_sim) {
2077 PrintF(
"Returned {%08" V8PRIxPTR
", %08" V8PRIxPTR
"}\n", x, y);
2079 if (ABI_RETURNS_OBJECTPAIR_IN_REGS) {
2080 set_register(r2, x);
2081 set_register(r3, y);
2083 memcpy(reinterpret_cast<void*>(result_buffer), &result,
2084 sizeof(ObjectPair));
2085 set_register(r2, result_buffer);
2088 DCHECK(redirection->type() == ExternalReference::BUILTIN_CALL);
2089 SimulatorRuntimeCall target =
2090 reinterpret_cast<SimulatorRuntimeCall
>(external);
2091 intptr_t result = target(arg[0], arg[1], arg[2], arg[3], arg[4],
2092 arg[5], arg[6], arg[7], arg[8]);
2093 if (::v8::internal::FLAG_trace_sim) {
2094 PrintF(
"Returned %08" V8PRIxPTR
"\n", result);
2096 set_register(r2, result);
2153 int64_t saved_lr = *
reinterpret_cast<intptr_t*
>(
2154 get_register(sp) + kStackFrameRASlot * kPointerSize);
2155 #if (!V8_TARGET_ARCH_S390X && V8_HOST_ARCH_S390) 2158 saved_lr &= 0x7FFFFFFF;
2164 S390Debugger dbg(
this);
2170 if (svc >= (1 << 23)) {
2171 uint32_t code = svc & kStopCodeMask;
2172 if (isWatchedStop(code)) {
2173 IncreaseStopCounter(code);
2177 if (isEnabledStop(code)) {
2178 S390Debugger dbg(
this);
2181 set_pc(get_pc() +
sizeof(FourByteInstr) + kPointerSize);
2193 bool Simulator::isStopInstruction(Instruction* instr) {
2194 return (instr->Bits(27, 24) == 0xF) && (instr->SvcValue() >= kStopCode);
2197 bool Simulator::isWatchedStop(
uint32_t code) {
2198 DCHECK_LE(code, kMaxStopCode);
2199 return code < kNumOfWatchedStops;
2202 bool Simulator::isEnabledStop(
uint32_t code) {
2203 DCHECK_LE(code, kMaxStopCode);
2205 return !isWatchedStop(code) ||
2206 !(watched_stops_[code].count & kStopDisabledBit);
2209 void Simulator::EnableStop(
uint32_t code) {
2210 DCHECK(isWatchedStop(code));
2211 if (!isEnabledStop(code)) {
2212 watched_stops_[code].count &= ~kStopDisabledBit;
2216 void Simulator::DisableStop(
uint32_t code) {
2217 DCHECK(isWatchedStop(code));
2218 if (isEnabledStop(code)) {
2219 watched_stops_[code].count |= kStopDisabledBit;
2223 void Simulator::IncreaseStopCounter(
uint32_t code) {
2224 DCHECK_LE(code, kMaxStopCode);
2225 DCHECK(isWatchedStop(code));
2226 if ((watched_stops_[code].count & ~(1 << 31)) == 0x7FFFFFFF) {
2228 "Stop counter for code %i has overflowed.\n" 2229 "Enabling this code and reseting the counter to 0.\n",
2231 watched_stops_[code].count = 0;
2234 watched_stops_[code].count++;
2239 void Simulator::PrintStopInfo(
uint32_t code) {
2240 DCHECK_LE(code, kMaxStopCode);
2241 if (!isWatchedStop(code)) {
2242 PrintF(
"Stop not watched.");
2244 const char* state = isEnabledStop(code) ?
"Enabled" :
"Disabled";
2245 int32_t count = watched_stops_[code].count & ~kStopDisabledBit;
2248 if (watched_stops_[code].desc) {
2249 PrintF(
"stop %i - 0x%x: \t%s, \tcounter = %i, \t%s\n", code, code,
2250 state, count, watched_stops_[code].desc);
2252 PrintF(
"stop %i - 0x%x: \t%s, \tcounter = %i\n", code, code, state,
2265 #define CheckOverflowForIntAdd(src1, src2, type) \ 2266 OverflowFromSigned<type>(src1 + src2, src1, src2, true); 2268 #define CheckOverflowForIntSub(src1, src2, type) \ 2269 OverflowFromSigned<type>(src1 - src2, src1, src2, false); 2272 #define CheckOverflowForUIntAdd(src1, src2) \ 2273 ((src1) + (src2) < (src1) || (src1) + (src2) < (src2)) 2276 #define CheckOverflowForUIntSub(src1, src2) ((src1) - (src2) > (src1)) 2279 #define CheckOverflowForMul(src1, src2) (((src1) * (src2)) / (src2) != (src1)) 2282 #define CheckOverflowForShiftRight(src1, src2) \ 2283 (((src1) >> (src2)) << (src2) != (src1)) 2286 #define CheckOverflowForShiftLeft(src1, src2) \ 2287 (((src1) << (src2)) >> (src2) != (src1)) 2289 int16_t Simulator::ByteReverse(int16_t hword) {
2290 #if defined(__GNUC__) 2291 return __builtin_bswap16(hword);
2293 return (hword << 8) | ((hword >> 8) & 0x00FF);
2297 int32_t Simulator::ByteReverse(int32_t word) {
2298 #if defined(__GNUC__) 2299 return __builtin_bswap32(word);
2301 int32_t result = word << 24;
2302 result |= (word << 8) & 0x00FF0000;
2303 result |= (word >> 8) & 0x0000FF00;
2304 result |= (word >> 24) & 0x00000FF;
2310 #if defined(__GNUC__) 2311 return __builtin_bswap64(dword);
2313 #error unsupport __builtin_bswap64 2317 int Simulator::DecodeInstruction(Instruction* instr) {
2318 Opcode op = instr->S390OpcodeValue();
2319 DCHECK_NOT_NULL(EvalTable[op]);
2320 return (this->*EvalTable[op])(instr);
2324 void Simulator::ExecuteInstruction(Instruction* instr,
bool auto_incr_pc) {
2327 if (v8::internal::FLAG_check_icache) {
2328 CheckICache(i_cache(), instr);
2331 pc_modified_ =
false;
2333 if (::v8::internal::FLAG_trace_sim) {
2338 dasm.InstructionDecode(buffer, reinterpret_cast<byte*>(instr));
2339 PrintF(
"%05" PRId64
" %08" V8PRIxPTR
" %s\n", icount_,
2340 reinterpret_cast<intptr_t>(instr), buffer.start());
2348 int length = DecodeInstruction(instr);
2350 if (!pc_modified_ && auto_incr_pc) {
2351 DCHECK(length == instr->InstructionLength());
2352 set_pc(reinterpret_cast<intptr_t>(instr) + length);
2357 void Simulator::DebugStart() {
2358 S390Debugger dbg(
this);
2362 void Simulator::Execute() {
2365 intptr_t program_counter = get_pc();
2367 if (::v8::internal::FLAG_stop_sim_at == 0) {
2370 while (program_counter != end_sim_pc) {
2371 Instruction* instr =
reinterpret_cast<Instruction*
>(program_counter);
2372 ExecuteInstruction(instr);
2373 program_counter = get_pc();
2378 while (program_counter != end_sim_pc) {
2379 Instruction* instr =
reinterpret_cast<Instruction*
>(program_counter);
2380 if (icount_ == ::v8::internal::FLAG_stop_sim_at) {
2381 S390Debugger dbg(
this);
2384 ExecuteInstruction(instr);
2386 program_counter = get_pc();
2391 void Simulator::CallInternal(Address entry,
int reg_arg_count) {
2393 isolate_->stack_guard()->AdjustStackLimitForSimulator();
2396 if (ABI_USES_FUNCTION_DESCRIPTORS) {
2398 set_pc(*(reinterpret_cast<intptr_t*>(entry)));
2401 set_pc(static_cast<intptr_t>(entry));
2404 int64_t r6_val = get_register(r6);
2405 int64_t r7_val = get_register(r7);
2406 int64_t r8_val = get_register(r8);
2407 int64_t r9_val = get_register(r9);
2408 int64_t r10_val = get_register(r10);
2409 int64_t r11_val = get_register(r11);
2410 int64_t r12_val = get_register(r12);
2411 int64_t r13_val = get_register(r13);
2413 if (ABI_CALL_VIA_IP) {
2415 set_register(ip, get_pc());
2421 registers_[14] = end_sim_pc;
2426 if (reg_arg_count < 5) {
2427 set_register(r6, callee_saved_value + 6);
2429 set_register(r7, callee_saved_value + 7);
2430 set_register(r8, callee_saved_value + 8);
2431 set_register(r9, callee_saved_value + 9);
2432 set_register(r10, callee_saved_value + 10);
2433 set_register(r11, callee_saved_value + 11);
2434 set_register(r12, callee_saved_value + 12);
2435 set_register(r13, callee_saved_value + 13);
2441 #ifndef V8_TARGET_ARCH_S390X 2442 if (reg_arg_count < 5) {
2443 DCHECK_EQ(callee_saved_value + 6, get_low_register<uint32_t>(r6));
2445 DCHECK_EQ(callee_saved_value + 7, get_low_register<uint32_t>(r7));
2446 DCHECK_EQ(callee_saved_value + 8, get_low_register<uint32_t>(r8));
2447 DCHECK_EQ(callee_saved_value + 9, get_low_register<uint32_t>(r9));
2448 DCHECK_EQ(callee_saved_value + 10, get_low_register<uint32_t>(r10));
2449 DCHECK_EQ(callee_saved_value + 11, get_low_register<uint32_t>(r11));
2450 DCHECK_EQ(callee_saved_value + 12, get_low_register<uint32_t>(r12));
2451 DCHECK_EQ(callee_saved_value + 13, get_low_register<uint32_t>(r13));
2453 if (reg_arg_count < 5) {
2454 DCHECK_EQ(callee_saved_value + 6, get_register(r6));
2456 DCHECK_EQ(callee_saved_value + 7, get_register(r7));
2457 DCHECK_EQ(callee_saved_value + 8, get_register(r8));
2458 DCHECK_EQ(callee_saved_value + 9, get_register(r9));
2459 DCHECK_EQ(callee_saved_value + 10, get_register(r10));
2460 DCHECK_EQ(callee_saved_value + 11, get_register(r11));
2461 DCHECK_EQ(callee_saved_value + 12, get_register(r12));
2462 DCHECK_EQ(callee_saved_value + 13, get_register(r13));
2466 set_register(r6, r6_val);
2467 set_register(r7, r7_val);
2468 set_register(r8, r8_val);
2469 set_register(r9, r9_val);
2470 set_register(r10, r10_val);
2471 set_register(r11, r11_val);
2472 set_register(r12, r12_val);
2473 set_register(r13, r13_val);
2476 intptr_t Simulator::CallImpl(Address entry,
int argument_count,
2477 const intptr_t* arguments) {
2479 isolate_->stack_guard()->AdjustStackLimitForSimulator();
2482 int64_t r6_val = get_register(r6);
2483 int64_t r7_val = get_register(r7);
2484 int64_t r8_val = get_register(r8);
2485 int64_t r9_val = get_register(r9);
2486 int64_t r10_val = get_register(r10);
2487 int64_t r11_val = get_register(r11);
2488 int64_t r12_val = get_register(r12);
2489 int64_t r13_val = get_register(r13);
2494 int reg_arg_count = std::min(5, argument_count);
2495 int stack_arg_count = argument_count - reg_arg_count;
2496 for (
int i = 0;
i < reg_arg_count;
i++) {
2497 set_register(
i + 2, arguments[
i]);
2501 int64_t original_stack = get_register(sp);
2505 (kCalleeRegisterSaveAreaSize + stack_arg_count *
sizeof(intptr_t)));
2506 if (base::OS::ActivationFrameAlignment() != 0) {
2507 entry_stack &= -base::OS::ActivationFrameAlignment();
2511 intptr_t* stack_argument =
2512 reinterpret_cast<intptr_t*
>(entry_stack + kCalleeRegisterSaveAreaSize);
2513 memcpy(stack_argument, arguments + reg_arg_count,
2514 stack_arg_count *
sizeof(*arguments));
2515 set_register(sp, entry_stack);
2518 #if ABI_USES_FUNCTION_DESCRIPTORS 2520 set_pc(*(reinterpret_cast<intptr_t*>(entry)));
2523 set_pc(static_cast<intptr_t>(entry));
2527 set_register(r12, get_pc());
2532 registers_[14] = end_sim_pc;
2537 if (reg_arg_count < 5) {
2538 set_register(r6, callee_saved_value + 6);
2540 set_register(r7, callee_saved_value + 7);
2541 set_register(r8, callee_saved_value + 8);
2542 set_register(r9, callee_saved_value + 9);
2543 set_register(r10, callee_saved_value + 10);
2544 set_register(r11, callee_saved_value + 11);
2545 set_register(r12, callee_saved_value + 12);
2546 set_register(r13, callee_saved_value + 13);
2552 #ifndef V8_TARGET_ARCH_S390X 2553 if (reg_arg_count < 5) {
2554 DCHECK_EQ(callee_saved_value + 6, get_low_register<uint32_t>(r6));
2556 DCHECK_EQ(callee_saved_value + 7, get_low_register<uint32_t>(r7));
2557 DCHECK_EQ(callee_saved_value + 8, get_low_register<uint32_t>(r8));
2558 DCHECK_EQ(callee_saved_value + 9, get_low_register<uint32_t>(r9));
2559 DCHECK_EQ(callee_saved_value + 10, get_low_register<uint32_t>(r10));
2560 DCHECK_EQ(callee_saved_value + 11, get_low_register<uint32_t>(r11));
2561 DCHECK_EQ(callee_saved_value + 12, get_low_register<uint32_t>(r12));
2562 DCHECK_EQ(callee_saved_value + 13, get_low_register<uint32_t>(r13));
2564 if (reg_arg_count < 5) {
2565 DCHECK_EQ(callee_saved_value + 6, get_register(r6));
2567 DCHECK_EQ(callee_saved_value + 7, get_register(r7));
2568 DCHECK_EQ(callee_saved_value + 8, get_register(r8));
2569 DCHECK_EQ(callee_saved_value + 9, get_register(r9));
2570 DCHECK_EQ(callee_saved_value + 10, get_register(r10));
2571 DCHECK_EQ(callee_saved_value + 11, get_register(r11));
2572 DCHECK_EQ(callee_saved_value + 12, get_register(r12));
2573 DCHECK_EQ(callee_saved_value + 13, get_register(r13));
2577 set_register(r6, r6_val);
2578 set_register(r7, r7_val);
2579 set_register(r8, r8_val);
2580 set_register(r9, r9_val);
2581 set_register(r10, r10_val);
2582 set_register(r11, r11_val);
2583 set_register(r12, r12_val);
2584 set_register(r13, r13_val);
2587 #ifndef V8_TARGET_ARCH_S390X 2588 DCHECK_EQ(entry_stack, get_low_register<uint32_t>(sp));
2590 DCHECK_EQ(entry_stack, get_register(sp));
2592 set_register(sp, original_stack);
2595 return get_register(r2);
2598 void Simulator::CallFP(Address entry,
double d0,
double d1) {
2599 set_d_register_from_double(0, d0);
2600 set_d_register_from_double(1, d1);
2601 CallInternal(entry);
2604 int32_t Simulator::CallFPReturnsInt(Address entry,
double d0,
double d1) {
2605 CallFP(entry, d0, d1);
2606 int32_t result = get_register(r2);
2610 double Simulator::CallFPReturnsDouble(Address entry,
double d0,
double d1) {
2611 CallFP(entry, d0, d1);
2612 return get_double_from_d_register(0);
2618 *stack_slot = address;
2619 set_register(sp, new_sp);
2624 uintptr_t current_sp = get_register(sp);
2627 set_register(sp, current_sp +
sizeof(
uintptr_t));
2631 #define EVALUATE(name) \ 2632 int Simulator::Evaluate_##name(Instruction* instr) 2634 #define DCHECK_OPCODE(op) DCHECK(instr->S390OpcodeValue() == op) 2636 #define AS(type) reinterpret_cast<type*>(instr) 2638 #define DECODE_RIL_A_INSTRUCTION(r1, i2) \ 2639 int r1 = AS(RILInstruction)->R1Value(); \ 2640 uint32_t i2 = AS(RILInstruction)->I2UnsignedValue(); \ 2643 #define DECODE_RIL_B_INSTRUCTION(r1, i2) \ 2644 int r1 = AS(RILInstruction)->R1Value(); \ 2645 int32_t i2 = AS(RILInstruction)->I2Value(); \ 2648 #define DECODE_RIL_C_INSTRUCTION(m1, ri2) \ 2649 Condition m1 = static_cast<Condition>(AS(RILInstruction)->R1Value()); \ 2650 uint64_t ri2 = AS(RILInstruction)->I2Value(); \ 2653 #define DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2) \ 2654 int r1 = AS(RXYInstruction)->R1Value(); \ 2655 int x2 = AS(RXYInstruction)->X2Value(); \ 2656 int b2 = AS(RXYInstruction)->B2Value(); \ 2657 int d2 = AS(RXYInstruction)->D2Value(); \ 2660 #define DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val) \ 2661 int x2 = AS(RXInstruction)->X2Value(); \ 2662 int b2 = AS(RXInstruction)->B2Value(); \ 2663 int r1 = AS(RXInstruction)->R1Value(); \ 2664 intptr_t d2_val = AS(RXInstruction)->D2Value(); \ 2667 #define DECODE_RS_A_INSTRUCTION(r1, r3, b2, d2) \ 2668 int r3 = AS(RSInstruction)->R3Value(); \ 2669 int b2 = AS(RSInstruction)->B2Value(); \ 2670 int r1 = AS(RSInstruction)->R1Value(); \ 2671 intptr_t d2 = AS(RSInstruction)->D2Value(); \ 2674 #define DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2) \ 2675 int b2 = AS(RSInstruction)->B2Value(); \ 2676 int r1 = AS(RSInstruction)->R1Value(); \ 2677 int d2 = AS(RSInstruction)->D2Value(); \ 2680 #define DECODE_RSI_INSTRUCTION(r1, r3, i2) \ 2681 int r1 = AS(RSIInstruction)->R1Value(); \ 2682 int r3 = AS(RSIInstruction)->R3Value(); \ 2683 int32_t i2 = AS(RSIInstruction)->I2Value(); \ 2686 #define DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val) \ 2687 int b1 = AS(SIInstruction)->B1Value(); \ 2688 intptr_t d1_val = AS(SIInstruction)->D1Value(); \ 2689 uint8_t imm_val = AS(SIInstruction)->I2Value(); \ 2692 #define DECODE_SIL_INSTRUCTION(b1, d1, i2) \ 2693 int b1 = AS(SILInstruction)->B1Value(); \ 2694 intptr_t d1 = AS(SILInstruction)->D1Value(); \ 2695 int16_t i2 = AS(SILInstruction)->I2Value(); \ 2698 #define DECODE_SIY_INSTRUCTION(b1, d1, i2) \ 2699 int b1 = AS(SIYInstruction)->B1Value(); \ 2700 intptr_t d1 = AS(SIYInstruction)->D1Value(); \ 2701 uint8_t i2 = AS(SIYInstruction)->I2Value(); \ 2704 #define DECODE_RRE_INSTRUCTION(r1, r2) \ 2705 int r1 = AS(RREInstruction)->R1Value(); \ 2706 int r2 = AS(RREInstruction)->R2Value(); \ 2709 #define DECODE_RRE_INSTRUCTION_M3(r1, r2, m3) \ 2710 int r1 = AS(RREInstruction)->R1Value(); \ 2711 int r2 = AS(RREInstruction)->R2Value(); \ 2712 int m3 = AS(RREInstruction)->M3Value(); \ 2715 #define DECODE_RRE_INSTRUCTION_NO_R2(r1) \ 2716 int r1 = AS(RREInstruction)->R1Value(); \ 2719 #define DECODE_RRD_INSTRUCTION(r1, r2, r3) \ 2720 int r1 = AS(RRDInstruction)->R1Value(); \ 2721 int r2 = AS(RRDInstruction)->R2Value(); \ 2722 int r3 = AS(RRDInstruction)->R3Value(); \ 2725 #define DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4) \ 2726 int r1 = AS(RRFInstruction)->R1Value(); \ 2727 int r2 = AS(RRFInstruction)->R2Value(); \ 2728 int m3 = AS(RRFInstruction)->M3Value(); \ 2729 int m4 = AS(RRFInstruction)->M4Value(); \ 2732 #define DECODE_RRF_A_INSTRUCTION(r1, r2, r3) \ 2733 int r1 = AS(RRFInstruction)->R1Value(); \ 2734 int r2 = AS(RRFInstruction)->R2Value(); \ 2735 int r3 = AS(RRFInstruction)->R3Value(); \ 2738 #define DECODE_RRF_C_INSTRUCTION(r1, r2, m3) \ 2739 int r1 = AS(RRFInstruction)->R1Value(); \ 2740 int r2 = AS(RRFInstruction)->R2Value(); \ 2741 Condition m3 = static_cast<Condition>(AS(RRFInstruction)->M3Value()); \ 2744 #define DECODE_RR_INSTRUCTION(r1, r2) \ 2745 int r1 = AS(RRInstruction)->R1Value(); \ 2746 int r2 = AS(RRInstruction)->R2Value(); \ 2749 #define DECODE_RIE_D_INSTRUCTION(r1, r2, i2) \ 2750 int r1 = AS(RIEInstruction)->R1Value(); \ 2751 int r2 = AS(RIEInstruction)->R2Value(); \ 2752 int32_t i2 = AS(RIEInstruction)->I6Value(); \ 2755 #define DECODE_RIE_E_INSTRUCTION(r1, r2, i2) \ 2756 int r1 = AS(RIEInstruction)->R1Value(); \ 2757 int r2 = AS(RIEInstruction)->R2Value(); \ 2758 int32_t i2 = AS(RIEInstruction)->I6Value(); \ 2761 #define DECODE_RIE_F_INSTRUCTION(r1, r2, i3, i4, i5) \ 2762 int r1 = AS(RIEInstruction)->R1Value(); \ 2763 int r2 = AS(RIEInstruction)->R2Value(); \ 2764 uint32_t i3 = AS(RIEInstruction)->I3Value(); \ 2765 uint32_t i4 = AS(RIEInstruction)->I4Value(); \ 2766 uint32_t i5 = AS(RIEInstruction)->I5Value(); \ 2769 #define DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2) \ 2770 int r1 = AS(RSYInstruction)->R1Value(); \ 2771 int r3 = AS(RSYInstruction)->R3Value(); \ 2772 int b2 = AS(RSYInstruction)->B2Value(); \ 2773 intptr_t d2 = AS(RSYInstruction)->D2Value(); \ 2776 #define DECODE_RI_A_INSTRUCTION(instr, r1, i2) \ 2777 int32_t r1 = AS(RIInstruction)->R1Value(); \ 2778 int16_t i2 = AS(RIInstruction)->I2Value(); \ 2781 #define DECODE_RI_B_INSTRUCTION(instr, r1, i2) \ 2782 int32_t r1 = AS(RILInstruction)->R1Value(); \ 2783 int16_t i2 = AS(RILInstruction)->I2Value(); \ 2786 #define DECODE_RI_C_INSTRUCTION(instr, m1, i2) \ 2787 Condition m1 = static_cast<Condition>(AS(RIInstruction)->R1Value()); \ 2788 int16_t i2 = AS(RIInstruction)->I2Value(); \ 2791 #define DECODE_RXE_INSTRUCTION(r1, b2, x2, d2) \ 2792 int r1 = AS(RXEInstruction)->R1Value(); \ 2793 int b2 = AS(RXEInstruction)->B2Value(); \ 2794 int x2 = AS(RXEInstruction)->X2Value(); \ 2795 int d2 = AS(RXEInstruction)->D2Value(); \ 2798 #define DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4) \ 2799 int r1 = AS(VRR_C_Instruction)->R1Value(); \ 2800 int r2 = AS(VRR_C_Instruction)->R2Value(); \ 2801 int r3 = AS(VRR_C_Instruction)->R3Value(); \ 2802 int m6 = AS(VRR_C_Instruction)->M6Value(); \ 2803 int m5 = AS(VRR_C_Instruction)->M5Value(); \ 2804 int m4 = AS(VRR_C_Instruction)->M4Value(); \ 2807 #define GET_ADDRESS(index_reg, base_reg, offset) \ 2808 (((index_reg) == 0) ? 0 : get_register(index_reg)) + \ 2809 (((base_reg) == 0) ? 0 : get_register(base_reg)) + offset 2811 int Simulator::Evaluate_Unknown(Instruction* instr) {
2817 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
2823 double r2_val = get_double_from_d_register(r2);
2824 double r3_val = get_double_from_d_register(r3);
2825 double r1_val = r2_val + r3_val;
2826 set_d_register_from_double(r1, r1_val);
2832 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
2838 double r2_val = get_double_from_d_register(r2);
2839 double r3_val = get_double_from_d_register(r3);
2840 double r1_val = r2_val - r3_val;
2841 set_d_register_from_double(r1, r1_val);
2847 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
2853 double r2_val = get_double_from_d_register(r2);
2854 double r3_val = get_double_from_d_register(r3);
2855 double r1_val = r2_val * r3_val;
2856 set_d_register_from_double(r1, r1_val);
2862 DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
2868 double r2_val = get_double_from_d_register(r2);
2869 double r3_val = get_double_from_d_register(r3);
2870 double r1_val = r2_val / r3_val;
2871 set_d_register_from_double(r1, r1_val);
2876 DCHECK_OPCODE(DUMY);
2877 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
2888 DECODE_RR_INSTRUCTION(r1, r2);
2889 uint32_t r1_val = get_low_register<uint32_t>(r1);
2890 uint32_t r2_val = get_low_register<uint32_t>(r2);
2891 SetS390ConditionCode<uint32_t>(r1_val, r2_val);
2897 DECODE_RR_INSTRUCTION(r1, r2);
2898 set_low_register(r1, get_low_register<int32_t>(r2));
2904 DECODE_RR_INSTRUCTION(r1, r2);
2905 int32_t r1_val = get_low_register<int32_t>(r1);
2906 int32_t r2_val = get_low_register<int32_t>(r2);
2907 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val, int32_t);
2909 SetS390ConditionCode<int32_t>(r1_val, 0);
2910 SetS390OverflowCode(isOF);
2911 set_low_register(r1, r1_val);
2917 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
2918 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
2919 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
2920 intptr_t addr = b2_val + x2_val + d2_val;
2921 int32_t mem_val = ReadW(addr, instr);
2922 set_low_register(r1, mem_val);
2928 DECODE_RI_C_INSTRUCTION(instr, m1, i2);
2930 if (TestConditionCode(m1)) {
2931 intptr_t offset = 2 * i2;
2932 set_pc(get_pc() + offset);
2939 DECODE_RI_A_INSTRUCTION(instr, r1, i2);
2940 int32_t r1_val = get_low_register<int32_t>(r1);
2941 bool isOF = CheckOverflowForIntAdd(r1_val, i2, int32_t);
2943 set_low_register(r1, r1_val);
2944 SetS390ConditionCode<int32_t>(r1_val, 0);
2945 SetS390OverflowCode(isOF);
2950 DCHECK_OPCODE(AGHI);
2951 DECODE_RI_A_INSTRUCTION(instr, r1, i2);
2952 int64_t r1_val = get_register(r1);
2954 isOF = CheckOverflowForIntAdd(r1_val, i2,
int64_t);
2956 set_register(r1, r1_val);
2957 SetS390ConditionCode<int64_t>(r1_val, 0);
2958 SetS390OverflowCode(isOF);
2963 DCHECK_OPCODE(BRCL);
2964 DECODE_RIL_C_INSTRUCTION(m1, ri2);
2966 if (TestConditionCode(m1)) {
2967 intptr_t offset = 2 * ri2;
2968 set_pc(get_pc() + offset);
2974 DCHECK_OPCODE(IIHF);
2975 DECODE_RIL_A_INSTRUCTION(r1, imm);
2976 set_high_register(r1, imm);
2981 DCHECK_OPCODE(IILF);
2982 DECODE_RIL_A_INSTRUCTION(r1, imm);
2983 set_low_register(r1, imm);
2989 DECODE_RRE_INSTRUCTION(r1, r2);
2990 set_register(r1, get_register(r2));
2996 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
2997 intptr_t addr = GET_ADDRESS(x2, b2, d2);
2998 int64_t mem_val = ReadDW(addr);
2999 set_register(r1, mem_val);
3005 DECODE_RRE_INSTRUCTION(r1, r2);
3006 int64_t r1_val = get_register(r1);
3007 int64_t r2_val = get_register(r2);
3008 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val,
int64_t);
3010 set_register(r1, r1_val);
3011 SetS390ConditionCode<int64_t>(r1_val, 0);
3012 SetS390OverflowCode(isOF);
3017 DCHECK_OPCODE(LGFR);
3018 DECODE_RRE_INSTRUCTION(r1, r2);
3019 int32_t r2_val = get_low_register<int32_t>(r2);
3021 set_register(r1, result);
3028 DECODE_RRE_INSTRUCTION(r1, r2);
3029 int32_t r2_val = get_low_register<int32_t>(r2);
3032 set_low_register(r1, r2_val);
3037 DCHECK_OPCODE(LGBR);
3038 DECODE_RRE_INSTRUCTION(r1, r2);
3039 int64_t r2_val = get_low_register<int64_t>(r2);
3042 set_register(r1, r2_val);
3048 DECODE_RRE_INSTRUCTION(r1, r2);
3049 int32_t r2_val = get_low_register<int32_t>(r2);
3052 set_low_register(r1, r2_val);
3057 DCHECK_OPCODE(LGHR);
3058 DECODE_RRE_INSTRUCTION(r1, r2);
3059 int64_t r2_val = get_low_register<int64_t>(r2);
3062 set_register(r1, r2_val);
3068 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
3069 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3071 set_register(r1, mem_val);
3077 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3078 int32_t r1_val = get_low_register<int32_t>(r1);
3079 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3080 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3081 intptr_t addr = b2_val + x2_val + d2_val;
3082 WriteW(addr, r1_val, instr);
3088 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
3089 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3090 uint64_t value = get_register(r1);
3091 WriteDW(addr, value);
3097 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
3098 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3099 uint32_t value = get_low_register<uint32_t>(r1);
3100 WriteW(addr, value, instr);
3106 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
3107 intptr_t addr = GET_ADDRESS(x2, b2, d2);
3108 uint32_t mem_val = ReadWU(addr, instr);
3109 set_low_register(r1, mem_val);
3114 DCHECK_OPCODE(LLGC);
3115 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
3116 uint8_t mem_val = ReadBU(GET_ADDRESS(x2, b2, d2));
3117 set_register(r1, static_cast<uint64_t>(mem_val));
3123 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
3124 uint8_t mem_val = ReadBU(GET_ADDRESS(x2, b2, d2));
3125 set_low_register(r1, static_cast<uint32_t>(mem_val));
3131 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
3133 int shiftBits = GET_ADDRESS(0, b2, d2) & 0x3F;
3135 uint32_t r3_val = get_low_register<uint32_t>(r3);
3137 uint32_t rotateBits = r3_val >> (32 - shiftBits);
3138 alu_out = (r3_val << shiftBits) | (rotateBits);
3139 set_low_register(r1, alu_out);
3144 DCHECK_OPCODE(RISBG);
3145 DECODE_RIE_F_INSTRUCTION(r1, r2, i3, i4, i5);
3153 bool zero_remaining = (0 != (i4 & 0x80));
3155 uint64_t src_val = get_register(r2);
3158 uint64_t rotated_val =
3159 (src_val << shift_amount) | (src_val >> (64 - shift_amount));
3160 int32_t width = end_bit - start_bit + 1;
3162 uint64_t selection_mask = 0;
3164 selection_mask = (
static_cast<uint64_t
>(1) << width) - 1;
3166 selection_mask =
static_cast<uint64_t
>(
static_cast<int64_t>(-1));
3168 selection_mask = selection_mask << (63 - end_bit);
3170 uint64_t selected_val = rotated_val & selection_mask;
3172 if (!zero_remaining) {
3174 selected_val = (get_register(r1) & ~selection_mask) | selected_val;
3178 SetS390ConditionCode<int64_t>(selected_val, 0);
3179 set_register(r1, selected_val);
3184 DCHECK_OPCODE(AHIK);
3185 DECODE_RIE_D_INSTRUCTION(r1, r2, i2);
3186 int32_t r2_val = get_low_register<int32_t>(r2);
3187 int32_t imm =
static_cast<int32_t
>(i2);
3188 bool isOF = CheckOverflowForIntAdd(r2_val, imm, int32_t);
3189 set_low_register(r1, r2_val + imm);
3190 SetS390ConditionCode<int32_t>(r2_val + imm, 0);
3191 SetS390OverflowCode(isOF);
3197 DCHECK_OPCODE(AGHIK);
3198 DECODE_RIE_D_INSTRUCTION(r1, r2, i2);
3199 int64_t r2_val = get_register(r2);
3201 bool isOF = CheckOverflowForIntAdd(r2_val, imm,
int64_t);
3202 set_register(r1, r2_val + imm);
3203 SetS390ConditionCode<int64_t>(r2_val + imm, 0);
3204 SetS390OverflowCode(isOF);
3209 DCHECK_OPCODE(BKPT);
3210 set_pc(get_pc() + 2);
3211 S390Debugger dbg(
this);
3237 DECODE_RR_INSTRUCTION(r1, r2);
3238 if (TestConditionCode(Condition(r1))) {
3239 intptr_t r2_val = get_register(r2);
3240 #if (!V8_TARGET_ARCH_S390X && V8_HOST_ARCH_S390) 3244 if (r2_val != bad_lr && r2_val != end_sim_pc) r2_val &= 0x7FFFFFFF;
3271 DCHECK_OPCODE(BASR);
3272 DECODE_RR_INSTRUCTION(r1, r2);
3273 intptr_t link_addr = get_pc() + 2;
3275 int64_t r2_val = (r2 == 0) ? link_addr : get_register(r2);
3276 #if (!V8_TARGET_ARCH_S390X && V8_HOST_ARCH_S390) 3282 link_addr |= 0x80000000;
3284 set_register(r1, link_addr);
3304 DECODE_RR_INSTRUCTION(r1, r2);
3305 int32_t r2_val = get_low_register<int32_t>(r2);
3307 r2_val = (r2_val < 0) ? -r2_val : r2_val;
3308 set_low_register(r1, r2_val);
3309 SetS390ConditionCode<int32_t>(r2_val, 0);
3310 if (r2_val == (static_cast<int32_t>(1) << 31)) {
3311 SetS390OverflowCode(
true);
3319 DECODE_RR_INSTRUCTION(r1, r2);
3320 int32_t r2_val = get_low_register<int32_t>(r2);
3321 r2_val = (r2_val >= 0) ? -r2_val : r2_val;
3322 set_low_register(r1, r2_val);
3323 condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT;
3330 DECODE_RR_INSTRUCTION(r1, r2);
3331 int32_t r2_val = get_low_register<int32_t>(r2);
3332 SetS390ConditionCode<int32_t>(r2_val, 0);
3333 set_low_register(r1, r2_val);
3339 DECODE_RR_INSTRUCTION(r1, r2);
3340 int32_t r2_val = get_low_register<int32_t>(r2);
3343 isOF = __builtin_ssub_overflow(0, r2_val, &result);
3344 set_low_register(r1, result);
3345 SetS390ConditionCode<int32_t>(r2_val, 0);
3351 SetS390OverflowCode(
true);
3358 DECODE_RR_INSTRUCTION(r1, r2);
3359 int32_t r1_val = get_low_register<int32_t>(r1);
3360 int32_t r2_val = get_low_register<int32_t>(r2);
3362 SetS390BitWiseConditionCode<uint32_t>(r1_val);
3363 set_low_register(r1, r1_val);
3369 DECODE_RR_INSTRUCTION(r1, r2);
3370 int32_t r1_val = get_low_register<int32_t>(r1);
3371 int32_t r2_val = get_low_register<int32_t>(r2);
3373 SetS390BitWiseConditionCode<uint32_t>(r1_val);
3374 set_low_register(r1, r1_val);
3380 DECODE_RR_INSTRUCTION(r1, r2);
3381 int32_t r1_val = get_low_register<int32_t>(r1);
3382 int32_t r2_val = get_low_register<int32_t>(r2);
3384 SetS390BitWiseConditionCode<uint32_t>(r1_val);
3385 set_low_register(r1, r1_val);
3391 DECODE_RR_INSTRUCTION(r1, r2);
3392 int32_t r1_val = get_low_register<int32_t>(r1);
3393 int32_t r2_val = get_low_register<int32_t>(r2);
3394 SetS390ConditionCode<int32_t>(r1_val, r2_val);
3400 DECODE_RR_INSTRUCTION(r1, r2);
3401 int32_t r1_val = get_low_register<int32_t>(r1);
3402 int32_t r2_val = get_low_register<int32_t>(r2);
3404 isOF = CheckOverflowForIntSub(r1_val, r2_val, int32_t);
3406 SetS390ConditionCode<int32_t>(r1_val, 0);
3407 SetS390OverflowCode(isOF);
3408 set_low_register(r1, r1_val);
3414 DECODE_RR_INSTRUCTION(r1, r2);
3415 int32_t r1_val = get_low_register<int32_t>(r1);
3416 int32_t r2_val = get_low_register<int32_t>(r2);
3417 DCHECK_EQ(r1 % 2, 0);
3418 r1_val = get_low_register<int32_t>(r1 + 1);
3419 int64_t product =
static_cast<int64_t>(r1_val) * static_cast<int64_t>(r2_val);
3420 int32_t high_bits = product >> 32;
3422 int32_t low_bits = product & 0x00000000FFFFFFFF;
3423 set_low_register(r1, high_bits);
3424 set_low_register(r1 + 1, low_bits);
3430 DECODE_RR_INSTRUCTION(r1, r2);
3431 int32_t r1_val = get_low_register<int32_t>(r1);
3432 int32_t r2_val = get_low_register<int32_t>(r2);
3434 DCHECK_EQ(r1 % 2, 0);
3441 dividend += get_low_register<uint32_t>(r1 + 1);
3442 int32_t remainder = dividend % r2_val;
3443 int32_t quotient = dividend / r2_val;
3445 set_low_register(r1, remainder);
3446 set_low_register(r1 + 1, quotient);
3447 set_low_register(r1, r1_val);
3453 DECODE_RR_INSTRUCTION(r1, r2);
3454 uint32_t r1_val = get_low_register<uint32_t>(r1);
3455 uint32_t r2_val = get_low_register<uint32_t>(r2);
3458 alu_out = r1_val + r2_val;
3459 isOF = CheckOverflowForUIntAdd(r1_val, r2_val);
3460 set_low_register(r1, alu_out);
3461 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
3467 DECODE_RR_INSTRUCTION(r1, r2);
3468 uint32_t r1_val = get_low_register<uint32_t>(r1);
3469 uint32_t r2_val = get_low_register<uint32_t>(r2);
3472 alu_out = r1_val - r2_val;
3473 isOF = CheckOverflowForUIntSub(r1_val, r2_val);
3474 set_low_register(r1, alu_out);
3475 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
3481 DECODE_RR_INSTRUCTION(r1, r2);
3482 int64_t r2_val = get_d_register(r2);
3483 set_d_register(r1, r2_val);
3501 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3502 int16_t r1_val = get_low_register<int32_t>(r1);
3503 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3504 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3505 intptr_t mem_addr = b2_val + x2_val + d2_val;
3506 WriteH(mem_addr, r1_val, instr);
3513 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3514 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3515 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3516 intptr_t addr = b2_val + x2_val + d2_val;
3517 set_register(r1, addr);
3524 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3525 uint8_t r1_val = get_low_register<int32_t>(r1);
3526 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3527 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3528 intptr_t mem_addr = b2_val + x2_val + d2_val;
3529 WriteB(mem_addr, r1_val);
3541 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3542 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3543 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3544 int32_t r1_val = get_low_register<int32_t>(r1);
3546 SixByteInstr the_instr = Instruction::InstructionBits(
3547 reinterpret_cast<const byte*>(b2_val + x2_val + d2_val));
3548 int inst_length = Instruction::InstructionLength(
3549 reinterpret_cast<const byte*>(b2_val + x2_val + d2_val));
3551 char new_instr_buf[8];
3552 char* addr =
reinterpret_cast<char*
>(&new_instr_buf[0]);
3553 the_instr |=
static_cast<SixByteInstr
>(r1_val & 0xFF)
3554 << (8 * inst_length - 16);
3555 Instruction::SetInstructionBits<SixByteInstr>(
3556 reinterpret_cast<byte*
>(addr), static_cast<SixByteInstr>(the_instr));
3557 ExecuteInstruction(reinterpret_cast<Instruction*>(addr),
false);
3582 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3584 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3585 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3586 intptr_t mem_addr = x2_val + b2_val + d2_val;
3588 int32_t result =
static_cast<int32_t
>(ReadH(mem_addr, instr));
3589 set_low_register(r1, result);
3601 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3602 int32_t r1_val = get_low_register<int32_t>(r1);
3603 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3604 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3605 intptr_t addr = b2_val + x2_val + d2_val;
3606 int32_t mem_val =
static_cast<int32_t
>(ReadH(addr, instr));
3607 int32_t alu_out = 0;
3609 isOF = CheckOverflowForIntAdd(r1_val, mem_val, int32_t);
3610 alu_out = r1_val + mem_val;
3611 set_low_register(r1, alu_out);
3612 SetS390ConditionCode<int32_t>(alu_out, 0);
3613 SetS390OverflowCode(isOF);
3620 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3621 int32_t r1_val = get_low_register<int32_t>(r1);
3622 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3623 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3624 intptr_t addr = b2_val + x2_val + d2_val;
3625 int32_t mem_val =
static_cast<int32_t
>(ReadH(addr, instr));
3626 int32_t alu_out = 0;
3628 isOF = CheckOverflowForIntSub(r1_val, mem_val, int32_t);
3629 alu_out = r1_val - mem_val;
3630 SetS390ConditionCode<int32_t>(alu_out, 0);
3631 SetS390OverflowCode(isOF);
3638 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3639 int32_t r1_val = get_low_register<int32_t>(r1);
3640 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3641 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3642 intptr_t addr = b2_val + x2_val + d2_val;
3643 int32_t mem_val =
static_cast<int32_t
>(ReadH(addr, instr));
3644 int32_t alu_out = 0;
3645 alu_out = r1_val * mem_val;
3646 set_low_register(r1, alu_out);
3677 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3678 int32_t r1_val = get_low_register<int32_t>(r1);
3679 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3680 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3681 int32_t mem_val = ReadW(b2_val + x2_val + d2_val, instr);
3682 int32_t alu_out = 0;
3683 alu_out = r1_val & mem_val;
3684 SetS390BitWiseConditionCode<uint32_t>(alu_out);
3685 set_low_register(r1, alu_out);
3691 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3692 int32_t r1_val = get_low_register<int32_t>(r1);
3693 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3694 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3695 intptr_t addr = b2_val + x2_val + d2_val;
3696 int32_t mem_val = ReadW(addr, instr);
3697 SetS390ConditionCode<uint32_t>(r1_val, mem_val);
3704 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3705 int32_t r1_val = get_low_register<int32_t>(r1);
3706 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3707 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3708 int32_t mem_val = ReadW(b2_val + x2_val + d2_val, instr);
3709 int32_t alu_out = 0;
3710 alu_out = r1_val | mem_val;
3711 SetS390BitWiseConditionCode<uint32_t>(alu_out);
3712 set_low_register(r1, alu_out);
3719 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3720 int32_t r1_val = get_low_register<int32_t>(r1);
3721 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3722 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3723 int32_t mem_val = ReadW(b2_val + x2_val + d2_val, instr);
3724 int32_t alu_out = 0;
3725 alu_out = r1_val ^ mem_val;
3726 SetS390BitWiseConditionCode<uint32_t>(alu_out);
3727 set_low_register(r1, alu_out);
3733 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3734 int32_t r1_val = get_low_register<int32_t>(r1);
3735 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3736 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3737 intptr_t addr = b2_val + x2_val + d2_val;
3738 int32_t mem_val = ReadW(addr, instr);
3739 SetS390ConditionCode<int32_t>(r1_val, mem_val);
3746 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3747 int32_t r1_val = get_low_register<int32_t>(r1);
3748 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3749 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3750 int32_t mem_val = ReadW(b2_val + x2_val + d2_val, instr);
3751 int32_t alu_out = 0;
3753 isOF = CheckOverflowForIntAdd(r1_val, mem_val, int32_t);
3754 alu_out = r1_val + mem_val;
3755 SetS390ConditionCode<int32_t>(alu_out, 0);
3756 SetS390OverflowCode(isOF);
3757 set_low_register(r1, alu_out);
3764 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3765 int32_t r1_val = get_low_register<int32_t>(r1);
3766 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3767 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3768 int32_t mem_val = ReadW(b2_val + x2_val + d2_val, instr);
3769 int32_t alu_out = 0;
3771 isOF = CheckOverflowForIntSub(r1_val, mem_val, int32_t);
3772 alu_out = r1_val - mem_val;
3773 SetS390ConditionCode<int32_t>(alu_out, 0);
3774 SetS390OverflowCode(isOF);
3775 set_low_register(r1, alu_out);
3781 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3782 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3783 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3784 intptr_t addr = b2_val + x2_val + d2_val;
3785 DCHECK_EQ(r1 % 2, 0);
3786 int32_t mem_val = ReadW(addr, instr);
3787 int32_t r1_val = get_low_register<int32_t>(r1 + 1);
3789 static_cast<int64_t>(r1_val) * static_cast<int64_t>(mem_val);
3790 int32_t high_bits = product >> 32;
3792 int32_t low_bits = product & 0x00000000FFFFFFFF;
3793 set_low_register(r1, high_bits);
3794 set_low_register(r1 + 1, low_bits);
3818 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3819 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3820 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3821 intptr_t addr = b2_val + x2_val + d2_val;
3822 int64_t frs_val = get_d_register(r1);
3823 WriteDW(addr, frs_val);
3829 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3830 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3831 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3832 intptr_t addr = b2_val + x2_val + d2_val;
3834 set_d_register(r1, dbl_val);
3846 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3847 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3848 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3849 intptr_t addr = b2_val + x2_val + d2_val;
3850 int64_t frs_val = get_d_register(r1) >> 32;
3851 WriteW(addr, static_cast<int32_t>(frs_val), instr);
3857 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3858 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3859 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3860 int32_t mem_val = ReadW(b2_val + x2_val + d2_val, instr);
3861 int32_t r1_val = get_low_register<int32_t>(r1);
3862 set_low_register(r1, r1_val * mem_val);
3868 DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3869 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3870 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
3871 intptr_t addr = b2_val + x2_val + d2_val;
3872 float float_val = *
reinterpret_cast<float*
>(addr);
3873 set_d_register_from_float32(r1, float_val);
3878 DCHECK_OPCODE(BRXH);
3879 DECODE_RSI_INSTRUCTION(r1, r3, i2);
3880 int32_t r1_val = (r1 == 0) ? 0 : get_low_register<int32_t>(r1);
3881 int32_t r3_val = (r3 == 0) ? 0 : get_low_register<int32_t>(r3);
3882 intptr_t branch_address = get_pc() + (2 * i2);
3884 int32_t compare_val = r3 % 2 == 0 ?
3885 get_low_register<int32_t>(r3 + 1) : r3_val;
3886 if (r1_val > compare_val) {
3887 set_pc(branch_address);
3889 set_low_register(r1, r1_val);
3901 DECODE_RS_A_INSTRUCTION(r1, r3, b2, d2);
3904 int32_t r1_val = (r1 == 0) ? 0 : get_register(r1);
3905 int32_t r3_val = (r3 == 0) ? 0 : get_register(r3);
3906 intptr_t b2_val = (b2 == 0) ? 0 : get_register(b2);
3907 intptr_t branch_address = b2_val + d2;
3915 int32_t compare_val = r3 % 2 == 0 ? get_register(r3 + 1) : r3_val;
3916 if (r1_val > compare_val) {
3918 set_pc(branch_address);
3922 set_register(r1, r1_val);
3935 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
3937 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
3938 int shiftBits = (b2_val + d2) & 0x3F;
3939 uint32_t r1_val = get_low_register<uint32_t>(r1);
3941 alu_out = r1_val >> shiftBits;
3942 set_low_register(r1, alu_out);
3948 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2)
3950 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
3951 int shiftBits = (b2_val + d2) & 0x3F;
3952 uint32_t r1_val = get_low_register<uint32_t>(r1);
3954 alu_out = r1_val << shiftBits;
3955 set_low_register(r1, alu_out);
3961 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
3963 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
3964 int shiftBits = (b2_val + d2) & 0x3F;
3965 int32_t r1_val = get_low_register<int32_t>(r1);
3966 int32_t alu_out = 0;
3968 alu_out = r1_val >> shiftBits;
3969 set_low_register(r1, alu_out);
3970 SetS390ConditionCode<int32_t>(alu_out, 0);
3971 SetS390OverflowCode(isOF);
3977 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
3979 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
3980 int shiftBits = (b2_val + d2) & 0x3F;
3981 int32_t r1_val = get_low_register<int32_t>(r1);
3982 int32_t alu_out = 0;
3984 isOF = CheckOverflowForShiftLeft(r1_val, shiftBits);
3985 alu_out = r1_val << shiftBits;
3986 set_low_register(r1, alu_out);
3987 SetS390ConditionCode<int32_t>(alu_out, 0);
3988 SetS390OverflowCode(isOF);
3993 DCHECK_OPCODE(SRDL);
3994 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
3995 DCHECK_EQ(r1 % 2, 0);
3997 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
3998 int shiftBits = (b2_val + d2) & 0x3F;
3999 uint64_t opnd1 =
static_cast<uint64_t
>(get_low_register<uint32_t>(r1)) << 32;
4000 uint64_t opnd2 =
static_cast<uint64_t
>(get_low_register<uint32_t>(r1 + 1));
4001 uint64_t r1_val = opnd1 | opnd2;
4002 uint64_t alu_out = r1_val >> shiftBits;
4003 set_low_register(r1, alu_out >> 32);
4004 set_low_register(r1 + 1, alu_out & 0x00000000FFFFFFFF);
4005 SetS390ConditionCode<int32_t>(alu_out, 0);
4010 DCHECK_OPCODE(SLDL);
4011 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
4013 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
4014 int shiftBits = (b2_val + d2) & 0x3F;
4016 DCHECK_EQ(r1 % 2, 0);
4017 uint32_t r1_val = get_low_register<uint32_t>(r1);
4018 uint32_t r1_next_val = get_low_register<uint32_t>(r1 + 1);
4019 uint64_t alu_out = (
static_cast<uint64_t
>(r1_val) << 32) |
4020 (
static_cast<uint64_t
>(r1_next_val));
4021 alu_out <<= shiftBits;
4022 set_low_register(r1 + 1, static_cast<uint32_t>(alu_out));
4023 set_low_register(r1, static_cast<uint32_t>(alu_out >> 32));
4028 DCHECK_OPCODE(SRDA);
4029 DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
4030 DCHECK_EQ(r1 % 2, 0);
4032 int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
4033 int shiftBits = (b2_val + d2) & 0x3F;
4034 int64_t opnd1 =
static_cast<int64_t>(get_low_register<int32_t>(r1)) << 32;
4035 int64_t opnd2 =
static_cast<uint64_t
>(get_low_register<uint32_t>(r1 + 1));
4036 int64_t r1_val = opnd1 + opnd2;
4037 int64_t alu_out = r1_val >> shiftBits;
4038 set_low_register(r1, alu_out >> 32);
4039 set_low_register(r1 + 1, alu_out & 0x00000000FFFFFFFF);
4040 SetS390ConditionCode<int32_t>(alu_out, 0);
4052 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2);
4058 if (r3 < r1) r3 += 16;
4060 int32_t rb_val = (rb == 0) ? 0 : get_low_register<int32_t>(rb);
4063 for (
int i = 0;
i <= r3 - r1;
i++) {
4064 int32_t value = get_low_register<int32_t>((r1 +
i) % 16);
4065 WriteW(rb_val + offset + 4 *
i, value, instr);
4073 DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val)
4074 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
4075 intptr_t addr = b1_val + d1_val;
4076 uint8_t mem_val = ReadB(addr);
4077 uint8_t selected_bits = mem_val & imm_val;
4081 if (0 == selected_bits) {
4082 condition_reg_ = CC_EQ;
4083 }
else if (selected_bits == imm_val) {
4084 condition_reg_ = 0x1;
4086 condition_reg_ = 0x4;
4112 DECODE_SI_INSTRUCTION_I_UINT8(b1, d1_val, imm_val)
4113 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
4114 intptr_t addr = b1_val + d1_val;
4115 uint8_t mem_val = ReadB(addr);
4116 SetS390ConditionCode<uint8_t>(mem_val, imm_val);
4134 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2);
4140 if (r3 < r1) r3 += 16;
4142 int32_t rb_val = (rb == 0) ? 0 : get_low_register<int32_t>(rb);
4145 for (
int i = 0;
i <= r3 - r1;
i++) {
4146 int32_t value = ReadW(rb_val + offset + 4 *
i, instr);
4147 set_low_register((r1 +
i) % 16, value);
4215 SSInstruction* ssInstr =
reinterpret_cast<SSInstruction*
>(instr);
4216 int b1 = ssInstr->B1Value();
4217 intptr_t d1 = ssInstr->D1Value();
4218 int b2 = ssInstr->B2Value();
4219 intptr_t d2 = ssInstr->D2Value();
4220 int length = ssInstr->Length();
4221 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
4222 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
4223 intptr_t src_addr = b2_val + d2;
4224 intptr_t dst_addr = b1_val + d1;
4226 for (
int i = 0;
i < length + 1; ++
i) {
4227 WriteB(dst_addr++, ReadB(src_addr++));
4438 DCHECK_OPCODE(NILH);
4439 DECODE_RI_A_INSTRUCTION(instr, r1,
i);
4440 int32_t r1_val = get_low_register<int32_t>(r1);
4442 SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) &
i);
4443 i = (
i << 16) | 0x0000FFFF;
4444 set_low_register(r1, r1_val &
i);
4449 DCHECK_OPCODE(NILL);
4450 DECODE_RI_A_INSTRUCTION(instr, r1,
i);
4451 int32_t r1_val = get_low_register<int32_t>(r1);
4453 SetS390BitWiseConditionCode<uint16_t>(r1_val &
i);
4455 set_low_register(r1, r1_val &
i);
4472 DCHECK_OPCODE(OILH);
4473 DECODE_RI_A_INSTRUCTION(instr, r1,
i);
4474 int32_t r1_val = get_low_register<int32_t>(r1);
4476 SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) |
i);
4478 set_low_register(r1, r1_val |
i);
4483 DCHECK_OPCODE(OILL);
4484 DECODE_RI_A_INSTRUCTION(instr, r1,
i);
4485 int32_t r1_val = get_low_register<int32_t>(r1);
4487 SetS390BitWiseConditionCode<uint16_t>(r1_val |
i);
4488 set_low_register(r1, r1_val |
i);
4523 DCHECK_OPCODE(TMLL);
4524 DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4526 uint32_t r1_val = get_low_register<uint32_t>(r1);
4527 r1_val = r1_val & 0x0000FFFF;
4530 if (0 == (mask & r1_val)) {
4531 condition_reg_ = 0x8;
4537 if (mask == (mask & r1_val)) {
4538 condition_reg_ = 0x1;
4544 #if defined(__GNUC__) 4545 int leadingZeros = __builtin_clz(mask);
4546 mask = 0x80000000u >> leadingZeros;
4547 if (mask & r1_val) {
4549 condition_reg_ = 0x2;
4552 condition_reg_ = 0x4;
4556 for (
int i = 15;
i >= 0;
i--) {
4557 if (mask & (1 <<
i)) {
4558 if (r1_val & (1 <<
i)) {
4560 condition_reg_ = 0x2;
4563 condition_reg_ = 0x4;
4585 DCHECK_OPCODE(BRAS);
4587 DECODE_RI_B_INSTRUCTION(instr, r1, d2)
4588 intptr_t pc = get_pc();
4590 set_register(r1, pc +
sizeof(FourByteInstr));
4592 set_pc(pc + d2 * 2);
4597 DCHECK_OPCODE(BRCT);
4599 DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4600 int64_t value = get_low_register<int32_t>(r1);
4601 set_low_register(r1, --value);
4604 intptr_t offset = i2 * 2;
4605 set_pc(get_pc() + offset);
4611 DCHECK_OPCODE(BRCTG);
4613 DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4614 int64_t value = get_register(r1);
4615 set_register(r1, --value);
4618 intptr_t offset = i2 * 2;
4619 set_pc(get_pc() + offset);
4626 DECODE_RI_A_INSTRUCTION(instr, r1,
i);
4627 set_low_register(r1,
i);
4632 DCHECK_OPCODE(LGHI);
4633 DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4635 set_register(r1,
i);
4641 DECODE_RI_A_INSTRUCTION(instr, r1,
i);
4642 int32_t r1_val = get_low_register<int32_t>(r1);
4644 isOF = CheckOverflowForMul(r1_val,
i);
4646 set_low_register(r1, r1_val);
4647 SetS390ConditionCode<int32_t>(r1_val, 0);
4648 SetS390OverflowCode(isOF);
4653 DCHECK_OPCODE(MGHI);
4654 DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4656 int64_t r1_val = get_register(r1);
4658 isOF = CheckOverflowForMul(r1_val,
i);
4660 set_register(r1, r1_val);
4661 SetS390ConditionCode<int32_t>(r1_val, 0);
4662 SetS390OverflowCode(isOF);
4668 DECODE_RI_A_INSTRUCTION(instr, r1,
i);
4669 int32_t r1_val = get_low_register<int32_t>(r1);
4670 SetS390ConditionCode<int32_t>(r1_val,
i);
4675 DCHECK_OPCODE(CGHI);
4676 DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4678 int64_t r1_val = get_register(r1);
4679 SetS390ConditionCode<int64_t>(r1_val,
i);
4684 DCHECK_OPCODE(LARL);
4685 DECODE_RIL_B_INSTRUCTION(r1, i2);
4686 intptr_t offset = i2 * 2;
4687 set_register(r1, get_pc() + offset);
4692 DCHECK_OPCODE(LGFI);
4693 DECODE_RIL_A_INSTRUCTION(r1, imm);
4694 set_register(r1, static_cast<int64_t>(static_cast<int32_t>(imm)));
4699 DCHECK_OPCODE(BRASL);
4701 DECODE_RIL_B_INSTRUCTION(r1, i2);
4703 intptr_t pc = get_pc();
4704 set_register(r1, pc + 6);
4705 set_pc(pc + d2 * 2);
4710 DCHECK_OPCODE(XIHF);
4711 DECODE_RIL_A_INSTRUCTION(r1, imm);
4713 alu_out = get_high_register<uint32_t>(r1);
4714 alu_out = alu_out ^ imm;
4715 set_high_register(r1, alu_out);
4716 SetS390BitWiseConditionCode<uint32_t>(alu_out);
4721 DCHECK_OPCODE(XILF);
4722 DECODE_RIL_A_INSTRUCTION(r1, imm);
4724 alu_out = get_low_register<uint32_t>(r1);
4725 alu_out = alu_out ^ imm;
4726 set_low_register(r1, alu_out);
4727 SetS390BitWiseConditionCode<uint32_t>(alu_out);
4732 DCHECK_OPCODE(NIHF);
4734 DECODE_RIL_A_INSTRUCTION(r1, imm);
4735 uint32_t alu_out = get_high_register<uint32_t>(r1);
4737 SetS390BitWiseConditionCode<uint32_t>(alu_out);
4738 set_high_register(r1, alu_out);
4743 DCHECK_OPCODE(NILF);
4745 DECODE_RIL_A_INSTRUCTION(r1, imm);
4746 uint32_t alu_out = get_low_register<uint32_t>(r1);
4748 SetS390BitWiseConditionCode<uint32_t>(alu_out);
4749 set_low_register(r1, alu_out);
4754 DCHECK_OPCODE(OIHF);
4756 DECODE_RIL_B_INSTRUCTION(r1, imm);
4757 uint32_t alu_out = get_high_register<uint32_t>(r1);
4759 SetS390BitWiseConditionCode<uint32_t>(alu_out);
4760 set_high_register(r1, alu_out);
4765 DCHECK_OPCODE(OILF);
4767 DECODE_RIL_B_INSTRUCTION(r1, imm);
4768 uint32_t alu_out = get_low_register<uint32_t>(r1);
4770 SetS390BitWiseConditionCode<uint32_t>(alu_out);
4771 set_low_register(r1, alu_out);
4776 DCHECK_OPCODE(LLIHF);
4778 DECODE_RIL_A_INSTRUCTION(r1, i2);
4779 uint64_t imm =
static_cast<uint64_t
>(i2);
4780 set_register(r1, imm << 32);
4785 DCHECK_OPCODE(LLILF);
4787 DECODE_RIL_A_INSTRUCTION(r1, i2);
4788 uint64_t imm =
static_cast<uint64_t
>(i2);
4789 set_register(r1, imm);
4794 DCHECK_OPCODE(MSGFI);
4795 DECODE_RIL_B_INSTRUCTION(r1, i2);
4796 int64_t alu_out = get_register(r1);
4797 alu_out = alu_out * i2;
4798 set_register(r1, alu_out);
4803 DCHECK_OPCODE(MSFI);
4804 DECODE_RIL_B_INSTRUCTION(r1, i2);
4805 int32_t alu_out = get_low_register<int32_t>(r1);
4806 alu_out = alu_out * i2;
4807 set_low_register(r1, alu_out);
4812 DCHECK_OPCODE(SLGFI);
4813 #ifndef V8_TARGET_ARCH_S390X 4817 DECODE_RIL_A_INSTRUCTION(r1, i2);
4818 uint64_t r1_val = (uint64_t)(get_register(r1));
4820 alu_out = r1_val - i2;
4821 set_register(r1, (intptr_t)alu_out);
4822 SetS390ConditionCode<uint64_t>(alu_out, 0);
4827 DCHECK_OPCODE(SLFI);
4828 DECODE_RIL_A_INSTRUCTION(r1, imm);
4829 uint32_t alu_out = get_low_register<uint32_t>(r1);
4831 SetS390ConditionCode<uint32_t>(alu_out, 0);
4832 set_low_register(r1, alu_out);
4837 DCHECK_OPCODE(AGFI);
4839 DECODE_RIL_B_INSTRUCTION(r1, i2_val);
4842 int64_t r1_val = get_register(r1);
4844 isOF = CheckOverflowForIntAdd(r1_val, i2,
int64_t);
4845 int64_t alu_out = r1_val + i2;
4846 set_register(r1, alu_out);
4847 SetS390ConditionCode<int64_t>(alu_out, 0);
4848 SetS390OverflowCode(isOF);
4855 DECODE_RIL_B_INSTRUCTION(r1, i2);
4858 int32_t r1_val = get_low_register<int32_t>(r1);
4859 isOF = CheckOverflowForIntAdd(r1_val, i2, int32_t);
4860 int32_t alu_out = r1_val + i2;
4861 set_low_register(r1, alu_out);
4862 SetS390ConditionCode<int32_t>(alu_out, 0);
4863 SetS390OverflowCode(isOF);
4868 DCHECK_OPCODE(ALGFI);
4869 #ifndef V8_TARGET_ARCH_S390X 4873 DECODE_RIL_A_INSTRUCTION(r1, i2);
4874 uint64_t r1_val = (uint64_t)(get_register(r1));
4876 alu_out = r1_val + i2;
4877 set_register(r1, (intptr_t)alu_out);
4878 SetS390ConditionCode<uint64_t>(alu_out, 0);
4884 DCHECK_OPCODE(ALFI);
4885 DECODE_RIL_A_INSTRUCTION(r1, imm);
4886 uint32_t alu_out = get_low_register<uint32_t>(r1);
4888 SetS390ConditionCode<uint32_t>(alu_out, 0);
4889 set_low_register(r1, alu_out);
4894 DCHECK_OPCODE(CGFI);
4896 DECODE_RIL_B_INSTRUCTION(r1, i2);
4898 SetS390ConditionCode<int64_t>(get_register(r1), imm);
4905 DECODE_RIL_B_INSTRUCTION(r1, imm);
4906 SetS390ConditionCode<int32_t>(get_low_register<int32_t>(r1), imm);
4911 DCHECK_OPCODE(CLGFI);
4913 DECODE_RIL_A_INSTRUCTION(r1, i2);
4914 uint64_t imm =
static_cast<uint64_t
>(i2);
4915 SetS390ConditionCode<uint64_t>(get_register(r1), imm);
4920 DCHECK_OPCODE(CLFI);
4922 DECODE_RIL_A_INSTRUCTION(r1, imm);
4923 SetS390ConditionCode<uint32_t>(get_low_register<uint32_t>(r1), imm);
5061 DECODE_RIL_A_INSTRUCTION(r1, i2);
5062 int32_t r1_val = get_high_register<int32_t>(r1);
5063 bool isOF = CheckOverflowForIntAdd(r1_val, static_cast<int32_t>(i2), int32_t);
5064 r1_val +=
static_cast<int32_t
>(i2);
5065 set_high_register(r1, r1_val);
5066 SetS390ConditionCode<int32_t>(r1_val, 0);
5067 SetS390OverflowCode(isOF);
5085 DECODE_RIL_A_INSTRUCTION(r1, imm);
5086 int32_t r1_val = get_high_register<int32_t>(r1);
5087 SetS390ConditionCode<int32_t>(r1_val,
static_cast<int32_t
>(imm));
5092 DCHECK_OPCODE(CLIH);
5094 DECODE_RIL_A_INSTRUCTION(r1, imm);
5095 SetS390ConditionCode<uint32_t>(get_high_register<uint32_t>(r1), imm);
5209 DECODE_RRE_INSTRUCTION(r1, r2);
5210 int32_t r1_val = get_low_register<int32_t>(r1);
5211 int32_t r2_val = get_low_register<int32_t>(r2);
5212 set_low_register(r1, r1_val * r2_val);
5217 DCHECK_OPCODE(MSRKC);
5218 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
5219 int32_t r2_val = get_low_register<int32_t>(r2);
5220 int32_t r3_val = get_low_register<int32_t>(r3);
5222 static_cast<int64_t>(r2_val) * static_cast<int64_t>(r3_val);
5223 int32_t result32 =
static_cast<int32_t
>(result64);
5224 bool isOF = (
static_cast<int64_t>(result32) != result64);
5225 SetS390ConditionCode<int32_t>(result32, 0);
5226 SetS390OverflowCode(isOF);
5227 set_low_register(r1, result32);
5346 DCHECK_OPCODE(TRAP4);
5349 int64_t sp_addr = get_register(sp);
5350 for (
int i = 0;
i < kCalleeRegisterSaveAreaSize / kPointerSize; ++
i) {
5352 if (
i != 14) (
reinterpret_cast<intptr_t*
>(sp_addr))[
i] = 0xDEADBABE;
5354 SoftwareInterrupt(instr);
5359 DCHECK_OPCODE(LPEBR);
5360 DECODE_RRE_INSTRUCTION(r1, r2);
5361 float fr1_val = get_float32_from_d_register(r1);
5362 float fr2_val = get_float32_from_d_register(r2);
5363 fr1_val = std::fabs(fr2_val);
5364 set_d_register_from_float32(r1, fr1_val);
5365 if (fr2_val != fr2_val) {
5366 condition_reg_ = CC_OF;
5367 }
else if (fr2_val == 0) {
5368 condition_reg_ = CC_EQ;
5370 condition_reg_ = CC_GT;
5383 DCHECK_OPCODE(LTEBR);
5384 DECODE_RRE_INSTRUCTION(r1, r2);
5385 int64_t r2_val = get_d_register(r2);
5386 float fr2_val = get_float32_from_d_register(r2);
5387 SetS390ConditionCode<float>(fr2_val, 0.0);
5388 set_d_register(r1, r2_val);
5393 DCHECK_OPCODE(LCEBR);
5394 DECODE_RRE_INSTRUCTION(r1, r2);
5395 float fr1_val = get_float32_from_d_register(r1);
5396 float fr2_val = get_float32_from_d_register(r2);
5398 set_d_register_from_float32(r1, fr1_val);
5399 if (fr2_val != fr2_val) {
5400 condition_reg_ = CC_OF;
5401 }
else if (fr2_val == 0) {
5402 condition_reg_ = CC_EQ;
5403 }
else if (fr2_val < 0) {
5404 condition_reg_ = CC_LT;
5405 }
else if (fr2_val > 0) {
5406 condition_reg_ = CC_GT;
5412 DCHECK_OPCODE(LDEBR);
5413 DECODE_RRE_INSTRUCTION(r1, r2);
5414 float fp_val = get_float32_from_d_register(r2);
5415 double db_val =
static_cast<double>(fp_val);
5416 set_d_register_from_double(r1, db_val);
5445 DCHECK_OPCODE(CEBR);
5446 DECODE_RRE_INSTRUCTION(r1, r2);
5447 float fr1_val = get_float32_from_d_register(r1);
5448 float fr2_val = get_float32_from_d_register(r2);
5449 if (isNaN(fr1_val) || isNaN(fr2_val)) {
5450 condition_reg_ = CC_OF;
5452 SetS390ConditionCode<float>(fr1_val, fr2_val);
5459 DCHECK_OPCODE(AEBR);
5460 DECODE_RRE_INSTRUCTION(r1, r2);
5461 float fr1_val = get_float32_from_d_register(r1);
5462 float fr2_val = get_float32_from_d_register(r2);
5464 set_d_register_from_float32(r1, fr1_val);
5465 SetS390ConditionCode<float>(fr1_val, 0);
5471 DCHECK_OPCODE(SEBR);
5472 DECODE_RRE_INSTRUCTION(r1, r2);
5473 float fr1_val = get_float32_from_d_register(r1);
5474 float fr2_val = get_float32_from_d_register(r2);
5476 set_d_register_from_float32(r1, fr1_val);
5477 SetS390ConditionCode<float>(fr1_val, 0);
5489 DCHECK_OPCODE(DEBR);
5490 DECODE_RRE_INSTRUCTION(r1, r2);
5491 float fr1_val = get_float32_from_d_register(r1);
5492 float fr2_val = get_float32_from_d_register(r2);
5494 set_d_register_from_float32(r1, fr1_val);
5511 DCHECK_OPCODE(LPDBR);
5512 DECODE_RRE_INSTRUCTION(r1, r2);
5513 double r1_val = get_double_from_d_register(r1);
5514 double r2_val = get_double_from_d_register(r2);
5515 r1_val = std::fabs(r2_val);
5516 set_d_register_from_double(r1, r1_val);
5517 if (r2_val != r2_val) {
5518 condition_reg_ = CC_OF;
5519 }
else if (r2_val == 0) {
5520 condition_reg_ = CC_EQ;
5522 condition_reg_ = CC_GT;
5534 DCHECK_OPCODE(LTDBR);
5535 DECODE_RRE_INSTRUCTION(r1, r2);
5536 int64_t r2_val = get_d_register(r2);
5537 SetS390ConditionCode<double>(bit_cast<double,
int64_t>(r2_val), 0.0);
5538 set_d_register(r1, r2_val);
5543 DCHECK_OPCODE(LCDBR);
5544 DECODE_RRE_INSTRUCTION(r1, r2);
5545 double r1_val = get_double_from_d_register(r1);
5546 double r2_val = get_double_from_d_register(r2);
5548 set_d_register_from_double(r1, r1_val);
5549 if (r2_val != r2_val) {
5550 condition_reg_ = CC_OF;
5551 }
else if (r2_val == 0) {
5552 condition_reg_ = CC_EQ;
5553 }
else if (r2_val < 0) {
5554 condition_reg_ = CC_LT;
5555 }
else if (r2_val > 0) {
5556 condition_reg_ = CC_GT;
5562 DCHECK_OPCODE(SQEBR);
5563 DECODE_RRE_INSTRUCTION(r1, r2);
5564 float fr1_val = get_float32_from_d_register(r1);
5565 float fr2_val = get_float32_from_d_register(r2);
5566 fr1_val = std::sqrt(fr2_val);
5567 set_d_register_from_float32(r1, fr1_val);
5572 DCHECK_OPCODE(SQDBR);
5573 DECODE_RRE_INSTRUCTION(r1, r2);
5574 double r1_val = get_double_from_d_register(r1);
5575 double r2_val = get_double_from_d_register(r2);
5576 r1_val = std::sqrt(r2_val);
5577 set_d_register_from_double(r1, r1_val);
5588 DCHECK_OPCODE(MEEBR);
5589 DECODE_RRE_INSTRUCTION(r1, r2);
5590 float fr1_val = get_float32_from_d_register(r1);
5591 float fr2_val = get_float32_from_d_register(r2);
5593 set_d_register_from_float32(r1, fr1_val);
5604 DCHECK_OPCODE(CDBR);
5605 DECODE_RRE_INSTRUCTION(r1, r2);
5606 double r1_val = get_double_from_d_register(r1);
5607 double r2_val = get_double_from_d_register(r2);
5608 if (isNaN(r1_val) || isNaN(r2_val)) {
5609 condition_reg_ = CC_OF;
5611 SetS390ConditionCode<double>(r1_val, r2_val);
5617 DCHECK_OPCODE(ADBR);
5618 DECODE_RRE_INSTRUCTION(r1, r2);
5619 double r1_val = get_double_from_d_register(r1);
5620 double r2_val = get_double_from_d_register(r2);
5622 set_d_register_from_double(r1, r1_val);
5623 SetS390ConditionCode<double>(r1_val, 0);
5628 DCHECK_OPCODE(SDBR);
5629 DECODE_RRE_INSTRUCTION(r1, r2);
5630 double r1_val = get_double_from_d_register(r1);
5631 double r2_val = get_double_from_d_register(r2);
5633 set_d_register_from_double(r1, r1_val);
5634 SetS390ConditionCode<double>(r1_val, 0);
5639 DCHECK_OPCODE(MDBR);
5640 DECODE_RRE_INSTRUCTION(r1, r2);
5641 double r1_val = get_double_from_d_register(r1);
5642 double r2_val = get_double_from_d_register(r2);
5644 set_d_register_from_double(r1, r1_val);
5649 DCHECK_OPCODE(DDBR);
5650 DECODE_RRE_INSTRUCTION(r1, r2);
5651 double r1_val = get_double_from_d_register(r1);
5652 double r2_val = get_double_from_d_register(r2);
5654 set_d_register_from_double(r1, r1_val);
5659 DCHECK_OPCODE(MADBR);
5660 DECODE_RRD_INSTRUCTION(r1, r2, r3);
5661 double r1_val = get_double_from_d_register(r1);
5662 double r2_val = get_double_from_d_register(r2);
5663 double r3_val = get_double_from_d_register(r3);
5664 r1_val += r2_val * r3_val;
5665 set_d_register_from_double(r1, r1_val);
5666 SetS390ConditionCode<double>(r1_val, 0);
5701 DCHECK_OPCODE(LEDBRA);
5702 DECODE_RRE_INSTRUCTION(r1, r2);
5703 double r2_val = get_double_from_d_register(r2);
5704 set_d_register_from_float32(r1, static_cast<float>(r2_val));
5781 DCHECK_OPCODE(FIEBRA);
5782 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
5783 float r2_val = get_float32_from_d_register(r2);
5786 case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0:
5787 set_d_register_from_float32(r1, round(r2_val));
5789 case Assembler::FIDBRA_ROUND_TOWARD_0:
5790 set_d_register_from_float32(r1, trunc(r2_val));
5792 case Assembler::FIDBRA_ROUND_TOWARD_POS_INF:
5793 set_d_register_from_float32(r1, std::ceil(r2_val));
5795 case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF:
5796 set_d_register_from_float32(r1, std::floor(r2_val));
5824 DCHECK_OPCODE(FIDBRA);
5825 DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
5826 double r2_val = get_double_from_d_register(r2);
5829 case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0:
5830 set_d_register_from_double(r1, round(r2_val));
5832 case Assembler::FIDBRA_ROUND_TOWARD_0:
5833 set_d_register_from_double(r1, trunc(r2_val));
5835 case Assembler::FIDBRA_ROUND_TOWARD_POS_INF:
5836 set_d_register_from_double(r1, std::ceil(r2_val));
5838 case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF:
5839 set_d_register_from_double(r1, std::floor(r2_val));
5879 DCHECK_OPCODE(LZDR);
5880 DECODE_RRE_INSTRUCTION_NO_R2(r1);
5881 set_d_register_from_double(r1, 0.0);
5910 DCHECK_OPCODE(CELFBR);
5911 DECODE_RRE_INSTRUCTION(r1, r2);
5912 uint32_t r2_val = get_low_register<uint32_t>(r2);
5913 float r1_val =
static_cast<float>(r2_val);
5914 set_d_register_from_float32(r1, r1_val);
5919 DCHECK_OPCODE(CDLFBR);
5920 DECODE_RRE_INSTRUCTION(r1, r2);
5921 uint32_t r2_val = get_low_register<uint32_t>(r2);
5922 double r1_val =
static_cast<double>(r2_val);
5923 set_d_register_from_double(r1, r1_val);
5934 DCHECK_OPCODE(CEFBRA);
5935 DECODE_RRE_INSTRUCTION(r1, r2);
5936 int32_t fr2_val = get_low_register<int32_t>(r2);
5937 float fr1_val =
static_cast<float>(fr2_val);
5938 set_d_register_from_float32(r1, fr1_val);
5943 DCHECK_OPCODE(CDFBRA);
5944 DECODE_RRE_INSTRUCTION(r1, r2);
5945 int32_t r2_val = get_low_register<int32_t>(r2);
5946 double r1_val =
static_cast<double>(r2_val);
5947 set_d_register_from_double(r1, r1_val);
5958 DCHECK_OPCODE(CFEBRA);
5959 DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val);
5960 float r2_fval = get_float32_from_d_register(r2);
5963 SetS390RoundConditionCode(r2_fval, INT32_MAX, INT32_MIN);
5966 case CURRENT_ROUNDING_MODE:
5967 case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: {
5968 r1_val =
static_cast<int32_t
>(r2_fval);
5971 case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0: {
5972 float ceil_val = std::ceil(r2_fval);
5973 float floor_val = std::floor(r2_fval);
5974 float sub_val1 = std::fabs(r2_fval - floor_val);
5975 float sub_val2 = std::fabs(r2_fval - ceil_val);
5976 if (sub_val1 > sub_val2) {
5977 r1_val =
static_cast<int32_t
>(ceil_val);
5978 }
else if (sub_val1 < sub_val2) {
5979 r1_val =
static_cast<int32_t
>(floor_val);
5981 if (r2_fval > 0.0) {
5982 r1_val =
static_cast<int32_t
>(ceil_val);
5984 r1_val =
static_cast<int32_t
>(floor_val);
5989 case ROUND_TO_NEAREST_WITH_TIES_TO_EVEN: {
5990 float ceil_val = std::ceil(r2_fval);
5991 float floor_val = std::floor(r2_fval);
5992 float sub_val1 = std::fabs(r2_fval - floor_val);
5993 float sub_val2 = std::fabs(r2_fval - ceil_val);
5994 if (sub_val1 > sub_val2) {
5995 r1_val =
static_cast<int32_t
>(ceil_val);
5996 }
else if (sub_val1 < sub_val2) {
5997 r1_val =
static_cast<int32_t
>(floor_val);
5999 int32_t c_v =
static_cast<int32_t
>(ceil_val);
6000 int32_t f_v =
static_cast<int32_t
>(floor_val);
6008 case ROUND_TOWARD_0: {
6013 if (temp < INT_MIN || temp > INT_MAX) {
6014 condition_reg_ = CC_OF;
6016 r1_val =
static_cast<int32_t
>(r2_fval);
6019 case ROUND_TOWARD_PLUS_INFINITE: {
6020 r1_val =
static_cast<int32_t
>(std::ceil(r2_fval));
6023 case ROUND_TOWARD_MINUS_INFINITE: {
6028 if (temp < INT_MIN || temp > INT_MAX) {
6029 condition_reg_ = CC_OF;
6031 r1_val =
static_cast<int32_t
>(std::floor(r2_fval));
6037 set_low_register(r1, r1_val);
6042 DCHECK_OPCODE(CFDBRA);
6043 DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val);
6044 double r2_val = get_double_from_d_register(r2);
6047 SetS390RoundConditionCode(r2_val, INT32_MAX, INT32_MIN);
6050 case CURRENT_ROUNDING_MODE:
6051 case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: {
6052 r1_val =
static_cast<int32_t
>(r2_val);
6055 case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0: {
6056 double ceil_val = std::ceil(r2_val);
6057 double floor_val = std::floor(r2_val);
6058 double sub_val1 = std::fabs(r2_val - floor_val);
6059 double sub_val2 = std::fabs(r2_val - ceil_val);
6060 if (sub_val1 > sub_val2) {
6061 r1_val =
static_cast<int32_t
>(ceil_val);
6062 }
else if (sub_val1 < sub_val2) {
6063 r1_val =
static_cast<int32_t
>(floor_val);
6066 r1_val =
static_cast<int32_t
>(ceil_val);
6068 r1_val =
static_cast<int32_t
>(floor_val);
6073 case ROUND_TO_NEAREST_WITH_TIES_TO_EVEN: {
6074 double ceil_val = std::ceil(r2_val);
6075 double floor_val = std::floor(r2_val);
6076 double sub_val1 = std::fabs(r2_val - floor_val);
6077 double sub_val2 = std::fabs(r2_val - ceil_val);
6078 if (sub_val1 > sub_val2) {
6079 r1_val =
static_cast<int32_t
>(ceil_val);
6080 }
else if (sub_val1 < sub_val2) {
6081 r1_val =
static_cast<int32_t
>(floor_val);
6083 int32_t c_v =
static_cast<int32_t
>(ceil_val);
6084 int32_t f_v =
static_cast<int32_t
>(floor_val);
6092 case ROUND_TOWARD_0: {
6097 if (temp < INT_MIN || temp > INT_MAX) {
6098 condition_reg_ = CC_OF;
6100 r1_val =
static_cast<int32_t
>(r2_val);
6103 case ROUND_TOWARD_PLUS_INFINITE: {
6104 r1_val =
static_cast<int32_t
>(std::ceil(r2_val));
6107 case ROUND_TOWARD_MINUS_INFINITE: {
6112 if (temp < INT_MIN || temp > INT_MAX) {
6113 condition_reg_ = CC_OF;
6115 r1_val =
static_cast<int32_t
>(std::floor(r2_val));
6121 set_low_register(r1, r1_val);
6132 DCHECK_OPCODE(CLFEBR);
6133 DECODE_RRE_INSTRUCTION(r1, r2);
6134 float r2_val = get_float32_from_d_register(r2);
6136 set_low_register(r1, r1_val);
6137 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT32_MAX);
6142 DCHECK_OPCODE(CLFDBR);
6143 DECODE_RRE_INSTRUCTION(r1, r2);
6144 double a = get_double_from_d_register(r2);
6145 double n = std::round(a);
6147 set_low_register(r1, r1_val);
6148 if (std::isfinite(a) && a < 0.0) {
6149 DCHECK(n <= 0.0 && std::isfinite(n));
6150 condition_reg_ = (n < 0.0) ? 0x1 : 0x4;
6151 }
else if (a == 0.0) {
6152 condition_reg_ = 0x8;
6153 }
else if (std::isfinite(a) && a > 0.0) {
6154 DCHECK(n >= 0.0 && std::isfinite(n));
6155 condition_reg_ = (n <= static_cast<double>(UINT32_MAX)) ? 0x2 : 0x1;
6157 condition_reg_ = 0x1;
6169 DCHECK_OPCODE(CELGBR);
6170 DECODE_RRE_INSTRUCTION(r1, r2);
6171 uint64_t r2_val = get_register(r2);
6172 float r1_val =
static_cast<float>(r2_val);
6173 set_d_register_from_float32(r1, r1_val);
6178 DCHECK_OPCODE(CDLGBR);
6179 DECODE_RRE_INSTRUCTION(r1, r2);
6180 uint64_t r2_val = get_register(r2);
6181 double r1_val =
static_cast<double>(r2_val);
6182 set_d_register_from_double(r1, r1_val);
6193 DCHECK_OPCODE(CEGBRA);
6194 DECODE_RRE_INSTRUCTION(r1, r2);
6195 int64_t fr2_val = get_register(r2);
6196 float fr1_val =
static_cast<float>(fr2_val);
6197 set_d_register_from_float32(r1, fr1_val);
6202 DCHECK_OPCODE(CDGBRA);
6203 DECODE_RRE_INSTRUCTION(r1, r2);
6204 int64_t r2_val = get_register(r2);
6205 double r1_val =
static_cast<double>(r2_val);
6206 set_d_register_from_double(r1, r1_val);
6217 DCHECK_OPCODE(CGEBRA);
6218 DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val);
6219 float r2_fval = get_float32_from_d_register(r2);
6222 SetS390RoundConditionCode(r2_fval, INT64_MAX, INT64_MIN);
6225 case CURRENT_ROUNDING_MODE:
6226 case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0:
6227 case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: {
6231 case ROUND_TO_NEAREST_WITH_TIES_TO_EVEN: {
6232 float ceil_val = std::ceil(r2_fval);
6233 float floor_val = std::floor(r2_fval);
6234 if (std::abs(r2_fval - floor_val) > std::abs(r2_fval - ceil_val)) {
6235 r1_val =
static_cast<int64_t>(ceil_val);
6236 }
else if (std::abs(r2_fval - floor_val) < std::abs(r2_fval - ceil_val)) {
6237 r1_val =
static_cast<int64_t>(floor_val);
6248 case ROUND_TOWARD_0: {
6249 r1_val =
static_cast<int64_t>(r2_fval);
6252 case ROUND_TOWARD_PLUS_INFINITE: {
6253 r1_val =
static_cast<int64_t>(std::ceil(r2_fval));
6256 case ROUND_TOWARD_MINUS_INFINITE: {
6257 r1_val =
static_cast<int64_t>(std::floor(r2_fval));
6263 set_register(r1, r1_val);
6268 DCHECK_OPCODE(CGDBRA);
6269 DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val);
6270 double r2_val = get_double_from_d_register(r2);
6273 SetS390RoundConditionCode(r2_val, INT64_MAX, INT64_MIN);
6276 case CURRENT_ROUNDING_MODE:
6277 case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0:
6278 case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: {
6282 case ROUND_TO_NEAREST_WITH_TIES_TO_EVEN: {
6283 double ceil_val = std::ceil(r2_val);
6284 double floor_val = std::floor(r2_val);
6285 if (std::abs(r2_val - floor_val) > std::abs(r2_val - ceil_val)) {
6286 r1_val =
static_cast<int64_t>(ceil_val);
6287 }
else if (std::abs(r2_val - floor_val) < std::abs(r2_val - ceil_val)) {
6288 r1_val =
static_cast<int64_t>(floor_val);
6299 case ROUND_TOWARD_0: {
6300 r1_val =
static_cast<int64_t>(r2_val);
6303 case ROUND_TOWARD_PLUS_INFINITE: {
6304 r1_val =
static_cast<int64_t>(std::ceil(r2_val));
6307 case ROUND_TOWARD_MINUS_INFINITE: {
6308 r1_val =
static_cast<int64_t>(std::floor(r2_val));
6314 set_register(r1, r1_val);
6325 DCHECK_OPCODE(CLGEBR);
6326 DECODE_RRE_INSTRUCTION(r1, r2);
6327 float r2_val = get_float32_from_d_register(r2);
6328 uint64_t r1_val =
static_cast<uint64_t
>(r2_val);
6329 set_register(r1, r1_val);
6330 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT64_MAX);
6335 DCHECK_OPCODE(CLGDBR);
6336 DECODE_RRE_INSTRUCTION(r1, r2);
6337 double r2_val = get_double_from_d_register(r2);
6338 uint64_t r1_val =
static_cast<uint64_t
>(r2_val);
6339 set_register(r1, r1_val);
6340 SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT64_MAX);
6363 DCHECK_OPCODE(LDGR);
6365 DECODE_RRE_INSTRUCTION(r1, r2);
6366 uint64_t int_val = get_register(r2);
6369 set_d_register(r1, int_val);
6392 DCHECK_OPCODE(LGDR);
6393 DECODE_RRE_INSTRUCTION(r1, r2);
6395 int64_t double_val = get_d_register(r2);
6396 set_register(r1, double_val);
6659 DCHECK_OPCODE(LPGR);
6661 DECODE_RRE_INSTRUCTION(r1, r2);
6662 int64_t r2_val = get_register(r2);
6663 r2_val = (r2_val < 0) ? -r2_val : r2_val;
6664 set_register(r1, r2_val);
6665 SetS390ConditionCode<int64_t>(r2_val, 0);
6666 if (r2_val == (static_cast<int64_t>(1) << 63)) {
6667 SetS390OverflowCode(
true);
6673 DCHECK_OPCODE(LNGR);
6675 DECODE_RRE_INSTRUCTION(r1, r2);
6676 int64_t r2_val = get_register(r2);
6677 r2_val = (r2_val >= 0) ? -r2_val : r2_val;
6678 set_register(r1, r2_val);
6679 condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT;
6685 DCHECK_OPCODE(LTGR);
6687 DECODE_RRE_INSTRUCTION(r1, r2);
6688 int64_t r2_val = get_register(r2);
6689 SetS390ConditionCode<int64_t>(r2_val, 0);
6690 set_register(r1, get_register(r2));
6695 DCHECK_OPCODE(LCGR);
6696 DECODE_RRE_INSTRUCTION(r1, r2);
6697 int64_t r2_val = get_register(r2);
6700 #ifdef V8_TARGET_ARCH_S390X 6701 isOF = __builtin_ssubl_overflow(0L, r2_val, &result);
6703 isOF = __builtin_ssubll_overflow(0L, r2_val, &result);
6705 set_register(r1, result);
6706 SetS390ConditionCode<int64_t>(result, 0);
6708 SetS390OverflowCode(
true);
6715 DECODE_RRE_INSTRUCTION(r1, r2);
6716 int64_t r1_val = get_register(r1);
6717 int64_t r2_val = get_register(r2);
6719 isOF = CheckOverflowForIntSub(r1_val, r2_val,
int64_t);
6721 SetS390ConditionCode<int64_t>(r1_val, 0);
6722 SetS390OverflowCode(isOF);
6723 set_register(r1, r1_val);
6740 DCHECK_OPCODE(MSGR);
6741 DECODE_RRE_INSTRUCTION(r1, r2);
6742 int64_t r1_val = get_register(r1);
6743 int64_t r2_val = get_register(r2);
6744 set_register(r1, r1_val * r2_val);
6749 DCHECK_OPCODE(MSGRKC);
6750 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
6751 int64_t r2_val = get_register(r2);
6752 int64_t r3_val = get_register(r3);
6753 volatile int64_t result64 = r2_val * r3_val;
6754 bool isOF = ((r2_val == -1 && result64 == (
static_cast<int64_t>(1L) << 63)) ||
6755 (r2_val != 0 && result64 / r2_val != r3_val));
6756 SetS390ConditionCode<int64_t>(result64, 0);
6757 SetS390OverflowCode(isOF);
6758 set_register(r1, result64);
6763 DCHECK_OPCODE(DSGR);
6764 DECODE_RRE_INSTRUCTION(r1, r2);
6766 DCHECK_EQ(r1 % 2, 0);
6768 int64_t dividend = get_register(r1 + 1);
6769 int64_t divisor = get_register(r2);
6770 set_register(r1, dividend % divisor);
6771 set_register(r1 + 1, dividend / divisor);
6776 DCHECK_OPCODE(LRVGR);
6777 DECODE_RRE_INSTRUCTION(r1, r2);
6778 int64_t r2_val = get_register(r2);
6779 int64_t r1_val = ByteReverse(r2_val);
6781 set_register(r1, r1_val);
6786 DCHECK_OPCODE(LPGFR);
6788 DECODE_RRE_INSTRUCTION(r1, r2);
6789 int32_t r2_val = get_low_register<int32_t>(r2);
6791 int64_t r1_val =
static_cast<int64_t>((r2_val < 0) ? -r2_val : r2_val);
6792 set_register(r1, r1_val);
6793 SetS390ConditionCode<int64_t>(r1_val, 0);
6804 DCHECK_OPCODE(LTGFR);
6805 DECODE_RRE_INSTRUCTION(r1, r2);
6808 int32_t r2_val = get_low_register<int32_t>(r2);
6810 set_register(r1, result);
6811 SetS390ConditionCode<int64_t>(result, 0);
6816 DCHECK_OPCODE(LCGFR);
6817 DECODE_RRE_INSTRUCTION(r1, r2);
6820 int32_t r2_val = get_low_register<int32_t>(r2);
6822 set_register(r1, result);
6827 DCHECK_OPCODE(LLGFR);
6828 DECODE_RRE_INSTRUCTION(r1, r2);
6829 int32_t r2_val = get_low_register<int32_t>(r2);
6830 uint64_t r2_finalval = (
static_cast<uint64_t
>(r2_val) & 0x00000000FFFFFFFF);
6831 set_register(r1, r2_finalval);
6842 DCHECK_OPCODE(AGFR);
6843 DECODE_RRE_INSTRUCTION(r1, r2);
6845 int64_t r1_val = get_register(r1);
6846 int64_t r2_val =
static_cast<int64_t>(get_low_register<int32_t>(r2));
6847 bool isOF = CheckOverflowForIntAdd(r1_val, r2_val,
int64_t);
6849 SetS390ConditionCode<int64_t>(r1_val, 0);
6850 SetS390OverflowCode(isOF);
6851 set_register(r1, r1_val);
6856 DCHECK_OPCODE(SGFR);
6857 DECODE_RRE_INSTRUCTION(r1, r2);
6859 int64_t r1_val = get_register(r1);
6860 int64_t r2_val =
static_cast<int64_t>(get_low_register<int32_t>(r2));
6862 isOF = CheckOverflowForIntSub(r1_val, r2_val,
int64_t);
6864 SetS390ConditionCode<int64_t>(r1_val, 0);
6865 SetS390OverflowCode(isOF);
6866 set_register(r1, r1_val);
6883 DCHECK_OPCODE(MSGFR);
6884 DECODE_RRE_INSTRUCTION(r1, r2);
6885 int64_t r1_val = get_register(r1);
6886 int64_t r2_val =
static_cast<int64_t>(get_low_register<int32_t>(r2));
6887 int64_t product = r1_val * r2_val;
6888 set_register(r1, product);
6893 DCHECK_OPCODE(DSGFR);
6894 DECODE_RRE_INSTRUCTION(r1, r2);
6895 DCHECK_EQ(r1 % 2, 0);
6896 int64_t r1_val = get_register(r1 + 1);
6897 int64_t r2_val =
static_cast<int64_t>(get_low_register<int32_t>(r2));
6898 int64_t quotient = r1_val / r2_val;
6899 int64_t remainder = r1_val % r2_val;
6900 set_register(r1, remainder);
6901 set_register(r1 + 1, quotient);
6912 DCHECK_OPCODE(LRVR);
6913 DECODE_RRE_INSTRUCTION(r1, r2);
6914 int32_t r2_val = get_low_register<int32_t>(r2);
6915 int32_t r1_val = ByteReverse(r2_val);
6917 set_low_register(r1, r1_val);
6923 DECODE_RRE_INSTRUCTION(r1, r2);
6925 int64_t r1_val = get_register(r1);
6926 int64_t r2_val = get_register(r2);
6927 SetS390ConditionCode<int64_t>(r1_val, r2_val);
6932 DCHECK_OPCODE(CLGR);
6933 DECODE_RRE_INSTRUCTION(r1, r2);
6935 uint64_t r1_val =
static_cast<uint64_t
>(get_register(r1));
6936 uint64_t r2_val =
static_cast<uint64_t
>(get_register(r2));
6937 SetS390ConditionCode<uint64_t>(r1_val, r2_val);
6978 DCHECK_OPCODE(CGFR);
6979 DECODE_RRE_INSTRUCTION(r1, r2);
6981 int64_t r1_val = get_register(r1);
6982 int64_t r2_val =
static_cast<int64_t>(get_low_register<int32_t>(r2));
6983 SetS390ConditionCode<int64_t>(r1_val, r2_val);
7079 DECODE_RRE_INSTRUCTION(r1, r2);
7080 int64_t r1_val = get_register(r1);
7081 int64_t r2_val = get_register(r2);
7083 SetS390BitWiseConditionCode<uint64_t>(r1_val);
7084 set_register(r1, r1_val);
7090 DECODE_RRE_INSTRUCTION(r1, r2);
7091 int64_t r1_val = get_register(r1);
7092 int64_t r2_val = get_register(r2);
7094 SetS390BitWiseConditionCode<uint64_t>(r1_val);
7095 set_register(r1, r1_val);
7101 DECODE_RRE_INSTRUCTION(r1, r2);
7102 int64_t r1_val = get_register(r1);
7103 int64_t r2_val = get_register(r2);
7105 SetS390BitWiseConditionCode<uint64_t>(r1_val);
7106 set_register(r1, r1_val);
7111 DCHECK_OPCODE(FLOGR);
7112 DECODE_RRE_INSTRUCTION(r1, r2);
7114 DCHECK_EQ(r1 % 2, 0);
7116 int64_t r2_val = get_register(r2);
7119 for (;
i < 64;
i++) {
7120 if (r2_val < 0)
break;
7124 r2_val = get_register(r2);
7127 set_register(r1,
i);
7128 set_register(r1 + 1, r2_val & mask);
7133 DCHECK_OPCODE(LLGCR);
7134 DECODE_RRE_INSTRUCTION(r1, r2);
7135 uint64_t r2_val = get_low_register<uint64_t>(r2);
7138 set_register(r1, r2_val);
7143 DCHECK_OPCODE(LLGHR);
7144 DECODE_RRE_INSTRUCTION(r1, r2);
7145 uint64_t r2_val = get_low_register<uint64_t>(r2);
7148 set_register(r1, r2_val);
7159 DCHECK_OPCODE(DLGR);
7160 #ifdef V8_TARGET_ARCH_S390X 7161 DECODE_RRE_INSTRUCTION(r1, r2);
7162 uint64_t r1_val = get_register(r1);
7163 uint64_t r2_val = get_register(r2);
7164 DCHECK_EQ(r1 % 2, 0);
7165 unsigned __int128 dividend =
static_cast<unsigned __int128
>(r1_val) << 64;
7166 dividend += get_register(r1 + 1);
7167 uint64_t remainder = dividend % r2_val;
7168 uint64_t quotient = dividend / r2_val;
7169 set_register(r1, remainder);
7170 set_register(r1 + 1, quotient);
7222 DCHECK_OPCODE(LLCR);
7223 DECODE_RRE_INSTRUCTION(r1, r2);
7224 uint32_t r2_val = get_low_register<uint32_t>(r2);
7227 set_low_register(r1, r2_val);
7232 DCHECK_OPCODE(LLHR);
7233 DECODE_RRE_INSTRUCTION(r1, r2);
7234 uint32_t r2_val = get_low_register<uint32_t>(r2);
7237 set_low_register(r1, r2_val);
7243 DECODE_RRE_INSTRUCTION(r1, r2);
7244 DCHECK_EQ(r1 % 2, 0);
7246 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1);
7247 uint32_t r2_val = get_low_register<uint32_t>(r2);
7249 static_cast<uint64_t
>(r1_val) * static_cast<uint64_t>(r2_val);
7250 int32_t high_bits = product >> 32;
7251 int32_t low_bits = product & 0x00000000FFFFFFFF;
7252 set_low_register(r1, high_bits);
7253 set_low_register(r1 + 1, low_bits);
7259 DECODE_RRE_INSTRUCTION(r1, r2);
7260 uint32_t r1_val = get_low_register<uint32_t>(r1);
7261 uint32_t r2_val = get_low_register<uint32_t>(r2);
7262 DCHECK_EQ(r1 % 2, 0);
7263 uint64_t dividend =
static_cast<uint64_t
>(r1_val) << 32;
7264 dividend += get_low_register<uint32_t>(r1 + 1);
7265 uint32_t remainder = dividend % r2_val;
7266 uint32_t quotient = dividend / r2_val;
7268 set_low_register(r1, remainder);
7269 set_low_register(r1 + 1, quotient);
7274 DCHECK_OPCODE(ALCR);
7275 DECODE_RRE_INSTRUCTION(r1, r2);
7276 uint32_t r1_val = get_low_register<uint32_t>(r1);
7277 uint32_t r2_val = get_low_register<uint32_t>(r2);
7281 alu_out = r1_val + r2_val;
7282 bool isOF_original = CheckOverflowForUIntAdd(r1_val, r2_val);
7283 if (TestConditionCode((Condition)2) || TestConditionCode((Condition)3)) {
7284 alu_out = alu_out + 1;
7285 isOF = isOF_original || CheckOverflowForUIntAdd(alu_out, 1);
7287 isOF = isOF_original;
7289 set_low_register(r1, alu_out);
7290 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
7295 DCHECK_OPCODE(SLBR);
7296 DECODE_RRE_INSTRUCTION(r1, r2);
7297 uint32_t r1_val = get_low_register<uint32_t>(r1);
7298 uint32_t r2_val = get_low_register<uint32_t>(r2);
7302 alu_out = r1_val - r2_val;
7303 bool isOF_original = CheckOverflowForUIntSub(r1_val, r2_val);
7304 if (TestConditionCode((Condition)2) || TestConditionCode((Condition)3)) {
7305 alu_out = alu_out - 1;
7306 isOF = isOF_original || CheckOverflowForUIntSub(alu_out, 1);
7308 isOF = isOF_original;
7310 set_low_register(r1, alu_out);
7311 SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
7417 EVALUATE(POPCNT_Z) {
7418 DCHECK_OPCODE(POPCNT_Z);
7419 DECODE_RRE_INSTRUCTION(r1, r2);
7420 int64_t r2_val = get_register(r2);
7423 uint8_t* r2_val_ptr =
reinterpret_cast<uint8_t*
>(&r2_val);
7424 uint8_t* r1_val_ptr =
reinterpret_cast<uint8_t*
>(&r1_val);
7425 for (
int i = 0;
i < 8;
i++) {
7427 #if defined(__GNUC__) 7428 r1_val_ptr[
i] = __builtin_popcount(x);
7430 #error unsupport __builtin_popcount 7433 set_register(r1, static_cast<uint64_t>(r1_val));
7438 DCHECK_OPCODE(LOCGR);
7439 DECODE_RRF_C_INSTRUCTION(r1, r2, m3);
7440 if (TestConditionCode(m3)) {
7441 set_register(r1, get_register(r2));
7447 DCHECK_OPCODE(NGRK);
7448 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7450 int64_t r2_val = get_register(r2);
7451 int64_t r3_val = get_register(r3);
7452 uint64_t bitwise_result = 0;
7453 bitwise_result = r2_val & r3_val;
7454 SetS390BitWiseConditionCode<uint64_t>(bitwise_result);
7455 set_register(r1, bitwise_result);
7460 DCHECK_OPCODE(OGRK);
7461 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7463 int64_t r2_val = get_register(r2);
7464 int64_t r3_val = get_register(r3);
7465 uint64_t bitwise_result = 0;
7466 bitwise_result = r2_val | r3_val;
7467 SetS390BitWiseConditionCode<uint64_t>(bitwise_result);
7468 set_register(r1, bitwise_result);
7473 DCHECK_OPCODE(XGRK);
7474 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7476 int64_t r2_val = get_register(r2);
7477 int64_t r3_val = get_register(r3);
7478 uint64_t bitwise_result = 0;
7479 bitwise_result = r2_val ^ r3_val;
7480 SetS390BitWiseConditionCode<uint64_t>(bitwise_result);
7481 set_register(r1, bitwise_result);
7486 DCHECK_OPCODE(AGRK);
7487 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7489 int64_t r2_val = get_register(r2);
7490 int64_t r3_val = get_register(r3);
7491 bool isOF = CheckOverflowForIntAdd(r2_val, r3_val,
int64_t);
7492 SetS390ConditionCode<int64_t>(r2_val + r3_val, 0);
7493 SetS390OverflowCode(isOF);
7494 set_register(r1, r2_val + r3_val);
7499 DCHECK_OPCODE(SGRK);
7500 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7502 int64_t r2_val = get_register(r2);
7503 int64_t r3_val = get_register(r3);
7504 bool isOF = CheckOverflowForIntSub(r2_val, r3_val,
int64_t);
7505 SetS390ConditionCode<int64_t>(r2_val - r3_val, 0);
7506 SetS390OverflowCode(isOF);
7507 set_register(r1, r2_val - r3_val);
7512 DCHECK_OPCODE(ALGRK);
7513 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7515 uint64_t r2_val = get_register(r2);
7516 uint64_t r3_val = get_register(r3);
7517 bool isOF = CheckOverflowForUIntAdd(r2_val, r3_val);
7518 SetS390ConditionCode<uint64_t>(r2_val + r3_val, 0);
7519 SetS390OverflowCode(isOF);
7520 set_register(r1, r2_val + r3_val);
7525 DCHECK_OPCODE(SLGRK);
7526 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7528 uint64_t r2_val = get_register(r2);
7529 uint64_t r3_val = get_register(r3);
7530 bool isOF = CheckOverflowForUIntSub(r2_val, r3_val);
7531 SetS390ConditionCode<uint64_t>(r2_val - r3_val, 0);
7532 SetS390OverflowCode(isOF);
7533 set_register(r1, r2_val - r3_val);
7538 DCHECK_OPCODE(LOCR);
7539 DECODE_RRF_C_INSTRUCTION(r1, r2, m3);
7540 if (TestConditionCode(m3)) {
7541 set_low_register(r1, get_low_register<int32_t>(r2));
7548 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7550 int32_t r2_val = get_low_register<int32_t>(r2);
7551 int32_t r3_val = get_low_register<int32_t>(r3);
7554 bitwise_result = r2_val & r3_val;
7555 SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
7556 set_low_register(r1, bitwise_result);
7562 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7564 int32_t r2_val = get_low_register<int32_t>(r2);
7565 int32_t r3_val = get_low_register<int32_t>(r3);
7568 bitwise_result = r2_val | r3_val;
7569 SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
7570 set_low_register(r1, bitwise_result);
7576 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7578 int32_t r2_val = get_low_register<int32_t>(r2);
7579 int32_t r3_val = get_low_register<int32_t>(r3);
7582 bitwise_result = r2_val ^ r3_val;
7583 SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
7584 set_low_register(r1, bitwise_result);
7590 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7592 int32_t r2_val = get_low_register<int32_t>(r2);
7593 int32_t r3_val = get_low_register<int32_t>(r3);
7594 bool isOF = CheckOverflowForIntAdd(r2_val, r3_val, int32_t);
7595 SetS390ConditionCode<int32_t>(r2_val + r3_val, 0);
7596 SetS390OverflowCode(isOF);
7597 set_low_register(r1, r2_val + r3_val);
7603 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7605 int32_t r2_val = get_low_register<int32_t>(r2);
7606 int32_t r3_val = get_low_register<int32_t>(r3);
7607 bool isOF = CheckOverflowForIntSub(r2_val, r3_val, int32_t);
7608 SetS390ConditionCode<int32_t>(r2_val - r3_val, 0);
7609 SetS390OverflowCode(isOF);
7610 set_low_register(r1, r2_val - r3_val);
7615 DCHECK_OPCODE(ALRK);
7616 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7618 uint32_t r2_val = get_low_register<uint32_t>(r2);
7619 uint32_t r3_val = get_low_register<uint32_t>(r3);
7620 bool isOF = CheckOverflowForUIntAdd(r2_val, r3_val);
7621 SetS390ConditionCode<uint32_t>(r2_val + r3_val, 0);
7622 SetS390OverflowCode(isOF);
7623 set_low_register(r1, r2_val + r3_val);
7628 DCHECK_OPCODE(SLRK);
7629 DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7631 uint32_t r2_val = get_low_register<uint32_t>(r2);
7632 uint32_t r3_val = get_low_register<uint32_t>(r3);
7633 bool isOF = CheckOverflowForUIntSub(r2_val, r3_val);
7634 SetS390ConditionCode<uint32_t>(r2_val - r3_val, 0);
7635 SetS390OverflowCode(isOF);
7636 set_low_register(r1, r2_val - r3_val);
7642 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7643 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7644 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7645 intptr_t addr = x2_val + b2_val + d2;
7647 set_register(r1, value);
7648 SetS390ConditionCode<int64_t>(value, 0);
7660 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7661 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7662 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7663 int64_t alu_out = get_register(r1);
7664 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
7665 bool isOF = CheckOverflowForIntAdd(alu_out, mem_val,
int64_t);
7667 SetS390ConditionCode<int64_t>(alu_out, 0);
7668 SetS390OverflowCode(isOF);
7669 set_register(r1, alu_out);
7675 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7676 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7677 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7678 int64_t alu_out = get_register(r1);
7679 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
7680 bool isOF = CheckOverflowForIntSub(alu_out, mem_val,
int64_t);
7682 SetS390ConditionCode<int32_t>(alu_out, 0);
7683 SetS390OverflowCode(isOF);
7684 set_register(r1, alu_out);
7690 #ifndef V8_TARGET_ARCH_S390X 7693 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7694 uint64_t r1_val = get_register(r1);
7695 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7696 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7697 intptr_t d2_val = d2;
7698 uint64_t alu_out = r1_val;
7699 uint64_t mem_val =
static_cast<uint64_t
>(ReadDW(b2_val + d2_val + x2_val));
7701 SetS390ConditionCode<uint64_t>(alu_out, 0);
7702 set_register(r1, alu_out);
7708 #ifndef V8_TARGET_ARCH_S390X 7711 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7712 uint64_t r1_val = get_register(r1);
7713 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7714 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7715 intptr_t d2_val = d2;
7716 uint64_t alu_out = r1_val;
7717 uint64_t mem_val =
static_cast<uint64_t
>(ReadDW(b2_val + d2_val + x2_val));
7719 SetS390ConditionCode<uint64_t>(alu_out, 0);
7720 set_register(r1, alu_out);
7726 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7727 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7728 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7729 intptr_t d2_val = d2;
7730 int64_t mem_val = ReadDW(b2_val + d2_val + x2_val);
7731 int64_t r1_val = get_register(r1);
7732 set_register(r1, mem_val * r1_val);
7738 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7739 DCHECK_EQ(r1 % 2, 0);
7740 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7741 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7742 intptr_t d2_val = d2;
7743 int64_t mem_val = ReadDW(b2_val + d2_val + x2_val);
7744 int64_t r1_val = get_register(r1 + 1);
7745 int64_t quotient = r1_val / mem_val;
7746 int64_t remainder = r1_val % mem_val;
7747 set_register(r1, remainder);
7748 set_register(r1 + 1, quotient);
7760 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7761 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7762 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7763 intptr_t addr = x2_val + b2_val + d2;
7764 int32_t value = ReadW(addr, instr);
7765 set_low_register(r1, value);
7766 SetS390ConditionCode<int32_t>(value, 0);
7772 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7774 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7775 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7776 intptr_t addr = x2_val + b2_val + d2;
7778 set_register(r1, mem_val);
7783 DCHECK_OPCODE(LLGF);
7784 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7786 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7787 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7788 intptr_t addr = x2_val + b2_val + d2;
7789 uint64_t mem_val =
static_cast<uint64_t
>(ReadWU(addr, instr));
7790 set_register(r1, mem_val);
7802 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7803 uint64_t r1_val = get_register(r1);
7804 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7805 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7806 intptr_t d2_val = d2;
7807 uint64_t alu_out = r1_val;
7808 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr);
7810 SetS390ConditionCode<int64_t>(alu_out, 0);
7811 set_register(r1, alu_out);
7817 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7818 uint64_t r1_val = get_register(r1);
7819 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7820 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7821 intptr_t d2_val = d2;
7822 uint64_t alu_out = r1_val;
7823 uint32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr);
7825 SetS390ConditionCode<int64_t>(alu_out, 0);
7826 set_register(r1, alu_out);
7843 DCHECK_OPCODE(MSGF);
7844 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7845 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7846 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7847 intptr_t d2_val = d2;
7849 static_cast<int64_t>(ReadW(b2_val + d2_val + x2_val, instr));
7850 int64_t r1_val = get_register(r1);
7851 int64_t product = r1_val * mem_val;
7852 set_register(r1, product);
7857 DCHECK_OPCODE(DSGF);
7858 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7859 DCHECK_EQ(r1 % 2, 0);
7860 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7861 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7862 intptr_t d2_val = d2;
7864 static_cast<int64_t>(ReadW(b2_val + d2_val + x2_val, instr));
7865 int64_t r1_val = get_register(r1 + 1);
7866 int64_t quotient = r1_val / mem_val;
7867 int64_t remainder = r1_val % mem_val;
7868 set_register(r1, remainder);
7869 set_register(r1 + 1, quotient);
7874 DCHECK_OPCODE(LRVG);
7875 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7876 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7877 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7878 intptr_t mem_addr = b2_val + x2_val + d2;
7879 int64_t mem_val = ReadW64(mem_addr, instr);
7880 set_register(r1, ByteReverse(mem_val));
7886 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7887 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7888 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7889 intptr_t mem_addr = b2_val + x2_val + d2;
7890 int32_t mem_val = ReadW(mem_addr, instr);
7891 set_low_register(r1, ByteReverse(mem_val));
7896 DCHECK_OPCODE(LRVH);
7897 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7898 int32_t r1_val = get_low_register<int32_t>(r1);
7899 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7900 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7901 intptr_t mem_addr = b2_val + x2_val + d2;
7902 int16_t mem_val = ReadH(mem_addr, instr);
7903 int32_t result = ByteReverse(mem_val) & 0x0000FFFF;
7904 result |= r1_val & 0xFFFF0000;
7905 set_low_register(r1, result);
7911 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7912 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7913 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7914 int64_t alu_out = get_register(r1);
7915 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
7916 SetS390ConditionCode<int64_t>(alu_out, mem_val);
7917 set_register(r1, alu_out);
7923 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7924 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7925 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7926 int64_t alu_out = get_register(r1);
7927 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
7928 SetS390ConditionCode<uint64_t>(alu_out, mem_val);
7929 set_register(r1, alu_out);
7982 DCHECK_OPCODE(STRV);
7983 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7984 int32_t r1_val = get_low_register<int32_t>(r1);
7985 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7986 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7987 intptr_t mem_addr = b2_val + x2_val + d2;
7988 WriteW(mem_addr, ByteReverse(r1_val), instr);
7993 DCHECK_OPCODE(STRVG);
7994 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7995 int64_t r1_val = get_register(r1);
7996 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
7997 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
7998 intptr_t mem_addr = b2_val + x2_val + d2;
7999 WriteDW(mem_addr, ByteReverse(r1_val));
8004 DCHECK_OPCODE(STRVH);
8005 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8006 int32_t r1_val = get_low_register<int32_t>(r1);
8007 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8008 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8009 intptr_t mem_addr = b2_val + x2_val + d2;
8010 int16_t result =
static_cast<int16_t
>(r1_val >> 16);
8011 WriteH(mem_addr, ByteReverse(result), instr);
8023 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8024 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8025 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8026 intptr_t d2_val = d2;
8027 int32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr);
8028 int32_t r1_val = get_low_register<int32_t>(r1);
8029 set_low_register(r1, mem_val * r1_val);
8035 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8036 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8037 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8038 intptr_t d2_val = d2;
8039 int32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr);
8040 int32_t r1_val = get_low_register<int32_t>(r1);
8042 static_cast<int64_t>(r1_val) * static_cast<int64_t>(mem_val);
8043 int32_t result32 =
static_cast<int32_t
>(result64);
8044 bool isOF = (
static_cast<int64_t>(result32) != result64);
8045 SetS390ConditionCode<int32_t>(result32, 0);
8046 SetS390OverflowCode(isOF);
8047 set_low_register(r1, result32);
8048 set_low_register(r1, mem_val * r1_val);
8054 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8055 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8056 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8057 int32_t alu_out = get_low_register<int32_t>(r1);
8058 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr);
8060 SetS390BitWiseConditionCode<uint32_t>(alu_out);
8061 set_low_register(r1, alu_out);
8067 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8068 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8069 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8070 uint32_t alu_out = get_low_register<uint32_t>(r1);
8071 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr);
8072 SetS390ConditionCode<uint32_t>(alu_out, mem_val);
8078 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8079 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8080 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8081 int32_t alu_out = get_low_register<int32_t>(r1);
8082 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr);
8084 SetS390BitWiseConditionCode<uint32_t>(alu_out);
8085 set_low_register(r1, alu_out);
8091 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8092 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8093 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8094 int32_t alu_out = get_low_register<int32_t>(r1);
8095 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr);
8097 SetS390BitWiseConditionCode<uint32_t>(alu_out);
8098 set_low_register(r1, alu_out);
8104 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8105 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8106 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8107 int32_t alu_out = get_low_register<int32_t>(r1);
8108 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr);
8109 SetS390ConditionCode<int32_t>(alu_out, mem_val);
8115 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8116 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8117 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8118 int32_t alu_out = get_low_register<int32_t>(r1);
8119 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr);
8121 isOF = CheckOverflowForIntAdd(alu_out, mem_val, int32_t);
8123 SetS390ConditionCode<int32_t>(alu_out, 0);
8124 SetS390OverflowCode(isOF);
8125 set_low_register(r1, alu_out);
8131 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8132 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8133 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8134 int32_t alu_out = get_low_register<int32_t>(r1);
8135 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr);
8137 isOF = CheckOverflowForIntSub(alu_out, mem_val, int32_t);
8139 SetS390ConditionCode<int32_t>(alu_out, 0);
8140 SetS390OverflowCode(isOF);
8141 set_low_register(r1, alu_out);
8147 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8148 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8149 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8150 DCHECK_EQ(r1 % 2, 0);
8151 int32_t mem_val = ReadW(b2_val + x2_val + d2, instr);
8152 int32_t r1_val = get_low_register<int32_t>(r1 + 1);
8154 static_cast<int64_t>(r1_val) * static_cast<int64_t>(mem_val);
8155 int32_t high_bits = product >> 32;
8157 int32_t low_bits = product & 0x00000000FFFFFFFF;
8158 set_low_register(r1, high_bits);
8159 set_low_register(r1 + 1, low_bits);
8165 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8166 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8167 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8168 uint32_t alu_out = get_low_register<uint32_t>(r1);
8169 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr);
8171 set_low_register(r1, alu_out);
8172 SetS390ConditionCode<uint32_t>(alu_out, 0);
8178 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8179 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8180 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8181 uint32_t alu_out = get_low_register<uint32_t>(r1);
8182 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr);
8184 set_low_register(r1, alu_out);
8185 SetS390ConditionCode<uint32_t>(alu_out, 0);
8190 DCHECK_OPCODE(STHY);
8191 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8193 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8194 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8195 intptr_t addr = x2_val + b2_val + d2;
8196 uint16_t value = get_low_register<uint32_t>(r1);
8197 WriteH(addr, value, instr);
8203 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8208 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
8209 int64_t rx_val = (rx == 0) ? 0 : get_register(rx);
8210 set_register(r1, rx_val + rb_val + offset);
8215 DCHECK_OPCODE(STCY);
8216 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8218 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8219 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8220 intptr_t addr = x2_val + b2_val + d2;
8221 uint8_t value = get_low_register<uint32_t>(r1);
8222 WriteB(addr, value);
8241 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8242 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8243 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8244 intptr_t addr = x2_val + b2_val + d2;
8245 int32_t mem_val = ReadB(addr);
8246 set_low_register(r1, mem_val);
8252 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8254 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8255 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8256 intptr_t addr = x2_val + b2_val + d2;
8257 int64_t mem_val = ReadB(addr);
8258 set_register(r1, mem_val);
8264 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8266 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8267 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8268 intptr_t addr = x2_val + b2_val + d2;
8269 int32_t result =
static_cast<int32_t
>(ReadH(addr, instr));
8270 set_low_register(r1, result);
8282 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8283 int32_t r1_val = get_low_register<int32_t>(r1);
8284 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8285 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8286 intptr_t d2_val = d2;
8288 static_cast<int32_t
>(ReadH(b2_val + d2_val + x2_val, instr));
8289 int32_t alu_out = 0;
8291 alu_out = r1_val + mem_val;
8292 isOF = CheckOverflowForIntAdd(r1_val, mem_val, int32_t);
8293 set_low_register(r1, alu_out);
8294 SetS390ConditionCode<int32_t>(alu_out, 0);
8295 SetS390OverflowCode(isOF);
8301 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8302 int32_t r1_val = get_low_register<int32_t>(r1);
8303 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8304 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8305 intptr_t d2_val = d2;
8307 static_cast<int32_t
>(ReadH(b2_val + d2_val + x2_val, instr));
8308 int32_t alu_out = 0;
8310 alu_out = r1_val - mem_val;
8311 isOF = CheckOverflowForIntSub(r1_val, mem_val,
int64_t);
8312 set_low_register(r1, alu_out);
8313 SetS390ConditionCode<int32_t>(alu_out, 0);
8314 SetS390OverflowCode(isOF);
8326 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8327 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8328 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8329 int64_t alu_out = get_register(r1);
8330 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
8332 SetS390BitWiseConditionCode<uint32_t>(alu_out);
8333 set_register(r1, alu_out);
8339 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8340 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8341 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8342 int64_t alu_out = get_register(r1);
8343 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
8345 SetS390BitWiseConditionCode<uint32_t>(alu_out);
8346 set_register(r1, alu_out);
8352 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8353 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8354 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8355 int64_t alu_out = get_register(r1);
8356 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
8358 SetS390BitWiseConditionCode<uint32_t>(alu_out);
8359 set_register(r1, alu_out);
8377 #ifdef V8_TARGET_ARCH_S390X 8378 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8379 uint64_t r1_val = get_register(r1);
8380 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8381 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8382 DCHECK_EQ(r1 % 2, 0);
8383 unsigned __int128 dividend =
static_cast<unsigned __int128
>(r1_val) << 64;
8384 dividend += get_register(r1 + 1);
8385 int64_t mem_val = ReadDW(b2_val + x2_val + d2);
8386 uint64_t remainder = dividend % mem_val;
8387 uint64_t quotient = dividend / mem_val;
8388 set_register(r1, remainder);
8389 set_register(r1 + 1, quotient);
8423 DCHECK_OPCODE(LLGH);
8425 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8426 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8427 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8428 intptr_t d2_val = d2;
8429 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val, instr);
8430 set_register(r1, mem_val);
8437 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8438 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8439 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8440 intptr_t d2_val = d2;
8441 uint16_t mem_val = ReadHU(b2_val + d2_val + x2_val, instr);
8442 set_low_register(r1, mem_val);
8448 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8449 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8450 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8451 DCHECK_EQ(r1 % 2, 0);
8452 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr);
8453 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1);
8455 static_cast<uint64_t
>(r1_val) * static_cast<uint64_t>(mem_val);
8456 uint32_t high_bits = product >> 32;
8458 uint32_t low_bits = product & 0x00000000FFFFFFFF;
8459 set_low_register(r1, high_bits);
8460 set_low_register(r1 + 1, low_bits);
8466 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8467 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
8468 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8469 DCHECK_EQ(r1 % 2, 0);
8470 uint32_t mem_val = ReadWU(b2_val + x2_val + d2, instr);
8471 uint32_t r1_val = get_low_register<uint32_t>(r1 + 1);
8473 static_cast<uint64_t
>(r1_val) / static_cast<uint64_t>(mem_val);
8474 uint64_t remainder =
8475 static_cast<uint64_t
>(r1_val) % static_cast<uint64_t>(mem_val);
8476 set_low_register(r1, remainder);
8477 set_low_register(r1 + 1, quotient);
8584 DCHECK_OPCODE(MVGHI);
8586 DECODE_SIL_INSTRUCTION(b1, d1, i2);
8587 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
8588 intptr_t src_addr = b1_val + d1;
8589 WriteDW(src_addr, i2);
8594 DCHECK_OPCODE(MVHI);
8596 DECODE_SIL_INSTRUCTION(b1, d1, i2);
8597 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
8598 intptr_t src_addr = b1_val + d1;
8599 WriteW(src_addr, i2, instr);
8642 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8649 if (r3 < r1) r3 += 16;
8651 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
8654 for (
int i = 0;
i <= r3 - r1;
i++) {
8655 int64_t value = ReadDW(rb_val + offset + 8 *
i);
8656 set_register((r1 +
i) % 16, value);
8662 DCHECK_OPCODE(SRAG);
8664 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8666 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8667 int shiftBits = (b2_val + d2) & 0x3F;
8668 int64_t r3_val = get_register(r3);
8669 intptr_t alu_out = 0;
8671 alu_out = r3_val >> shiftBits;
8672 set_register(r1, alu_out);
8673 SetS390ConditionCode<intptr_t>(alu_out, 0);
8674 SetS390OverflowCode(isOF);
8679 DCHECK_OPCODE(SLAG);
8681 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8683 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8684 int shiftBits = (b2_val + d2) & 0x3F;
8685 int64_t r3_val = get_register(r3);
8686 intptr_t alu_out = 0;
8688 isOF = CheckOverflowForShiftLeft(r3_val, shiftBits);
8689 alu_out = r3_val << shiftBits;
8690 set_register(r1, alu_out);
8691 SetS390ConditionCode<intptr_t>(alu_out, 0);
8692 SetS390OverflowCode(isOF);
8697 DCHECK_OPCODE(SRLG);
8703 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8705 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8706 int shiftBits = (b2_val + d2) & 0x3F;
8708 uint64_t r3_val = get_register(r3);
8709 uint64_t alu_out = 0;
8710 alu_out = r3_val >> shiftBits;
8711 set_register(r1, alu_out);
8716 DCHECK_OPCODE(SLLG);
8722 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8724 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8725 int shiftBits = (b2_val + d2) & 0x3F;
8727 uint64_t r3_val = get_register(r3);
8728 uint64_t alu_out = 0;
8729 alu_out = r3_val << shiftBits;
8730 set_register(r1, alu_out);
8736 DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2);
8737 int32_t offset = d2;
8738 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
8739 intptr_t target_addr =
static_cast<intptr_t
>(rb_val) + offset;
8741 int32_t r1_val = get_low_register<int32_t>(r1);
8742 int32_t r3_val = get_low_register<int32_t>(r3);
8744 DCHECK_EQ(target_addr & 0x3, 0);
8745 bool is_success = __atomic_compare_exchange_n(
8746 reinterpret_cast<int32_t*>(target_addr), &r1_val, r3_val,
true,
8747 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
8749 set_low_register(r1, r1_val);
8750 condition_reg_ = 0x4;
8752 condition_reg_ = 0x8;
8759 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8760 int32_t offset = d2;
8761 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8762 intptr_t target_addr =
static_cast<intptr_t
>(b2_val) + offset;
8764 int32_t r1_val = get_low_register<int32_t>(r1);
8765 int32_t r3_val = get_low_register<int32_t>(r3);
8767 DCHECK_EQ(target_addr & 0x3, 0);
8768 bool is_success = __atomic_compare_exchange_n(
8769 reinterpret_cast<int32_t*>(target_addr), &r1_val, r3_val,
true,
8770 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
8772 set_low_register(r1, r1_val);
8773 condition_reg_ = 0x4;
8775 condition_reg_ = 0x8;
8782 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8783 int32_t offset = d2;
8784 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8785 intptr_t target_addr =
static_cast<intptr_t
>(b2_val) + offset;
8787 int64_t r1_val = get_register(r1);
8788 int64_t r3_val = get_register(r3);
8790 DCHECK_EQ(target_addr & 0x3, 0);
8791 bool is_success = __atomic_compare_exchange_n(
8792 reinterpret_cast<int64_t*>(target_addr), &r1_val, r3_val,
true,
8793 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
8795 set_register(r1, r1_val);
8796 condition_reg_ = 0x4;
8798 condition_reg_ = 0x8;
8804 DCHECK_OPCODE(RLLG);
8810 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8812 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8813 int shiftBits = (b2_val + d2) & 0x3F;
8815 uint64_t r3_val = get_register(r3);
8816 uint64_t alu_out = 0;
8817 uint64_t rotateBits = r3_val >> (64 - shiftBits);
8818 alu_out = (r3_val << shiftBits) | (rotateBits);
8819 set_register(r1, alu_out);
8824 DCHECK_OPCODE(STMG);
8825 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8832 if (r3 < r1) r3 += 16;
8834 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
8837 for (
int i = 0;
i <= r3 - r1;
i++) {
8838 int64_t value = get_register((r1 +
i) % 16);
8839 WriteDW(rb_val + offset + 8 *
i, value);
8895 DECODE_SIY_INSTRUCTION(b1, d1, i2);
8896 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
8897 intptr_t d1_val = d1;
8898 intptr_t addr = b1_val + d1_val;
8899 uint8_t mem_val = ReadB(addr);
8900 uint8_t imm_val = i2;
8901 uint8_t selected_bits = mem_val & imm_val;
8905 if (0 == selected_bits) {
8906 condition_reg_ = CC_EQ;
8907 }
else if (selected_bits == imm_val) {
8908 condition_reg_ = 0x1;
8910 condition_reg_ = 0x4;
8928 DCHECK_OPCODE(CLIY);
8929 DECODE_SIY_INSTRUCTION(b1, d1, i2);
8931 int64_t b1_val = (b1 == 0) ? 0 : get_register(b1);
8932 intptr_t d1_val = d1;
8933 intptr_t addr = b1_val + d1_val;
8934 uint8_t mem_val = ReadB(addr);
8935 uint8_t imm_val = i2;
8936 SetS390ConditionCode<uint8_t>(mem_val, imm_val);
8958 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned);
8959 int8_t i2_8bit =
static_cast<int8_t
>(i2_unsigned);
8960 int32_t i2 =
static_cast<int32_t
>(i2_8bit);
8961 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1);
8964 intptr_t addr = b1_val + d1_val;
8966 int32_t mem_val = ReadW(addr, instr);
8967 bool isOF = CheckOverflowForIntAdd(mem_val, i2, int32_t);
8968 int32_t alu_out = mem_val + i2;
8969 SetS390ConditionCode<int32_t>(alu_out, 0);
8970 SetS390OverflowCode(isOF);
8971 WriteW(addr, alu_out, instr);
8982 DCHECK_OPCODE(AGSI);
8987 DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned);
8988 int8_t i2_8bit =
static_cast<int8_t
>(i2_unsigned);
8990 intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1);
8993 intptr_t addr = b1_val + d1_val;
8995 int64_t mem_val = ReadDW(addr);
8996 int isOF = CheckOverflowForIntAdd(mem_val, i2,
int64_t);
8997 int64_t alu_out = mem_val + i2;
8998 SetS390ConditionCode<uint64_t>(alu_out, 0);
8999 SetS390OverflowCode(isOF);
9000 WriteDW(addr, alu_out);
9035 DCHECK_OPCODE(STMY);
9036 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9043 if (r3 < r1) r3 += 16;
9045 int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2);
9048 for (
int i = 0;
i <= r3 - r1;
i++) {
9049 int32_t value = get_low_register<int32_t>((r1 +
i) % 16);
9050 WriteW(b2_val + offset + 4 *
i, value, instr);
9063 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9070 if (r3 < r1) r3 += 16;
9072 int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2);
9075 for (
int i = 0;
i <= r3 - r1;
i++) {
9076 int32_t value = ReadW(b2_val + offset + 4 *
i, instr);
9077 set_low_register((r1 +
i) % 16, value);
9089 DCHECK_OPCODE(SRAK);
9090 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9093 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9094 int shiftBits = (b2_val + d2) & 0x3F;
9095 int32_t r3_val = get_low_register<int32_t>(r3);
9096 int32_t alu_out = 0;
9098 alu_out = r3_val >> shiftBits;
9099 set_low_register(r1, alu_out);
9100 SetS390ConditionCode<int32_t>(alu_out, 0);
9101 SetS390OverflowCode(isOF);
9106 DCHECK_OPCODE(SLAK);
9107 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9110 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9111 int shiftBits = (b2_val + d2) & 0x3F;
9112 int32_t r3_val = get_low_register<int32_t>(r3);
9113 int32_t alu_out = 0;
9115 isOF = CheckOverflowForShiftLeft(r3_val, shiftBits);
9116 alu_out = r3_val << shiftBits;
9117 set_low_register(r1, alu_out);
9118 SetS390ConditionCode<int32_t>(alu_out, 0);
9119 SetS390OverflowCode(isOF);
9124 DCHECK_OPCODE(SRLK);
9130 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9132 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9133 int shiftBits = (b2_val + d2) & 0x3F;
9135 uint32_t r3_val = get_low_register<uint32_t>(r3);
9137 alu_out = r3_val >> shiftBits;
9138 set_low_register(r1, alu_out);
9143 DCHECK_OPCODE(SLLK);
9149 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9151 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9152 int shiftBits = (b2_val + d2) & 0x3F;
9154 uint32_t r3_val = get_low_register<uint32_t>(r3);
9156 alu_out = r3_val << shiftBits;
9157 set_low_register(r1, alu_out);
9173 #define ATOMIC_LOAD_AND_UPDATE_WORD64(op) \ 9174 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); \ 9175 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); \ 9176 intptr_t addr = static_cast<intptr_t>(b2_val) + d2; \ 9177 int64_t r3_val = get_register(r3); \ 9178 DCHECK_EQ(addr & 0x3, 0); \ 9180 op(reinterpret_cast<int64_t*>(addr), r3_val, __ATOMIC_SEQ_CST); \ 9181 set_register(r1, r1_val); 9184 DCHECK_OPCODE(LANG);
9185 ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_and);
9190 DCHECK_OPCODE(LAOG);
9191 ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_or);
9196 DCHECK_OPCODE(LAXG);
9197 ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_xor);
9202 DCHECK_OPCODE(LAAG);
9203 ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_add);
9213 #undef ATOMIC_LOAD_AND_UPDATE_WORD64 9227 #define ATOMIC_LOAD_AND_UPDATE_WORD32(op) \ 9228 DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2); \ 9229 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); \ 9230 intptr_t addr = static_cast<intptr_t>(b2_val) + d2; \ 9231 int32_t r3_val = get_low_register<int32_t>(r3); \ 9232 DCHECK_EQ(addr & 0x3, 0); \ 9233 int32_t r1_val = op(reinterpret_cast<int32_t*>(addr), \ 9234 r3_val, __ATOMIC_SEQ_CST); \ 9235 set_low_register(r1, r1_val); 9239 ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_and);
9245 ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_or);
9251 ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_xor);
9257 ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_add);
9267 #undef ATOMIC_LOAD_AND_UPDATE_WORD32 9270 DCHECK_OPCODE(BRXHG);
9271 DECODE_RIE_E_INSTRUCTION(r1, r3, i2);
9272 int64_t r1_val = (r1 == 0) ? 0 : get_register(r1);
9273 int64_t r3_val = (r3 == 0) ? 0 : get_register(r3);
9274 intptr_t branch_address = get_pc() + (2 * i2);
9276 int64_t compare_val = r3 % 2 == 0 ? get_register(r3 + 1) : r3_val;
9277 if (r1_val > compare_val) {
9278 set_pc(branch_address);
9280 set_register(r1, r1_val);
9393 DCHECK_OPCODE(LDEB);
9394 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9398 int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
9399 int64_t rx_val = (rx == 0) ? 0 : get_register(rx);
9400 float fval = ReadFloat(rx_val + rb_val + offset);
9401 set_d_register_from_double(r1, static_cast<double>(fval));
9432 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9433 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9434 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9435 intptr_t d2_val = d2;
9436 float r1_val = get_float32_from_d_register(r1);
9437 float fval = ReadFloat(b2_val + x2_val + d2_val);
9438 SetS390ConditionCode<float>(r1_val, fval);
9444 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9445 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9446 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9447 intptr_t d2_val = d2;
9448 float r1_val = get_float32_from_d_register(r1);
9449 float fval = ReadFloat(b2_val + x2_val + d2_val);
9451 set_d_register_from_float32(r1, r1_val);
9452 SetS390ConditionCode<float>(r1_val, 0);
9458 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9459 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9460 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9461 intptr_t d2_val = d2;
9462 float r1_val = get_float32_from_d_register(r1);
9463 float fval = ReadFloat(b2_val + x2_val + d2_val);
9465 set_d_register_from_float32(r1, r1_val);
9466 SetS390ConditionCode<float>(r1_val, 0);
9478 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9479 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9480 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9481 intptr_t d2_val = d2;
9482 float r1_val = get_float32_from_d_register(r1);
9483 float fval = ReadFloat(b2_val + x2_val + d2_val);
9485 set_d_register_from_float32(r1, r1_val);
9526 DCHECK_OPCODE(SQDB);
9527 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9528 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9529 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9530 intptr_t d2_val = d2;
9531 double r1_val = get_double_from_d_register(r1);
9532 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
9533 r1_val = std::sqrt(dbl_val);
9534 set_d_register_from_double(r1, r1_val);
9539 DCHECK_OPCODE(MEEB);
9540 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9541 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9542 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9543 intptr_t d2_val = d2;
9544 float r1_val = get_float32_from_d_register(r1);
9545 float fval = ReadFloat(b2_val + x2_val + d2_val);
9547 set_d_register_from_float32(r1, r1_val);
9560 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9561 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9562 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9563 intptr_t d2_val = d2;
9564 double r1_val = get_double_from_d_register(r1);
9565 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
9566 SetS390ConditionCode<double>(r1_val, dbl_val);
9573 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9574 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9575 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9576 intptr_t d2_val = d2;
9577 double r1_val = get_double_from_d_register(r1);
9578 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
9580 set_d_register_from_double(r1, r1_val);
9581 SetS390ConditionCode<double>(r1_val, 0);
9587 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9588 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9589 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9590 intptr_t d2_val = d2;
9591 double r1_val = get_double_from_d_register(r1);
9592 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
9594 set_d_register_from_double(r1, r1_val);
9595 SetS390ConditionCode<double>(r1_val, 0);
9601 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9602 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9603 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9604 intptr_t d2_val = d2;
9605 double r1_val = get_double_from_d_register(r1);
9606 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
9608 set_d_register_from_double(r1, r1_val);
9614 DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9615 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9616 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9617 intptr_t d2_val = d2;
9618 double r1_val = get_double_from_d_register(r1);
9619 double dbl_val = ReadDouble(b2_val + x2_val + d2_val);
9621 set_d_register_from_double(r1, r1_val);
9699 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9701 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9702 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9703 intptr_t addr = x2_val + b2_val + d2;
9704 float float_val = *
reinterpret_cast<float*
>(addr);
9705 set_d_register_from_float32(r1, float_val);
9711 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9713 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9714 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9715 intptr_t addr = x2_val + b2_val + d2;
9716 uint64_t dbl_val = *
reinterpret_cast<uint64_t*
>(addr);
9717 set_d_register(r1, dbl_val);
9722 DCHECK_OPCODE(STEY);
9723 DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9725 int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
9726 int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9727 intptr_t addr = x2_val + b2_val + d2;
9728 int64_t frs_val = get_d_register(r1) >> 32;
9729 WriteW(addr, static_cast<int32_t>(frs_val), instr);
9734 DCHECK_OPCODE(STDY);
9735 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 intptr_t addr = x2_val + b2_val + d2;
9740 int64_t frs_val = get_d_register(r1);
9741 WriteDW(addr, frs_val);
9774 #endif // USE_SIMULATOR 9775 #endif // V8_TARGET_ARCH_S390