Index: src/s390/simulator-s390.cc |
diff --git a/src/s390/simulator-s390.cc b/src/s390/simulator-s390.cc |
index b86132f12c7e0dae7715a22716c642ceba42f0d4..1ed9b0e281550cf8994ee2227a516631e5cb12e1 100644 |
--- a/src/s390/simulator-s390.cc |
+++ b/src/s390/simulator-s390.cc |
@@ -8769,8 +8769,6 @@ EVALUATE(DEBR) { |
float fr2_val = get_float32_from_d_register(r2); |
fr1_val /= fr2_val; |
set_d_register_from_float32(r1, fr1_val); |
- SetS390ConditionCode<float>(fr1_val, 0); |
- |
return length; |
} |
@@ -8870,7 +8868,6 @@ EVALUATE(MEEBR) { |
float fr2_val = get_float32_from_d_register(r2); |
fr1_val *= fr2_val; |
set_d_register_from_float32(r1, fr1_val); |
- SetS390ConditionCode<float>(fr1_val, 0); |
return length; |
} |
@@ -8922,7 +8919,6 @@ EVALUATE(MDBR) { |
double r2_val = get_double_from_d_register(r2); |
r1_val *= r2_val; |
set_d_register_from_double(r1, r1_val); |
- SetS390ConditionCode<double>(r1_val, 0); |
return length; |
} |
@@ -8933,7 +8929,6 @@ EVALUATE(DDBR) { |
double r2_val = get_double_from_d_register(r2); |
r1_val /= r2_val; |
set_d_register_from_double(r1, r1_val); |
- SetS390ConditionCode<double>(r1_val, 0); |
return length; |
} |
@@ -10435,12 +10430,14 @@ EVALUATE(DLGR) { |
dividend += get_register(r1 + 1); |
uint64_t remainder = dividend % r2_val; |
uint64_t quotient = dividend / r2_val; |
- r1_val = remainder; |
set_register(r1, remainder); |
set_register(r1 + 1, quotient); |
return length; |
#else |
+ // 32 bit arch doesn't support __int128 type |
+ USE(instr); |
UNREACHABLE(); |
+ return 0; |
#endif |
} |
@@ -10926,8 +10923,10 @@ EVALUATE(AG) { |
int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
int64_t alu_out = get_register(r1); |
int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
+ bool isOF = CheckOverflowForIntAdd(alu_out, mem_val, int64_t); |
alu_out += mem_val; |
- SetS390ConditionCode<int32_t>(alu_out, 0); |
+ SetS390ConditionCode<int64_t>(alu_out, 0); |
+ SetS390OverflowCode(isOF); |
set_register(r1, alu_out); |
return length; |
} |
@@ -10939,8 +10938,10 @@ EVALUATE(SG) { |
int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
int64_t alu_out = get_register(r1); |
int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
+ bool isOF = CheckOverflowForIntSub(alu_out, mem_val, int64_t); |
alu_out -= mem_val; |
SetS390ConditionCode<int32_t>(alu_out, 0); |
+ SetS390OverflowCode(isOF); |
set_register(r1, alu_out); |
return length; |
} |
@@ -10994,9 +10995,19 @@ EVALUATE(MSG) { |
} |
EVALUATE(DSG) { |
- UNIMPLEMENTED(); |
- USE(instr); |
- return 0; |
+ DCHECK_OPCODE(DSG); |
+ DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
+ DCHECK(r1 % 2 == 0); |
+ 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; |
+ int64_t mem_val = ReadDW(b2_val + d2_val + x2_val); |
+ int64_t r1_val = get_register(r1 + 1); |
+ int64_t quotient = r1_val / mem_val; |
+ int64_t remainder = r1_val % mem_val; |
+ set_register(r1, remainder); |
+ set_register(r1 + 1, quotient); |
+ return length; |
} |
EVALUATE(CVBG) { |
@@ -11604,9 +11615,27 @@ EVALUATE(MLG) { |
} |
EVALUATE(DLG) { |
- UNIMPLEMENTED(); |
+ DCHECK_OPCODE(DLG); |
+#ifdef V8_TARGET_ARCH_S390X |
+ DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2); |
+ uint64_t r1_val = get_register(r1); |
+ int64_t x2_val = (x2 == 0) ? 0 : get_register(x2); |
+ int64_t b2_val = (b2 == 0) ? 0 : get_register(b2); |
+ DCHECK(r1 % 2 == 0); |
+ unsigned __int128 dividend = static_cast<unsigned __int128>(r1_val) << 64; |
+ dividend += get_register(r1 + 1); |
+ int64_t mem_val = ReadDW(b2_val + x2_val + d2); |
+ uint64_t remainder = dividend % mem_val; |
+ uint64_t quotient = dividend / mem_val; |
+ set_register(r1, remainder); |
+ set_register(r1 + 1, quotient); |
+ return length; |
+#else |
+ // 32 bit arch doesn't support __int128 type |
USE(instr); |
+ UNREACHABLE(); |
return 0; |
+#endif |
} |
EVALUATE(ALCG) { |
@@ -12509,16 +12538,14 @@ EVALUATE(CIB) { |
EVALUATE(LDEB) { |
DCHECK_OPCODE(LDEB); |
- // Load Float |
DECODE_RXE_INSTRUCTION(r1, b2, x2, d2); |
int rb = b2; |
int rx = x2; |
int offset = d2; |
int64_t rb_val = (rb == 0) ? 0 : get_register(rb); |
int64_t rx_val = (rx == 0) ? 0 : get_register(rx); |
- double ret = |
- static_cast<double>(*reinterpret_cast<float*>(rx_val + rb_val + offset)); |
- set_d_register_from_double(r1, ret); |
+ float fval = ReadFloat(rx_val + rb_val + offset); |
+ set_d_register_from_double(r1, static_cast<double>(fval)); |
return length; |
} |
@@ -12560,15 +12587,31 @@ EVALUATE(CEB) { |
} |
EVALUATE(AEB) { |
- UNIMPLEMENTED(); |
- USE(instr); |
- return 0; |
+ DCHECK_OPCODE(AEB); |
+ DECODE_RXE_INSTRUCTION(r1, b2, x2, 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; |
+ float r1_val = get_float32_from_d_register(r1); |
+ float fval = ReadFloat(b2_val + x2_val + d2_val); |
+ r1_val += fval; |
+ set_d_register_from_float32(r1, r1_val); |
+ SetS390ConditionCode<float>(r1_val, 0); |
+ return length; |
} |
EVALUATE(SEB) { |
- UNIMPLEMENTED(); |
- USE(instr); |
- return 0; |
+ DCHECK_OPCODE(SEB); |
+ DECODE_RXE_INSTRUCTION(r1, b2, x2, 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; |
+ float r1_val = get_float32_from_d_register(r1); |
+ float fval = ReadFloat(b2_val + x2_val + d2_val); |
+ r1_val -= fval; |
+ set_d_register_from_float32(r1, r1_val); |
+ SetS390ConditionCode<float>(r1_val, 0); |
+ return length; |
} |
EVALUATE(MDEB) { |
@@ -12578,9 +12621,16 @@ EVALUATE(MDEB) { |
} |
EVALUATE(DEB) { |
- UNIMPLEMENTED(); |
- USE(instr); |
- return 0; |
+ DCHECK_OPCODE(DEB); |
+ DECODE_RXE_INSTRUCTION(r1, b2, x2, 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; |
+ float r1_val = get_float32_from_d_register(r1); |
+ float fval = ReadFloat(b2_val + x2_val + d2_val); |
+ r1_val /= fval; |
+ set_d_register_from_float32(r1, r1_val); |
+ return length; |
} |
EVALUATE(MAEB) { |
@@ -12633,9 +12683,16 @@ EVALUATE(SQDB) { |
} |
EVALUATE(MEEB) { |
- UNIMPLEMENTED(); |
- USE(instr); |
- return 0; |
+ DCHECK_OPCODE(MEEB); |
+ DECODE_RXE_INSTRUCTION(r1, b2, x2, 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; |
+ float r1_val = get_float32_from_d_register(r1); |
+ float fval = ReadFloat(b2_val + x2_val + d2_val); |
+ r1_val *= fval; |
+ set_d_register_from_float32(r1, r1_val); |
+ return length; |
} |
EVALUATE(KDB) { |
@@ -12696,7 +12753,6 @@ EVALUATE(MDB) { |
double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
r1_val *= dbl_val; |
set_d_register_from_double(r1, r1_val); |
- SetS390ConditionCode<double>(r1_val, 0); |
return length; |
} |
@@ -12710,7 +12766,6 @@ EVALUATE(DDB) { |
double dbl_val = ReadDouble(b2_val + x2_val + d2_val); |
r1_val /= dbl_val; |
set_d_register_from_double(r1, r1_val); |
- SetS390ConditionCode<double>(r1_val, 0); |
return length; |
} |