Upgrade V8 to 5.1.281.57 DO NOT MERGE
FPIIM-449
Change-Id: Id981b686b4d587ac31697662eb98bb34be42ad90
(cherry picked from commit 3b9bc31999c9787eb726ecdbfd5796bfdec32a18)
diff --git a/src/arm/simulator-arm.cc b/src/arm/simulator-arm.cc
index 4630b94..6c22a0a 100644
--- a/src/arm/simulator-arm.cc
+++ b/src/arm/simulator-arm.cc
@@ -1041,6 +1041,32 @@
return value;
}
+void Simulator::SetSpecialRegister(SRegisterFieldMask reg_and_mask,
+ uint32_t value) {
+ // Only CPSR_f is implemented. Of that, only N, Z, C and V are implemented.
+ if ((reg_and_mask == CPSR_f) && ((value & ~kSpecialCondition) == 0)) {
+ n_flag_ = ((value & (1 << 31)) != 0);
+ z_flag_ = ((value & (1 << 30)) != 0);
+ c_flag_ = ((value & (1 << 29)) != 0);
+ v_flag_ = ((value & (1 << 28)) != 0);
+ } else {
+ UNIMPLEMENTED();
+ }
+}
+
+uint32_t Simulator::GetFromSpecialRegister(SRegister reg) {
+ uint32_t result = 0;
+ // Only CPSR_f is implemented.
+ if (reg == CPSR) {
+ if (n_flag_) result |= (1 << 31);
+ if (z_flag_) result |= (1 << 30);
+ if (c_flag_) result |= (1 << 29);
+ if (v_flag_) result |= (1 << 28);
+ } else {
+ UNIMPLEMENTED();
+ }
+ return result;
+}
// Runtime FP routines take:
// - two double arguments
@@ -1307,11 +1333,12 @@
// Calculate C flag value for subtractions.
-bool Simulator::BorrowFrom(int32_t left, int32_t right) {
+bool Simulator::BorrowFrom(int32_t left, int32_t right, int32_t carry) {
uint32_t uleft = static_cast<uint32_t>(left);
uint32_t uright = static_cast<uint32_t>(right);
- return (uright > uleft);
+ return (uright > uleft) ||
+ (!carry && (((uright + 1) > uleft) || (uright > (uleft - 1))));
}
@@ -2312,7 +2339,22 @@
return;
}
} else if ((type == 0) && instr->IsMiscType0()) {
- if (instr->Bits(22, 21) == 1) {
+ if ((instr->Bits(27, 23) == 2) && (instr->Bits(21, 20) == 2) &&
+ (instr->Bits(15, 4) == 0xf00)) {
+ // MSR
+ int rm = instr->RmValue();
+ DCHECK_NE(pc, rm); // UNPREDICTABLE
+ SRegisterFieldMask sreg_and_mask =
+ instr->BitField(22, 22) | instr->BitField(19, 16);
+ SetSpecialRegister(sreg_and_mask, get_register(rm));
+ } else if ((instr->Bits(27, 23) == 2) && (instr->Bits(21, 20) == 0) &&
+ (instr->Bits(11, 0) == 0)) {
+ // MRS
+ int rd = instr->RdValue();
+ DCHECK_NE(pc, rd); // UNPREDICTABLE
+ SRegister sreg = static_cast<SRegister>(instr->BitField(22, 22));
+ set_register(rd, GetFromSpecialRegister(sreg));
+ } else if (instr->Bits(22, 21) == 1) {
int rm = instr->RmValue();
switch (instr->BitField(7, 4)) {
case BX:
@@ -2452,8 +2494,15 @@
}
case SBC: {
- Format(instr, "sbc'cond's 'rd, 'rn, 'shift_rm");
- Format(instr, "sbc'cond's 'rd, 'rn, 'imm");
+ // Format(instr, "sbc'cond's 'rd, 'rn, 'shift_rm");
+ // Format(instr, "sbc'cond's 'rd, 'rn, 'imm");
+ alu_out = (rn_val - shifter_operand) - (GetCarry() ? 0 : 1);
+ set_register(rd, alu_out);
+ if (instr->HasS()) {
+ SetNZFlags(alu_out);
+ SetCFlag(!BorrowFrom(rn_val, shifter_operand, GetCarry()));
+ SetVFlag(OverflowFrom(alu_out, rn_val, shifter_operand, false));
+ }
break;
}
@@ -3215,7 +3264,7 @@
if (instr->SzValue() == 0x1) {
set_d_register_from_double(vd, instr->DoubleImmedVmov());
} else {
- UNREACHABLE(); // Not used by v8.
+ set_s_register_from_float(d, instr->DoubleImmedVmov());
}
} else if (((instr->Opc2Value() == 0x6)) && (instr->Opc3Value() == 0x3)) {
// vrintz - truncate