| Index: src/s390/simulator-s390.cc
|
| diff --git a/src/s390/simulator-s390.cc b/src/s390/simulator-s390.cc
|
| index b669dcb20701c8bebd1fe3e7dfd5cda3574aa094..b0fa0917ad7ecad6a12657f9976d39f1aaba8a05 100644
|
| --- a/src/s390/simulator-s390.cc
|
| +++ b/src/s390/simulator-s390.cc
|
| @@ -1300,6 +1300,7 @@ void Simulator::EvalTableInit() {
|
| EvalTable[BCTG] = &Simulator::Evaluate_BCTG;
|
| EvalTable[STY] = &Simulator::Evaluate_STY;
|
| EvalTable[MSY] = &Simulator::Evaluate_MSY;
|
| + EvalTable[MSC] = &Simulator::Evaluate_MSC;
|
| EvalTable[NY] = &Simulator::Evaluate_NY;
|
| EvalTable[CLY] = &Simulator::Evaluate_CLY;
|
| EvalTable[OY] = &Simulator::Evaluate_OY;
|
| @@ -8157,6 +8158,25 @@ EVALUATE(MSY) {
|
| return length;
|
| }
|
|
|
| +EVALUATE(MSC) {
|
| + DCHECK_OPCODE(MSC);
|
| + DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
|
| + int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
|
| + int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
|
| + intptr_t d2_val = d2;
|
| + int32_t mem_val = ReadW(b2_val + d2_val + x2_val, instr);
|
| + int32_t r1_val = get_low_register<int32_t>(r1);
|
| + int64_t result64 =
|
| + static_cast<int64_t>(r1_val) * static_cast<int64_t>(mem_val);
|
| + int32_t result32 = static_cast<int32_t>(result64);
|
| + bool isOF = (static_cast<int64_t>(result32) != result64);
|
| + SetS390ConditionCode<int32_t>(result32, 0);
|
| + SetS390OverflowCode(isOF);
|
| + set_low_register(r1, result32);
|
| + set_low_register(r1, mem_val * r1_val);
|
| + return length;
|
| +}
|
| +
|
| EVALUATE(NY) {
|
| DCHECK_OPCODE(NY);
|
| DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
|
|
|