V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
simulator-s390.cc
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <stdarg.h>
6 #include <stdlib.h>
7 #include <cmath>
8 
9 #if V8_TARGET_ARCH_S390
10 
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)
23 
24 // Only build the simulator if not compiling for real s390 hardware.
25 namespace v8 {
26 namespace internal {
27 
28 // This macro provides a platform independent use of sscanf. The reason for
29 // SScanF not being implemented in a platform independent way through
30 // ::v8::internal::OS in the same way as SNPrintF is that the
31 // Windows C Run-Time Library does not provide vsscanf.
32 #define SScanF sscanf // NOLINT
33 
34 // The S390Debugger class is used by the simulator while debugging simulated
35 // z/Architecture code.
36 class S390Debugger {
37  public:
38  explicit S390Debugger(Simulator* sim) : sim_(sim) {}
39 
40  void Stop(Instruction* instr);
41  void Debug();
42 
43  private:
44 #if V8_TARGET_LITTLE_ENDIAN
45  static const Instr kBreakpointInstr = (0x0000FFB2); // TRAP4 0000
46  static const Instr kNopInstr = (0x00160016); // OR r0, r0 x2
47 #else
48  static const Instr kBreakpointInstr = (0xB2FF0000); // TRAP4 0000
49  static const Instr kNopInstr = (0x16001600); // OR r0, r0 x2
50 #endif
51 
52  Simulator* sim_;
53 
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);
60 
61  // Set or delete a breakpoint. Returns true if successful.
62  bool SetBreakpoint(Instruction* break_pc);
63  bool DeleteBreakpoint(Instruction* break_pc);
64 
65  // Undo and redo all breakpoints. This is needed to bracket disassembly and
66  // execution to skip past breakpoints when run from the debugger.
67  void UndoBreakpoints();
68  void RedoBreakpoints();
69 };
70 
71 void S390Debugger::Stop(Instruction* instr) {
72  // Get the stop code.
73  // use of kStopCodeMask not right on PowerPC
74  uint32_t code = instr->SvcValue() & kStopCodeMask;
75  // Retrieve the encoded address, which comes just after this stop.
76  char* msg = *reinterpret_cast<char**>(sim_->get_pc() + sizeof(FourByteInstr));
77  // Update this stop description.
78  if (sim_->isWatchedStop(code) && !sim_->watched_stops_[code].desc) {
79  sim_->watched_stops_[code].desc = msg;
80  }
81  // Print the stop message and code if it is not the default code.
82  if (code != kMaxStopCode) {
83  PrintF("Simulator hit stop %u: %s\n", code, msg);
84  } else {
85  PrintF("Simulator hit %s\n", msg);
86  }
87  sim_->set_pc(sim_->get_pc() + sizeof(FourByteInstr) + kPointerSize);
88  Debug();
89 }
90 
91 intptr_t S390Debugger::GetRegisterValue(int regnum) {
92  return sim_->get_register(regnum);
93 }
94 
95 double S390Debugger::GetRegisterPairDoubleValue(int regnum) {
96  return sim_->get_double_from_register_pair(regnum);
97 }
98 
99 double S390Debugger::GetFPDoubleRegisterValue(int regnum) {
100  return sim_->get_double_from_d_register(regnum);
101 }
102 
103 float S390Debugger::GetFPFloatRegisterValue(int regnum) {
104  return sim_->get_float32_from_d_register(regnum);
105 }
106 
107 bool S390Debugger::GetValue(const char* desc, intptr_t* value) {
108  int regnum = Registers::Number(desc);
109  if (regnum != kNoRegister) {
110  *value = GetRegisterValue(regnum);
111  return true;
112  } else {
113  if (strncmp(desc, "0x", 2) == 0) {
114  return SScanF(desc + 2, "%" V8PRIxPTR,
115  reinterpret_cast<uintptr_t*>(value)) == 1;
116  } else {
117  return SScanF(desc, "%" V8PRIuPTR, reinterpret_cast<uintptr_t*>(value)) ==
118  1;
119  }
120  }
121  return false;
122 }
123 
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);
128  return true;
129  }
130  return false;
131 }
132 
133 bool S390Debugger::SetBreakpoint(Instruction* break_pc) {
134  // Check if a breakpoint can be set. If not return without any side-effects.
135  if (sim_->break_pc_ != nullptr) {
136  return false;
137  }
138 
139  // Set the breakpoint.
140  sim_->break_pc_ = break_pc;
141  sim_->break_instr_ = break_pc->InstructionBits();
142  // Not setting the breakpoint instruction in the code itself. It will be set
143  // when the debugger shell continues.
144  return true;
145 }
146 
147 bool S390Debugger::DeleteBreakpoint(Instruction* break_pc) {
148  if (sim_->break_pc_ != nullptr) {
149  sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
150  }
151 
152  sim_->break_pc_ = nullptr;
153  sim_->break_instr_ = 0;
154  return true;
155 }
156 
157 void S390Debugger::UndoBreakpoints() {
158  if (sim_->break_pc_ != nullptr) {
159  sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
160  }
161 }
162 
163 void S390Debugger::RedoBreakpoints() {
164  if (sim_->break_pc_ != nullptr) {
165  sim_->break_pc_->SetInstructionBits(kBreakpointInstr);
166  }
167 }
168 
169 void S390Debugger::Debug() {
170  intptr_t last_pc = -1;
171  bool done = false;
172 
173 #define COMMAND_SIZE 63
174 #define ARG_SIZE 255
175 
176 #define STR(a) #a
177 #define XSTR(a) STR(a)
178 
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};
183 
184  // make sure to have a proper terminating character if reaching the limit
185  cmd[COMMAND_SIZE] = 0;
186  arg1[ARG_SIZE] = 0;
187  arg2[ARG_SIZE] = 0;
188 
189  // Undo all set breakpoints while running in the debugger shell. This will
190  // make them invisible to all commands.
191  UndoBreakpoints();
192  // Disable tracing while simulating
193  bool trace = ::v8::internal::FLAG_trace_sim;
194  ::v8::internal::FLAG_trace_sim = false;
195 
196  while (!done && !sim_->has_bad_pc()) {
197  if (last_pc != sim_->get_pc()) {
198  disasm::NameConverter converter;
199  disasm::Disassembler dasm(converter);
200  // use a reasonably large buffer
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();
205  }
206  char* line = ReadLine("sim> ");
207  if (line == nullptr) {
208  break;
209  } else {
210  char* last_input = sim_->last_debugger_input();
211  if (strcmp(line, "\n") == 0 && last_input != nullptr) {
212  line = last_input;
213  } else {
214  // Ownership is transferred to sim_;
215  sim_->set_last_debugger_input(line);
216  }
217  // Use sscanf to parse the individual parts of the command line. At the
218  // moment no command expects more than two parameters.
219  int argc = SScanF(line,
220  "%" XSTR(COMMAND_SIZE) "s "
221  "%" XSTR(ARG_SIZE) "s "
222  "%" XSTR(ARG_SIZE) "s",
223  cmd, arg1, arg2);
224  if ((strcmp(cmd, "si") == 0) || (strcmp(cmd, "stepi") == 0)) {
225  intptr_t value;
226 
227  // If at a breakpoint, proceed past it.
228  if ((reinterpret_cast<Instruction*>(sim_->get_pc()))
229  ->InstructionBits() == 0x7D821008) {
230  sim_->set_pc(sim_->get_pc() + sizeof(FourByteInstr));
231  } else {
232  sim_->ExecuteInstruction(
233  reinterpret_cast<Instruction*>(sim_->get_pc()));
234  }
235 
236  if (argc == 2 && last_pc != sim_->get_pc()) {
237  disasm::NameConverter converter;
238  disasm::Disassembler dasm(converter);
239  // use a reasonably large buffer
241 
242  if (GetValue(arg1, &value)) {
243  // Interpret a numeric argument as the number of instructions to
244  // step past.
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(),
249  buffer.start());
250  sim_->ExecuteInstruction(
251  reinterpret_cast<Instruction*>(sim_->get_pc()));
252  }
253  } else {
254  // Otherwise treat it as the mnemonic of the opcode to stop at.
255  char mnemonic[256];
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 != ' ')
261  mnemonicStart++;
262  SScanF(mnemonicStart, "%s", mnemonic);
263  if (!strcmp(arg1, mnemonic)) break;
264 
265  PrintF(" 0x%08" V8PRIxPTR " %s\n", sim_->get_pc(),
266  buffer.start());
267  sim_->ExecuteInstruction(
268  reinterpret_cast<Instruction*>(sim_->get_pc()));
269  }
270  }
271  }
272  } else if ((strcmp(cmd, "c") == 0) || (strcmp(cmd, "cont") == 0)) {
273  // If at a breakpoint, proceed past it.
274  if ((reinterpret_cast<Instruction*>(sim_->get_pc()))
275  ->InstructionBits() == 0x7D821008) {
276  sim_->set_pc(sim_->get_pc() + sizeof(FourByteInstr));
277  } else {
278  // Execute the one instruction we broke at with breakpoints disabled.
279  sim_->ExecuteInstruction(
280  reinterpret_cast<Instruction*>(sim_->get_pc()));
281  }
282  // Leave the debugger shell.
283  done = true;
284  } else if ((strcmp(cmd, "p") == 0) || (strcmp(cmd, "print") == 0)) {
285  if (argc == 2 || (argc == 3 && strcmp(arg2, "fp") == 0)) {
286  intptr_t value;
287  double dvalue;
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 &&
294  (i % 2) == 0) {
295  dvalue = GetRegisterPairDoubleValue(i);
296  PrintF(" (%f)\n", dvalue);
297  } else if (i != 0 && !((i + 1) & 3)) {
298  PrintF("\n");
299  }
300  }
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 &&
309  (i % 2) == 0) {
310  dvalue = GetRegisterPairDoubleValue(i);
311  PrintF(" (%f)\n", dvalue);
312  } else if (!((i + 1) % 2)) {
313  PrintF("\n");
314  }
315  }
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);
321  uint32_t as_words = bit_cast<uint32_t>(fvalue);
322  PrintF("%3s: %f 0x%08x\n",
323  RegisterName(DoubleRegister::from_code(i)), fvalue,
324  as_words);
325  }
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));
334  }
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,
343  value);
344  } else {
345  PrintF("%s unrecognized\n", arg1);
346  }
347  } else {
348  if (GetValue(arg1, &value)) {
349  PrintF("%s: 0x%08" V8PRIxPTR " %" V8PRIdPTR "\n", arg1, value,
350  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));
356  } else {
357  PrintF("%s unrecognized\n", arg1);
358  }
359  }
360  } else {
361  PrintF("print <register>\n");
362  }
363  } else if ((strcmp(cmd, "po") == 0) ||
364  (strcmp(cmd, "printobject") == 0)) {
365  if (argc == 2) {
366  intptr_t value;
367  StdoutStream os;
368  if (GetValue(arg1, &value)) {
369  Object* obj = reinterpret_cast<Object*>(value);
370  os << arg1 << ": \n";
371 #ifdef DEBUG
372  obj->Print(os);
373  os << "\n";
374 #else
375  os << Brief(obj) << "\n";
376 #endif
377  } else {
378  os << arg1 << " unrecognized\n";
379  }
380  } else {
381  PrintF("printobject <value>\n");
382  }
383  } else if (strcmp(cmd, "setpc") == 0) {
384  intptr_t value;
385 
386  if (!GetValue(arg1, &value)) {
387  PrintF("%s unrecognized\n", arg1);
388  continue;
389  }
390  sim_->set_pc(value);
391  } else if (strcmp(cmd, "stack") == 0 || strcmp(cmd, "mem") == 0) {
392  intptr_t* cur = nullptr;
393  intptr_t* end = nullptr;
394  int next_arg = 1;
395 
396  if (strcmp(cmd, "stack") == 0) {
397  cur = reinterpret_cast<intptr_t*>(sim_->get_register(Simulator::sp));
398  } else { // "mem"
399  intptr_t value;
400  if (!GetValue(arg1, &value)) {
401  PrintF("%s unrecognized\n", arg1);
402  continue;
403  }
404  cur = reinterpret_cast<intptr_t*>(value);
405  next_arg++;
406  }
407 
408  intptr_t words; // likely inaccurate variable name for 64bit
409  if (argc == next_arg) {
410  words = 10;
411  } else {
412  if (!GetValue(argv[next_arg], &words)) {
413  words = 10;
414  }
415  }
416  end = cur + words;
417 
418  while (cur < end) {
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)) {
428  PrintF(" (");
429  obj->ShortPrint();
430  PrintF(")");
431  }
432  PrintF("\n");
433  cur++;
434  }
435  } else if (strcmp(cmd, "disasm") == 0 || strcmp(cmd, "di") == 0) {
436  disasm::NameConverter converter;
437  disasm::Disassembler dasm(converter);
438  // use a reasonably large buffer
440 
441  byte* prev = nullptr;
442  byte* cur = nullptr;
443  // Default number of instructions to disassemble.
444  int32_t numInstructions = 10;
445 
446  if (argc == 1) {
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) {
451  // The argument is an address or a register name.
452  intptr_t value;
453  if (GetValue(arg1, &value)) {
454  cur = reinterpret_cast<byte*>(value);
455  }
456  } else {
457  // The argument is the number of instructions.
458  intptr_t value;
459  if (GetValue(arg1, &value)) {
460  cur = reinterpret_cast<byte*>(sim_->get_pc());
461  // Disassemble <arg1> instructions.
462  numInstructions = static_cast<int32_t>(value);
463  }
464  }
465  } else {
466  intptr_t value1;
467  intptr_t value2;
468  if (GetValue(arg1, &value1) && GetValue(arg2, &value2)) {
469  cur = reinterpret_cast<byte*>(value1);
470  // Disassemble <arg2> instructions.
471  numInstructions = static_cast<int32_t>(value2);
472  }
473  }
474 
475  while (numInstructions > 0) {
476  prev = cur;
477  cur += dasm.InstructionDecode(buffer, cur);
478  PrintF(" 0x%08" V8PRIxPTR " %s\n", reinterpret_cast<intptr_t>(prev),
479  buffer.start());
480  numInstructions--;
481  }
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) {
487  if (argc == 2) {
488  intptr_t value;
489  if (GetValue(arg1, &value)) {
490  if (!SetBreakpoint(reinterpret_cast<Instruction*>(value))) {
491  PrintF("setting breakpoint failed\n");
492  }
493  } else {
494  PrintF("%s unrecognized\n", arg1);
495  }
496  } else {
497  PrintF("break <address>\n");
498  }
499  } else if (strcmp(cmd, "del") == 0) {
500  if (!DeleteBreakpoint(nullptr)) {
501  PrintF("deleting breakpoint failed\n");
502  }
503  } else if (strcmp(cmd, "cr") == 0) {
504  PrintF("Condition reg: %08x\n", sim_->condition_reg_);
505  } else if (strcmp(cmd, "stop") == 0) {
506  intptr_t value;
507  intptr_t stop_pc =
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)) {
513  // Remove the current stop.
514  if (sim_->isStopInstruction(stop_instr)) {
515  stop_instr->SetInstructionBits(kNopInstr);
516  msg_address->SetInstructionBits(kNopInstr);
517  } else {
518  PrintF("Not at debugger stop.\n");
519  }
520  } else if (argc == 3) {
521  // Print information about all/the specified breakpoint(s).
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);
527  }
528  } else if (GetValue(arg2, &value)) {
529  sim_->PrintStopInfo(value);
530  } else {
531  PrintF("Unrecognized argument.\n");
532  }
533  } else if (strcmp(arg1, "enable") == 0) {
534  // Enable all/the specified breakpoint(s).
535  if (strcmp(arg2, "all") == 0) {
536  for (uint32_t i = 0; i < sim_->kNumOfWatchedStops; i++) {
537  sim_->EnableStop(i);
538  }
539  } else if (GetValue(arg2, &value)) {
540  sim_->EnableStop(value);
541  } else {
542  PrintF("Unrecognized argument.\n");
543  }
544  } else if (strcmp(arg1, "disable") == 0) {
545  // Disable all/the specified breakpoint(s).
546  if (strcmp(arg2, "all") == 0) {
547  for (uint32_t i = 0; i < sim_->kNumOfWatchedStops; i++) {
548  sim_->DisableStop(i);
549  }
550  } else if (GetValue(arg2, &value)) {
551  sim_->DisableStop(value);
552  } else {
553  PrintF("Unrecognized argument.\n");
554  }
555  }
556  } else {
557  PrintF("Wrong usage. Use help command for more information.\n");
558  }
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)) {
566  PrintF("cont\n");
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");
573  PrintF(
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");
578  PrintF(
579  " use register name 'allf' to display floating-point "
580  "registers\n");
581  PrintF("printobject <register>\n");
582  PrintF(" print an object from a register (alias 'po')\n");
583  PrintF("cr\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");
594  PrintF("gdb\n");
595  PrintF(" enter gdb\n");
596  PrintF("break <address>\n");
597  PrintF(" set a break point on the address\n");
598  PrintF("del\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");
623  } else {
624  PrintF("Unknown command: %s\n", cmd);
625  }
626  }
627  }
628 
629  // Add all the breakpoints back to stop execution and enter the debugger
630  // shell when hit.
631  RedoBreakpoints();
632  // Restore tracing
633  ::v8::internal::FLAG_trace_sim = trace;
634 
635 #undef COMMAND_SIZE
636 #undef ARG_SIZE
637 
638 #undef STR
639 #undef XSTR
640 }
641 
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);
645  return one == two;
646 }
647 
648 static uint32_t ICacheHash(void* key) {
649  return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(key)) >> 2;
650 }
651 
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;
656 }
657 
658 void Simulator::set_last_debugger_input(char* input) {
659  DeleteArray(last_debugger_input_);
660  last_debugger_input_ = input;
661 }
662 
663 void Simulator::SetRedirectInstruction(Instruction* instruction) {
664 // we use TRAP4 here (0xBF22)
665 #if V8_TARGET_LITTLE_ENDIAN
666  instruction->SetInstructionBits(0x1000FFB2);
667 #else
668  instruction->SetInstructionBits(0xB2FF0000 | kCallRtRedirected);
669 #endif
670 }
671 
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);
676  start -= intra_line;
677  size += intra_line;
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));
686  offset = 0;
687  }
688  if (size != 0) {
689  FlushOnePage(i_cache, start, size);
690  }
691 }
692 
693 CachePage* Simulator::GetCachePage(base::CustomMatcherHashMap* i_cache,
694  void* page) {
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;
699  }
700  return reinterpret_cast<CachePage*>(entry->value);
701 }
702 
703 // Flush from start up to and not including start + size.
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);
715 }
716 
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);
727  if (cache_hit) {
728  // Check that the data in memory matches the contents of the I-cache.
729  CHECK_EQ(memcmp(reinterpret_cast<void*>(instr),
730  cache_page->CachedData(offset), sizeof(FourByteInstr)),
731  0);
732  } else {
733  // Cache miss. Load memory into the cache.
734  memcpy(cached_line, line, CachePage::kLineLength);
735  *cache_valid_byte = CachePage::LINE_VALID;
736  }
737 }
738 
739 Simulator::EvaluateFuncType Simulator::EvalTable[] = {nullptr};
740 
741 void Simulator::EvalTableInit() {
742  for (int i = 0; i < MAX_NUM_OPCODES; i++) {
743  EvalTable[i] = &Simulator::Evaluate_Unknown;
744  }
745 
746 #define S390_SUPPORTED_VECTOR_OPCODE_LIST(V) \
747  V(vfs, VFS, 0xE7E2) /* type = VRR_C VECTOR FP SUBTRACT */ \
748  V(vfa, VFA, 0xE7E3) /* type = VRR_C VECTOR FP ADD */ \
749  V(vfd, VFD, 0xE7E5) /* type = VRR_C VECTOR FP DIVIDE */ \
750  V(vfm, VFM, 0xE7E7) /* type = VRR_C VECTOR FP MULTIPLY */
751 
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
756 
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;
1485 } // NOLINT
1486 
1487 Simulator::Simulator(Isolate* isolate) : isolate_(isolate) {
1488  static base::OnceType once = V8_ONCE_INIT;
1489  base::CallOnce(&once, &Simulator::EvalTableInit);
1490 // Set up simulator support first. Some of this information is needed to
1491 // setup the architecture state.
1492 #if V8_TARGET_ARCH_S390X
1493  size_t stack_size = FLAG_sim_stack_size * KB;
1494 #else
1495  size_t stack_size = MB; // allocate 1MB for stack
1496 #endif
1497  stack_size += 2 * stack_protection_size_;
1498  stack_ = reinterpret_cast<char*>(malloc(stack_size));
1499  pc_modified_ = false;
1500  icount_ = 0;
1501  break_pc_ = nullptr;
1502  break_instr_ = 0;
1503 
1504 // make sure our register type can hold exactly 4/8 bytes
1505 #ifdef V8_TARGET_ARCH_S390X
1506  DCHECK_EQ(sizeof(intptr_t), 8);
1507 #else
1508  DCHECK_EQ(sizeof(intptr_t), 4);
1509 #endif
1510  // Set up architecture state.
1511  // All registers are initialized to zero to start with.
1512  for (int i = 0; i < kNumGPRs; i++) {
1513  registers_[i] = 0;
1514  }
1515  condition_reg_ = 0;
1516  special_reg_pc_ = 0;
1517 
1518  // Initializing FP registers.
1519  for (int i = 0; i < kNumFPRs; i++) {
1520  fp_registers_[i] = 0.0;
1521  }
1522 
1523  // The sp is initialized to point to the bottom (high address) of the
1524  // allocated stack area. To be safe in potential stack underflows we leave
1525  // some buffer below.
1526  registers_[sp] =
1527  reinterpret_cast<intptr_t>(stack_) + stack_size - stack_protection_size_;
1528 
1529  last_debugger_input_ = nullptr;
1530 }
1531 
1532 Simulator::~Simulator() { free(stack_); }
1533 
1534 // Get the active Simulator for the current thread.
1535 Simulator* Simulator::current(Isolate* isolate) {
1537  isolate->FindOrAllocatePerThreadDataForThisThread();
1538  DCHECK_NOT_NULL(isolate_data);
1539 
1540  Simulator* sim = isolate_data->simulator();
1541  if (sim == nullptr) {
1542  // TODO(146): delete the simulator object when a thread/isolate goes away.
1543  sim = new Simulator(isolate);
1544  isolate_data->set_simulator(sim);
1545  }
1546  return sim;
1547 }
1548 
1549 // Sets the register in the architecture state.
1550 void Simulator::set_register(int reg, uint64_t value) {
1551  DCHECK((reg >= 0) && (reg < kNumGPRs));
1552  registers_[reg] = value;
1553 }
1554 
1555 // Get the register from the architecture state.
1556 uint64_t Simulator::get_register(int reg) const {
1557  DCHECK((reg >= 0) && (reg < kNumGPRs));
1558  // Stupid code added to avoid bug in GCC.
1559  // See: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43949
1560  if (reg >= kNumGPRs) return 0;
1561  // End stupid code.
1562  return registers_[reg];
1563 }
1564 
1565 template <typename T>
1566 T Simulator::get_low_register(int reg) const {
1567  DCHECK((reg >= 0) && (reg < kNumGPRs));
1568  // Stupid code added to avoid bug in GCC.
1569  // See: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43949
1570  if (reg >= kNumGPRs) return 0;
1571  // End stupid code.
1572  return static_cast<T>(registers_[reg] & 0xFFFFFFFF);
1573 }
1574 
1575 template <typename T>
1576 T Simulator::get_high_register(int reg) const {
1577  DCHECK((reg >= 0) && (reg < kNumGPRs));
1578  // Stupid code added to avoid bug in GCC.
1579  // See: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43949
1580  if (reg >= kNumGPRs) return 0;
1581  // End stupid code.
1582  return static_cast<T>(registers_[reg] >> 32);
1583 }
1584 
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;
1590 }
1591 
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;
1597 }
1598 
1599 double Simulator::get_double_from_register_pair(int reg) {
1600  DCHECK((reg >= 0) && (reg < kNumGPRs) && ((reg % 2) == 0));
1601 
1602  double dm_val = 0.0;
1603 #if 0 && !V8_TARGET_ARCH_S390X // doesn't make sense in 64bit mode
1604  // Read the bits from the unsigned integer register_[] array
1605  // into the double precision floating point value and return it.
1606  char buffer[sizeof(fp_registers_[0])];
1607  memcpy(buffer, &registers_[reg], 2 * sizeof(registers_[0]));
1608  memcpy(&dm_val, buffer, 2 * sizeof(registers_[0]));
1609 #endif
1610  return (dm_val);
1611 }
1612 
1613 // Raw access to the PC register.
1614 void Simulator::set_pc(intptr_t value) {
1615  pc_modified_ = true;
1616  special_reg_pc_ = value;
1617 }
1618 
1619 bool Simulator::has_bad_pc() const {
1620  return ((special_reg_pc_ == bad_lr) || (special_reg_pc_ == end_sim_pc));
1621 }
1622 
1623 // Raw access to the PC register without the special adjustment when reading.
1624 intptr_t Simulator::get_pc() const { return special_reg_pc_; }
1625 
1626 // Runtime FP routines take:
1627 // - two double arguments
1628 // - one double argument and zero or one integer arguments.
1629 // All are consructed here from d1, d2 and r2.
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);
1634 }
1635 
1636 // The return value is in d0.
1637 void Simulator::SetFpResult(const double& result) {
1638  set_d_register_from_double(0, result);
1639 }
1640 
1641 void Simulator::TrashCallerSaveRegisters() {
1642 // We don't trash the registers with the return value.
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;
1647 #endif
1648 }
1649 
1650 uint32_t Simulator::ReadWU(intptr_t addr, Instruction* instr) {
1651  uint32_t* ptr = reinterpret_cast<uint32_t*>(addr);
1652  return *ptr;
1653 }
1654 
1655 int64_t Simulator::ReadW64(intptr_t addr, Instruction* instr) {
1656  int64_t* ptr = reinterpret_cast<int64_t*>(addr);
1657  return *ptr;
1658 }
1659 
1660 int32_t Simulator::ReadW(intptr_t addr, Instruction* instr) {
1661  int32_t* ptr = reinterpret_cast<int32_t*>(addr);
1662  return *ptr;
1663 }
1664 
1665 void Simulator::WriteW(intptr_t addr, uint32_t value, Instruction* instr) {
1666  uint32_t* ptr = reinterpret_cast<uint32_t*>(addr);
1667  *ptr = value;
1668  return;
1669 }
1670 
1671 void Simulator::WriteW(intptr_t addr, int32_t value, Instruction* instr) {
1672  int32_t* ptr = reinterpret_cast<int32_t*>(addr);
1673  *ptr = value;
1674  return;
1675 }
1676 
1677 uint16_t Simulator::ReadHU(intptr_t addr, Instruction* instr) {
1678  uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
1679  return *ptr;
1680 }
1681 
1682 int16_t Simulator::ReadH(intptr_t addr, Instruction* instr) {
1683  int16_t* ptr = reinterpret_cast<int16_t*>(addr);
1684  return *ptr;
1685 }
1686 
1687 void Simulator::WriteH(intptr_t addr, uint16_t value, Instruction* instr) {
1688  uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
1689  *ptr = value;
1690  return;
1691 }
1692 
1693 void Simulator::WriteH(intptr_t addr, int16_t value, Instruction* instr) {
1694  int16_t* ptr = reinterpret_cast<int16_t*>(addr);
1695  *ptr = value;
1696  return;
1697 }
1698 
1699 uint8_t Simulator::ReadBU(intptr_t addr) {
1700  uint8_t* ptr = reinterpret_cast<uint8_t*>(addr);
1701  return *ptr;
1702 }
1703 
1704 int8_t Simulator::ReadB(intptr_t addr) {
1705  int8_t* ptr = reinterpret_cast<int8_t*>(addr);
1706  return *ptr;
1707 }
1708 
1709 void Simulator::WriteB(intptr_t addr, uint8_t value) {
1710  uint8_t* ptr = reinterpret_cast<uint8_t*>(addr);
1711  *ptr = value;
1712 }
1713 
1714 void Simulator::WriteB(intptr_t addr, int8_t value) {
1715  int8_t* ptr = reinterpret_cast<int8_t*>(addr);
1716  *ptr = value;
1717 }
1718 
1719 int64_t Simulator::ReadDW(intptr_t addr) {
1720  int64_t* ptr = reinterpret_cast<int64_t*>(addr);
1721  return *ptr;
1722 }
1723 
1724 void Simulator::WriteDW(intptr_t addr, int64_t value) {
1725  int64_t* ptr = reinterpret_cast<int64_t*>(addr);
1726  *ptr = value;
1727  return;
1728 }
1729 
1733 double Simulator::ReadDouble(intptr_t addr) {
1734  double* ptr = reinterpret_cast<double*>(addr);
1735  return *ptr;
1736 }
1737 
1738 float Simulator::ReadFloat(intptr_t addr) {
1739  float* ptr = reinterpret_cast<float*>(addr);
1740  return *ptr;
1741 }
1742 
1743 // Returns the limit of the stack area to enable checking for stack overflows.
1744 uintptr_t Simulator::StackLimit(uintptr_t c_limit) const {
1745  // The simulator uses a separate JS stack. If we have exhausted the C stack,
1746  // we also drop down the JS limit to reflect the exhaustion on the JS stack.
1747  if (GetCurrentStackPosition() < c_limit) {
1748  return reinterpret_cast<uintptr_t>(get_sp());
1749  }
1750 
1751  // Otherwise the limit is the JS stack. Leave a safety margin to prevent
1752  // overrunning the stack when pushing values.
1753  return reinterpret_cast<uintptr_t>(stack_) + stack_protection_size_;
1754 }
1755 
1756 // Unsupported instructions use Format to print an error and stop execution.
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);
1760  UNIMPLEMENTED();
1761 }
1762 
1763 // Calculate C flag value for additions.
1764 bool Simulator::CarryFrom(int32_t left, int32_t right, int32_t carry) {
1765  uint32_t uleft = static_cast<uint32_t>(left);
1766  uint32_t uright = static_cast<uint32_t>(right);
1767  uint32_t urest = 0xFFFFFFFFU - uleft;
1768 
1769  return (uright > urest) ||
1770  (carry && (((uright + 1) > urest) || (uright > (urest - 1))));
1771 }
1772 
1773 // Calculate C flag value for subtractions.
1774 bool Simulator::BorrowFrom(int32_t left, int32_t right) {
1775  uint32_t uleft = static_cast<uint32_t>(left);
1776  uint32_t uright = static_cast<uint32_t>(right);
1777 
1778  return (uright > uleft);
1779 }
1780 
1781 // Calculate V flag value for additions and subtractions.
1782 template <typename T1>
1783 bool Simulator::OverflowFromSigned(T1 alu_out, T1 left, T1 right,
1784  bool addition) {
1785  bool overflow;
1786  if (addition) {
1787  // operands have the same sign
1788  overflow = ((left >= 0 && right >= 0) || (left < 0 && right < 0))
1789  // and operands and result have different sign
1790  && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
1791  } else {
1792  // operands have different signs
1793  overflow = ((left < 0 && right >= 0) || (left >= 0 && right < 0))
1794  // and first operand and result have different signs
1795  && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
1796  }
1797  return overflow;
1798 }
1799 
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);
1804 }
1805 #else
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);
1810 #else
1811  *x = static_cast<int32_t>(*pair);
1812  *y = static_cast<int32_t>(*pair >> 32);
1813 #endif
1814 }
1815 #endif
1816 
1817 // Calls into the V8 runtime.
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,
1822  intptr_t arg8);
1823 typedef ObjectPair (*SimulatorRuntimePairCall)(intptr_t arg0, intptr_t arg1,
1824  intptr_t arg2, intptr_t arg3,
1825  intptr_t arg4, intptr_t arg5);
1826 
1827 // These prototypes handle the four types of FP calls.
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);
1832 
1833 // This signature supports direct call in to API function native callback
1834 // (refer to InvocationCallback in v8.h).
1835 typedef void (*SimulatorRuntimeDirectApiCall)(intptr_t arg0);
1836 typedef void (*SimulatorRuntimeProfilingApiCall)(intptr_t arg0, void* arg1);
1837 
1838 // This signature supports direct call to accessor getter callback.
1839 typedef void (*SimulatorRuntimeDirectGetterCall)(intptr_t arg0, intptr_t arg1);
1840 typedef void (*SimulatorRuntimeProfilingGetterCall)(intptr_t arg0,
1841  intptr_t arg1, void* arg2);
1842 
1843 // Software interrupt instructions are used by the simulator to call into the
1844 // C-based V8 runtime.
1845 void Simulator::SoftwareInterrupt(Instruction* instr) {
1846  int svc = instr->SvcValue();
1847  switch (svc) {
1848  case kCallRtRedirected: {
1849  // Check if stack is aligned. Error if not aligned is reported below to
1850  // include information on the function called.
1851  bool stack_aligned =
1852  (get_register(sp) & (::v8::internal::FLAG_sim_stack_alignment - 1)) ==
1853  0;
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);
1864  arg0_regnum++;
1865  }
1866  intptr_t arg[kArgCount];
1867  // First 5 arguments in registers r2-r6.
1868  for (int i = 0; i < kRegisterArgCount; i++) {
1869  arg[i] = get_register(arg0_regnum + i);
1870  }
1871  // Remaining arguments on stack
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)];
1876  }
1877  STATIC_ASSERT(kArgCount == kRegisterArgCount + 4);
1878  STATIC_ASSERT(kMaxCParameters == 9);
1879  bool fp_call =
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);
1884 
1885  // Place the return address on the stack, making the call GC safe.
1886  *reinterpret_cast<intptr_t*>(get_register(sp) +
1887  kStackFrameRASlot * kPointerSize) =
1888  get_register(r14);
1889 
1890  intptr_t external =
1891  reinterpret_cast<intptr_t>(redirection->external_function());
1892  if (fp_call) {
1893  double dval0, dval1; // one or two double parameters
1894  intptr_t ival; // zero or one integer parameters
1895  int iresult = 0; // integer return value
1896  double dresult = 0; // double return value
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)),
1906  dval0, dval1);
1907  break;
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)),
1911  dval0);
1912  break;
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)),
1916  dval0, ival);
1917  break;
1918  default:
1919  UNREACHABLE();
1920  break;
1921  }
1922  if (!stack_aligned) {
1923  PrintF(" with unaligned stack %08" V8PRIxPTR "\n",
1924  static_cast<intptr_t>(get_register(sp)));
1925  }
1926  PrintF("\n");
1927  }
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);
1935  break;
1936  }
1937  case ExternalReference::BUILTIN_FP_FP_CALL: {
1938  SimulatorRuntimeFPFPCall target =
1939  reinterpret_cast<SimulatorRuntimeFPFPCall>(external);
1940  dresult = target(dval0, dval1);
1941  SetFpResult(dresult);
1942  break;
1943  }
1944  case ExternalReference::BUILTIN_FP_CALL: {
1945  SimulatorRuntimeFPCall target =
1946  reinterpret_cast<SimulatorRuntimeFPCall>(external);
1947  dresult = target(dval0);
1948  SetFpResult(dresult);
1949  break;
1950  }
1951  case ExternalReference::BUILTIN_FP_INT_CALL: {
1952  SimulatorRuntimeFPIntCall target =
1953  reinterpret_cast<SimulatorRuntimeFPIntCall>(external);
1954  dresult = target(dval0, ival);
1955  SetFpResult(dresult);
1956  break;
1957  }
1958  default:
1959  UNREACHABLE();
1960  break;
1961  }
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);
1966  break;
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);
1971  break;
1972  default:
1973  UNREACHABLE();
1974  break;
1975  }
1976  }
1977  } else if (redirection->type() == ExternalReference::DIRECT_API_CALL) {
1978  // See callers of MacroAssembler::CallApiFunctionAndReturn for
1979  // explanation of register usage.
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)));
1986  }
1987  PrintF("\n");
1988  }
1989  CHECK(stack_aligned);
1990  SimulatorRuntimeDirectApiCall target =
1991  reinterpret_cast<SimulatorRuntimeDirectApiCall>(external);
1992  target(arg[0]);
1993  } else if (redirection->type() == ExternalReference::PROFILING_API_CALL) {
1994  // See callers of MacroAssembler::CallApiFunctionAndReturn for
1995  // explanation of register usage.
1996  if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
1997  PrintF("Call to host function at %p args %08" V8PRIxPTR
1998  " %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)));
2003  }
2004  PrintF("\n");
2005  }
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) {
2011  // See callers of MacroAssembler::CallApiFunctionAndReturn for
2012  // explanation of register usage.
2013  if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
2014  PrintF("Call to host function at %p args %08" V8PRIxPTR
2015  " %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)));
2020  }
2021  PrintF("\n");
2022  }
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]));
2028  }
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)));
2039  }
2040  PrintF("\n");
2041  }
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]));
2047  }
2048  target(arg[0], arg[1], Redirection::ReverseRedirection(arg[2]));
2049  } else {
2050  // builtin call.
2051  if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
2052  SimulatorRuntimeCall target =
2053  reinterpret_cast<SimulatorRuntimeCall>(external);
2054  PrintF(
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)));
2064  }
2065  PrintF("\n");
2066  }
2067  CHECK(stack_aligned);
2068  if (redirection->type() == ExternalReference::BUILTIN_CALL_PAIR) {
2069  SimulatorRuntimePairCall target =
2070  reinterpret_cast<SimulatorRuntimePairCall>(external);
2071  ObjectPair result =
2072  target(arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);
2073  intptr_t x;
2074  intptr_t y;
2075  decodeObjectPair(&result, &x, &y);
2076  if (::v8::internal::FLAG_trace_sim) {
2077  PrintF("Returned {%08" V8PRIxPTR ", %08" V8PRIxPTR "}\n", x, y);
2078  }
2079  if (ABI_RETURNS_OBJECTPAIR_IN_REGS) {
2080  set_register(r2, x);
2081  set_register(r3, y);
2082  } else {
2083  memcpy(reinterpret_cast<void*>(result_buffer), &result,
2084  sizeof(ObjectPair));
2085  set_register(r2, result_buffer);
2086  }
2087  } else {
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);
2095  }
2096  set_register(r2, result);
2097  }
2098  // #if !V8_TARGET_ARCH_S390X
2099  // DCHECK(redirection->type() ==
2100  // ExternalReference::BUILTIN_CALL);
2101  // SimulatorRuntimeCall target =
2102  // reinterpret_cast<SimulatorRuntimeCall>(external);
2103  // int64_t result = target(arg[0], arg[1], arg[2], arg[3],
2104  // arg[4],
2105  // arg[5]);
2106  // int32_t lo_res = static_cast<int32_t>(result);
2107  // int32_t hi_res = static_cast<int32_t>(result >> 32);
2108  // #if !V8_TARGET_LITTLE_ENDIAN
2109  // if (::v8::internal::FLAG_trace_sim) {
2110  // PrintF("Returned %08x\n", hi_res);
2111  // }
2112  // set_register(r2, hi_res);
2113  // set_register(r3, lo_res);
2114  // #else
2115  // if (::v8::internal::FLAG_trace_sim) {
2116  // PrintF("Returned %08x\n", lo_res);
2117  // }
2118  // set_register(r2, lo_res);
2119  // set_register(r3, hi_res);
2120  // #endif
2121  // #else
2122  // if (redirection->type() == ExternalReference::BUILTIN_CALL) {
2123  // SimulatorRuntimeCall target =
2124  // reinterpret_cast<SimulatorRuntimeCall>(external);
2125  // intptr_t result = target(arg[0], arg[1], arg[2], arg[3],
2126  // arg[4],
2127  // arg[5]);
2128  // if (::v8::internal::FLAG_trace_sim) {
2129  // PrintF("Returned %08" V8PRIxPTR "\n", result);
2130  // }
2131  // set_register(r2, result);
2132  // } else {
2133  // DCHECK(redirection->type() ==
2134  // ExternalReference::BUILTIN_CALL_PAIR);
2135  // SimulatorRuntimePairCall target =
2136  // reinterpret_cast<SimulatorRuntimePairCall>(external);
2137  // ObjectPair result = target(arg[0], arg[1], arg[2], arg[3],
2138  // arg[4], arg[5]);
2139  // if (::v8::internal::FLAG_trace_sim) {
2140  // PrintF("Returned %08" V8PRIxPTR ", %08" V8PRIxPTR "\n",
2141  // result.x, result.y);
2142  // }
2143  // #if ABI_RETURNS_OBJECTPAIR_IN_REGS
2144  // set_register(r2, result.x);
2145  // set_register(r3, result.y);
2146  // #else
2147  // memcpy(reinterpret_cast<void *>(result_buffer), &result,
2148  // sizeof(ObjectPair));
2149  // #endif
2150  // }
2151  // #endif
2152  }
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)
2156  // On zLinux-31, the saved_lr might be tagged with a high bit of 1.
2157  // Cleanse it before proceeding with simulation.
2158  saved_lr &= 0x7FFFFFFF;
2159 #endif
2160  set_pc(saved_lr);
2161  break;
2162  }
2163  case kBreakpoint: {
2164  S390Debugger dbg(this);
2165  dbg.Debug();
2166  break;
2167  }
2168  // stop uses all codes greater than 1 << 23.
2169  default: {
2170  if (svc >= (1 << 23)) {
2171  uint32_t code = svc & kStopCodeMask;
2172  if (isWatchedStop(code)) {
2173  IncreaseStopCounter(code);
2174  }
2175  // Stop if it is enabled, otherwise go on jumping over the stop
2176  // and the message address.
2177  if (isEnabledStop(code)) {
2178  S390Debugger dbg(this);
2179  dbg.Stop(instr);
2180  } else {
2181  set_pc(get_pc() + sizeof(FourByteInstr) + kPointerSize);
2182  }
2183  } else {
2184  // This is not a valid svc code.
2185  UNREACHABLE();
2186  break;
2187  }
2188  }
2189  }
2190 }
2191 
2192 // Stop helper functions.
2193 bool Simulator::isStopInstruction(Instruction* instr) {
2194  return (instr->Bits(27, 24) == 0xF) && (instr->SvcValue() >= kStopCode);
2195 }
2196 
2197 bool Simulator::isWatchedStop(uint32_t code) {
2198  DCHECK_LE(code, kMaxStopCode);
2199  return code < kNumOfWatchedStops;
2200 }
2201 
2202 bool Simulator::isEnabledStop(uint32_t code) {
2203  DCHECK_LE(code, kMaxStopCode);
2204  // Unwatched stops are always enabled.
2205  return !isWatchedStop(code) ||
2206  !(watched_stops_[code].count & kStopDisabledBit);
2207 }
2208 
2209 void Simulator::EnableStop(uint32_t code) {
2210  DCHECK(isWatchedStop(code));
2211  if (!isEnabledStop(code)) {
2212  watched_stops_[code].count &= ~kStopDisabledBit;
2213  }
2214 }
2215 
2216 void Simulator::DisableStop(uint32_t code) {
2217  DCHECK(isWatchedStop(code));
2218  if (isEnabledStop(code)) {
2219  watched_stops_[code].count |= kStopDisabledBit;
2220  }
2221 }
2222 
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) {
2227  PrintF(
2228  "Stop counter for code %i has overflowed.\n"
2229  "Enabling this code and reseting the counter to 0.\n",
2230  code);
2231  watched_stops_[code].count = 0;
2232  EnableStop(code);
2233  } else {
2234  watched_stops_[code].count++;
2235  }
2236 }
2237 
2238 // Print a stop status.
2239 void Simulator::PrintStopInfo(uint32_t code) {
2240  DCHECK_LE(code, kMaxStopCode);
2241  if (!isWatchedStop(code)) {
2242  PrintF("Stop not watched.");
2243  } else {
2244  const char* state = isEnabledStop(code) ? "Enabled" : "Disabled";
2245  int32_t count = watched_stops_[code].count & ~kStopDisabledBit;
2246  // Don't print the state of unused breakpoints.
2247  if (count != 0) {
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);
2251  } else {
2252  PrintF("stop %i - 0x%x: \t%s, \tcounter = %i\n", code, code, state,
2253  count);
2254  }
2255  }
2256  }
2257 }
2258 
2259 // Method for checking overflow on signed addition:
2260 // Test src1 and src2 have opposite sign,
2261 // (1) No overflow if they have opposite sign
2262 // (2) Test the result and one of the operands have opposite sign
2263 // (a) No overflow if they don't have opposite sign
2264 // (b) Overflow if opposite
2265 #define CheckOverflowForIntAdd(src1, src2, type) \
2266  OverflowFromSigned<type>(src1 + src2, src1, src2, true);
2267 
2268 #define CheckOverflowForIntSub(src1, src2, type) \
2269  OverflowFromSigned<type>(src1 - src2, src1, src2, false);
2270 
2271 // Method for checking overflow on unsigned addition
2272 #define CheckOverflowForUIntAdd(src1, src2) \
2273  ((src1) + (src2) < (src1) || (src1) + (src2) < (src2))
2274 
2275 // Method for checking overflow on unsigned subtraction
2276 #define CheckOverflowForUIntSub(src1, src2) ((src1) - (src2) > (src1))
2277 
2278 // Method for checking overflow on multiplication
2279 #define CheckOverflowForMul(src1, src2) (((src1) * (src2)) / (src2) != (src1))
2280 
2281 // Method for checking overflow on shift right
2282 #define CheckOverflowForShiftRight(src1, src2) \
2283  (((src1) >> (src2)) << (src2) != (src1))
2284 
2285 // Method for checking overflow on shift left
2286 #define CheckOverflowForShiftLeft(src1, src2) \
2287  (((src1) << (src2)) >> (src2) != (src1))
2288 
2289 int16_t Simulator::ByteReverse(int16_t hword) {
2290 #if defined(__GNUC__)
2291  return __builtin_bswap16(hword);
2292 #else
2293  return (hword << 8) | ((hword >> 8) & 0x00FF);
2294 #endif
2295 }
2296 
2297 int32_t Simulator::ByteReverse(int32_t word) {
2298 #if defined(__GNUC__)
2299  return __builtin_bswap32(word);
2300 #else
2301  int32_t result = word << 24;
2302  result |= (word << 8) & 0x00FF0000;
2303  result |= (word >> 8) & 0x0000FF00;
2304  result |= (word >> 24) & 0x00000FF;
2305  return result;
2306 #endif
2307 }
2308 
2309 int64_t Simulator::ByteReverse(int64_t dword) {
2310 #if defined(__GNUC__)
2311  return __builtin_bswap64(dword);
2312 #else
2313 #error unsupport __builtin_bswap64
2314 #endif
2315 }
2316 
2317 int Simulator::DecodeInstruction(Instruction* instr) {
2318  Opcode op = instr->S390OpcodeValue();
2319  DCHECK_NOT_NULL(EvalTable[op]);
2320  return (this->*EvalTable[op])(instr);
2321 }
2322 
2323 // Executes the current instruction.
2324 void Simulator::ExecuteInstruction(Instruction* instr, bool auto_incr_pc) {
2325  icount_++;
2326 
2327  if (v8::internal::FLAG_check_icache) {
2328  CheckICache(i_cache(), instr);
2329  }
2330 
2331  pc_modified_ = false;
2332 
2333  if (::v8::internal::FLAG_trace_sim) {
2334  disasm::NameConverter converter;
2335  disasm::Disassembler dasm(converter);
2336  // use a reasonably large buffer
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());
2341 
2342  // Flush stdout to prevent incomplete file output during abnormal exits
2343  // This is caused by the output being buffered before being written to file
2344  fflush(stdout);
2345  }
2346 
2347  // Try to simulate as S390 Instruction first.
2348  int length = DecodeInstruction(instr);
2349 
2350  if (!pc_modified_ && auto_incr_pc) {
2351  DCHECK(length == instr->InstructionLength());
2352  set_pc(reinterpret_cast<intptr_t>(instr) + length);
2353  }
2354  return;
2355 }
2356 
2357 void Simulator::DebugStart() {
2358  S390Debugger dbg(this);
2359  dbg.Debug();
2360 }
2361 
2362 void Simulator::Execute() {
2363  // Get the PC to simulate. Cannot use the accessor here as we need the
2364  // raw PC value and not the one used as input to arithmetic instructions.
2365  intptr_t program_counter = get_pc();
2366 
2367  if (::v8::internal::FLAG_stop_sim_at == 0) {
2368  // Fast version of the dispatch loop without checking whether the simulator
2369  // should be stopping at a particular executed instruction.
2370  while (program_counter != end_sim_pc) {
2371  Instruction* instr = reinterpret_cast<Instruction*>(program_counter);
2372  ExecuteInstruction(instr);
2373  program_counter = get_pc();
2374  }
2375  } else {
2376  // FLAG_stop_sim_at is at the non-default value. Stop in the debugger when
2377  // we reach the particular instruction count.
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);
2382  dbg.Debug();
2383  } else {
2384  ExecuteInstruction(instr);
2385  }
2386  program_counter = get_pc();
2387  }
2388  }
2389 }
2390 
2391 void Simulator::CallInternal(Address entry, int reg_arg_count) {
2392  // Adjust JS-based stack limit to C-based stack limit.
2393  isolate_->stack_guard()->AdjustStackLimitForSimulator();
2394 
2395  // Prepare to execute the code at entry
2396  if (ABI_USES_FUNCTION_DESCRIPTORS) {
2397  // entry is the function descriptor
2398  set_pc(*(reinterpret_cast<intptr_t*>(entry)));
2399  } else {
2400  // entry is the instruction address
2401  set_pc(static_cast<intptr_t>(entry));
2402  }
2403  // Remember the values of non-volatile registers.
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);
2412 
2413  if (ABI_CALL_VIA_IP) {
2414  // Put target address in ip (for JS prologue).
2415  set_register(ip, get_pc());
2416  }
2417 
2418  // Put down marker for end of simulation. The simulator will stop simulation
2419  // when the PC reaches this value. By saving the "end simulation" value into
2420  // the LR the simulation stops when returning to this call point.
2421  registers_[14] = end_sim_pc;
2422 
2423  // Set up the non-volatile registers with a known value. To be able to check
2424  // that they are preserved properly across JS execution.
2425  uintptr_t callee_saved_value = icount_;
2426  if (reg_arg_count < 5) {
2427  set_register(r6, callee_saved_value + 6);
2428  }
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);
2436 
2437  // Start the simulation
2438  Execute();
2439 
2440 // Check that the non-volatile registers have been preserved.
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));
2444  }
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));
2452 #else
2453  if (reg_arg_count < 5) {
2454  DCHECK_EQ(callee_saved_value + 6, get_register(r6));
2455  }
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));
2463 #endif
2464 
2465  // Restore non-volatile registers with the original value.
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);
2474 }
2475 
2476 intptr_t Simulator::CallImpl(Address entry, int argument_count,
2477  const intptr_t* arguments) {
2478  // Adjust JS-based stack limit to C-based stack limit.
2479  isolate_->stack_guard()->AdjustStackLimitForSimulator();
2480 
2481  // Remember the values of non-volatile registers.
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);
2490 
2491  // Set up arguments
2492 
2493  // First 5 arguments passed in registers r2-r6.
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]);
2498  }
2499 
2500  // Remaining arguments passed on stack.
2501  int64_t original_stack = get_register(sp);
2502  // Compute position of stack on entry to generated code.
2503  uintptr_t entry_stack =
2504  (original_stack -
2505  (kCalleeRegisterSaveAreaSize + stack_arg_count * sizeof(intptr_t)));
2506  if (base::OS::ActivationFrameAlignment() != 0) {
2507  entry_stack &= -base::OS::ActivationFrameAlignment();
2508  }
2509 
2510  // Store remaining arguments on stack, from low to high memory.
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);
2516 
2517 // Prepare to execute the code at entry
2518 #if ABI_USES_FUNCTION_DESCRIPTORS
2519  // entry is the function descriptor
2520  set_pc(*(reinterpret_cast<intptr_t*>(entry)));
2521 #else
2522  // entry is the instruction address
2523  set_pc(static_cast<intptr_t>(entry));
2524 #endif
2525 
2526  // Put target address in ip (for JS prologue).
2527  set_register(r12, get_pc());
2528 
2529  // Put down marker for end of simulation. The simulator will stop simulation
2530  // when the PC reaches this value. By saving the "end simulation" value into
2531  // the LR the simulation stops when returning to this call point.
2532  registers_[14] = end_sim_pc;
2533 
2534  // Set up the non-volatile registers with a known value. To be able to check
2535  // that they are preserved properly across JS execution.
2536  uintptr_t callee_saved_value = icount_;
2537  if (reg_arg_count < 5) {
2538  set_register(r6, callee_saved_value + 6);
2539  }
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);
2547 
2548  // Start the simulation
2549  Execute();
2550 
2551 // Check that the non-volatile registers have been preserved.
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));
2555  }
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));
2563 #else
2564  if (reg_arg_count < 5) {
2565  DCHECK_EQ(callee_saved_value + 6, get_register(r6));
2566  }
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));
2574 #endif
2575 
2576  // Restore non-volatile registers with the original value.
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);
2585 // Pop stack passed arguments.
2586 
2587 #ifndef V8_TARGET_ARCH_S390X
2588  DCHECK_EQ(entry_stack, get_low_register<uint32_t>(sp));
2589 #else
2590  DCHECK_EQ(entry_stack, get_register(sp));
2591 #endif
2592  set_register(sp, original_stack);
2593 
2594  // Return value register
2595  return get_register(r2);
2596 }
2597 
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);
2602 }
2603 
2604 int32_t Simulator::CallFPReturnsInt(Address entry, double d0, double d1) {
2605  CallFP(entry, d0, d1);
2606  int32_t result = get_register(r2);
2607  return result;
2608 }
2609 
2610 double Simulator::CallFPReturnsDouble(Address entry, double d0, double d1) {
2611  CallFP(entry, d0, d1);
2612  return get_double_from_d_register(0);
2613 }
2614 
2615 uintptr_t Simulator::PushAddress(uintptr_t address) {
2616  uintptr_t new_sp = get_register(sp) - sizeof(uintptr_t);
2617  uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(new_sp);
2618  *stack_slot = address;
2619  set_register(sp, new_sp);
2620  return new_sp;
2621 }
2622 
2623 uintptr_t Simulator::PopAddress() {
2624  uintptr_t current_sp = get_register(sp);
2625  uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp);
2626  uintptr_t address = *stack_slot;
2627  set_register(sp, current_sp + sizeof(uintptr_t));
2628  return address;
2629 }
2630 
2631 #define EVALUATE(name) \
2632  int Simulator::Evaluate_##name(Instruction* instr)
2633 
2634 #define DCHECK_OPCODE(op) DCHECK(instr->S390OpcodeValue() == op)
2635 
2636 #define AS(type) reinterpret_cast<type*>(instr)
2637 
2638 #define DECODE_RIL_A_INSTRUCTION(r1, i2) \
2639  int r1 = AS(RILInstruction)->R1Value(); \
2640  uint32_t i2 = AS(RILInstruction)->I2UnsignedValue(); \
2641  int length = 6;
2642 
2643 #define DECODE_RIL_B_INSTRUCTION(r1, i2) \
2644  int r1 = AS(RILInstruction)->R1Value(); \
2645  int32_t i2 = AS(RILInstruction)->I2Value(); \
2646  int length = 6;
2647 
2648 #define DECODE_RIL_C_INSTRUCTION(m1, ri2) \
2649  Condition m1 = static_cast<Condition>(AS(RILInstruction)->R1Value()); \
2650  uint64_t ri2 = AS(RILInstruction)->I2Value(); \
2651  int length = 6;
2652 
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(); \
2658  int length = 6;
2659 
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(); \
2665  int length = 4;
2666 
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(); \
2672  int length = 4;
2673 
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(); \
2678  int length = 4;
2679 
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(); \
2684  int length = 4;
2685 
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(); \
2690  int length = 4;
2691 
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(); \
2696  int length = 6;
2697 
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(); \
2702  int length = 6;
2703 
2704 #define DECODE_RRE_INSTRUCTION(r1, r2) \
2705  int r1 = AS(RREInstruction)->R1Value(); \
2706  int r2 = AS(RREInstruction)->R2Value(); \
2707  int length = 4;
2708 
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(); \
2713  int length = 4;
2714 
2715 #define DECODE_RRE_INSTRUCTION_NO_R2(r1) \
2716  int r1 = AS(RREInstruction)->R1Value(); \
2717  int length = 4;
2718 
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(); \
2723  int length = 4;
2724 
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(); \
2730  int length = 4;
2731 
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(); \
2736  int length = 4;
2737 
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()); \
2742  int length = 4;
2743 
2744 #define DECODE_RR_INSTRUCTION(r1, r2) \
2745  int r1 = AS(RRInstruction)->R1Value(); \
2746  int r2 = AS(RRInstruction)->R2Value(); \
2747  int length = 2;
2748 
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(); \
2753  int length = 6;
2754 
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(); \
2759  int length = 6;
2760 
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(); \
2767  int length = 6;
2768 
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(); \
2774  int length = 6;
2775 
2776 #define DECODE_RI_A_INSTRUCTION(instr, r1, i2) \
2777  int32_t r1 = AS(RIInstruction)->R1Value(); \
2778  int16_t i2 = AS(RIInstruction)->I2Value(); \
2779  int length = 4;
2780 
2781 #define DECODE_RI_B_INSTRUCTION(instr, r1, i2) \
2782  int32_t r1 = AS(RILInstruction)->R1Value(); \
2783  int16_t i2 = AS(RILInstruction)->I2Value(); \
2784  int length = 4;
2785 
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(); \
2789  int length = 4;
2790 
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(); \
2796  int length = 6;
2797 
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(); \
2805  int length = 6;
2806 
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
2810 
2811 int Simulator::Evaluate_Unknown(Instruction* instr) {
2812  UNREACHABLE();
2813 }
2814 
2815 EVALUATE(VFA) {
2816  DCHECK_OPCODE(VFA);
2817  DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
2818  USE(m6);
2819  USE(m5);
2820  USE(m4);
2821  DCHECK_EQ(m5, 8);
2822  DCHECK_EQ(m4, 3);
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);
2827  return length;
2828 }
2829 
2830 EVALUATE(VFS) {
2831  DCHECK_OPCODE(VFS);
2832  DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
2833  USE(m6);
2834  USE(m5);
2835  USE(m4);
2836  DCHECK_EQ(m5, 8);
2837  DCHECK_EQ(m4, 3);
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);
2842  return length;
2843 }
2844 
2845 EVALUATE(VFM) {
2846  DCHECK_OPCODE(VFM);
2847  DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
2848  USE(m6);
2849  USE(m5);
2850  USE(m4);
2851  DCHECK_EQ(m5, 8);
2852  DCHECK_EQ(m4, 3);
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);
2857  return length;
2858 }
2859 
2860 EVALUATE(VFD) {
2861  DCHECK_OPCODE(VFD);
2862  DECODE_VRR_C_INSTRUCTION(r1, r2, r3, m6, m5, m4);
2863  USE(m6);
2864  USE(m5);
2865  USE(m4);
2866  DCHECK_EQ(m5, 8);
2867  DCHECK_EQ(m4, 3);
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);
2872  return length;
2873 }
2874 
2875 EVALUATE(DUMY) {
2876  DCHECK_OPCODE(DUMY);
2877  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
2878  USE(r1);
2879  USE(x2);
2880  USE(b2);
2881  USE(d2);
2882  // dummy instruction does nothing.
2883  return length;
2884 }
2885 
2886 EVALUATE(CLR) {
2887  DCHECK_OPCODE(CLR);
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);
2892  return length;
2893 }
2894 
2895 EVALUATE(LR) {
2896  DCHECK_OPCODE(LR);
2897  DECODE_RR_INSTRUCTION(r1, r2);
2898  set_low_register(r1, get_low_register<int32_t>(r2));
2899  return length;
2900 }
2901 
2902 EVALUATE(AR) {
2903  DCHECK_OPCODE(AR);
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);
2908  r1_val += r2_val;
2909  SetS390ConditionCode<int32_t>(r1_val, 0);
2910  SetS390OverflowCode(isOF);
2911  set_low_register(r1, r1_val);
2912  return length;
2913 }
2914 
2915 EVALUATE(L) {
2916  DCHECK_OPCODE(L);
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);
2923  return length;
2924 }
2925 
2926 EVALUATE(BRC) {
2927  DCHECK_OPCODE(BRC);
2928  DECODE_RI_C_INSTRUCTION(instr, m1, i2);
2929 
2930  if (TestConditionCode(m1)) {
2931  intptr_t offset = 2 * i2;
2932  set_pc(get_pc() + offset);
2933  }
2934  return length;
2935 }
2936 
2937 EVALUATE(AHI) {
2938  DCHECK_OPCODE(AHI);
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);
2942  r1_val += i2;
2943  set_low_register(r1, r1_val);
2944  SetS390ConditionCode<int32_t>(r1_val, 0);
2945  SetS390OverflowCode(isOF);
2946  return length;
2947 }
2948 
2949 EVALUATE(AGHI) {
2950  DCHECK_OPCODE(AGHI);
2951  DECODE_RI_A_INSTRUCTION(instr, r1, i2);
2952  int64_t r1_val = get_register(r1);
2953  bool isOF = false;
2954  isOF = CheckOverflowForIntAdd(r1_val, i2, int64_t);
2955  r1_val += i2;
2956  set_register(r1, r1_val);
2957  SetS390ConditionCode<int64_t>(r1_val, 0);
2958  SetS390OverflowCode(isOF);
2959  return length;
2960 }
2961 
2962 EVALUATE(BRCL) {
2963  DCHECK_OPCODE(BRCL);
2964  DECODE_RIL_C_INSTRUCTION(m1, ri2);
2965 
2966  if (TestConditionCode(m1)) {
2967  intptr_t offset = 2 * ri2;
2968  set_pc(get_pc() + offset);
2969  }
2970  return length;
2971 }
2972 
2973 EVALUATE(IIHF) {
2974  DCHECK_OPCODE(IIHF);
2975  DECODE_RIL_A_INSTRUCTION(r1, imm);
2976  set_high_register(r1, imm);
2977  return length;
2978 }
2979 
2980 EVALUATE(IILF) {
2981  DCHECK_OPCODE(IILF);
2982  DECODE_RIL_A_INSTRUCTION(r1, imm);
2983  set_low_register(r1, imm);
2984  return length;
2985 }
2986 
2987 EVALUATE(LGR) {
2988  DCHECK_OPCODE(LGR);
2989  DECODE_RRE_INSTRUCTION(r1, r2);
2990  set_register(r1, get_register(r2));
2991  return length;
2992 }
2993 
2994 EVALUATE(LG) {
2995  DCHECK_OPCODE(LG);
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);
3000  return length;
3001 }
3002 
3003 EVALUATE(AGR) {
3004  DCHECK_OPCODE(AGR);
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);
3009  r1_val += r2_val;
3010  set_register(r1, r1_val);
3011  SetS390ConditionCode<int64_t>(r1_val, 0);
3012  SetS390OverflowCode(isOF);
3013  return length;
3014 }
3015 
3016 EVALUATE(LGFR) {
3017  DCHECK_OPCODE(LGFR);
3018  DECODE_RRE_INSTRUCTION(r1, r2);
3019  int32_t r2_val = get_low_register<int32_t>(r2);
3020  int64_t result = static_cast<int64_t>(r2_val);
3021  set_register(r1, result);
3022 
3023  return length;
3024 }
3025 
3026 EVALUATE(LBR) {
3027  DCHECK_OPCODE(LBR);
3028  DECODE_RRE_INSTRUCTION(r1, r2);
3029  int32_t r2_val = get_low_register<int32_t>(r2);
3030  r2_val <<= 24;
3031  r2_val >>= 24;
3032  set_low_register(r1, r2_val);
3033  return length;
3034 }
3035 
3036 EVALUATE(LGBR) {
3037  DCHECK_OPCODE(LGBR);
3038  DECODE_RRE_INSTRUCTION(r1, r2);
3039  int64_t r2_val = get_low_register<int64_t>(r2);
3040  r2_val <<= 56;
3041  r2_val >>= 56;
3042  set_register(r1, r2_val);
3043  return length;
3044 }
3045 
3046 EVALUATE(LHR) {
3047  DCHECK_OPCODE(LHR);
3048  DECODE_RRE_INSTRUCTION(r1, r2);
3049  int32_t r2_val = get_low_register<int32_t>(r2);
3050  r2_val <<= 16;
3051  r2_val >>= 16;
3052  set_low_register(r1, r2_val);
3053  return length;
3054 }
3055 
3056 EVALUATE(LGHR) {
3057  DCHECK_OPCODE(LGHR);
3058  DECODE_RRE_INSTRUCTION(r1, r2);
3059  int64_t r2_val = get_low_register<int64_t>(r2);
3060  r2_val <<= 48;
3061  r2_val >>= 48;
3062  set_register(r1, r2_val);
3063  return length;
3064 }
3065 
3066 EVALUATE(LGF) {
3067  DCHECK_OPCODE(LGF);
3068  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
3069  intptr_t addr = GET_ADDRESS(x2, b2, d2);
3070  int64_t mem_val = static_cast<int64_t>(ReadW(addr, instr));
3071  set_register(r1, mem_val);
3072  return length;
3073 }
3074 
3075 EVALUATE(ST) {
3076  DCHECK_OPCODE(ST);
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);
3083  return length;
3084 }
3085 
3086 EVALUATE(STG) {
3087  DCHECK_OPCODE(STG);
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);
3092  return length;
3093 }
3094 
3095 EVALUATE(STY) {
3096  DCHECK_OPCODE(STY);
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);
3101  return length;
3102 }
3103 
3104 EVALUATE(LY) {
3105  DCHECK_OPCODE(LY);
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);
3110  return length;
3111 }
3112 
3113 EVALUATE(LLGC) {
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));
3118  return length;
3119 }
3120 
3121 EVALUATE(LLC) {
3122  DCHECK_OPCODE(LLC);
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));
3126  return length;
3127 }
3128 
3129 EVALUATE(RLL) {
3130  DCHECK_OPCODE(RLL);
3131  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
3132  // only takes rightmost 6 bits
3133  int shiftBits = GET_ADDRESS(0, b2, d2) & 0x3F;
3134  // unsigned
3135  uint32_t r3_val = get_low_register<uint32_t>(r3);
3136  uint32_t alu_out = 0;
3137  uint32_t rotateBits = r3_val >> (32 - shiftBits);
3138  alu_out = (r3_val << shiftBits) | (rotateBits);
3139  set_low_register(r1, alu_out);
3140  return length;
3141 }
3142 
3143 EVALUATE(RISBG) {
3144  DCHECK_OPCODE(RISBG);
3145  DECODE_RIE_F_INSTRUCTION(r1, r2, i3, i4, i5);
3146  // Starting Bit Position is Bits 2-7 of I3 field
3147  uint32_t start_bit = i3 & 0x3F;
3148  // Ending Bit Position is Bits 2-7 of I4 field
3149  uint32_t end_bit = i4 & 0x3F;
3150  // Shift Amount is Bits 2-7 of I5 field
3151  uint32_t shift_amount = i5 & 0x3F;
3152  // Zero out Remaining (unslected) bits if Bit 0 of I4 is 1.
3153  bool zero_remaining = (0 != (i4 & 0x80));
3154 
3155  uint64_t src_val = get_register(r2);
3156 
3157  // Rotate Left by Shift Amount first
3158  uint64_t rotated_val =
3159  (src_val << shift_amount) | (src_val >> (64 - shift_amount));
3160  int32_t width = end_bit - start_bit + 1;
3161 
3162  uint64_t selection_mask = 0;
3163  if (width < 64) {
3164  selection_mask = (static_cast<uint64_t>(1) << width) - 1;
3165  } else {
3166  selection_mask = static_cast<uint64_t>(static_cast<int64_t>(-1));
3167  }
3168  selection_mask = selection_mask << (63 - end_bit);
3169 
3170  uint64_t selected_val = rotated_val & selection_mask;
3171 
3172  if (!zero_remaining) {
3173  // Merged the unselected bits from the original value
3174  selected_val = (get_register(r1) & ~selection_mask) | selected_val;
3175  }
3176 
3177  // Condition code is set by treating result as 64-bit signed int
3178  SetS390ConditionCode<int64_t>(selected_val, 0);
3179  set_register(r1, selected_val);
3180  return length;
3181 }
3182 
3183 EVALUATE(AHIK) {
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);
3192  return length;
3193 }
3194 
3195 EVALUATE(AGHIK) {
3196  // 64-bit Add
3197  DCHECK_OPCODE(AGHIK);
3198  DECODE_RIE_D_INSTRUCTION(r1, r2, i2);
3199  int64_t r2_val = get_register(r2);
3200  int64_t imm = static_cast<int64_t>(i2);
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);
3205  return length;
3206 }
3207 
3208 EVALUATE(BKPT) {
3209  DCHECK_OPCODE(BKPT);
3210  set_pc(get_pc() + 2);
3211  S390Debugger dbg(this);
3212  dbg.Debug();
3213  int length = 2;
3214  return length;
3215 }
3216 
3217 EVALUATE(SPM) {
3218  UNIMPLEMENTED();
3219  USE(instr);
3220  return 0;
3221 }
3222 
3223 EVALUATE(BALR) {
3224  UNIMPLEMENTED();
3225  USE(instr);
3226  return 0;
3227 }
3228 
3229 EVALUATE(BCTR) {
3230  UNIMPLEMENTED();
3231  USE(instr);
3232  return 0;
3233 }
3234 
3235 EVALUATE(BCR) {
3236  DCHECK_OPCODE(BCR);
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)
3241  // On 31-bit, the top most bit may be 0 or 1, but is ignored by the
3242  // hardware. Cleanse the top bit before jumping to it, unless it's one
3243  // of the special PCs
3244  if (r2_val != bad_lr && r2_val != end_sim_pc) r2_val &= 0x7FFFFFFF;
3245 #endif
3246  set_pc(r2_val);
3247  }
3248 
3249  return length;
3250 }
3251 
3252 EVALUATE(SVC) {
3253  UNIMPLEMENTED();
3254  USE(instr);
3255  return 0;
3256 }
3257 
3258 EVALUATE(BSM) {
3259  UNIMPLEMENTED();
3260  USE(instr);
3261  return 0;
3262 }
3263 
3264 EVALUATE(BASSM) {
3265  UNIMPLEMENTED();
3266  USE(instr);
3267  return 0;
3268 }
3269 
3270 EVALUATE(BASR) {
3271  DCHECK_OPCODE(BASR);
3272  DECODE_RR_INSTRUCTION(r1, r2);
3273  intptr_t link_addr = get_pc() + 2;
3274  // If R2 is zero, the BASR does not branch.
3275  int64_t r2_val = (r2 == 0) ? link_addr : get_register(r2);
3276 #if (!V8_TARGET_ARCH_S390X && V8_HOST_ARCH_S390)
3277  // On 31-bit, the top most bit may be 0 or 1, which can cause issues
3278  // for stackwalker. The top bit should either be cleanse before being
3279  // pushed onto the stack, or during stack walking when dereferenced.
3280  // For simulator, we'll take the worst case scenario and always tag
3281  // the high bit, to flush out more problems.
3282  link_addr |= 0x80000000;
3283 #endif
3284  set_register(r1, link_addr);
3285  set_pc(r2_val);
3286  return length;
3287 }
3288 
3289 EVALUATE(MVCL) {
3290  UNIMPLEMENTED();
3291  USE(instr);
3292  return 0;
3293 }
3294 
3295 EVALUATE(CLCL) {
3296  UNIMPLEMENTED();
3297  USE(instr);
3298  return 0;
3299 }
3300 
3301 EVALUATE(LPR) {
3302  DCHECK_OPCODE(LPR);
3303  // Load Positive (32)
3304  DECODE_RR_INSTRUCTION(r1, r2);
3305  int32_t r2_val = get_low_register<int32_t>(r2);
3306  // If negative, then negate it.
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);
3312  }
3313  return length;
3314 }
3315 
3316 EVALUATE(LNR) {
3317  DCHECK_OPCODE(LNR);
3318  // Load Negative (32)
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; // If pos, then negate it.
3322  set_low_register(r1, r2_val);
3323  condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT; // CC0 - result is zero
3324  // CC1 - result is negative
3325  return length;
3326 }
3327 
3328 EVALUATE(LTR) {
3329  DCHECK_OPCODE(LTR);
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);
3334  return length;
3335 }
3336 
3337 EVALUATE(LCR) {
3338  DCHECK_OPCODE(LCR);
3339  DECODE_RR_INSTRUCTION(r1, r2);
3340  int32_t r2_val = get_low_register<int32_t>(r2);
3341  int32_t result = 0;
3342  bool isOF = false;
3343  isOF = __builtin_ssub_overflow(0, r2_val, &result);
3344  set_low_register(r1, result);
3345  SetS390ConditionCode<int32_t>(r2_val, 0);
3346  // Checks for overflow where r2_val = -2147483648.
3347  // Cannot do int comparison due to GCC 4.8 bug on x86.
3348  // Detect INT_MIN alternatively, as it is the only value where both
3349  // original and result are negative due to overflow.
3350  if (isOF) {
3351  SetS390OverflowCode(true);
3352  }
3353  return length;
3354 }
3355 
3356 EVALUATE(NR) {
3357  DCHECK_OPCODE(NR);
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);
3361  r1_val &= r2_val;
3362  SetS390BitWiseConditionCode<uint32_t>(r1_val);
3363  set_low_register(r1, r1_val);
3364  return length;
3365 }
3366 
3367 EVALUATE(OR) {
3368  DCHECK_OPCODE(OR);
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);
3372  r1_val |= r2_val;
3373  SetS390BitWiseConditionCode<uint32_t>(r1_val);
3374  set_low_register(r1, r1_val);
3375  return length;
3376 }
3377 
3378 EVALUATE(XR) {
3379  DCHECK_OPCODE(XR);
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);
3383  r1_val ^= r2_val;
3384  SetS390BitWiseConditionCode<uint32_t>(r1_val);
3385  set_low_register(r1, r1_val);
3386  return length;
3387 }
3388 
3389 EVALUATE(CR) {
3390  DCHECK_OPCODE(CR);
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);
3395  return length;
3396 }
3397 
3398 EVALUATE(SR) {
3399  DCHECK_OPCODE(SR);
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);
3403  bool isOF = false;
3404  isOF = CheckOverflowForIntSub(r1_val, r2_val, int32_t);
3405  r1_val -= r2_val;
3406  SetS390ConditionCode<int32_t>(r1_val, 0);
3407  SetS390OverflowCode(isOF);
3408  set_low_register(r1, r1_val);
3409  return length;
3410 }
3411 
3412 EVALUATE(MR) {
3413  DCHECK_OPCODE(MR);
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;
3421  r1_val = high_bits;
3422  int32_t low_bits = product & 0x00000000FFFFFFFF;
3423  set_low_register(r1, high_bits);
3424  set_low_register(r1 + 1, low_bits);
3425  return length;
3426 }
3427 
3428 EVALUATE(DR) {
3429  DCHECK_OPCODE(DR);
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);
3433  // reg-reg pair should be even-odd pair, assert r1 is an even register
3434  DCHECK_EQ(r1 % 2, 0);
3435  // leftmost 32 bits of the dividend are in r1
3436  // rightmost 32 bits of the dividend are in r1+1
3437  // get the signed value from r1
3438  int64_t dividend = static_cast<int64_t>(r1_val) << 32;
3439  // get unsigned value from r1+1
3440  // avoid addition with sign-extended r1+1 value
3441  dividend += get_low_register<uint32_t>(r1 + 1);
3442  int32_t remainder = dividend % r2_val;
3443  int32_t quotient = dividend / r2_val;
3444  r1_val = remainder;
3445  set_low_register(r1, remainder);
3446  set_low_register(r1 + 1, quotient);
3447  set_low_register(r1, r1_val);
3448  return length;
3449 }
3450 
3451 EVALUATE(ALR) {
3452  DCHECK_OPCODE(ALR);
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);
3456  uint32_t alu_out = 0;
3457  bool isOF = false;
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);
3462  return length;
3463 }
3464 
3465 EVALUATE(SLR) {
3466  DCHECK_OPCODE(SLR);
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);
3470  uint32_t alu_out = 0;
3471  bool isOF = false;
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);
3476  return length;
3477 }
3478 
3479 EVALUATE(LDR) {
3480  DCHECK_OPCODE(LDR);
3481  DECODE_RR_INSTRUCTION(r1, r2);
3482  int64_t r2_val = get_d_register(r2);
3483  set_d_register(r1, r2_val);
3484  return length;
3485 }
3486 
3487 EVALUATE(CDR) {
3488  UNIMPLEMENTED();
3489  USE(instr);
3490  return 0;
3491 }
3492 
3493 EVALUATE(LER) {
3494  UNIMPLEMENTED();
3495  USE(instr);
3496  return 0;
3497 }
3498 
3499 EVALUATE(STH) {
3500  DCHECK_OPCODE(STH);
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);
3507 
3508  return length;
3509 }
3510 
3511 EVALUATE(LA) {
3512  DCHECK_OPCODE(LA);
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);
3518  return length;
3519 }
3520 
3521 EVALUATE(STC) {
3522  DCHECK_OPCODE(STC);
3523  // Store Character/Byte
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);
3530  return length;
3531 }
3532 
3533 EVALUATE(IC_z) {
3534  UNIMPLEMENTED();
3535  USE(instr);
3536  return 0;
3537 }
3538 
3539 EVALUATE(EX) {
3540  DCHECK_OPCODE(EX);
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);
3545 
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));
3550 
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);
3558  return length;
3559 }
3560 
3561 EVALUATE(BAL) {
3562  UNIMPLEMENTED();
3563  USE(instr);
3564  return 0;
3565 }
3566 
3567 EVALUATE(BCT) {
3568  UNIMPLEMENTED();
3569  USE(instr);
3570  return 0;
3571 }
3572 
3573 EVALUATE(BC) {
3574  UNIMPLEMENTED();
3575  USE(instr);
3576  return 0;
3577 }
3578 
3579 EVALUATE(LH) {
3580  DCHECK_OPCODE(LH);
3581  // Load Halfword
3582  DECODE_RX_A_INSTRUCTION(x2, b2, r1, d2_val);
3583 
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;
3587 
3588  int32_t result = static_cast<int32_t>(ReadH(mem_addr, instr));
3589  set_low_register(r1, result);
3590  return length;
3591 }
3592 
3593 EVALUATE(CH) {
3594  UNIMPLEMENTED();
3595  USE(instr);
3596  return 0;
3597 }
3598 
3599 EVALUATE(AH) {
3600  DCHECK_OPCODE(AH);
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;
3608  bool isOF = false;
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);
3614 
3615  return length;
3616 }
3617 
3618 EVALUATE(SH) {
3619  DCHECK_OPCODE(SH);
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;
3627  bool isOF = false;
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);
3632 
3633  return length;
3634 }
3635 
3636 EVALUATE(MH) {
3637  DCHECK_OPCODE(MH);
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);
3647  return length;
3648 }
3649 
3650 EVALUATE(BAS) {
3651  UNIMPLEMENTED();
3652  USE(instr);
3653  return 0;
3654 }
3655 
3656 EVALUATE(CVD) {
3657  UNIMPLEMENTED();
3658  USE(instr);
3659  return 0;
3660 }
3661 
3662 EVALUATE(CVB) {
3663  UNIMPLEMENTED();
3664  USE(instr);
3665  return 0;
3666 }
3667 
3668 EVALUATE(LAE) {
3669  UNIMPLEMENTED();
3670  USE(instr);
3671  return 0;
3672 }
3673 
3674 EVALUATE(N) {
3675  DCHECK_OPCODE(N);
3676  // 32-bit Reg-Mem instructions
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);
3686  return length;
3687 }
3688 
3689 EVALUATE(CL) {
3690  DCHECK_OPCODE(CL);
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);
3698  return length;
3699 }
3700 
3701 EVALUATE(O) {
3702  DCHECK_OPCODE(O);
3703  // 32-bit Reg-Mem instructions
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);
3713  return length;
3714 }
3715 
3716 EVALUATE(X) {
3717  DCHECK_OPCODE(X);
3718  // 32-bit Reg-Mem instructions
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);
3728  return length;
3729 }
3730 
3731 EVALUATE(C) {
3732  DCHECK_OPCODE(C);
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);
3740  return length;
3741 }
3742 
3743 EVALUATE(A) {
3744  DCHECK_OPCODE(A);
3745  // 32-bit Reg-Mem instructions
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;
3752  bool isOF = false;
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);
3758  return length;
3759 }
3760 
3761 EVALUATE(S) {
3762  DCHECK_OPCODE(S);
3763  // 32-bit Reg-Mem instructions
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;
3770  bool isOF = false;
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);
3776  return length;
3777 }
3778 
3779 EVALUATE(M) {
3780  DCHECK_OPCODE(M);
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);
3788  int64_t product =
3789  static_cast<int64_t>(r1_val) * static_cast<int64_t>(mem_val);
3790  int32_t high_bits = product >> 32;
3791  r1_val = high_bits;
3792  int32_t low_bits = product & 0x00000000FFFFFFFF;
3793  set_low_register(r1, high_bits);
3794  set_low_register(r1 + 1, low_bits);
3795  return length;
3796 }
3797 
3798 EVALUATE(D) {
3799  UNIMPLEMENTED();
3800  USE(instr);
3801  return 0;
3802 }
3803 
3804 EVALUATE(AL) {
3805  UNIMPLEMENTED();
3806  USE(instr);
3807  return 0;
3808 }
3809 
3810 EVALUATE(SL) {
3811  UNIMPLEMENTED();
3812  USE(instr);
3813  return 0;
3814 }
3815 
3816 EVALUATE(STD) {
3817  DCHECK_OPCODE(STD);
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);
3824  return length;
3825 }
3826 
3827 EVALUATE(LD) {
3828  DCHECK_OPCODE(LD);
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;
3833  int64_t dbl_val = *reinterpret_cast<int64_t*>(addr);
3834  set_d_register(r1, dbl_val);
3835  return length;
3836 }
3837 
3838 EVALUATE(CD) {
3839  UNIMPLEMENTED();
3840  USE(instr);
3841  return 0;
3842 }
3843 
3844 EVALUATE(STE) {
3845  DCHECK_OPCODE(STE);
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);
3852  return length;
3853 }
3854 
3855 EVALUATE(MS) {
3856  DCHECK_OPCODE(MS);
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);
3863  return length;
3864 }
3865 
3866 EVALUATE(LE) {
3867  DCHECK_OPCODE(LE);
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);
3874  return length;
3875 }
3876 
3877 EVALUATE(BRXH) {
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);
3883  r1_val += r3_val;
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);
3888  }
3889  set_low_register(r1, r1_val);
3890  return length;
3891 }
3892 
3893 EVALUATE(BRXLE) {
3894  UNIMPLEMENTED();
3895  USE(instr);
3896  return 0;
3897 }
3898 
3899 EVALUATE(BXH) {
3900  DCHECK_OPCODE(BXH);
3901  DECODE_RS_A_INSTRUCTION(r1, r3, b2, d2);
3902 
3903  // r1_val is the first operand, r3_val is the increment
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;
3908  // increment r1_val
3909  r1_val += r3_val;
3910 
3911  // if the increment is even, then it designates a pair of registers
3912  // and the contents of the even and odd registers of the pair are used as
3913  // the increment and compare value respectively. If the increment is odd,
3914  // the increment itself is used as both the increment and compare value
3915  int32_t compare_val = r3 % 2 == 0 ? get_register(r3 + 1) : r3_val;
3916  if (r1_val > compare_val) {
3917  // branch to address if r1_val is greater than compare value
3918  set_pc(branch_address);
3919  }
3920 
3921  // update contents of register in r1 with the new incremented value
3922  set_register(r1, r1_val);
3923 
3924  return length;
3925 }
3926 
3927 EVALUATE(BXLE) {
3928  UNIMPLEMENTED();
3929  USE(instr);
3930  return 0;
3931 }
3932 
3933 EVALUATE(SRL) {
3934  DCHECK_OPCODE(SRL);
3935  DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
3936  // only takes rightmost 6bits
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);
3940  uint32_t alu_out = 0;
3941  alu_out = r1_val >> shiftBits;
3942  set_low_register(r1, alu_out);
3943  return length;
3944 }
3945 
3946 EVALUATE(SLL) {
3947  DCHECK_OPCODE(SLL);
3948  DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2)
3949  // only takes rightmost 6bits
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);
3953  uint32_t alu_out = 0;
3954  alu_out = r1_val << shiftBits;
3955  set_low_register(r1, alu_out);
3956  return length;
3957 }
3958 
3959 EVALUATE(SRA) {
3960  DCHECK_OPCODE(SRA);
3961  DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
3962  // only takes rightmost 6bits
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;
3967  bool isOF = false;
3968  alu_out = r1_val >> shiftBits;
3969  set_low_register(r1, alu_out);
3970  SetS390ConditionCode<int32_t>(alu_out, 0);
3971  SetS390OverflowCode(isOF);
3972  return length;
3973 }
3974 
3975 EVALUATE(SLA) {
3976  DCHECK_OPCODE(SLA);
3977  DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
3978  // only takes rightmost 6bits
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;
3983  bool isOF = false;
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);
3989  return length;
3990 }
3991 
3992 EVALUATE(SRDL) {
3993  DCHECK_OPCODE(SRDL);
3994  DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
3995  DCHECK_EQ(r1 % 2, 0); // must be a reg pair
3996  // only takes rightmost 6bits
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);
4006  return length;
4007 }
4008 
4009 EVALUATE(SLDL) {
4010  DCHECK_OPCODE(SLDL);
4011  DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
4012  // only takes rightmost 6bits
4013  int64_t b2_val = b2 == 0 ? 0 : get_register(b2);
4014  int shiftBits = (b2_val + d2) & 0x3F;
4015 
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));
4024  return length;
4025 }
4026 
4027 EVALUATE(SRDA) {
4028  DCHECK_OPCODE(SRDA);
4029  DECODE_RS_A_INSTRUCTION_NO_R3(r1, b2, d2);
4030  DCHECK_EQ(r1 % 2, 0); // must be a reg pair
4031  // only takes rightmost 6bits
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);
4041  return length;
4042 }
4043 
4044 EVALUATE(SLDA) {
4045  UNIMPLEMENTED();
4046  USE(instr);
4047  return 0;
4048 }
4049 
4050 EVALUATE(STM) {
4051  DCHECK_OPCODE(STM);
4052  DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2);
4053  // Store Multiple 32-bits.
4054  int offset = d2;
4055  // Regs roll around if r3 is less than r1.
4056  // Artificially increase r3 by 16 so we can calculate
4057  // the number of regs stored properly.
4058  if (r3 < r1) r3 += 16;
4059 
4060  int32_t rb_val = (rb == 0) ? 0 : get_low_register<int32_t>(rb);
4061 
4062  // Store each register in ascending order.
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);
4066  }
4067  return length;
4068 }
4069 
4070 EVALUATE(TM) {
4071  DCHECK_OPCODE(TM);
4072  // Test Under Mask (Mem - Imm) (8)
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;
4078  // CC0: Selected bits are zero
4079  // CC1: Selected bits mixed zeros and ones
4080  // CC3: Selected bits all ones
4081  if (0 == selected_bits) {
4082  condition_reg_ = CC_EQ; // CC0
4083  } else if (selected_bits == imm_val) {
4084  condition_reg_ = 0x1; // CC3
4085  } else {
4086  condition_reg_ = 0x4; // CC1
4087  }
4088  return length;
4089 }
4090 
4091 EVALUATE(MVI) {
4092  UNIMPLEMENTED();
4093  USE(instr);
4094  return 0;
4095 }
4096 
4097 EVALUATE(TS) {
4098  UNIMPLEMENTED();
4099  USE(instr);
4100  return 0;
4101 }
4102 
4103 EVALUATE(NI) {
4104  UNIMPLEMENTED();
4105  USE(instr);
4106  return 0;
4107 }
4108 
4109 EVALUATE(CLI) {
4110  DCHECK_OPCODE(CLI);
4111  // Compare Immediate (Mem - Imm) (8)
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);
4117  return length;
4118 }
4119 
4120 EVALUATE(OI) {
4121  UNIMPLEMENTED();
4122  USE(instr);
4123  return 0;
4124 }
4125 
4126 EVALUATE(XI) {
4127  UNIMPLEMENTED();
4128  USE(instr);
4129  return 0;
4130 }
4131 
4132 EVALUATE(LM) {
4133  DCHECK_OPCODE(LM);
4134  DECODE_RS_A_INSTRUCTION(r1, r3, rb, d2);
4135  // Store Multiple 32-bits.
4136  int offset = d2;
4137  // Regs roll around if r3 is less than r1.
4138  // Artificially increase r3 by 16 so we can calculate
4139  // the number of regs stored properly.
4140  if (r3 < r1) r3 += 16;
4141 
4142  int32_t rb_val = (rb == 0) ? 0 : get_low_register<int32_t>(rb);
4143 
4144  // Store each register in ascending order.
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);
4148  }
4149  return length;
4150 }
4151 
4152 EVALUATE(MVCLE) {
4153  UNIMPLEMENTED();
4154  USE(instr);
4155  return 0;
4156 }
4157 
4158 EVALUATE(CLCLE) {
4159  UNIMPLEMENTED();
4160  USE(instr);
4161  return 0;
4162 }
4163 
4164 EVALUATE(MC) {
4165  UNIMPLEMENTED();
4166  USE(instr);
4167  return 0;
4168 }
4169 
4170 EVALUATE(CDS) {
4171  UNIMPLEMENTED();
4172  USE(instr);
4173  return 0;
4174 }
4175 
4176 EVALUATE(STCM) {
4177  UNIMPLEMENTED();
4178  USE(instr);
4179  return 0;
4180 }
4181 
4182 EVALUATE(ICM) {
4183  UNIMPLEMENTED();
4184  USE(instr);
4185  return 0;
4186 }
4187 
4188 EVALUATE(BPRP) {
4189  UNIMPLEMENTED();
4190  USE(instr);
4191  return 0;
4192 }
4193 
4194 EVALUATE(BPP) {
4195  UNIMPLEMENTED();
4196  USE(instr);
4197  return 0;
4198 }
4199 
4200 EVALUATE(TRTR) {
4201  UNIMPLEMENTED();
4202  USE(instr);
4203  return 0;
4204 }
4205 
4206 EVALUATE(MVN) {
4207  UNIMPLEMENTED();
4208  USE(instr);
4209  return 0;
4210 }
4211 
4212 EVALUATE(MVC) {
4213  DCHECK_OPCODE(MVC);
4214  // Move Character
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;
4225  // remember that the length is the actual length - 1
4226  for (int i = 0; i < length + 1; ++i) {
4227  WriteB(dst_addr++, ReadB(src_addr++));
4228  }
4229  length = 6;
4230  return length;
4231 }
4232 
4233 EVALUATE(MVZ) {
4234  UNIMPLEMENTED();
4235  USE(instr);
4236  return 0;
4237 }
4238 
4239 EVALUATE(NC) {
4240  UNIMPLEMENTED();
4241  USE(instr);
4242  return 0;
4243 }
4244 
4245 EVALUATE(CLC) {
4246  UNIMPLEMENTED();
4247  USE(instr);
4248  return 0;
4249 }
4250 
4251 EVALUATE(OC) {
4252  UNIMPLEMENTED();
4253  USE(instr);
4254  return 0;
4255 }
4256 
4257 EVALUATE(XC) {
4258  UNIMPLEMENTED();
4259  USE(instr);
4260  return 0;
4261 }
4262 
4263 EVALUATE(MVCP) {
4264  UNIMPLEMENTED();
4265  USE(instr);
4266  return 0;
4267 }
4268 
4269 EVALUATE(TR) {
4270  UNIMPLEMENTED();
4271  USE(instr);
4272  return 0;
4273 }
4274 
4275 EVALUATE(TRT) {
4276  UNIMPLEMENTED();
4277  USE(instr);
4278  return 0;
4279 }
4280 
4281 EVALUATE(ED) {
4282  UNIMPLEMENTED();
4283  USE(instr);
4284  return 0;
4285 }
4286 
4287 EVALUATE(EDMK) {
4288  UNIMPLEMENTED();
4289  USE(instr);
4290  return 0;
4291 }
4292 
4293 EVALUATE(PKU) {
4294  UNIMPLEMENTED();
4295  USE(instr);
4296  return 0;
4297 }
4298 
4299 EVALUATE(UNPKU) {
4300  UNIMPLEMENTED();
4301  USE(instr);
4302  return 0;
4303 }
4304 
4305 EVALUATE(MVCIN) {
4306  UNIMPLEMENTED();
4307  USE(instr);
4308  return 0;
4309 }
4310 
4311 EVALUATE(PKA) {
4312  UNIMPLEMENTED();
4313  USE(instr);
4314  return 0;
4315 }
4316 
4317 EVALUATE(UNPKA) {
4318  UNIMPLEMENTED();
4319  USE(instr);
4320  return 0;
4321 }
4322 
4323 EVALUATE(PLO) {
4324  UNIMPLEMENTED();
4325  USE(instr);
4326  return 0;
4327 }
4328 
4329 EVALUATE(LMD) {
4330  UNIMPLEMENTED();
4331  USE(instr);
4332  return 0;
4333 }
4334 
4335 EVALUATE(SRP) {
4336  UNIMPLEMENTED();
4337  USE(instr);
4338  return 0;
4339 }
4340 
4341 EVALUATE(MVO) {
4342  UNIMPLEMENTED();
4343  USE(instr);
4344  return 0;
4345 }
4346 
4347 EVALUATE(PACK) {
4348  UNIMPLEMENTED();
4349  USE(instr);
4350  return 0;
4351 }
4352 
4353 EVALUATE(UNPK) {
4354  UNIMPLEMENTED();
4355  USE(instr);
4356  return 0;
4357 }
4358 
4359 EVALUATE(ZAP) {
4360  UNIMPLEMENTED();
4361  USE(instr);
4362  return 0;
4363 }
4364 
4365 EVALUATE(AP) {
4366  UNIMPLEMENTED();
4367  USE(instr);
4368  return 0;
4369 }
4370 
4371 EVALUATE(SP) {
4372  UNIMPLEMENTED();
4373  USE(instr);
4374  return 0;
4375 }
4376 
4377 EVALUATE(MP) {
4378  UNIMPLEMENTED();
4379  USE(instr);
4380  return 0;
4381 }
4382 
4383 EVALUATE(DP) {
4384  UNIMPLEMENTED();
4385  USE(instr);
4386  return 0;
4387 }
4388 
4389 EVALUATE(UPT) {
4390  UNIMPLEMENTED();
4391  USE(instr);
4392  return 0;
4393 }
4394 
4395 EVALUATE(PFPO) {
4396  UNIMPLEMENTED();
4397  USE(instr);
4398  return 0;
4399 }
4400 
4401 EVALUATE(IIHH) {
4402  UNIMPLEMENTED();
4403  USE(instr);
4404  return 0;
4405 }
4406 
4407 EVALUATE(IIHL) {
4408  UNIMPLEMENTED();
4409  USE(instr);
4410  return 0;
4411 }
4412 
4413 EVALUATE(IILH) {
4414  UNIMPLEMENTED();
4415  USE(instr);
4416  return 0;
4417 }
4418 
4419 EVALUATE(IILL) {
4420  UNIMPLEMENTED();
4421  USE(instr);
4422  return 0;
4423 }
4424 
4425 EVALUATE(NIHH) {
4426  UNIMPLEMENTED();
4427  USE(instr);
4428  return 0;
4429 }
4430 
4431 EVALUATE(NIHL) {
4432  UNIMPLEMENTED();
4433  USE(instr);
4434  return 0;
4435 }
4436 
4437 EVALUATE(NILH) {
4438  DCHECK_OPCODE(NILH);
4439  DECODE_RI_A_INSTRUCTION(instr, r1, i);
4440  int32_t r1_val = get_low_register<int32_t>(r1);
4441  // CC is set based on the 16 bits that are AND'd
4442  SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) & i);
4443  i = (i << 16) | 0x0000FFFF;
4444  set_low_register(r1, r1_val & i);
4445  return length;
4446 }
4447 
4448 EVALUATE(NILL) {
4449  DCHECK_OPCODE(NILL);
4450  DECODE_RI_A_INSTRUCTION(instr, r1, i);
4451  int32_t r1_val = get_low_register<int32_t>(r1);
4452  // CC is set based on the 16 bits that are AND'd
4453  SetS390BitWiseConditionCode<uint16_t>(r1_val & i);
4454  i |= 0xFFFF0000;
4455  set_low_register(r1, r1_val & i);
4456  return length;
4457 }
4458 
4459 EVALUATE(OIHH) {
4460  UNIMPLEMENTED();
4461  USE(instr);
4462  return 0;
4463 }
4464 
4465 EVALUATE(OIHL) {
4466  UNIMPLEMENTED();
4467  USE(instr);
4468  return 0;
4469 }
4470 
4471 EVALUATE(OILH) {
4472  DCHECK_OPCODE(OILH);
4473  DECODE_RI_A_INSTRUCTION(instr, r1, i);
4474  int32_t r1_val = get_low_register<int32_t>(r1);
4475  // CC is set based on the 16 bits that are AND'd
4476  SetS390BitWiseConditionCode<uint16_t>((r1_val >> 16) | i);
4477  i = i << 16;
4478  set_low_register(r1, r1_val | i);
4479  return length;
4480 }
4481 
4482 EVALUATE(OILL) {
4483  DCHECK_OPCODE(OILL);
4484  DECODE_RI_A_INSTRUCTION(instr, r1, i);
4485  int32_t r1_val = get_low_register<int32_t>(r1);
4486  // CC is set based on the 16 bits that are AND'd
4487  SetS390BitWiseConditionCode<uint16_t>(r1_val | i);
4488  set_low_register(r1, r1_val | i);
4489  return length;
4490 }
4491 
4492 EVALUATE(LLIHH) {
4493  UNIMPLEMENTED();
4494  USE(instr);
4495  return 0;
4496 }
4497 
4498 EVALUATE(LLIHL) {
4499  UNIMPLEMENTED();
4500  USE(instr);
4501  return 0;
4502 }
4503 
4504 EVALUATE(LLILH) {
4505  UNIMPLEMENTED();
4506  USE(instr);
4507  return 0;
4508 }
4509 
4510 EVALUATE(LLILL) {
4511  UNIMPLEMENTED();
4512  USE(instr);
4513  return 0;
4514 }
4515 
4516 EVALUATE(TMLH) {
4517  UNIMPLEMENTED();
4518  USE(instr);
4519  return 0;
4520 }
4521 
4522 EVALUATE(TMLL) {
4523  DCHECK_OPCODE(TMLL);
4524  DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4525  uint32_t mask = i2 & 0x0000FFFF;
4526  uint32_t r1_val = get_low_register<uint32_t>(r1);
4527  r1_val = r1_val & 0x0000FFFF; // uses only the last 16bits
4528 
4529  // Test if all selected bits are zeros or mask is zero
4530  if (0 == (mask & r1_val)) {
4531  condition_reg_ = 0x8;
4532  return length; // Done!
4533  }
4534 
4535  DCHECK_NE(mask, 0);
4536  // Test if all selected bits are one
4537  if (mask == (mask & r1_val)) {
4538  condition_reg_ = 0x1;
4539  return length; // Done!
4540  }
4541 
4542  // Now we know selected bits mixed zeros and ones
4543  // Test if the leftmost bit is zero or one
4544 #if defined(__GNUC__)
4545  int leadingZeros = __builtin_clz(mask);
4546  mask = 0x80000000u >> leadingZeros;
4547  if (mask & r1_val) {
4548  // leftmost bit is one
4549  condition_reg_ = 0x2;
4550  } else {
4551  // leftmost bit is zero
4552  condition_reg_ = 0x4;
4553  }
4554  return length; // Done!
4555 #else
4556  for (int i = 15; i >= 0; i--) {
4557  if (mask & (1 << i)) {
4558  if (r1_val & (1 << i)) {
4559  // leftmost bit is one
4560  condition_reg_ = 0x2;
4561  } else {
4562  // leftmost bit is zero
4563  condition_reg_ = 0x4;
4564  }
4565  return length; // Done!
4566  }
4567  }
4568 #endif
4569  UNREACHABLE();
4570 }
4571 
4572 EVALUATE(TMHH) {
4573  UNIMPLEMENTED();
4574  USE(instr);
4575  return 0;
4576 }
4577 
4578 EVALUATE(TMHL) {
4579  UNIMPLEMENTED();
4580  USE(instr);
4581  return 0;
4582 }
4583 
4584 EVALUATE(BRAS) {
4585  DCHECK_OPCODE(BRAS);
4586  // Branch Relative and Save
4587  DECODE_RI_B_INSTRUCTION(instr, r1, d2)
4588  intptr_t pc = get_pc();
4589  // Set PC of next instruction to register
4590  set_register(r1, pc + sizeof(FourByteInstr));
4591  // Update PC to branch target
4592  set_pc(pc + d2 * 2);
4593  return length;
4594 }
4595 
4596 EVALUATE(BRCT) {
4597  DCHECK_OPCODE(BRCT);
4598  // Branch On Count (32/64).
4599  DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4600  int64_t value = get_low_register<int32_t>(r1);
4601  set_low_register(r1, --value);
4602  // Branch if value != 0
4603  if (value != 0) {
4604  intptr_t offset = i2 * 2;
4605  set_pc(get_pc() + offset);
4606  }
4607  return length;
4608 }
4609 
4610 EVALUATE(BRCTG) {
4611  DCHECK_OPCODE(BRCTG);
4612  // Branch On Count (32/64).
4613  DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4614  int64_t value = get_register(r1);
4615  set_register(r1, --value);
4616  // Branch if value != 0
4617  if (value != 0) {
4618  intptr_t offset = i2 * 2;
4619  set_pc(get_pc() + offset);
4620  }
4621  return length;
4622 }
4623 
4624 EVALUATE(LHI) {
4625  DCHECK_OPCODE(LHI);
4626  DECODE_RI_A_INSTRUCTION(instr, r1, i);
4627  set_low_register(r1, i);
4628  return length;
4629 }
4630 
4631 EVALUATE(LGHI) {
4632  DCHECK_OPCODE(LGHI);
4633  DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4634  int64_t i = static_cast<int64_t>(i2);
4635  set_register(r1, i);
4636  return length;
4637 }
4638 
4639 EVALUATE(MHI) {
4640  DCHECK_OPCODE(MHI);
4641  DECODE_RI_A_INSTRUCTION(instr, r1, i);
4642  int32_t r1_val = get_low_register<int32_t>(r1);
4643  bool isOF = false;
4644  isOF = CheckOverflowForMul(r1_val, i);
4645  r1_val *= i;
4646  set_low_register(r1, r1_val);
4647  SetS390ConditionCode<int32_t>(r1_val, 0);
4648  SetS390OverflowCode(isOF);
4649  return length;
4650 }
4651 
4652 EVALUATE(MGHI) {
4653  DCHECK_OPCODE(MGHI);
4654  DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4655  int64_t i = static_cast<int64_t>(i2);
4656  int64_t r1_val = get_register(r1);
4657  bool isOF = false;
4658  isOF = CheckOverflowForMul(r1_val, i);
4659  r1_val *= i;
4660  set_register(r1, r1_val);
4661  SetS390ConditionCode<int32_t>(r1_val, 0);
4662  SetS390OverflowCode(isOF);
4663  return length;
4664 }
4665 
4666 EVALUATE(CHI) {
4667  DCHECK_OPCODE(CHI);
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);
4671  return length;
4672 }
4673 
4674 EVALUATE(CGHI) {
4675  DCHECK_OPCODE(CGHI);
4676  DECODE_RI_A_INSTRUCTION(instr, r1, i2);
4677  int64_t i = static_cast<int64_t>(i2);
4678  int64_t r1_val = get_register(r1);
4679  SetS390ConditionCode<int64_t>(r1_val, i);
4680  return length;
4681 }
4682 
4683 EVALUATE(LARL) {
4684  DCHECK_OPCODE(LARL);
4685  DECODE_RIL_B_INSTRUCTION(r1, i2);
4686  intptr_t offset = i2 * 2;
4687  set_register(r1, get_pc() + offset);
4688  return length;
4689 }
4690 
4691 EVALUATE(LGFI) {
4692  DCHECK_OPCODE(LGFI);
4693  DECODE_RIL_A_INSTRUCTION(r1, imm);
4694  set_register(r1, static_cast<int64_t>(static_cast<int32_t>(imm)));
4695  return length;
4696 }
4697 
4698 EVALUATE(BRASL) {
4699  DCHECK_OPCODE(BRASL);
4700  // Branch and Save Relative Long
4701  DECODE_RIL_B_INSTRUCTION(r1, i2);
4702  intptr_t d2 = i2;
4703  intptr_t pc = get_pc();
4704  set_register(r1, pc + 6); // save next instruction to register
4705  set_pc(pc + d2 * 2); // update register
4706  return length;
4707 }
4708 
4709 EVALUATE(XIHF) {
4710  DCHECK_OPCODE(XIHF);
4711  DECODE_RIL_A_INSTRUCTION(r1, imm);
4712  uint32_t alu_out = 0;
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);
4717  return length;
4718 }
4719 
4720 EVALUATE(XILF) {
4721  DCHECK_OPCODE(XILF);
4722  DECODE_RIL_A_INSTRUCTION(r1, imm);
4723  uint32_t alu_out = 0;
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);
4728  return length;
4729 }
4730 
4731 EVALUATE(NIHF) {
4732  DCHECK_OPCODE(NIHF);
4733  // Bitwise Op on upper 32-bits
4734  DECODE_RIL_A_INSTRUCTION(r1, imm);
4735  uint32_t alu_out = get_high_register<uint32_t>(r1);
4736  alu_out &= imm;
4737  SetS390BitWiseConditionCode<uint32_t>(alu_out);
4738  set_high_register(r1, alu_out);
4739  return length;
4740 }
4741 
4742 EVALUATE(NILF) {
4743  DCHECK_OPCODE(NILF);
4744  // Bitwise Op on lower 32-bits
4745  DECODE_RIL_A_INSTRUCTION(r1, imm);
4746  uint32_t alu_out = get_low_register<uint32_t>(r1);
4747  alu_out &= imm;
4748  SetS390BitWiseConditionCode<uint32_t>(alu_out);
4749  set_low_register(r1, alu_out);
4750  return length;
4751 }
4752 
4753 EVALUATE(OIHF) {
4754  DCHECK_OPCODE(OIHF);
4755  // Bitwise Op on upper 32-bits
4756  DECODE_RIL_B_INSTRUCTION(r1, imm);
4757  uint32_t alu_out = get_high_register<uint32_t>(r1);
4758  alu_out |= imm;
4759  SetS390BitWiseConditionCode<uint32_t>(alu_out);
4760  set_high_register(r1, alu_out);
4761  return length;
4762 }
4763 
4764 EVALUATE(OILF) {
4765  DCHECK_OPCODE(OILF);
4766  // Bitwise Op on lower 32-bits
4767  DECODE_RIL_B_INSTRUCTION(r1, imm);
4768  uint32_t alu_out = get_low_register<uint32_t>(r1);
4769  alu_out |= imm;
4770  SetS390BitWiseConditionCode<uint32_t>(alu_out);
4771  set_low_register(r1, alu_out);
4772  return length;
4773 }
4774 
4775 EVALUATE(LLIHF) {
4776  DCHECK_OPCODE(LLIHF);
4777  // Load Logical Immediate into high word
4778  DECODE_RIL_A_INSTRUCTION(r1, i2);
4779  uint64_t imm = static_cast<uint64_t>(i2);
4780  set_register(r1, imm << 32);
4781  return length;
4782 }
4783 
4784 EVALUATE(LLILF) {
4785  DCHECK_OPCODE(LLILF);
4786  // Load Logical into lower 32-bits (zero extend upper 32-bits)
4787  DECODE_RIL_A_INSTRUCTION(r1, i2);
4788  uint64_t imm = static_cast<uint64_t>(i2);
4789  set_register(r1, imm);
4790  return length;
4791 }
4792 
4793 EVALUATE(MSGFI) {
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);
4799  return length;
4800 }
4801 
4802 EVALUATE(MSFI) {
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);
4808  return length;
4809 }
4810 
4811 EVALUATE(SLGFI) {
4812  DCHECK_OPCODE(SLGFI);
4813 #ifndef V8_TARGET_ARCH_S390X
4814  // should only be called on 64bit
4815  DCHECK(false);
4816 #endif
4817  DECODE_RIL_A_INSTRUCTION(r1, i2);
4818  uint64_t r1_val = (uint64_t)(get_register(r1));
4819  uint64_t alu_out;
4820  alu_out = r1_val - i2;
4821  set_register(r1, (intptr_t)alu_out);
4822  SetS390ConditionCode<uint64_t>(alu_out, 0);
4823  return length;
4824 }
4825 
4826 EVALUATE(SLFI) {
4827  DCHECK_OPCODE(SLFI);
4828  DECODE_RIL_A_INSTRUCTION(r1, imm);
4829  uint32_t alu_out = get_low_register<uint32_t>(r1);
4830  alu_out -= imm;
4831  SetS390ConditionCode<uint32_t>(alu_out, 0);
4832  set_low_register(r1, alu_out);
4833  return length;
4834 }
4835 
4836 EVALUATE(AGFI) {
4837  DCHECK_OPCODE(AGFI);
4838  // Clobbering Add Word Immediate
4839  DECODE_RIL_B_INSTRUCTION(r1, i2_val);
4840  bool isOF = false;
4841  // 64-bit Add (Register + 32-bit Imm)
4842  int64_t r1_val = get_register(r1);
4843  int64_t i2 = static_cast<int64_t>(i2_val);
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);
4849  return length;
4850 }
4851 
4852 EVALUATE(AFI) {
4853  DCHECK_OPCODE(AFI);
4854  // Clobbering Add Word Immediate
4855  DECODE_RIL_B_INSTRUCTION(r1, i2);
4856  bool isOF = false;
4857  // 32-bit Add (Register + 32-bit Immediate)
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);
4864  return length;
4865 }
4866 
4867 EVALUATE(ALGFI) {
4868  DCHECK_OPCODE(ALGFI);
4869 #ifndef V8_TARGET_ARCH_S390X
4870  // should only be called on 64bit
4871  DCHECK(false);
4872 #endif
4873  DECODE_RIL_A_INSTRUCTION(r1, i2);
4874  uint64_t r1_val = (uint64_t)(get_register(r1));
4875  uint64_t alu_out;
4876  alu_out = r1_val + i2;
4877  set_register(r1, (intptr_t)alu_out);
4878  SetS390ConditionCode<uint64_t>(alu_out, 0);
4879 
4880  return length;
4881 }
4882 
4883 EVALUATE(ALFI) {
4884  DCHECK_OPCODE(ALFI);
4885  DECODE_RIL_A_INSTRUCTION(r1, imm);
4886  uint32_t alu_out = get_low_register<uint32_t>(r1);
4887  alu_out += imm;
4888  SetS390ConditionCode<uint32_t>(alu_out, 0);
4889  set_low_register(r1, alu_out);
4890  return length;
4891 }
4892 
4893 EVALUATE(CGFI) {
4894  DCHECK_OPCODE(CGFI);
4895  // Compare with Immediate (64)
4896  DECODE_RIL_B_INSTRUCTION(r1, i2);
4897  int64_t imm = static_cast<int64_t>(i2);
4898  SetS390ConditionCode<int64_t>(get_register(r1), imm);
4899  return length;
4900 }
4901 
4902 EVALUATE(CFI) {
4903  DCHECK_OPCODE(CFI);
4904  // Compare with Immediate (32)
4905  DECODE_RIL_B_INSTRUCTION(r1, imm);
4906  SetS390ConditionCode<int32_t>(get_low_register<int32_t>(r1), imm);
4907  return length;
4908 }
4909 
4910 EVALUATE(CLGFI) {
4911  DCHECK_OPCODE(CLGFI);
4912  // Compare Logical with Immediate (64)
4913  DECODE_RIL_A_INSTRUCTION(r1, i2);
4914  uint64_t imm = static_cast<uint64_t>(i2);
4915  SetS390ConditionCode<uint64_t>(get_register(r1), imm);
4916  return length;
4917 }
4918 
4919 EVALUATE(CLFI) {
4920  DCHECK_OPCODE(CLFI);
4921  // Compare Logical with Immediate (32)
4922  DECODE_RIL_A_INSTRUCTION(r1, imm);
4923  SetS390ConditionCode<uint32_t>(get_low_register<uint32_t>(r1), imm);
4924  return length;
4925 }
4926 
4927 EVALUATE(LLHRL) {
4928  UNIMPLEMENTED();
4929  USE(instr);
4930  return 0;
4931 }
4932 
4933 EVALUATE(LGHRL) {
4934  UNIMPLEMENTED();
4935  USE(instr);
4936  return 0;
4937 }
4938 
4939 EVALUATE(LHRL) {
4940  UNIMPLEMENTED();
4941  USE(instr);
4942  return 0;
4943 }
4944 
4945 EVALUATE(LLGHRL) {
4946  UNIMPLEMENTED();
4947  USE(instr);
4948  return 0;
4949 }
4950 
4951 EVALUATE(STHRL) {
4952  UNIMPLEMENTED();
4953  USE(instr);
4954  return 0;
4955 }
4956 
4957 EVALUATE(LGRL) {
4958  UNIMPLEMENTED();
4959  USE(instr);
4960  return 0;
4961 }
4962 
4963 EVALUATE(STGRL) {
4964  UNIMPLEMENTED();
4965  USE(instr);
4966  return 0;
4967 }
4968 
4969 EVALUATE(LGFRL) {
4970  UNIMPLEMENTED();
4971  USE(instr);
4972  return 0;
4973 }
4974 
4975 EVALUATE(LRL) {
4976  UNIMPLEMENTED();
4977  USE(instr);
4978  return 0;
4979 }
4980 
4981 EVALUATE(LLGFRL) {
4982  UNIMPLEMENTED();
4983  USE(instr);
4984  return 0;
4985 }
4986 
4987 EVALUATE(STRL) {
4988  UNIMPLEMENTED();
4989  USE(instr);
4990  return 0;
4991 }
4992 
4993 EVALUATE(EXRL) {
4994  UNIMPLEMENTED();
4995  USE(instr);
4996  return 0;
4997 }
4998 
4999 EVALUATE(PFDRL) {
5000  UNIMPLEMENTED();
5001  USE(instr);
5002  return 0;
5003 }
5004 
5005 EVALUATE(CGHRL) {
5006  UNIMPLEMENTED();
5007  USE(instr);
5008  return 0;
5009 }
5010 
5011 EVALUATE(CHRL) {
5012  UNIMPLEMENTED();
5013  USE(instr);
5014  return 0;
5015 }
5016 
5017 EVALUATE(CGRL) {
5018  UNIMPLEMENTED();
5019  USE(instr);
5020  return 0;
5021 }
5022 
5023 EVALUATE(CGFRL) {
5024  UNIMPLEMENTED();
5025  USE(instr);
5026  return 0;
5027 }
5028 
5029 EVALUATE(ECTG) {
5030  UNIMPLEMENTED();
5031  USE(instr);
5032  return 0;
5033 }
5034 
5035 EVALUATE(CSST) {
5036  UNIMPLEMENTED();
5037  USE(instr);
5038  return 0;
5039 }
5040 
5041 EVALUATE(LPD) {
5042  UNIMPLEMENTED();
5043  USE(instr);
5044  return 0;
5045 }
5046 
5047 EVALUATE(LPDG) {
5048  UNIMPLEMENTED();
5049  USE(instr);
5050  return 0;
5051 }
5052 
5053 EVALUATE(BRCTH) {
5054  UNIMPLEMENTED();
5055  USE(instr);
5056  return 0;
5057 }
5058 
5059 EVALUATE(AIH) {
5060  DCHECK_OPCODE(AIH);
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);
5068  return length;
5069 }
5070 
5071 EVALUATE(ALSIH) {
5072  UNIMPLEMENTED();
5073  USE(instr);
5074  return 0;
5075 }
5076 
5077 EVALUATE(ALSIHN) {
5078  UNIMPLEMENTED();
5079  USE(instr);
5080  return 0;
5081 }
5082 
5083 EVALUATE(CIH) {
5084  DCHECK_OPCODE(CIH);
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));
5088  return length;
5089 }
5090 
5091 EVALUATE(CLIH) {
5092  DCHECK_OPCODE(CLIH);
5093  // Compare Logical with Immediate (32)
5094  DECODE_RIL_A_INSTRUCTION(r1, imm);
5095  SetS390ConditionCode<uint32_t>(get_high_register<uint32_t>(r1), imm);
5096  return length;
5097 }
5098 
5099 EVALUATE(STCK) {
5100  UNIMPLEMENTED();
5101  USE(instr);
5102  return 0;
5103 }
5104 
5105 EVALUATE(CFC) {
5106  UNIMPLEMENTED();
5107  USE(instr);
5108  return 0;
5109 }
5110 
5111 EVALUATE(IPM) {
5112  UNIMPLEMENTED();
5113  USE(instr);
5114  return 0;
5115 }
5116 
5117 EVALUATE(HSCH) {
5118  UNIMPLEMENTED();
5119  USE(instr);
5120  return 0;
5121 }
5122 
5123 EVALUATE(MSCH) {
5124  UNIMPLEMENTED();
5125  USE(instr);
5126  return 0;
5127 }
5128 
5129 EVALUATE(SSCH) {
5130  UNIMPLEMENTED();
5131  USE(instr);
5132  return 0;
5133 }
5134 
5135 EVALUATE(STSCH) {
5136  UNIMPLEMENTED();
5137  USE(instr);
5138  return 0;
5139 }
5140 
5141 EVALUATE(TSCH) {
5142  UNIMPLEMENTED();
5143  USE(instr);
5144  return 0;
5145 }
5146 
5147 EVALUATE(TPI) {
5148  UNIMPLEMENTED();
5149  USE(instr);
5150  return 0;
5151 }
5152 
5153 EVALUATE(SAL) {
5154  UNIMPLEMENTED();
5155  USE(instr);
5156  return 0;
5157 }
5158 
5159 EVALUATE(RSCH) {
5160  UNIMPLEMENTED();
5161  USE(instr);
5162  return 0;
5163 }
5164 
5165 EVALUATE(STCRW) {
5166  UNIMPLEMENTED();
5167  USE(instr);
5168  return 0;
5169 }
5170 
5171 EVALUATE(STCPS) {
5172  UNIMPLEMENTED();
5173  USE(instr);
5174  return 0;
5175 }
5176 
5177 EVALUATE(RCHP) {
5178  UNIMPLEMENTED();
5179  USE(instr);
5180  return 0;
5181 }
5182 
5183 EVALUATE(SCHM) {
5184  UNIMPLEMENTED();
5185  USE(instr);
5186  return 0;
5187 }
5188 
5189 EVALUATE(CKSM) {
5190  UNIMPLEMENTED();
5191  USE(instr);
5192  return 0;
5193 }
5194 
5195 EVALUATE(SAR) {
5196  UNIMPLEMENTED();
5197  USE(instr);
5198  return 0;
5199 }
5200 
5201 EVALUATE(EAR) {
5202  UNIMPLEMENTED();
5203  USE(instr);
5204  return 0;
5205 }
5206 
5207 EVALUATE(MSR) {
5208  DCHECK_OPCODE(MSR);
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);
5213  return length;
5214 }
5215 
5216 EVALUATE(MSRKC) {
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);
5221  int64_t result64 =
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);
5228  return length;
5229 }
5230 
5231 EVALUATE(MVST) {
5232  UNIMPLEMENTED();
5233  USE(instr);
5234  return 0;
5235 }
5236 
5237 EVALUATE(CUSE) {
5238  UNIMPLEMENTED();
5239  USE(instr);
5240  return 0;
5241 }
5242 
5243 EVALUATE(SRST) {
5244  UNIMPLEMENTED();
5245  USE(instr);
5246  return 0;
5247 }
5248 
5249 EVALUATE(XSCH) {
5250  UNIMPLEMENTED();
5251  USE(instr);
5252  return 0;
5253 }
5254 
5255 EVALUATE(STCKE) {
5256  UNIMPLEMENTED();
5257  USE(instr);
5258  return 0;
5259 }
5260 
5261 EVALUATE(STCKF) {
5262  UNIMPLEMENTED();
5263  USE(instr);
5264  return 0;
5265 }
5266 
5267 EVALUATE(SRNM) {
5268  UNIMPLEMENTED();
5269  USE(instr);
5270  return 0;
5271 }
5272 
5273 EVALUATE(STFPC) {
5274  UNIMPLEMENTED();
5275  USE(instr);
5276  return 0;
5277 }
5278 
5279 EVALUATE(LFPC) {
5280  UNIMPLEMENTED();
5281  USE(instr);
5282  return 0;
5283 }
5284 
5285 EVALUATE(TRE) {
5286  UNIMPLEMENTED();
5287  USE(instr);
5288  return 0;
5289 }
5290 
5291 EVALUATE(STFLE) {
5292  UNIMPLEMENTED();
5293  USE(instr);
5294  return 0;
5295 }
5296 
5297 EVALUATE(SRNMB) {
5298  UNIMPLEMENTED();
5299  USE(instr);
5300  return 0;
5301 }
5302 
5303 EVALUATE(SRNMT) {
5304  UNIMPLEMENTED();
5305  USE(instr);
5306  return 0;
5307 }
5308 
5309 EVALUATE(LFAS) {
5310  UNIMPLEMENTED();
5311  USE(instr);
5312  return 0;
5313 }
5314 
5315 EVALUATE(PPA) {
5316  UNIMPLEMENTED();
5317  USE(instr);
5318  return 0;
5319 }
5320 
5321 EVALUATE(ETND) {
5322  UNIMPLEMENTED();
5323  USE(instr);
5324  return 0;
5325 }
5326 
5327 EVALUATE(TEND) {
5328  UNIMPLEMENTED();
5329  USE(instr);
5330  return 0;
5331 }
5332 
5333 EVALUATE(NIAI) {
5334  UNIMPLEMENTED();
5335  USE(instr);
5336  return 0;
5337 }
5338 
5339 EVALUATE(TABORT) {
5340  UNIMPLEMENTED();
5341  USE(instr);
5342  return 0;
5343 }
5344 
5345 EVALUATE(TRAP4) {
5346  DCHECK_OPCODE(TRAP4);
5347  int length = 4;
5348  // whack the space of the caller allocated stack
5349  int64_t sp_addr = get_register(sp);
5350  for (int i = 0; i < kCalleeRegisterSaveAreaSize / kPointerSize; ++i) {
5351  // we dont want to whack the RA (r14)
5352  if (i != 14) (reinterpret_cast<intptr_t*>(sp_addr))[i] = 0xDEADBABE;
5353  }
5354  SoftwareInterrupt(instr);
5355  return length;
5356 }
5357 
5358 EVALUATE(LPEBR) {
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) { // input is NaN
5366  condition_reg_ = CC_OF;
5367  } else if (fr2_val == 0) {
5368  condition_reg_ = CC_EQ;
5369  } else {
5370  condition_reg_ = CC_GT;
5371  }
5372 
5373  return length;
5374 }
5375 
5376 EVALUATE(LNEBR) {
5377  UNIMPLEMENTED();
5378  USE(instr);
5379  return 0;
5380 }
5381 
5382 EVALUATE(LTEBR) {
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);
5389  return length;
5390 }
5391 
5392 EVALUATE(LCEBR) {
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);
5397  fr1_val = -fr2_val;
5398  set_d_register_from_float32(r1, fr1_val);
5399  if (fr2_val != fr2_val) { // input is NaN
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;
5407  }
5408  return length;
5409 }
5410 
5411 EVALUATE(LDEBR) {
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);
5417  return length;
5418 }
5419 
5420 EVALUATE(LXDBR) {
5421  UNIMPLEMENTED();
5422  USE(instr);
5423  return 0;
5424 }
5425 
5426 EVALUATE(LXEBR) {
5427  UNIMPLEMENTED();
5428  USE(instr);
5429  return 0;
5430 }
5431 
5432 EVALUATE(MXDBR) {
5433  UNIMPLEMENTED();
5434  USE(instr);
5435  return 0;
5436 }
5437 
5438 EVALUATE(KEBR) {
5439  UNIMPLEMENTED();
5440  USE(instr);
5441  return 0;
5442 }
5443 
5444 EVALUATE(CEBR) {
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;
5451  } else {
5452  SetS390ConditionCode<float>(fr1_val, fr2_val);
5453  }
5454 
5455  return length;
5456 }
5457 
5458 EVALUATE(AEBR) {
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);
5463  fr1_val += fr2_val;
5464  set_d_register_from_float32(r1, fr1_val);
5465  SetS390ConditionCode<float>(fr1_val, 0);
5466 
5467  return length;
5468 }
5469 
5470 EVALUATE(SEBR) {
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);
5475  fr1_val -= fr2_val;
5476  set_d_register_from_float32(r1, fr1_val);
5477  SetS390ConditionCode<float>(fr1_val, 0);
5478 
5479  return length;
5480 }
5481 
5482 EVALUATE(MDEBR) {
5483  UNIMPLEMENTED();
5484  USE(instr);
5485  return 0;
5486 }
5487 
5488 EVALUATE(DEBR) {
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);
5493  fr1_val /= fr2_val;
5494  set_d_register_from_float32(r1, fr1_val);
5495  return length;
5496 }
5497 
5498 EVALUATE(MAEBR) {
5499  UNIMPLEMENTED();
5500  USE(instr);
5501  return 0;
5502 }
5503 
5504 EVALUATE(MSEBR) {
5505  UNIMPLEMENTED();
5506  USE(instr);
5507  return 0;
5508 }
5509 
5510 EVALUATE(LPDBR) {
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) { // input is NaN
5518  condition_reg_ = CC_OF;
5519  } else if (r2_val == 0) {
5520  condition_reg_ = CC_EQ;
5521  } else {
5522  condition_reg_ = CC_GT;
5523  }
5524  return length;
5525 }
5526 
5527 EVALUATE(LNDBR) {
5528  UNIMPLEMENTED();
5529  USE(instr);
5530  return 0;
5531 }
5532 
5533 EVALUATE(LTDBR) {
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);
5539  return length;
5540 }
5541 
5542 EVALUATE(LCDBR) {
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);
5547  r1_val = -r2_val;
5548  set_d_register_from_double(r1, r1_val);
5549  if (r2_val != r2_val) { // input is NaN
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;
5557  }
5558  return length;
5559 }
5560 
5561 EVALUATE(SQEBR) {
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);
5568  return length;
5569 }
5570 
5571 EVALUATE(SQDBR) {
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);
5578  return length;
5579 }
5580 
5581 EVALUATE(SQXBR) {
5582  UNIMPLEMENTED();
5583  USE(instr);
5584  return 0;
5585 }
5586 
5587 EVALUATE(MEEBR) {
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);
5592  fr1_val *= fr2_val;
5593  set_d_register_from_float32(r1, fr1_val);
5594  return length;
5595 }
5596 
5597 EVALUATE(KDBR) {
5598  UNIMPLEMENTED();
5599  USE(instr);
5600  return 0;
5601 }
5602 
5603 EVALUATE(CDBR) {
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;
5610  } else {
5611  SetS390ConditionCode<double>(r1_val, r2_val);
5612  }
5613  return length;
5614 }
5615 
5616 EVALUATE(ADBR) {
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);
5621  r1_val += r2_val;
5622  set_d_register_from_double(r1, r1_val);
5623  SetS390ConditionCode<double>(r1_val, 0);
5624  return length;
5625 }
5626 
5627 EVALUATE(SDBR) {
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);
5632  r1_val -= r2_val;
5633  set_d_register_from_double(r1, r1_val);
5634  SetS390ConditionCode<double>(r1_val, 0);
5635  return length;
5636 }
5637 
5638 EVALUATE(MDBR) {
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);
5643  r1_val *= r2_val;
5644  set_d_register_from_double(r1, r1_val);
5645  return length;
5646 }
5647 
5648 EVALUATE(DDBR) {
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);
5653  r1_val /= r2_val;
5654  set_d_register_from_double(r1, r1_val);
5655  return length;
5656 }
5657 
5658 EVALUATE(MADBR) {
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);
5667  return length;
5668 }
5669 
5670 EVALUATE(MSDBR) {
5671  UNIMPLEMENTED();
5672  USE(instr);
5673  return 0;
5674 }
5675 
5676 EVALUATE(LPXBR) {
5677  UNIMPLEMENTED();
5678  USE(instr);
5679  return 0;
5680 }
5681 
5682 EVALUATE(LNXBR) {
5683  UNIMPLEMENTED();
5684  USE(instr);
5685  return 0;
5686 }
5687 
5688 EVALUATE(LTXBR) {
5689  UNIMPLEMENTED();
5690  USE(instr);
5691  return 0;
5692 }
5693 
5694 EVALUATE(LCXBR) {
5695  UNIMPLEMENTED();
5696  USE(instr);
5697  return 0;
5698 }
5699 
5700 EVALUATE(LEDBRA) {
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));
5705  return length;
5706 }
5707 
5708 EVALUATE(LDXBRA) {
5709  UNIMPLEMENTED();
5710  USE(instr);
5711  return 0;
5712 }
5713 
5714 EVALUATE(LEXBRA) {
5715  UNIMPLEMENTED();
5716  USE(instr);
5717  return 0;
5718 }
5719 
5720 EVALUATE(FIXBRA) {
5721  UNIMPLEMENTED();
5722  USE(instr);
5723  return 0;
5724 }
5725 
5726 EVALUATE(KXBR) {
5727  UNIMPLEMENTED();
5728  USE(instr);
5729  return 0;
5730 }
5731 
5732 EVALUATE(CXBR) {
5733  UNIMPLEMENTED();
5734  USE(instr);
5735  return 0;
5736 }
5737 
5738 EVALUATE(AXBR) {
5739  UNIMPLEMENTED();
5740  USE(instr);
5741  return 0;
5742 }
5743 
5744 EVALUATE(SXBR) {
5745  UNIMPLEMENTED();
5746  USE(instr);
5747  return 0;
5748 }
5749 
5750 EVALUATE(MXBR) {
5751  UNIMPLEMENTED();
5752  USE(instr);
5753  return 0;
5754 }
5755 
5756 EVALUATE(DXBR) {
5757  UNIMPLEMENTED();
5758  USE(instr);
5759  return 0;
5760 }
5761 
5762 EVALUATE(TBEDR) {
5763  UNIMPLEMENTED();
5764  USE(instr);
5765  return 0;
5766 }
5767 
5768 EVALUATE(TBDR) {
5769  UNIMPLEMENTED();
5770  USE(instr);
5771  return 0;
5772 }
5773 
5774 EVALUATE(DIEBR) {
5775  UNIMPLEMENTED();
5776  USE(instr);
5777  return 0;
5778 }
5779 
5780 EVALUATE(FIEBRA) {
5781  DCHECK_OPCODE(FIEBRA);
5782  DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
5783  float r2_val = get_float32_from_d_register(r2);
5784  CHECK_EQ(m4, 0);
5785  switch (m3) {
5786  case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0:
5787  set_d_register_from_float32(r1, round(r2_val));
5788  break;
5789  case Assembler::FIDBRA_ROUND_TOWARD_0:
5790  set_d_register_from_float32(r1, trunc(r2_val));
5791  break;
5792  case Assembler::FIDBRA_ROUND_TOWARD_POS_INF:
5793  set_d_register_from_float32(r1, std::ceil(r2_val));
5794  break;
5795  case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF:
5796  set_d_register_from_float32(r1, std::floor(r2_val));
5797  break;
5798  default:
5799  UNIMPLEMENTED();
5800  break;
5801  }
5802  return length;
5803 }
5804 
5805 EVALUATE(THDER) {
5806  UNIMPLEMENTED();
5807  USE(instr);
5808  return 0;
5809 }
5810 
5811 EVALUATE(THDR) {
5812  UNIMPLEMENTED();
5813  USE(instr);
5814  return 0;
5815 }
5816 
5817 EVALUATE(DIDBR) {
5818  UNIMPLEMENTED();
5819  USE(instr);
5820  return 0;
5821 }
5822 
5823 EVALUATE(FIDBRA) {
5824  DCHECK_OPCODE(FIDBRA);
5825  DECODE_RRF_E_INSTRUCTION(r1, r2, m3, m4);
5826  double r2_val = get_double_from_d_register(r2);
5827  CHECK_EQ(m4, 0);
5828  switch (m3) {
5829  case Assembler::FIDBRA_ROUND_TO_NEAREST_AWAY_FROM_0:
5830  set_d_register_from_double(r1, round(r2_val));
5831  break;
5832  case Assembler::FIDBRA_ROUND_TOWARD_0:
5833  set_d_register_from_double(r1, trunc(r2_val));
5834  break;
5835  case Assembler::FIDBRA_ROUND_TOWARD_POS_INF:
5836  set_d_register_from_double(r1, std::ceil(r2_val));
5837  break;
5838  case Assembler::FIDBRA_ROUND_TOWARD_NEG_INF:
5839  set_d_register_from_double(r1, std::floor(r2_val));
5840  break;
5841  default:
5842  UNIMPLEMENTED();
5843  break;
5844  }
5845  return length;
5846 }
5847 
5848 EVALUATE(LXR) {
5849  UNIMPLEMENTED();
5850  USE(instr);
5851  return 0;
5852 }
5853 
5854 EVALUATE(LPDFR) {
5855  UNIMPLEMENTED();
5856  USE(instr);
5857  return 0;
5858 }
5859 
5860 EVALUATE(LNDFR) {
5861  UNIMPLEMENTED();
5862  USE(instr);
5863  return 0;
5864 }
5865 
5866 EVALUATE(LCDFR) {
5867  UNIMPLEMENTED();
5868  USE(instr);
5869  return 0;
5870 }
5871 
5872 EVALUATE(LZER) {
5873  UNIMPLEMENTED();
5874  USE(instr);
5875  return 0;
5876 }
5877 
5878 EVALUATE(LZDR) {
5879  DCHECK_OPCODE(LZDR);
5880  DECODE_RRE_INSTRUCTION_NO_R2(r1);
5881  set_d_register_from_double(r1, 0.0);
5882  return length;
5883 }
5884 
5885 EVALUATE(LZXR) {
5886  UNIMPLEMENTED();
5887  USE(instr);
5888  return 0;
5889 }
5890 
5891 EVALUATE(SFPC) {
5892  UNIMPLEMENTED();
5893  USE(instr);
5894  return 0;
5895 }
5896 
5897 EVALUATE(SFASR) {
5898  UNIMPLEMENTED();
5899  USE(instr);
5900  return 0;
5901 }
5902 
5903 EVALUATE(EFPC) {
5904  UNIMPLEMENTED();
5905  USE(instr);
5906  return 0;
5907 }
5908 
5909 EVALUATE(CELFBR) {
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);
5915  return length;
5916 }
5917 
5918 EVALUATE(CDLFBR) {
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);
5924  return length;
5925 }
5926 
5927 EVALUATE(CXLFBR) {
5928  UNIMPLEMENTED();
5929  USE(instr);
5930  return 0;
5931 }
5932 
5933 EVALUATE(CEFBRA) {
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);
5939  return length;
5940 }
5941 
5942 EVALUATE(CDFBRA) {
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);
5948  return length;
5949 }
5950 
5951 EVALUATE(CXFBRA) {
5952  UNIMPLEMENTED();
5953  USE(instr);
5954  return 0;
5955 }
5956 
5957 EVALUATE(CFEBRA) {
5958  DCHECK_OPCODE(CFEBRA);
5959  DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val);
5960  float r2_fval = get_float32_from_d_register(r2);
5961  int32_t r1_val = 0;
5962 
5963  SetS390RoundConditionCode(r2_fval, INT32_MAX, INT32_MIN);
5964 
5965  switch (mask_val) {
5966  case CURRENT_ROUNDING_MODE:
5967  case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: {
5968  r1_val = static_cast<int32_t>(r2_fval);
5969  break;
5970  }
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);
5980  } else { // round away from zero:
5981  if (r2_fval > 0.0) {
5982  r1_val = static_cast<int32_t>(ceil_val);
5983  } else {
5984  r1_val = static_cast<int32_t>(floor_val);
5985  }
5986  }
5987  break;
5988  }
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);
5998  } else { // check which one is even:
5999  int32_t c_v = static_cast<int32_t>(ceil_val);
6000  int32_t f_v = static_cast<int32_t>(floor_val);
6001  if (f_v % 2 == 0)
6002  r1_val = f_v;
6003  else
6004  r1_val = c_v;
6005  }
6006  break;
6007  }
6008  case ROUND_TOWARD_0: {
6009  // check for overflow, cast r2_fval to 64bit integer
6010  // then check value within the range of INT_MIN and INT_MAX
6011  // and set condition code accordingly
6012  int64_t temp = static_cast<int64_t>(r2_fval);
6013  if (temp < INT_MIN || temp > INT_MAX) {
6014  condition_reg_ = CC_OF;
6015  }
6016  r1_val = static_cast<int32_t>(r2_fval);
6017  break;
6018  }
6019  case ROUND_TOWARD_PLUS_INFINITE: {
6020  r1_val = static_cast<int32_t>(std::ceil(r2_fval));
6021  break;
6022  }
6023  case ROUND_TOWARD_MINUS_INFINITE: {
6024  // check for overflow, cast r2_fval to 64bit integer
6025  // then check value within the range of INT_MIN and INT_MAX
6026  // and set condition code accordingly
6027  int64_t temp = static_cast<int64_t>(std::floor(r2_fval));
6028  if (temp < INT_MIN || temp > INT_MAX) {
6029  condition_reg_ = CC_OF;
6030  }
6031  r1_val = static_cast<int32_t>(std::floor(r2_fval));
6032  break;
6033  }
6034  default:
6035  UNREACHABLE();
6036  }
6037  set_low_register(r1, r1_val);
6038  return length;
6039 }
6040 
6041 EVALUATE(CFDBRA) {
6042  DCHECK_OPCODE(CFDBRA);
6043  DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val);
6044  double r2_val = get_double_from_d_register(r2);
6045  int32_t r1_val = 0;
6046 
6047  SetS390RoundConditionCode(r2_val, INT32_MAX, INT32_MIN);
6048 
6049  switch (mask_val) {
6050  case CURRENT_ROUNDING_MODE:
6051  case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: {
6052  r1_val = static_cast<int32_t>(r2_val);
6053  break;
6054  }
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);
6064  } else { // round away from zero:
6065  if (r2_val > 0.0) {
6066  r1_val = static_cast<int32_t>(ceil_val);
6067  } else {
6068  r1_val = static_cast<int32_t>(floor_val);
6069  }
6070  }
6071  break;
6072  }
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);
6082  } else { // check which one is even:
6083  int32_t c_v = static_cast<int32_t>(ceil_val);
6084  int32_t f_v = static_cast<int32_t>(floor_val);
6085  if (f_v % 2 == 0)
6086  r1_val = f_v;
6087  else
6088  r1_val = c_v;
6089  }
6090  break;
6091  }
6092  case ROUND_TOWARD_0: {
6093  // check for overflow, cast r2_val to 64bit integer
6094  // then check value within the range of INT_MIN and INT_MAX
6095  // and set condition code accordingly
6096  int64_t temp = static_cast<int64_t>(r2_val);
6097  if (temp < INT_MIN || temp > INT_MAX) {
6098  condition_reg_ = CC_OF;
6099  }
6100  r1_val = static_cast<int32_t>(r2_val);
6101  break;
6102  }
6103  case ROUND_TOWARD_PLUS_INFINITE: {
6104  r1_val = static_cast<int32_t>(std::ceil(r2_val));
6105  break;
6106  }
6107  case ROUND_TOWARD_MINUS_INFINITE: {
6108  // check for overflow, cast r2_val to 64bit integer
6109  // then check value within the range of INT_MIN and INT_MAX
6110  // and set condition code accordingly
6111  int64_t temp = static_cast<int64_t>(std::floor(r2_val));
6112  if (temp < INT_MIN || temp > INT_MAX) {
6113  condition_reg_ = CC_OF;
6114  }
6115  r1_val = static_cast<int32_t>(std::floor(r2_val));
6116  break;
6117  }
6118  default:
6119  UNREACHABLE();
6120  }
6121  set_low_register(r1, r1_val);
6122  return length;
6123 }
6124 
6125 EVALUATE(CFXBRA) {
6126  UNIMPLEMENTED();
6127  USE(instr);
6128  return 0;
6129 }
6130 
6131 EVALUATE(CLFEBR) {
6132  DCHECK_OPCODE(CLFEBR);
6133  DECODE_RRE_INSTRUCTION(r1, r2);
6134  float r2_val = get_float32_from_d_register(r2);
6135  uint32_t r1_val = static_cast<uint32_t>(r2_val);
6136  set_low_register(r1, r1_val);
6137  SetS390ConvertConditionCode<double>(r2_val, r1_val, UINT32_MAX);
6138  return length;
6139 }
6140 
6141 EVALUATE(CLFDBR) {
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);
6146  uint32_t r1_val = static_cast<uint32_t>(n);
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;
6156  } else {
6157  condition_reg_ = 0x1;
6158  }
6159  return length;
6160 }
6161 
6162 EVALUATE(CLFXBR) {
6163  UNIMPLEMENTED();
6164  USE(instr);
6165  return 0;
6166 }
6167 
6168 EVALUATE(CELGBR) {
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);
6174  return length;
6175 }
6176 
6177 EVALUATE(CDLGBR) {
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);
6183  return length;
6184 }
6185 
6186 EVALUATE(CXLGBR) {
6187  UNIMPLEMENTED();
6188  USE(instr);
6189  return 0;
6190 }
6191 
6192 EVALUATE(CEGBRA) {
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);
6198  return length;
6199 }
6200 
6201 EVALUATE(CDGBRA) {
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);
6207  return length;
6208 }
6209 
6210 EVALUATE(CXGBRA) {
6211  UNIMPLEMENTED();
6212  USE(instr);
6213  return 0;
6214 }
6215 
6216 EVALUATE(CGEBRA) {
6217  DCHECK_OPCODE(CGEBRA);
6218  DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val);
6219  float r2_fval = get_float32_from_d_register(r2);
6220  int64_t r1_val = 0;
6221 
6222  SetS390RoundConditionCode(r2_fval, INT64_MAX, INT64_MIN);
6223 
6224  switch (mask_val) {
6225  case CURRENT_ROUNDING_MODE:
6226  case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0:
6227  case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: {
6228  UNIMPLEMENTED();
6229  break;
6230  }
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);
6238  } else { // check which one is even:
6239  int64_t c_v = static_cast<int64_t>(ceil_val);
6240  int64_t f_v = static_cast<int64_t>(floor_val);
6241  if (f_v % 2 == 0)
6242  r1_val = f_v;
6243  else
6244  r1_val = c_v;
6245  }
6246  break;
6247  }
6248  case ROUND_TOWARD_0: {
6249  r1_val = static_cast<int64_t>(r2_fval);
6250  break;
6251  }
6252  case ROUND_TOWARD_PLUS_INFINITE: {
6253  r1_val = static_cast<int64_t>(std::ceil(r2_fval));
6254  break;
6255  }
6256  case ROUND_TOWARD_MINUS_INFINITE: {
6257  r1_val = static_cast<int64_t>(std::floor(r2_fval));
6258  break;
6259  }
6260  default:
6261  UNREACHABLE();
6262  }
6263  set_register(r1, r1_val);
6264  return length;
6265 }
6266 
6267 EVALUATE(CGDBRA) {
6268  DCHECK_OPCODE(CGDBRA);
6269  DECODE_RRE_INSTRUCTION_M3(r1, r2, mask_val);
6270  double r2_val = get_double_from_d_register(r2);
6271  int64_t r1_val = 0;
6272 
6273  SetS390RoundConditionCode(r2_val, INT64_MAX, INT64_MIN);
6274 
6275  switch (mask_val) {
6276  case CURRENT_ROUNDING_MODE:
6277  case ROUND_TO_NEAREST_WITH_TIES_AWAY_FROM_0:
6278  case ROUND_TO_PREPARE_FOR_SHORTER_PRECISION: {
6279  UNIMPLEMENTED();
6280  break;
6281  }
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);
6289  } else { // check which one is even:
6290  int64_t c_v = static_cast<int64_t>(ceil_val);
6291  int64_t f_v = static_cast<int64_t>(floor_val);
6292  if (f_v % 2 == 0)
6293  r1_val = f_v;
6294  else
6295  r1_val = c_v;
6296  }
6297  break;
6298  }
6299  case ROUND_TOWARD_0: {
6300  r1_val = static_cast<int64_t>(r2_val);
6301  break;
6302  }
6303  case ROUND_TOWARD_PLUS_INFINITE: {
6304  r1_val = static_cast<int64_t>(std::ceil(r2_val));
6305  break;
6306  }
6307  case ROUND_TOWARD_MINUS_INFINITE: {
6308  r1_val = static_cast<int64_t>(std::floor(r2_val));
6309  break;
6310  }
6311  default:
6312  UNREACHABLE();
6313  }
6314  set_register(r1, r1_val);
6315  return length;
6316 }
6317 
6318 EVALUATE(CGXBRA) {
6319  UNIMPLEMENTED();
6320  USE(instr);
6321  return 0;
6322 }
6323 
6324 EVALUATE(CLGEBR) {
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);
6331  return length;
6332 }
6333 
6334 EVALUATE(CLGDBR) {
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);
6341  return length;
6342 }
6343 
6344 EVALUATE(CFER) {
6345  UNIMPLEMENTED();
6346  USE(instr);
6347  return 0;
6348 }
6349 
6350 EVALUATE(CFDR) {
6351  UNIMPLEMENTED();
6352  USE(instr);
6353  return 0;
6354 }
6355 
6356 EVALUATE(CFXR) {
6357  UNIMPLEMENTED();
6358  USE(instr);
6359  return 0;
6360 }
6361 
6362 EVALUATE(LDGR) {
6363  DCHECK_OPCODE(LDGR);
6364  // Load FPR from GPR (L <- 64)
6365  DECODE_RRE_INSTRUCTION(r1, r2);
6366  uint64_t int_val = get_register(r2);
6367  // double double_val = bit_cast<double, uint64_t>(int_val);
6368  // set_d_register_from_double(rreInst->R1Value(), double_val);
6369  set_d_register(r1, int_val);
6370  return length;
6371 }
6372 
6373 EVALUATE(CGER) {
6374  UNIMPLEMENTED();
6375  USE(instr);
6376  return 0;
6377 }
6378 
6379 EVALUATE(CGDR) {
6380  UNIMPLEMENTED();
6381  USE(instr);
6382  return 0;
6383 }
6384 
6385 EVALUATE(CGXR) {
6386  UNIMPLEMENTED();
6387  USE(instr);
6388  return 0;
6389 }
6390 
6391 EVALUATE(LGDR) {
6392  DCHECK_OPCODE(LGDR);
6393  DECODE_RRE_INSTRUCTION(r1, r2);
6394  // Load GPR from FPR (64 <- L)
6395  int64_t double_val = get_d_register(r2);
6396  set_register(r1, double_val);
6397  return length;
6398 }
6399 
6400 EVALUATE(MDTRA) {
6401  UNIMPLEMENTED();
6402  USE(instr);
6403  return 0;
6404 }
6405 
6406 EVALUATE(DDTRA) {
6407  UNIMPLEMENTED();
6408  USE(instr);
6409  return 0;
6410 }
6411 
6412 EVALUATE(ADTRA) {
6413  UNIMPLEMENTED();
6414  USE(instr);
6415  return 0;
6416 }
6417 
6418 EVALUATE(SDTRA) {
6419  UNIMPLEMENTED();
6420  USE(instr);
6421  return 0;
6422 }
6423 
6424 EVALUATE(LDETR) {
6425  UNIMPLEMENTED();
6426  USE(instr);
6427  return 0;
6428 }
6429 
6430 EVALUATE(LEDTR) {
6431  UNIMPLEMENTED();
6432  USE(instr);
6433  return 0;
6434 }
6435 
6436 EVALUATE(LTDTR) {
6437  UNIMPLEMENTED();
6438  USE(instr);
6439  return 0;
6440 }
6441 
6442 EVALUATE(FIDTR) {
6443  UNIMPLEMENTED();
6444  USE(instr);
6445  return 0;
6446 }
6447 
6448 EVALUATE(MXTRA) {
6449  UNIMPLEMENTED();
6450  USE(instr);
6451  return 0;
6452 }
6453 
6454 EVALUATE(DXTRA) {
6455  UNIMPLEMENTED();
6456  USE(instr);
6457  return 0;
6458 }
6459 
6460 EVALUATE(AXTRA) {
6461  UNIMPLEMENTED();
6462  USE(instr);
6463  return 0;
6464 }
6465 
6466 EVALUATE(SXTRA) {
6467  UNIMPLEMENTED();
6468  USE(instr);
6469  return 0;
6470 }
6471 
6472 EVALUATE(LXDTR) {
6473  UNIMPLEMENTED();
6474  USE(instr);
6475  return 0;
6476 }
6477 
6478 EVALUATE(LDXTR) {
6479  UNIMPLEMENTED();
6480  USE(instr);
6481  return 0;
6482 }
6483 
6484 EVALUATE(LTXTR) {
6485  UNIMPLEMENTED();
6486  USE(instr);
6487  return 0;
6488 }
6489 
6490 EVALUATE(FIXTR) {
6491  UNIMPLEMENTED();
6492  USE(instr);
6493  return 0;
6494 }
6495 
6496 EVALUATE(KDTR) {
6497  UNIMPLEMENTED();
6498  USE(instr);
6499  return 0;
6500 }
6501 
6502 EVALUATE(CGDTRA) {
6503  UNIMPLEMENTED();
6504  USE(instr);
6505  return 0;
6506 }
6507 
6508 EVALUATE(CUDTR) {
6509  UNIMPLEMENTED();
6510  USE(instr);
6511  return 0;
6512 }
6513 
6514 EVALUATE(CDTR) {
6515  UNIMPLEMENTED();
6516  USE(instr);
6517  return 0;
6518 }
6519 
6520 EVALUATE(EEDTR) {
6521  UNIMPLEMENTED();
6522  USE(instr);
6523  return 0;
6524 }
6525 
6526 EVALUATE(ESDTR) {
6527  UNIMPLEMENTED();
6528  USE(instr);
6529  return 0;
6530 }
6531 
6532 EVALUATE(KXTR) {
6533  UNIMPLEMENTED();
6534  USE(instr);
6535  return 0;
6536 }
6537 
6538 EVALUATE(CGXTRA) {
6539  UNIMPLEMENTED();
6540  USE(instr);
6541  return 0;
6542 }
6543 
6544 EVALUATE(CUXTR) {
6545  UNIMPLEMENTED();
6546  USE(instr);
6547  return 0;
6548 }
6549 
6550 EVALUATE(CSXTR) {
6551  UNIMPLEMENTED();
6552  USE(instr);
6553  return 0;
6554 }
6555 
6556 EVALUATE(CXTR) {
6557  UNIMPLEMENTED();
6558  USE(instr);
6559  return 0;
6560 }
6561 
6562 EVALUATE(EEXTR) {
6563  UNIMPLEMENTED();
6564  USE(instr);
6565  return 0;
6566 }
6567 
6568 EVALUATE(ESXTR) {
6569  UNIMPLEMENTED();
6570  USE(instr);
6571  return 0;
6572 }
6573 
6574 EVALUATE(CDGTRA) {
6575  UNIMPLEMENTED();
6576  USE(instr);
6577  return 0;
6578 }
6579 
6580 EVALUATE(CDUTR) {
6581  UNIMPLEMENTED();
6582  USE(instr);
6583  return 0;
6584 }
6585 
6586 EVALUATE(CDSTR) {
6587  UNIMPLEMENTED();
6588  USE(instr);
6589  return 0;
6590 }
6591 
6592 EVALUATE(CEDTR) {
6593  UNIMPLEMENTED();
6594  USE(instr);
6595  return 0;
6596 }
6597 
6598 EVALUATE(QADTR) {
6599  UNIMPLEMENTED();
6600  USE(instr);
6601  return 0;
6602 }
6603 
6604 EVALUATE(IEDTR) {
6605  UNIMPLEMENTED();
6606  USE(instr);
6607  return 0;
6608 }
6609 
6610 EVALUATE(RRDTR) {
6611  UNIMPLEMENTED();
6612  USE(instr);
6613  return 0;
6614 }
6615 
6616 EVALUATE(CXGTRA) {
6617  UNIMPLEMENTED();
6618  USE(instr);
6619  return 0;
6620 }
6621 
6622 EVALUATE(CXUTR) {
6623  UNIMPLEMENTED();
6624  USE(instr);
6625  return 0;
6626 }
6627 
6628 EVALUATE(CXSTR) {
6629  UNIMPLEMENTED();
6630  USE(instr);
6631  return 0;
6632 }
6633 
6634 EVALUATE(CEXTR) {
6635  UNIMPLEMENTED();
6636  USE(instr);
6637  return 0;
6638 }
6639 
6640 EVALUATE(QAXTR) {
6641  UNIMPLEMENTED();
6642  USE(instr);
6643  return 0;
6644 }
6645 
6646 EVALUATE(IEXTR) {
6647  UNIMPLEMENTED();
6648  USE(instr);
6649  return 0;
6650 }
6651 
6652 EVALUATE(RRXTR) {
6653  UNIMPLEMENTED();
6654  USE(instr);
6655  return 0;
6656 }
6657 
6658 EVALUATE(LPGR) {
6659  DCHECK_OPCODE(LPGR);
6660  // Load Positive (32)
6661  DECODE_RRE_INSTRUCTION(r1, r2);
6662  int64_t r2_val = get_register(r2);
6663  r2_val = (r2_val < 0) ? -r2_val : r2_val; // If negative, then negate it.
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);
6668  }
6669  return length;
6670 }
6671 
6672 EVALUATE(LNGR) {
6673  DCHECK_OPCODE(LNGR);
6674  // Load Negative (64)
6675  DECODE_RRE_INSTRUCTION(r1, r2);
6676  int64_t r2_val = get_register(r2);
6677  r2_val = (r2_val >= 0) ? -r2_val : r2_val; // If pos, then negate it.
6678  set_register(r1, r2_val);
6679  condition_reg_ = (r2_val == 0) ? CC_EQ : CC_LT; // CC0 - result is zero
6680  // CC1 - result is negative
6681  return length;
6682 }
6683 
6684 EVALUATE(LTGR) {
6685  DCHECK_OPCODE(LTGR);
6686  // Load Register (64)
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));
6691  return length;
6692 }
6693 
6694 EVALUATE(LCGR) {
6695  DCHECK_OPCODE(LCGR);
6696  DECODE_RRE_INSTRUCTION(r1, r2);
6697  int64_t r2_val = get_register(r2);
6698  int64_t result = 0;
6699  bool isOF = false;
6700 #ifdef V8_TARGET_ARCH_S390X
6701  isOF = __builtin_ssubl_overflow(0L, r2_val, &result);
6702 #else
6703  isOF = __builtin_ssubll_overflow(0L, r2_val, &result);
6704 #endif
6705  set_register(r1, result);
6706  SetS390ConditionCode<int64_t>(result, 0);
6707  if (isOF) {
6708  SetS390OverflowCode(true);
6709  }
6710  return length;
6711 }
6712 
6713 EVALUATE(SGR) {
6714  DCHECK_OPCODE(SGR);
6715  DECODE_RRE_INSTRUCTION(r1, r2);
6716  int64_t r1_val = get_register(r1);
6717  int64_t r2_val = get_register(r2);
6718  bool isOF = false;
6719  isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t);
6720  r1_val -= r2_val;
6721  SetS390ConditionCode<int64_t>(r1_val, 0);
6722  SetS390OverflowCode(isOF);
6723  set_register(r1, r1_val);
6724  return length;
6725 }
6726 
6727 EVALUATE(ALGR) {
6728  UNIMPLEMENTED();
6729  USE(instr);
6730  return 0;
6731 }
6732 
6733 EVALUATE(SLGR) {
6734  UNIMPLEMENTED();
6735  USE(instr);
6736  return 0;
6737 }
6738 
6739 EVALUATE(MSGR) {
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);
6745  return length;
6746 }
6747 
6748 EVALUATE(MSGRKC) {
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);
6759  return length;
6760 }
6761 
6762 EVALUATE(DSGR) {
6763  DCHECK_OPCODE(DSGR);
6764  DECODE_RRE_INSTRUCTION(r1, r2);
6765 
6766  DCHECK_EQ(r1 % 2, 0);
6767 
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);
6772  return length;
6773 }
6774 
6775 EVALUATE(LRVGR) {
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);
6780 
6781  set_register(r1, r1_val);
6782  return length;
6783 }
6784 
6785 EVALUATE(LPGFR) {
6786  DCHECK_OPCODE(LPGFR);
6787  // Load Positive (32)
6788  DECODE_RRE_INSTRUCTION(r1, r2);
6789  int32_t r2_val = get_low_register<int32_t>(r2);
6790  // If negative, then negate it.
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);
6794  return length;
6795 }
6796 
6797 EVALUATE(LNGFR) {
6798  UNIMPLEMENTED();
6799  USE(instr);
6800  return 0;
6801 }
6802 
6803 EVALUATE(LTGFR) {
6804  DCHECK_OPCODE(LTGFR);
6805  DECODE_RRE_INSTRUCTION(r1, r2);
6806  // Load and Test Register (64 <- 32) (Sign Extends 32-bit val)
6807  // Load Register (64 <- 32) (Sign Extends 32-bit val)
6808  int32_t r2_val = get_low_register<int32_t>(r2);
6809  int64_t result = static_cast<int64_t>(r2_val);
6810  set_register(r1, result);
6811  SetS390ConditionCode<int64_t>(result, 0);
6812  return length;
6813 }
6814 
6815 EVALUATE(LCGFR) {
6816  DCHECK_OPCODE(LCGFR);
6817  DECODE_RRE_INSTRUCTION(r1, r2);
6818  // Load and Test Register (64 <- 32) (Sign Extends 32-bit val)
6819  // Load Register (64 <- 32) (Sign Extends 32-bit val)
6820  int32_t r2_val = get_low_register<int32_t>(r2);
6821  int64_t result = static_cast<int64_t>(r2_val);
6822  set_register(r1, result);
6823  return length;
6824 }
6825 
6826 EVALUATE(LLGFR) {
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);
6832  return length;
6833 }
6834 
6835 EVALUATE(LLGTR) {
6836  UNIMPLEMENTED();
6837  USE(instr);
6838  return 0;
6839 }
6840 
6841 EVALUATE(AGFR) {
6842  DCHECK_OPCODE(AGFR);
6843  DECODE_RRE_INSTRUCTION(r1, r2);
6844  // Add Register (64 <- 32) (Sign Extends 32-bit val)
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);
6848  r1_val += r2_val;
6849  SetS390ConditionCode<int64_t>(r1_val, 0);
6850  SetS390OverflowCode(isOF);
6851  set_register(r1, r1_val);
6852  return length;
6853 }
6854 
6855 EVALUATE(SGFR) {
6856  DCHECK_OPCODE(SGFR);
6857  DECODE_RRE_INSTRUCTION(r1, r2);
6858  // Sub Reg (64 <- 32)
6859  int64_t r1_val = get_register(r1);
6860  int64_t r2_val = static_cast<int64_t>(get_low_register<int32_t>(r2));
6861  bool isOF = false;
6862  isOF = CheckOverflowForIntSub(r1_val, r2_val, int64_t);
6863  r1_val -= r2_val;
6864  SetS390ConditionCode<int64_t>(r1_val, 0);
6865  SetS390OverflowCode(isOF);
6866  set_register(r1, r1_val);
6867  return length;
6868 }
6869 
6870 EVALUATE(ALGFR) {
6871  UNIMPLEMENTED();
6872  USE(instr);
6873  return 0;
6874 }
6875 
6876 EVALUATE(SLGFR) {
6877  UNIMPLEMENTED();
6878  USE(instr);
6879  return 0;
6880 }
6881 
6882 EVALUATE(MSGFR) {
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);
6889  return length;
6890 }
6891 
6892 EVALUATE(DSGFR) {
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);
6902  return length;
6903 }
6904 
6905 EVALUATE(KMAC) {
6906  UNIMPLEMENTED();
6907  USE(instr);
6908  return 0;
6909 }
6910 
6911 EVALUATE(LRVR) {
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);
6916 
6917  set_low_register(r1, r1_val);
6918  return length;
6919 }
6920 
6921 EVALUATE(CGR) {
6922  DCHECK_OPCODE(CGR);
6923  DECODE_RRE_INSTRUCTION(r1, r2);
6924  // Compare (64)
6925  int64_t r1_val = get_register(r1);
6926  int64_t r2_val = get_register(r2);
6927  SetS390ConditionCode<int64_t>(r1_val, r2_val);
6928  return length;
6929 }
6930 
6931 EVALUATE(CLGR) {
6932  DCHECK_OPCODE(CLGR);
6933  DECODE_RRE_INSTRUCTION(r1, r2);
6934  // Compare Logical (64)
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);
6938  return length;
6939 }
6940 
6941 EVALUATE(KMF) {
6942  UNIMPLEMENTED();
6943  USE(instr);
6944  return 0;
6945 }
6946 
6947 EVALUATE(KMO) {
6948  UNIMPLEMENTED();
6949  USE(instr);
6950  return 0;
6951 }
6952 
6953 EVALUATE(PCC) {
6954  UNIMPLEMENTED();
6955  USE(instr);
6956  return 0;
6957 }
6958 
6959 EVALUATE(KMCTR) {
6960  UNIMPLEMENTED();
6961  USE(instr);
6962  return 0;
6963 }
6964 
6965 EVALUATE(KM) {
6966  UNIMPLEMENTED();
6967  USE(instr);
6968  return 0;
6969 }
6970 
6971 EVALUATE(KMC) {
6972  UNIMPLEMENTED();
6973  USE(instr);
6974  return 0;
6975 }
6976 
6977 EVALUATE(CGFR) {
6978  DCHECK_OPCODE(CGFR);
6979  DECODE_RRE_INSTRUCTION(r1, r2);
6980  // Compare (64)
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);
6984  return length;
6985 }
6986 
6987 EVALUATE(KIMD) {
6988  UNIMPLEMENTED();
6989  USE(instr);
6990  return 0;
6991 }
6992 
6993 EVALUATE(KLMD) {
6994  UNIMPLEMENTED();
6995  USE(instr);
6996  return 0;
6997 }
6998 
6999 EVALUATE(CFDTR) {
7000  UNIMPLEMENTED();
7001  USE(instr);
7002  return 0;
7003 }
7004 
7005 EVALUATE(CLGDTR) {
7006  UNIMPLEMENTED();
7007  USE(instr);
7008  return 0;
7009 }
7010 
7011 EVALUATE(CLFDTR) {
7012  UNIMPLEMENTED();
7013  USE(instr);
7014  return 0;
7015 }
7016 
7017 EVALUATE(BCTGR) {
7018  UNIMPLEMENTED();
7019  USE(instr);
7020  return 0;
7021 }
7022 
7023 EVALUATE(CFXTR) {
7024  UNIMPLEMENTED();
7025  USE(instr);
7026  return 0;
7027 }
7028 
7029 EVALUATE(CLFXTR) {
7030  UNIMPLEMENTED();
7031  USE(instr);
7032  return 0;
7033 }
7034 
7035 EVALUATE(CDFTR) {
7036  UNIMPLEMENTED();
7037  USE(instr);
7038  return 0;
7039 }
7040 
7041 EVALUATE(CDLGTR) {
7042  UNIMPLEMENTED();
7043  USE(instr);
7044  return 0;
7045 }
7046 
7047 EVALUATE(CDLFTR) {
7048  UNIMPLEMENTED();
7049  USE(instr);
7050  return 0;
7051 }
7052 
7053 EVALUATE(CXFTR) {
7054  UNIMPLEMENTED();
7055  USE(instr);
7056  return 0;
7057 }
7058 
7059 EVALUATE(CXLGTR) {
7060  UNIMPLEMENTED();
7061  USE(instr);
7062  return 0;
7063 }
7064 
7065 EVALUATE(CXLFTR) {
7066  UNIMPLEMENTED();
7067  USE(instr);
7068  return 0;
7069 }
7070 
7071 EVALUATE(CGRT) {
7072  UNIMPLEMENTED();
7073  USE(instr);
7074  return 0;
7075 }
7076 
7077 EVALUATE(NGR) {
7078  DCHECK_OPCODE(NGR);
7079  DECODE_RRE_INSTRUCTION(r1, r2);
7080  int64_t r1_val = get_register(r1);
7081  int64_t r2_val = get_register(r2);
7082  r1_val &= r2_val;
7083  SetS390BitWiseConditionCode<uint64_t>(r1_val);
7084  set_register(r1, r1_val);
7085  return length;
7086 }
7087 
7088 EVALUATE(OGR) {
7089  DCHECK_OPCODE(OGR);
7090  DECODE_RRE_INSTRUCTION(r1, r2);
7091  int64_t r1_val = get_register(r1);
7092  int64_t r2_val = get_register(r2);
7093  r1_val |= r2_val;
7094  SetS390BitWiseConditionCode<uint64_t>(r1_val);
7095  set_register(r1, r1_val);
7096  return length;
7097 }
7098 
7099 EVALUATE(XGR) {
7100  DCHECK_OPCODE(XGR);
7101  DECODE_RRE_INSTRUCTION(r1, r2);
7102  int64_t r1_val = get_register(r1);
7103  int64_t r2_val = get_register(r2);
7104  r1_val ^= r2_val;
7105  SetS390BitWiseConditionCode<uint64_t>(r1_val);
7106  set_register(r1, r1_val);
7107  return length;
7108 }
7109 
7110 EVALUATE(FLOGR) {
7111  DCHECK_OPCODE(FLOGR);
7112  DECODE_RRE_INSTRUCTION(r1, r2);
7113 
7114  DCHECK_EQ(r1 % 2, 0);
7115 
7116  int64_t r2_val = get_register(r2);
7117 
7118  int i = 0;
7119  for (; i < 64; i++) {
7120  if (r2_val < 0) break;
7121  r2_val <<= 1;
7122  }
7123 
7124  r2_val = get_register(r2);
7125 
7126  int64_t mask = ~(1 << (63 - i));
7127  set_register(r1, i);
7128  set_register(r1 + 1, r2_val & mask);
7129  return length;
7130 }
7131 
7132 EVALUATE(LLGCR) {
7133  DCHECK_OPCODE(LLGCR);
7134  DECODE_RRE_INSTRUCTION(r1, r2);
7135  uint64_t r2_val = get_low_register<uint64_t>(r2);
7136  r2_val <<= 56;
7137  r2_val >>= 56;
7138  set_register(r1, r2_val);
7139  return length;
7140 }
7141 
7142 EVALUATE(LLGHR) {
7143  DCHECK_OPCODE(LLGHR);
7144  DECODE_RRE_INSTRUCTION(r1, r2);
7145  uint64_t r2_val = get_low_register<uint64_t>(r2);
7146  r2_val <<= 48;
7147  r2_val >>= 48;
7148  set_register(r1, r2_val);
7149  return length;
7150 }
7151 
7152 EVALUATE(MLGR) {
7153  UNIMPLEMENTED();
7154  USE(instr);
7155  return 0;
7156 }
7157 
7158 EVALUATE(DLGR) {
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);
7171  return length;
7172 #else
7173  // 32 bit arch doesn't support __int128 type
7174  USE(instr);
7175  UNREACHABLE();
7176 #endif
7177 }
7178 
7179 EVALUATE(ALCGR) {
7180  UNIMPLEMENTED();
7181  USE(instr);
7182  return 0;
7183 }
7184 
7185 EVALUATE(SLBGR) {
7186  UNIMPLEMENTED();
7187  USE(instr);
7188  return 0;
7189 }
7190 
7191 EVALUATE(EPSW) {
7192  UNIMPLEMENTED();
7193  USE(instr);
7194  return 0;
7195 }
7196 
7197 EVALUATE(TRTT) {
7198  UNIMPLEMENTED();
7199  USE(instr);
7200  return 0;
7201 }
7202 
7203 EVALUATE(TRTO) {
7204  UNIMPLEMENTED();
7205  USE(instr);
7206  return 0;
7207 }
7208 
7209 EVALUATE(TROT) {
7210  UNIMPLEMENTED();
7211  USE(instr);
7212  return 0;
7213 }
7214 
7215 EVALUATE(TROO) {
7216  UNIMPLEMENTED();
7217  USE(instr);
7218  return 0;
7219 }
7220 
7221 EVALUATE(LLCR) {
7222  DCHECK_OPCODE(LLCR);
7223  DECODE_RRE_INSTRUCTION(r1, r2);
7224  uint32_t r2_val = get_low_register<uint32_t>(r2);
7225  r2_val <<= 24;
7226  r2_val >>= 24;
7227  set_low_register(r1, r2_val);
7228  return length;
7229 }
7230 
7231 EVALUATE(LLHR) {
7232  DCHECK_OPCODE(LLHR);
7233  DECODE_RRE_INSTRUCTION(r1, r2);
7234  uint32_t r2_val = get_low_register<uint32_t>(r2);
7235  r2_val <<= 16;
7236  r2_val >>= 16;
7237  set_low_register(r1, r2_val);
7238  return length;
7239 }
7240 
7241 EVALUATE(MLR) {
7242  DCHECK_OPCODE(MLR);
7243  DECODE_RRE_INSTRUCTION(r1, r2);
7244  DCHECK_EQ(r1 % 2, 0);
7245 
7246  uint32_t r1_val = get_low_register<uint32_t>(r1 + 1);
7247  uint32_t r2_val = get_low_register<uint32_t>(r2);
7248  uint64_t product =
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);
7254  return length;
7255 }
7256 
7257 EVALUATE(DLR) {
7258  DCHECK_OPCODE(DLR);
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;
7267  r1_val = remainder;
7268  set_low_register(r1, remainder);
7269  set_low_register(r1 + 1, quotient);
7270  return length;
7271 }
7272 
7273 EVALUATE(ALCR) {
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);
7278  uint32_t alu_out = 0;
7279  bool isOF = false;
7280 
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);
7286  } else {
7287  isOF = isOF_original;
7288  }
7289  set_low_register(r1, alu_out);
7290  SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
7291  return length;
7292 }
7293 
7294 EVALUATE(SLBR) {
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);
7299  uint32_t alu_out = 0;
7300  bool isOF = false;
7301 
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);
7307  } else {
7308  isOF = isOF_original;
7309  }
7310  set_low_register(r1, alu_out);
7311  SetS390ConditionCodeCarry<uint32_t>(alu_out, isOF);
7312  return length;
7313 }
7314 
7315 EVALUATE(CU14) {
7316  UNIMPLEMENTED();
7317  USE(instr);
7318  return 0;
7319 }
7320 
7321 EVALUATE(CU24) {
7322  UNIMPLEMENTED();
7323  USE(instr);
7324  return 0;
7325 }
7326 
7327 EVALUATE(CU41) {
7328  UNIMPLEMENTED();
7329  USE(instr);
7330  return 0;
7331 }
7332 
7333 EVALUATE(CU42) {
7334  UNIMPLEMENTED();
7335  USE(instr);
7336  return 0;
7337 }
7338 
7339 EVALUATE(TRTRE) {
7340  UNIMPLEMENTED();
7341  USE(instr);
7342  return 0;
7343 }
7344 
7345 EVALUATE(SRSTU) {
7346  UNIMPLEMENTED();
7347  USE(instr);
7348  return 0;
7349 }
7350 
7351 EVALUATE(TRTE) {
7352  UNIMPLEMENTED();
7353  USE(instr);
7354  return 0;
7355 }
7356 
7357 EVALUATE(AHHHR) {
7358  UNIMPLEMENTED();
7359  USE(instr);
7360  return 0;
7361 }
7362 
7363 EVALUATE(SHHHR) {
7364  UNIMPLEMENTED();
7365  USE(instr);
7366  return 0;
7367 }
7368 
7369 EVALUATE(ALHHHR) {
7370  UNIMPLEMENTED();
7371  USE(instr);
7372  return 0;
7373 }
7374 
7375 EVALUATE(SLHHHR) {
7376  UNIMPLEMENTED();
7377  USE(instr);
7378  return 0;
7379 }
7380 
7381 EVALUATE(CHHR) {
7382  UNIMPLEMENTED();
7383  USE(instr);
7384  return 0;
7385 }
7386 
7387 EVALUATE(AHHLR) {
7388  UNIMPLEMENTED();
7389  USE(instr);
7390  return 0;
7391 }
7392 
7393 EVALUATE(SHHLR) {
7394  UNIMPLEMENTED();
7395  USE(instr);
7396  return 0;
7397 }
7398 
7399 EVALUATE(ALHHLR) {
7400  UNIMPLEMENTED();
7401  USE(instr);
7402  return 0;
7403 }
7404 
7405 EVALUATE(SLHHLR) {
7406  UNIMPLEMENTED();
7407  USE(instr);
7408  return 0;
7409 }
7410 
7411 EVALUATE(CHLR) {
7412  UNIMPLEMENTED();
7413  USE(instr);
7414  return 0;
7415 }
7416 
7417 EVALUATE(POPCNT_Z) {
7418  DCHECK_OPCODE(POPCNT_Z);
7419  DECODE_RRE_INSTRUCTION(r1, r2);
7420  int64_t r2_val = get_register(r2);
7421  int64_t r1_val = 0;
7422 
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++) {
7426  uint32_t x = static_cast<uint32_t>(r2_val_ptr[i]);
7427 #if defined(__GNUC__)
7428  r1_val_ptr[i] = __builtin_popcount(x);
7429 #else
7430 #error unsupport __builtin_popcount
7431 #endif
7432  }
7433  set_register(r1, static_cast<uint64_t>(r1_val));
7434  return length;
7435 }
7436 
7437 EVALUATE(LOCGR) {
7438  DCHECK_OPCODE(LOCGR);
7439  DECODE_RRF_C_INSTRUCTION(r1, r2, m3);
7440  if (TestConditionCode(m3)) {
7441  set_register(r1, get_register(r2));
7442  }
7443  return length;
7444 }
7445 
7446 EVALUATE(NGRK) {
7447  DCHECK_OPCODE(NGRK);
7448  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7449  // 64-bit Non-clobbering arithmetics / bitwise ops.
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);
7456  return length;
7457 }
7458 
7459 EVALUATE(OGRK) {
7460  DCHECK_OPCODE(OGRK);
7461  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7462  // 64-bit Non-clobbering arithmetics / bitwise ops.
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);
7469  return length;
7470 }
7471 
7472 EVALUATE(XGRK) {
7473  DCHECK_OPCODE(XGRK);
7474  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7475  // 64-bit Non-clobbering arithmetics / bitwise ops.
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);
7482  return length;
7483 }
7484 
7485 EVALUATE(AGRK) {
7486  DCHECK_OPCODE(AGRK);
7487  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7488  // 64-bit Non-clobbering arithmetics / bitwise ops.
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);
7495  return length;
7496 }
7497 
7498 EVALUATE(SGRK) {
7499  DCHECK_OPCODE(SGRK);
7500  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7501  // 64-bit Non-clobbering arithmetics / bitwise ops.
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);
7508  return length;
7509 }
7510 
7511 EVALUATE(ALGRK) {
7512  DCHECK_OPCODE(ALGRK);
7513  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7514  // 64-bit Non-clobbering unsigned arithmetics
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);
7521  return length;
7522 }
7523 
7524 EVALUATE(SLGRK) {
7525  DCHECK_OPCODE(SLGRK);
7526  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7527  // 64-bit Non-clobbering unsigned arithmetics
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);
7534  return length;
7535 }
7536 
7537 EVALUATE(LOCR) {
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));
7542  }
7543  return length;
7544 }
7545 
7546 EVALUATE(NRK) {
7547  DCHECK_OPCODE(NRK);
7548  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7549  // 32-bit Non-clobbering arithmetics / bitwise ops
7550  int32_t r2_val = get_low_register<int32_t>(r2);
7551  int32_t r3_val = get_low_register<int32_t>(r3);
7552  // Assume bitwise operation here
7553  uint32_t bitwise_result = 0;
7554  bitwise_result = r2_val & r3_val;
7555  SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
7556  set_low_register(r1, bitwise_result);
7557  return length;
7558 }
7559 
7560 EVALUATE(ORK) {
7561  DCHECK_OPCODE(ORK);
7562  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7563  // 32-bit Non-clobbering arithmetics / bitwise ops
7564  int32_t r2_val = get_low_register<int32_t>(r2);
7565  int32_t r3_val = get_low_register<int32_t>(r3);
7566  // Assume bitwise operation here
7567  uint32_t bitwise_result = 0;
7568  bitwise_result = r2_val | r3_val;
7569  SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
7570  set_low_register(r1, bitwise_result);
7571  return length;
7572 }
7573 
7574 EVALUATE(XRK) {
7575  DCHECK_OPCODE(XRK);
7576  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7577  // 32-bit Non-clobbering arithmetics / bitwise ops
7578  int32_t r2_val = get_low_register<int32_t>(r2);
7579  int32_t r3_val = get_low_register<int32_t>(r3);
7580  // Assume bitwise operation here
7581  uint32_t bitwise_result = 0;
7582  bitwise_result = r2_val ^ r3_val;
7583  SetS390BitWiseConditionCode<uint32_t>(bitwise_result);
7584  set_low_register(r1, bitwise_result);
7585  return length;
7586 }
7587 
7588 EVALUATE(ARK) {
7589  DCHECK_OPCODE(ARK);
7590  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7591  // 32-bit Non-clobbering arithmetics / bitwise ops
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);
7598  return length;
7599 }
7600 
7601 EVALUATE(SRK) {
7602  DCHECK_OPCODE(SRK);
7603  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7604  // 32-bit Non-clobbering arithmetics / bitwise ops
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);
7611  return length;
7612 }
7613 
7614 EVALUATE(ALRK) {
7615  DCHECK_OPCODE(ALRK);
7616  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7617  // 32-bit Non-clobbering unsigned arithmetics
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);
7624  return length;
7625 }
7626 
7627 EVALUATE(SLRK) {
7628  DCHECK_OPCODE(SLRK);
7629  DECODE_RRF_A_INSTRUCTION(r1, r2, r3);
7630  // 32-bit Non-clobbering unsigned arithmetics
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);
7637  return length;
7638 }
7639 
7640 EVALUATE(LTG) {
7641  DCHECK_OPCODE(LTG);
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;
7646  int64_t value = ReadDW(addr);
7647  set_register(r1, value);
7648  SetS390ConditionCode<int64_t>(value, 0);
7649  return length;
7650 }
7651 
7652 EVALUATE(CVBY) {
7653  UNIMPLEMENTED();
7654  USE(instr);
7655  return 0;
7656 }
7657 
7658 EVALUATE(AG) {
7659  DCHECK_OPCODE(AG);
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);
7666  alu_out += mem_val;
7667  SetS390ConditionCode<int64_t>(alu_out, 0);
7668  SetS390OverflowCode(isOF);
7669  set_register(r1, alu_out);
7670  return length;
7671 }
7672 
7673 EVALUATE(SG) {
7674  DCHECK_OPCODE(SG);
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);
7681  alu_out -= mem_val;
7682  SetS390ConditionCode<int32_t>(alu_out, 0);
7683  SetS390OverflowCode(isOF);
7684  set_register(r1, alu_out);
7685  return length;
7686 }
7687 
7688 EVALUATE(ALG) {
7689  DCHECK_OPCODE(ALG);
7690 #ifndef V8_TARGET_ARCH_S390X
7691  DCHECK(false);
7692 #endif
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));
7700  alu_out += mem_val;
7701  SetS390ConditionCode<uint64_t>(alu_out, 0);
7702  set_register(r1, alu_out);
7703  return length;
7704 }
7705 
7706 EVALUATE(SLG) {
7707  DCHECK_OPCODE(SLG);
7708 #ifndef V8_TARGET_ARCH_S390X
7709  DCHECK(false);
7710 #endif
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));
7718  alu_out -= mem_val;
7719  SetS390ConditionCode<uint64_t>(alu_out, 0);
7720  set_register(r1, alu_out);
7721  return length;
7722 }
7723 
7724 EVALUATE(MSG) {
7725  DCHECK_OPCODE(MSG);
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);
7733  return length;
7734 }
7735 
7736 EVALUATE(DSG) {
7737  DCHECK_OPCODE(DSG);
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);
7749  return length;
7750 }
7751 
7752 EVALUATE(CVBG) {
7753  UNIMPLEMENTED();
7754  USE(instr);
7755  return 0;
7756 }
7757 
7758 EVALUATE(LT) {
7759  DCHECK_OPCODE(LT);
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);
7767  return length;
7768 }
7769 
7770 EVALUATE(LGH) {
7771  DCHECK_OPCODE(LGH);
7772  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7773  // Miscellaneous Loads and Stores
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;
7777  int64_t mem_val = static_cast<int64_t>(ReadH(addr, instr));
7778  set_register(r1, mem_val);
7779  return length;
7780 }
7781 
7782 EVALUATE(LLGF) {
7783  DCHECK_OPCODE(LLGF);
7784  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
7785  // Miscellaneous Loads and Stores
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);
7791  return length;
7792 }
7793 
7794 EVALUATE(LLGT) {
7795  UNIMPLEMENTED();
7796  USE(instr);
7797  return 0;
7798 }
7799 
7800 EVALUATE(AGF) {
7801  DCHECK_OPCODE(AGF);
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);
7809  alu_out += mem_val;
7810  SetS390ConditionCode<int64_t>(alu_out, 0);
7811  set_register(r1, alu_out);
7812  return length;
7813 }
7814 
7815 EVALUATE(SGF) {
7816  DCHECK_OPCODE(SGF);
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);
7824  alu_out -= mem_val;
7825  SetS390ConditionCode<int64_t>(alu_out, 0);
7826  set_register(r1, alu_out);
7827  return length;
7828 }
7829 
7830 EVALUATE(ALGF) {
7831  UNIMPLEMENTED();
7832  USE(instr);
7833  return 0;
7834 }
7835 
7836 EVALUATE(SLGF) {
7837  UNIMPLEMENTED();
7838  USE(instr);
7839  return 0;
7840 }
7841 
7842 EVALUATE(MSGF) {
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;
7848  int64_t mem_val =
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);
7853  return length;
7854 }
7855 
7856 EVALUATE(DSGF) {
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;
7863  int64_t mem_val =
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);
7870  return length;
7871 }
7872 
7873 EVALUATE(LRVG) {
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));
7881  return length;
7882 }
7883 
7884 EVALUATE(LRV) {
7885  DCHECK_OPCODE(LRV);
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));
7892  return length;
7893 }
7894 
7895 EVALUATE(LRVH) {
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);
7906  return length;
7907 }
7908 
7909 EVALUATE(CG) {
7910  DCHECK_OPCODE(CG);
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);
7918  return length;
7919 }
7920 
7921 EVALUATE(CLG) {
7922  DCHECK_OPCODE(CLG);
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);
7930  return length;
7931 }
7932 
7933 EVALUATE(NTSTG) {
7934  UNIMPLEMENTED();
7935  USE(instr);
7936  return 0;
7937 }
7938 
7939 EVALUATE(CVDY) {
7940  UNIMPLEMENTED();
7941  USE(instr);
7942  return 0;
7943 }
7944 
7945 EVALUATE(CVDG) {
7946  UNIMPLEMENTED();
7947  USE(instr);
7948  return 0;
7949 }
7950 
7951 EVALUATE(CGF) {
7952  UNIMPLEMENTED();
7953  USE(instr);
7954  return 0;
7955 }
7956 
7957 EVALUATE(CLGF) {
7958  UNIMPLEMENTED();
7959  USE(instr);
7960  return 0;
7961 }
7962 
7963 EVALUATE(LTGF) {
7964  UNIMPLEMENTED();
7965  USE(instr);
7966  return 0;
7967 }
7968 
7969 EVALUATE(CGH) {
7970  UNIMPLEMENTED();
7971  USE(instr);
7972  return 0;
7973 }
7974 
7975 EVALUATE(PFD) {
7976  DCHECK_OPCODE(PFD);
7977  USE(instr);
7978  return 6;
7979 }
7980 
7981 EVALUATE(STRV) {
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);
7989  return length;
7990 }
7991 
7992 EVALUATE(STRVG) {
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));
8000  return length;
8001 }
8002 
8003 EVALUATE(STRVH) {
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);
8012  return length;
8013 }
8014 
8015 EVALUATE(BCTG) {
8016  UNIMPLEMENTED();
8017  USE(instr);
8018  return 0;
8019 }
8020 
8021 EVALUATE(MSY) {
8022  DCHECK_OPCODE(MSY);
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);
8030  return length;
8031 }
8032 
8033 EVALUATE(MSC) {
8034  DCHECK_OPCODE(MSC);
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);
8041  int64_t result64 =
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);
8049  return length;
8050 }
8051 
8052 EVALUATE(NY) {
8053  DCHECK_OPCODE(NY);
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);
8059  alu_out &= mem_val;
8060  SetS390BitWiseConditionCode<uint32_t>(alu_out);
8061  set_low_register(r1, alu_out);
8062  return length;
8063 }
8064 
8065 EVALUATE(CLY) {
8066  DCHECK_OPCODE(CLY);
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);
8073  return length;
8074 }
8075 
8076 EVALUATE(OY) {
8077  DCHECK_OPCODE(OY);
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);
8083  alu_out |= mem_val;
8084  SetS390BitWiseConditionCode<uint32_t>(alu_out);
8085  set_low_register(r1, alu_out);
8086  return length;
8087 }
8088 
8089 EVALUATE(XY) {
8090  DCHECK_OPCODE(XY);
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);
8096  alu_out ^= mem_val;
8097  SetS390BitWiseConditionCode<uint32_t>(alu_out);
8098  set_low_register(r1, alu_out);
8099  return length;
8100 }
8101 
8102 EVALUATE(CY) {
8103  DCHECK_OPCODE(CY);
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);
8110  return length;
8111 }
8112 
8113 EVALUATE(AY) {
8114  DCHECK_OPCODE(AY);
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);
8120  bool isOF = false;
8121  isOF = CheckOverflowForIntAdd(alu_out, mem_val, int32_t);
8122  alu_out += mem_val;
8123  SetS390ConditionCode<int32_t>(alu_out, 0);
8124  SetS390OverflowCode(isOF);
8125  set_low_register(r1, alu_out);
8126  return length;
8127 }
8128 
8129 EVALUATE(SY) {
8130  DCHECK_OPCODE(SY);
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);
8136  bool isOF = false;
8137  isOF = CheckOverflowForIntSub(alu_out, mem_val, int32_t);
8138  alu_out -= mem_val;
8139  SetS390ConditionCode<int32_t>(alu_out, 0);
8140  SetS390OverflowCode(isOF);
8141  set_low_register(r1, alu_out);
8142  return length;
8143 }
8144 
8145 EVALUATE(MFY) {
8146  DCHECK_OPCODE(MFY);
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);
8153  int64_t product =
8154  static_cast<int64_t>(r1_val) * static_cast<int64_t>(mem_val);
8155  int32_t high_bits = product >> 32;
8156  r1_val = high_bits;
8157  int32_t low_bits = product & 0x00000000FFFFFFFF;
8158  set_low_register(r1, high_bits);
8159  set_low_register(r1 + 1, low_bits);
8160  return length;
8161 }
8162 
8163 EVALUATE(ALY) {
8164  DCHECK_OPCODE(ALY);
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);
8170  alu_out += mem_val;
8171  set_low_register(r1, alu_out);
8172  SetS390ConditionCode<uint32_t>(alu_out, 0);
8173  return length;
8174 }
8175 
8176 EVALUATE(SLY) {
8177  DCHECK_OPCODE(SLY);
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);
8183  alu_out -= mem_val;
8184  set_low_register(r1, alu_out);
8185  SetS390ConditionCode<uint32_t>(alu_out, 0);
8186  return length;
8187 }
8188 
8189 EVALUATE(STHY) {
8190  DCHECK_OPCODE(STHY);
8191  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8192  // Miscellaneous Loads and Stores
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);
8198  return length;
8199 }
8200 
8201 EVALUATE(LAY) {
8202  DCHECK_OPCODE(LAY);
8203  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8204  // Load Address
8205  int rb = b2;
8206  int rx = x2;
8207  int offset = 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);
8211  return length;
8212 }
8213 
8214 EVALUATE(STCY) {
8215  DCHECK_OPCODE(STCY);
8216  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8217  // Miscellaneous Loads and Stores
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);
8223  return length;
8224 }
8225 
8226 EVALUATE(ICY) {
8227  UNIMPLEMENTED();
8228  USE(instr);
8229  return 0;
8230 }
8231 
8232 EVALUATE(LAEY) {
8233  UNIMPLEMENTED();
8234  USE(instr);
8235  return 0;
8236 }
8237 
8238 EVALUATE(LB) {
8239  DCHECK_OPCODE(LB);
8240  // Miscellaneous Loads and Stores
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);
8247  return length;
8248 }
8249 
8250 EVALUATE(LGB) {
8251  DCHECK_OPCODE(LGB);
8252  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8253  // Miscellaneous Loads and Stores
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);
8259  return length;
8260 }
8261 
8262 EVALUATE(LHY) {
8263  DCHECK_OPCODE(LHY);
8264  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
8265  // Miscellaneous Loads and Stores
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);
8271  return length;
8272 }
8273 
8274 EVALUATE(CHY) {
8275  UNIMPLEMENTED();
8276  USE(instr);
8277  return 0;
8278 }
8279 
8280 EVALUATE(AHY) {
8281  DCHECK_OPCODE(AHY);
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;
8287  int32_t mem_val =
8288  static_cast<int32_t>(ReadH(b2_val + d2_val + x2_val, instr));
8289  int32_t alu_out = 0;
8290  bool isOF = false;
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);
8296  return length;
8297 }
8298 
8299 EVALUATE(SHY) {
8300  DCHECK_OPCODE(SHY);
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;
8306  int32_t mem_val =
8307  static_cast<int32_t>(ReadH(b2_val + d2_val + x2_val, instr));
8308  int32_t alu_out = 0;
8309  bool isOF = false;
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);
8315  return length;
8316 }
8317 
8318 EVALUATE(MHY) {
8319  UNIMPLEMENTED();
8320  USE(instr);
8321  return 0;
8322 }
8323 
8324 EVALUATE(NG) {
8325  DCHECK_OPCODE(NG);
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);
8331  alu_out &= mem_val;
8332  SetS390BitWiseConditionCode<uint32_t>(alu_out);
8333  set_register(r1, alu_out);
8334  return length;
8335 }
8336 
8337 EVALUATE(OG) {
8338  DCHECK_OPCODE(OG);
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);
8344  alu_out |= mem_val;
8345  SetS390BitWiseConditionCode<uint32_t>(alu_out);
8346  set_register(r1, alu_out);
8347  return length;
8348 }
8349 
8350 EVALUATE(XG) {
8351  DCHECK_OPCODE(XG);
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);
8357  alu_out ^= mem_val;
8358  SetS390BitWiseConditionCode<uint32_t>(alu_out);
8359  set_register(r1, alu_out);
8360  return length;
8361 }
8362 
8363 EVALUATE(LGAT) {
8364  UNIMPLEMENTED();
8365  USE(instr);
8366  return 0;
8367 }
8368 
8369 EVALUATE(MLG) {
8370  UNIMPLEMENTED();
8371  USE(instr);
8372  return 0;
8373 }
8374 
8375 EVALUATE(DLG) {
8376  DCHECK_OPCODE(DLG);
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);
8390  return length;
8391 #else
8392  // 32 bit arch doesn't support __int128 type
8393  USE(instr);
8394  UNREACHABLE();
8395 #endif
8396 }
8397 
8398 EVALUATE(ALCG) {
8399  UNIMPLEMENTED();
8400  USE(instr);
8401  return 0;
8402 }
8403 
8404 EVALUATE(SLBG) {
8405  UNIMPLEMENTED();
8406  USE(instr);
8407  return 0;
8408 }
8409 
8410 EVALUATE(STPQ) {
8411  UNIMPLEMENTED();
8412  USE(instr);
8413  return 0;
8414 }
8415 
8416 EVALUATE(LPQ) {
8417  UNIMPLEMENTED();
8418  USE(instr);
8419  return 0;
8420 }
8421 
8422 EVALUATE(LLGH) {
8423  DCHECK_OPCODE(LLGH);
8424  // Load Logical Halfword
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);
8431  return length;
8432 }
8433 
8434 EVALUATE(LLH) {
8435  DCHECK_OPCODE(LLH);
8436  // Load Logical Halfword
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);
8443  return length;
8444 }
8445 
8446 EVALUATE(ML) {
8447  DCHECK_OPCODE(ML);
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);
8454  uint64_t product =
8455  static_cast<uint64_t>(r1_val) * static_cast<uint64_t>(mem_val);
8456  uint32_t high_bits = product >> 32;
8457  r1_val = high_bits;
8458  uint32_t low_bits = product & 0x00000000FFFFFFFF;
8459  set_low_register(r1, high_bits);
8460  set_low_register(r1 + 1, low_bits);
8461  return length;
8462 }
8463 
8464 EVALUATE(DL) {
8465  DCHECK_OPCODE(DL);
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);
8472  uint64_t quotient =
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);
8478  return length;
8479 }
8480 
8481 EVALUATE(ALC) {
8482  UNIMPLEMENTED();
8483  USE(instr);
8484  return 0;
8485 }
8486 
8487 EVALUATE(SLB) {
8488  UNIMPLEMENTED();
8489  USE(instr);
8490  return 0;
8491 }
8492 
8493 EVALUATE(LLGTAT) {
8494  UNIMPLEMENTED();
8495  USE(instr);
8496  return 0;
8497 }
8498 
8499 EVALUATE(LLGFAT) {
8500  UNIMPLEMENTED();
8501  USE(instr);
8502  return 0;
8503 }
8504 
8505 EVALUATE(LAT) {
8506  UNIMPLEMENTED();
8507  USE(instr);
8508  return 0;
8509 }
8510 
8511 EVALUATE(LBH) {
8512  UNIMPLEMENTED();
8513  USE(instr);
8514  return 0;
8515 }
8516 
8517 EVALUATE(LLCH) {
8518  UNIMPLEMENTED();
8519  USE(instr);
8520  return 0;
8521 }
8522 
8523 EVALUATE(STCH) {
8524  UNIMPLEMENTED();
8525  USE(instr);
8526  return 0;
8527 }
8528 
8529 EVALUATE(LHH) {
8530  UNIMPLEMENTED();
8531  USE(instr);
8532  return 0;
8533 }
8534 
8535 EVALUATE(LLHH) {
8536  UNIMPLEMENTED();
8537  USE(instr);
8538  return 0;
8539 }
8540 
8541 EVALUATE(STHH) {
8542  UNIMPLEMENTED();
8543  USE(instr);
8544  return 0;
8545 }
8546 
8547 EVALUATE(LFHAT) {
8548  UNIMPLEMENTED();
8549  USE(instr);
8550  return 0;
8551 }
8552 
8553 EVALUATE(LFH) {
8554  UNIMPLEMENTED();
8555  USE(instr);
8556  return 0;
8557 }
8558 
8559 EVALUATE(STFH) {
8560  UNIMPLEMENTED();
8561  USE(instr);
8562  return 0;
8563 }
8564 
8565 EVALUATE(CHF) {
8566  UNIMPLEMENTED();
8567  USE(instr);
8568  return 0;
8569 }
8570 
8571 EVALUATE(MVCDK) {
8572  UNIMPLEMENTED();
8573  USE(instr);
8574  return 0;
8575 }
8576 
8577 EVALUATE(MVHHI) {
8578  UNIMPLEMENTED();
8579  USE(instr);
8580  return 0;
8581 }
8582 
8583 EVALUATE(MVGHI) {
8584  DCHECK_OPCODE(MVGHI);
8585  // Move Integer (64)
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);
8590  return length;
8591 }
8592 
8593 EVALUATE(MVHI) {
8594  DCHECK_OPCODE(MVHI);
8595  // Move Integer (32)
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);
8600  return length;
8601 }
8602 
8603 EVALUATE(CHHSI) {
8604  UNIMPLEMENTED();
8605  USE(instr);
8606  return 0;
8607 }
8608 
8609 EVALUATE(CGHSI) {
8610  UNIMPLEMENTED();
8611  USE(instr);
8612  return 0;
8613 }
8614 
8615 EVALUATE(CHSI) {
8616  UNIMPLEMENTED();
8617  USE(instr);
8618  return 0;
8619 }
8620 
8621 EVALUATE(CLFHSI) {
8622  UNIMPLEMENTED();
8623  USE(instr);
8624  return 0;
8625 }
8626 
8627 EVALUATE(TBEGIN) {
8628  UNIMPLEMENTED();
8629  USE(instr);
8630  return 0;
8631 }
8632 
8633 EVALUATE(TBEGINC) {
8634  UNIMPLEMENTED();
8635  USE(instr);
8636  return 0;
8637 }
8638 
8639 EVALUATE(LMG) {
8640  DCHECK_OPCODE(LMG);
8641  // Store Multiple 64-bits.
8642  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8643  int rb = b2;
8644  int offset = d2;
8645 
8646  // Regs roll around if r3 is less than r1.
8647  // Artificially increase r3 by 16 so we can calculate
8648  // the number of regs stored properly.
8649  if (r3 < r1) r3 += 16;
8650 
8651  int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
8652 
8653  // Store each register in ascending order.
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);
8657  }
8658  return length;
8659 }
8660 
8661 EVALUATE(SRAG) {
8662  DCHECK_OPCODE(SRAG);
8663  // 64-bit non-clobbering shift-left/right arithmetic
8664  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8665  // only takes rightmost 6 bits
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;
8670  bool isOF = false;
8671  alu_out = r3_val >> shiftBits;
8672  set_register(r1, alu_out);
8673  SetS390ConditionCode<intptr_t>(alu_out, 0);
8674  SetS390OverflowCode(isOF);
8675  return length;
8676 }
8677 
8678 EVALUATE(SLAG) {
8679  DCHECK_OPCODE(SLAG);
8680  // 64-bit non-clobbering shift-left/right arithmetic
8681  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8682  // only takes rightmost 6 bits
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;
8687  bool isOF = false;
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);
8693  return length;
8694 }
8695 
8696 EVALUATE(SRLG) {
8697  DCHECK_OPCODE(SRLG);
8698  // For SLLG/SRLG, the 64-bit third operand is shifted the number
8699  // of bits specified by the second-operand address, and the result is
8700  // placed at the first-operand location. Except for when the R1 and R3
8701  // fields designate the same register, the third operand remains
8702  // unchanged in general register R3.
8703  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8704  // only takes rightmost 6 bits
8705  int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8706  int shiftBits = (b2_val + d2) & 0x3F;
8707  // unsigned
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);
8712  return length;
8713 }
8714 
8715 EVALUATE(SLLG) {
8716  DCHECK_OPCODE(SLLG);
8717  // For SLLG/SRLG, the 64-bit third operand is shifted the number
8718  // of bits specified by the second-operand address, and the result is
8719  // placed at the first-operand location. Except for when the R1 and R3
8720  // fields designate the same register, the third operand remains
8721  // unchanged in general register R3.
8722  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8723  // only takes rightmost 6 bits
8724  int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8725  int shiftBits = (b2_val + d2) & 0x3F;
8726  // unsigned
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);
8731  return length;
8732 }
8733 
8734 EVALUATE(CS) {
8735  DCHECK_OPCODE(CS);
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;
8740 
8741  int32_t r1_val = get_low_register<int32_t>(r1);
8742  int32_t r3_val = get_low_register<int32_t>(r3);
8743 
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);
8748  if (!is_success) {
8749  set_low_register(r1, r1_val);
8750  condition_reg_ = 0x4;
8751  } else {
8752  condition_reg_ = 0x8;
8753  }
8754  return length;
8755 }
8756 
8757 EVALUATE(CSY) {
8758  DCHECK_OPCODE(CSY);
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;
8763 
8764  int32_t r1_val = get_low_register<int32_t>(r1);
8765  int32_t r3_val = get_low_register<int32_t>(r3);
8766 
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);
8771  if (!is_success) {
8772  set_low_register(r1, r1_val);
8773  condition_reg_ = 0x4;
8774  } else {
8775  condition_reg_ = 0x8;
8776  }
8777  return length;
8778 }
8779 
8780 EVALUATE(CSG) {
8781  DCHECK_OPCODE(CSG);
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;
8786 
8787  int64_t r1_val = get_register(r1);
8788  int64_t r3_val = get_register(r3);
8789 
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);
8794  if (!is_success) {
8795  set_register(r1, r1_val);
8796  condition_reg_ = 0x4;
8797  } else {
8798  condition_reg_ = 0x8;
8799  }
8800  return length;
8801 }
8802 
8803 EVALUATE(RLLG) {
8804  DCHECK_OPCODE(RLLG);
8805  // For SLLG/SRLG, the 64-bit third operand is shifted the number
8806  // of bits specified by the second-operand address, and the result is
8807  // placed at the first-operand location. Except for when the R1 and R3
8808  // fields designate the same register, the third operand remains
8809  // unchanged in general register R3.
8810  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8811  // only takes rightmost 6 bits
8812  int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
8813  int shiftBits = (b2_val + d2) & 0x3F;
8814  // unsigned
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);
8820  return length;
8821 }
8822 
8823 EVALUATE(STMG) {
8824  DCHECK_OPCODE(STMG);
8825  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
8826  int rb = b2;
8827  int offset = d2;
8828 
8829  // Regs roll around if r3 is less than r1.
8830  // Artificially increase r3 by 16 so we can calculate
8831  // the number of regs stored properly.
8832  if (r3 < r1) r3 += 16;
8833 
8834  int64_t rb_val = (rb == 0) ? 0 : get_register(rb);
8835 
8836  // Store each register in ascending order.
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);
8840  }
8841  return length;
8842 }
8843 
8844 EVALUATE(STMH) {
8845  UNIMPLEMENTED();
8846  USE(instr);
8847  return 0;
8848 }
8849 
8850 EVALUATE(STCMH) {
8851  UNIMPLEMENTED();
8852  USE(instr);
8853  return 0;
8854 }
8855 
8856 EVALUATE(STCMY) {
8857  UNIMPLEMENTED();
8858  USE(instr);
8859  return 0;
8860 }
8861 
8862 EVALUATE(CDSY) {
8863  UNIMPLEMENTED();
8864  USE(instr);
8865  return 0;
8866 }
8867 
8868 EVALUATE(CDSG) {
8869  UNIMPLEMENTED();
8870  USE(instr);
8871  return 0;
8872 }
8873 
8874 EVALUATE(BXHG) {
8875  UNIMPLEMENTED();
8876  USE(instr);
8877  return 0;
8878 }
8879 
8880 EVALUATE(BXLEG) {
8881  UNIMPLEMENTED();
8882  USE(instr);
8883  return 0;
8884 }
8885 
8886 EVALUATE(ECAG) {
8887  UNIMPLEMENTED();
8888  USE(instr);
8889  return 0;
8890 }
8891 
8892 EVALUATE(TMY) {
8893  DCHECK_OPCODE(TMY);
8894  // Test Under Mask (Mem - Imm) (8)
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;
8902  // CC0: Selected bits are zero
8903  // CC1: Selected bits mixed zeros and ones
8904  // CC3: Selected bits all ones
8905  if (0 == selected_bits) {
8906  condition_reg_ = CC_EQ; // CC0
8907  } else if (selected_bits == imm_val) {
8908  condition_reg_ = 0x1; // CC3
8909  } else {
8910  condition_reg_ = 0x4; // CC1
8911  }
8912  return length;
8913 }
8914 
8915 EVALUATE(MVIY) {
8916  UNIMPLEMENTED();
8917  USE(instr);
8918  return 0;
8919 }
8920 
8921 EVALUATE(NIY) {
8922  UNIMPLEMENTED();
8923  USE(instr);
8924  return 0;
8925 }
8926 
8927 EVALUATE(CLIY) {
8928  DCHECK_OPCODE(CLIY);
8929  DECODE_SIY_INSTRUCTION(b1, d1, i2);
8930  // Compare Immediate (Mem - Imm) (8)
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);
8937  return length;
8938 }
8939 
8940 EVALUATE(OIY) {
8941  UNIMPLEMENTED();
8942  USE(instr);
8943  return 0;
8944 }
8945 
8946 EVALUATE(XIY) {
8947  UNIMPLEMENTED();
8948  USE(instr);
8949  return 0;
8950 }
8951 
8952 EVALUATE(ASI) {
8953  DCHECK_OPCODE(ASI);
8954  // TODO(bcleung): Change all fooInstr->I2Value() to template functions.
8955  // The below static cast to 8 bit and then to 32 bit is necessary
8956  // because siyInstr->I2Value() returns a uint8_t, which a direct
8957  // cast to int32_t could incorrectly interpret.
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);
8962 
8963  int d1_val = d1;
8964  intptr_t addr = b1_val + d1_val;
8965 
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);
8972  return length;
8973 }
8974 
8975 EVALUATE(ALSI) {
8976  UNIMPLEMENTED();
8977  USE(instr);
8978  return 0;
8979 }
8980 
8981 EVALUATE(AGSI) {
8982  DCHECK_OPCODE(AGSI);
8983  // TODO(bcleung): Change all fooInstr->I2Value() to template functions.
8984  // The below static cast to 8 bit and then to 32 bit is necessary
8985  // because siyInstr->I2Value() returns a uint8_t, which a direct
8986  // cast to int32_t could incorrectly interpret.
8987  DECODE_SIY_INSTRUCTION(b1, d1, i2_unsigned);
8988  int8_t i2_8bit = static_cast<int8_t>(i2_unsigned);
8989  int64_t i2 = static_cast<int64_t>(i2_8bit);
8990  intptr_t b1_val = (b1 == 0) ? 0 : get_register(b1);
8991 
8992  int d1_val = d1;
8993  intptr_t addr = b1_val + d1_val;
8994 
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);
9001  return length;
9002 }
9003 
9004 EVALUATE(ALGSI) {
9005  UNIMPLEMENTED();
9006  USE(instr);
9007  return 0;
9008 }
9009 
9010 EVALUATE(ICMH) {
9011  UNIMPLEMENTED();
9012  USE(instr);
9013  return 0;
9014 }
9015 
9016 EVALUATE(ICMY) {
9017  UNIMPLEMENTED();
9018  USE(instr);
9019  return 0;
9020 }
9021 
9022 EVALUATE(MVCLU) {
9023  UNIMPLEMENTED();
9024  USE(instr);
9025  return 0;
9026 }
9027 
9028 EVALUATE(CLCLU) {
9029  UNIMPLEMENTED();
9030  USE(instr);
9031  return 0;
9032 }
9033 
9034 EVALUATE(STMY) {
9035  DCHECK_OPCODE(STMY);
9036  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9037  // Load/Store Multiple (32)
9038  int offset = d2;
9039 
9040  // Regs roll around if r3 is less than r1.
9041  // Artificially increase r3 by 16 so we can calculate
9042  // the number of regs stored properly.
9043  if (r3 < r1) r3 += 16;
9044 
9045  int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2);
9046 
9047  // Store each register in ascending order.
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);
9051  }
9052  return length;
9053 }
9054 
9055 EVALUATE(LMH) {
9056  UNIMPLEMENTED();
9057  USE(instr);
9058  return 0;
9059 }
9060 
9061 EVALUATE(LMY) {
9062  DCHECK_OPCODE(LMY);
9063  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9064  // Load/Store Multiple (32)
9065  int offset = d2;
9066 
9067  // Regs roll around if r3 is less than r1.
9068  // Artificially increase r3 by 16 so we can calculate
9069  // the number of regs stored properly.
9070  if (r3 < r1) r3 += 16;
9071 
9072  int32_t b2_val = (b2 == 0) ? 0 : get_low_register<int32_t>(b2);
9073 
9074  // Store each register in ascending order.
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);
9078  }
9079  return length;
9080 }
9081 
9082 EVALUATE(TP) {
9083  UNIMPLEMENTED();
9084  USE(instr);
9085  return 0;
9086 }
9087 
9088 EVALUATE(SRAK) {
9089  DCHECK_OPCODE(SRAK);
9090  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9091  // 32-bit non-clobbering shift-left/right arithmetic
9092  // only takes rightmost 6 bits
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;
9097  bool isOF = false;
9098  alu_out = r3_val >> shiftBits;
9099  set_low_register(r1, alu_out);
9100  SetS390ConditionCode<int32_t>(alu_out, 0);
9101  SetS390OverflowCode(isOF);
9102  return length;
9103 }
9104 
9105 EVALUATE(SLAK) {
9106  DCHECK_OPCODE(SLAK);
9107  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9108  // 32-bit non-clobbering shift-left/right arithmetic
9109  // only takes rightmost 6 bits
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;
9114  bool isOF = false;
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);
9120  return length;
9121 }
9122 
9123 EVALUATE(SRLK) {
9124  DCHECK_OPCODE(SRLK);
9125  // For SLLK/SRLL, the 32-bit third operand is shifted the number
9126  // of bits specified by the second-operand address, and the result is
9127  // placed at the first-operand location. Except for when the R1 and R3
9128  // fields designate the same register, the third operand remains
9129  // unchanged in general register R3.
9130  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9131  // only takes rightmost 6 bits
9132  int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9133  int shiftBits = (b2_val + d2) & 0x3F;
9134  // unsigned
9135  uint32_t r3_val = get_low_register<uint32_t>(r3);
9136  uint32_t alu_out = 0;
9137  alu_out = r3_val >> shiftBits;
9138  set_low_register(r1, alu_out);
9139  return length;
9140 }
9141 
9142 EVALUATE(SLLK) {
9143  DCHECK_OPCODE(SLLK);
9144  // For SLLK/SRLL, the 32-bit third operand is shifted the number
9145  // of bits specified by the second-operand address, and the result is
9146  // placed at the first-operand location. Except for when the R1 and R3
9147  // fields designate the same register, the third operand remains
9148  // unchanged in general register R3.
9149  DECODE_RSY_A_INSTRUCTION(r1, r3, b2, d2);
9150  // only takes rightmost 6 bits
9151  int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
9152  int shiftBits = (b2_val + d2) & 0x3F;
9153  // unsigned
9154  uint32_t r3_val = get_low_register<uint32_t>(r3);
9155  uint32_t alu_out = 0;
9156  alu_out = r3_val << shiftBits;
9157  set_low_register(r1, alu_out);
9158  return length;
9159 }
9160 
9161 EVALUATE(LOCG) {
9162  UNIMPLEMENTED();
9163  USE(instr);
9164  return 0;
9165 }
9166 
9167 EVALUATE(STOCG) {
9168  UNIMPLEMENTED();
9169  USE(instr);
9170  return 0;
9171 }
9172 
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); \
9179  int64_t r1_val = \
9180  op(reinterpret_cast<int64_t*>(addr), r3_val, __ATOMIC_SEQ_CST); \
9181  set_register(r1, r1_val);
9182 
9183 EVALUATE(LANG) {
9184  DCHECK_OPCODE(LANG);
9185  ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_and);
9186  return length;
9187 }
9188 
9189 EVALUATE(LAOG) {
9190  DCHECK_OPCODE(LAOG);
9191  ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_or);
9192  return length;
9193 }
9194 
9195 EVALUATE(LAXG) {
9196  DCHECK_OPCODE(LAXG);
9197  ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_xor);
9198  return length;
9199 }
9200 
9201 EVALUATE(LAAG) {
9202  DCHECK_OPCODE(LAAG);
9203  ATOMIC_LOAD_AND_UPDATE_WORD64(__atomic_fetch_add);
9204  return length;
9205 }
9206 
9207 EVALUATE(LAALG) {
9208  UNIMPLEMENTED();
9209  USE(instr);
9210  return 0;
9211 }
9212 
9213 #undef ATOMIC_LOAD_AND_UPDATE_WORD64
9214 
9215 EVALUATE(LOC) {
9216  UNIMPLEMENTED();
9217  USE(instr);
9218  return 0;
9219 }
9220 
9221 EVALUATE(STOC) {
9222  UNIMPLEMENTED();
9223  USE(instr);
9224  return 0;
9225 }
9226 
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);
9236 
9237 EVALUATE(LAN) {
9238  DCHECK_OPCODE(LAN);
9239  ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_and);
9240  return length;
9241 }
9242 
9243 EVALUATE(LAO) {
9244  DCHECK_OPCODE(LAO);
9245  ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_or);
9246  return length;
9247 }
9248 
9249 EVALUATE(LAX) {
9250  DCHECK_OPCODE(LAX);
9251  ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_xor);
9252  return length;
9253 }
9254 
9255 EVALUATE(LAA) {
9256  DCHECK_OPCODE(LAA);
9257  ATOMIC_LOAD_AND_UPDATE_WORD32(__atomic_fetch_add);
9258  return length;
9259 }
9260 
9261 EVALUATE(LAAL) {
9262  UNIMPLEMENTED();
9263  USE(instr);
9264  return 0;
9265 }
9266 
9267 #undef ATOMIC_LOAD_AND_UPDATE_WORD32
9268 
9269 EVALUATE(BRXHG) {
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);
9275  r1_val += r3_val;
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);
9279  }
9280  set_register(r1, r1_val);
9281  return length;
9282 }
9283 
9284 EVALUATE(BRXLG) {
9285  UNIMPLEMENTED();
9286  USE(instr);
9287  return 0;
9288 }
9289 
9290 EVALUATE(RISBLG) {
9291  UNIMPLEMENTED();
9292  USE(instr);
9293  return 0;
9294 }
9295 
9296 EVALUATE(RNSBG) {
9297  UNIMPLEMENTED();
9298  USE(instr);
9299  return 0;
9300 }
9301 
9302 EVALUATE(ROSBG) {
9303  UNIMPLEMENTED();
9304  USE(instr);
9305  return 0;
9306 }
9307 
9308 EVALUATE(RXSBG) {
9309  UNIMPLEMENTED();
9310  USE(instr);
9311  return 0;
9312 }
9313 
9314 EVALUATE(RISBGN) {
9315  UNIMPLEMENTED();
9316  USE(instr);
9317  return 0;
9318 }
9319 
9320 EVALUATE(RISBHG) {
9321  UNIMPLEMENTED();
9322  USE(instr);
9323  return 0;
9324 }
9325 
9326 EVALUATE(CGRJ) {
9327  UNIMPLEMENTED();
9328  USE(instr);
9329  return 0;
9330 }
9331 
9332 EVALUATE(CGIT) {
9333  UNIMPLEMENTED();
9334  USE(instr);
9335  return 0;
9336 }
9337 
9338 EVALUATE(CIT) {
9339  UNIMPLEMENTED();
9340  USE(instr);
9341  return 0;
9342 }
9343 
9344 EVALUATE(CLFIT) {
9345  UNIMPLEMENTED();
9346  USE(instr);
9347  return 0;
9348 }
9349 
9350 EVALUATE(CGIJ) {
9351  UNIMPLEMENTED();
9352  USE(instr);
9353  return 0;
9354 }
9355 
9356 EVALUATE(CIJ) {
9357  UNIMPLEMENTED();
9358  USE(instr);
9359  return 0;
9360 }
9361 
9362 EVALUATE(ALHSIK) {
9363  UNIMPLEMENTED();
9364  USE(instr);
9365  return 0;
9366 }
9367 
9368 EVALUATE(ALGHSIK) {
9369  UNIMPLEMENTED();
9370  USE(instr);
9371  return 0;
9372 }
9373 
9374 EVALUATE(CGRB) {
9375  UNIMPLEMENTED();
9376  USE(instr);
9377  return 0;
9378 }
9379 
9380 EVALUATE(CGIB) {
9381  UNIMPLEMENTED();
9382  USE(instr);
9383  return 0;
9384 }
9385 
9386 EVALUATE(CIB) {
9387  UNIMPLEMENTED();
9388  USE(instr);
9389  return 0;
9390 }
9391 
9392 EVALUATE(LDEB) {
9393  DCHECK_OPCODE(LDEB);
9394  DECODE_RXE_INSTRUCTION(r1, b2, x2, d2);
9395  int rb = b2;
9396  int rx = x2;
9397  int offset = 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));
9402  return length;
9403 }
9404 
9405 EVALUATE(LXDB) {
9406  UNIMPLEMENTED();
9407  USE(instr);
9408  return 0;
9409 }
9410 
9411 EVALUATE(LXEB) {
9412  UNIMPLEMENTED();
9413  USE(instr);
9414  return 0;
9415 }
9416 
9417 EVALUATE(MXDB) {
9418  UNIMPLEMENTED();
9419  USE(instr);
9420  return 0;
9421 }
9422 
9423 EVALUATE(KEB) {
9424  UNIMPLEMENTED();
9425  USE(instr);
9426  return 0;
9427 }
9428 
9429 EVALUATE(CEB) {
9430  DCHECK_OPCODE(CEB);
9431 
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);
9439  return length;
9440 }
9441 
9442 EVALUATE(AEB) {
9443  DCHECK_OPCODE(AEB);
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);
9450  r1_val += fval;
9451  set_d_register_from_float32(r1, r1_val);
9452  SetS390ConditionCode<float>(r1_val, 0);
9453  return length;
9454 }
9455 
9456 EVALUATE(SEB) {
9457  DCHECK_OPCODE(SEB);
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);
9464  r1_val -= fval;
9465  set_d_register_from_float32(r1, r1_val);
9466  SetS390ConditionCode<float>(r1_val, 0);
9467  return length;
9468 }
9469 
9470 EVALUATE(MDEB) {
9471  UNIMPLEMENTED();
9472  USE(instr);
9473  return 0;
9474 }
9475 
9476 EVALUATE(DEB) {
9477  DCHECK_OPCODE(DEB);
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);
9484  r1_val /= fval;
9485  set_d_register_from_float32(r1, r1_val);
9486  return length;
9487 }
9488 
9489 EVALUATE(MAEB) {
9490  UNIMPLEMENTED();
9491  USE(instr);
9492  return 0;
9493 }
9494 
9495 EVALUATE(MSEB) {
9496  UNIMPLEMENTED();
9497  USE(instr);
9498  return 0;
9499 }
9500 
9501 EVALUATE(TCEB) {
9502  UNIMPLEMENTED();
9503  USE(instr);
9504  return 0;
9505 }
9506 
9507 EVALUATE(TCDB) {
9508  UNIMPLEMENTED();
9509  USE(instr);
9510  return 0;
9511 }
9512 
9513 EVALUATE(TCXB) {
9514  UNIMPLEMENTED();
9515  USE(instr);
9516  return 0;
9517 }
9518 
9519 EVALUATE(SQEB) {
9520  UNIMPLEMENTED();
9521  USE(instr);
9522  return 0;
9523 }
9524 
9525 EVALUATE(SQDB) {
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);
9535  return length;
9536 }
9537 
9538 EVALUATE(MEEB) {
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);
9546  r1_val *= fval;
9547  set_d_register_from_float32(r1, r1_val);
9548  return length;
9549 }
9550 
9551 EVALUATE(KDB) {
9552  UNIMPLEMENTED();
9553  USE(instr);
9554  return 0;
9555 }
9556 
9557 EVALUATE(CDB) {
9558  DCHECK_OPCODE(CDB);
9559 
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);
9567  return length;
9568 }
9569 
9570 EVALUATE(ADB) {
9571  DCHECK_OPCODE(ADB);
9572 
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);
9579  r1_val += dbl_val;
9580  set_d_register_from_double(r1, r1_val);
9581  SetS390ConditionCode<double>(r1_val, 0);
9582  return length;
9583 }
9584 
9585 EVALUATE(SDB) {
9586  DCHECK_OPCODE(SDB);
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);
9593  r1_val -= dbl_val;
9594  set_d_register_from_double(r1, r1_val);
9595  SetS390ConditionCode<double>(r1_val, 0);
9596  return length;
9597 }
9598 
9599 EVALUATE(MDB) {
9600  DCHECK_OPCODE(MDB);
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);
9607  r1_val *= dbl_val;
9608  set_d_register_from_double(r1, r1_val);
9609  return length;
9610 }
9611 
9612 EVALUATE(DDB) {
9613  DCHECK_OPCODE(DDB);
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);
9620  r1_val /= dbl_val;
9621  set_d_register_from_double(r1, r1_val);
9622  return length;
9623 }
9624 
9625 EVALUATE(MADB) {
9626  UNIMPLEMENTED();
9627  USE(instr);
9628  return 0;
9629 }
9630 
9631 EVALUATE(MSDB) {
9632  UNIMPLEMENTED();
9633  USE(instr);
9634  return 0;
9635 }
9636 
9637 EVALUATE(SLDT) {
9638  UNIMPLEMENTED();
9639  USE(instr);
9640  return 0;
9641 }
9642 
9643 EVALUATE(SRDT) {
9644  UNIMPLEMENTED();
9645  USE(instr);
9646  return 0;
9647 }
9648 
9649 EVALUATE(SLXT) {
9650  UNIMPLEMENTED();
9651  USE(instr);
9652  return 0;
9653 }
9654 
9655 EVALUATE(SRXT) {
9656  UNIMPLEMENTED();
9657  USE(instr);
9658  return 0;
9659 }
9660 
9661 EVALUATE(TDCET) {
9662  UNIMPLEMENTED();
9663  USE(instr);
9664  return 0;
9665 }
9666 
9667 EVALUATE(TDGET) {
9668  UNIMPLEMENTED();
9669  USE(instr);
9670  return 0;
9671 }
9672 
9673 EVALUATE(TDCDT) {
9674  UNIMPLEMENTED();
9675  USE(instr);
9676  return 0;
9677 }
9678 
9679 EVALUATE(TDGDT) {
9680  UNIMPLEMENTED();
9681  USE(instr);
9682  return 0;
9683 }
9684 
9685 EVALUATE(TDCXT) {
9686  UNIMPLEMENTED();
9687  USE(instr);
9688  return 0;
9689 }
9690 
9691 EVALUATE(TDGXT) {
9692  UNIMPLEMENTED();
9693  USE(instr);
9694  return 0;
9695 }
9696 
9697 EVALUATE(LEY) {
9698  DCHECK_OPCODE(LEY);
9699  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9700  // Miscellaneous Loads and Stores
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);
9706  return length;
9707 }
9708 
9709 EVALUATE(LDY) {
9710  DCHECK_OPCODE(LDY);
9711  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9712  // Miscellaneous Loads and Stores
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);
9718  return length;
9719 }
9720 
9721 EVALUATE(STEY) {
9722  DCHECK_OPCODE(STEY);
9723  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9724  // Miscellaneous Loads and Stores
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);
9730  return length;
9731 }
9732 
9733 EVALUATE(STDY) {
9734  DCHECK_OPCODE(STDY);
9735  DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
9736  // Miscellaneous Loads and Stores
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);
9742  return length;
9743 }
9744 
9745 EVALUATE(CZDT) {
9746  UNIMPLEMENTED();
9747  USE(instr);
9748  return 0;
9749 }
9750 
9751 EVALUATE(CZXT) {
9752  UNIMPLEMENTED();
9753  USE(instr);
9754  return 0;
9755 }
9756 
9757 EVALUATE(CDZT) {
9758  UNIMPLEMENTED();
9759  USE(instr);
9760  return 0;
9761 }
9762 
9763 EVALUATE(CXZT) {
9764  UNIMPLEMENTED();
9765  USE(instr);
9766  return 0;
9767 }
9768 
9769 #undef EVALUATE
9770 
9771 } // namespace internal
9772 } // namespace v8
9773 
9774 #endif // USE_SIMULATOR
9775 #endif // V8_TARGET_ARCH_S390
Definition: libplatform.h:13