Index: runtime/vm/simulator_arm64.cc |
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc |
index 0cfcb2a85acf1df343bbedc639b040244c527a58..a0555677d03fa267299cbc1badf672e50d99727e 100644 |
--- a/runtime/vm/simulator_arm64.cc |
+++ b/runtime/vm/simulator_arm64.cc |
@@ -23,9 +23,13 @@ |
namespace dart { |
-DEFINE_FLAG(uint64_t, trace_sim_after, ULLONG_MAX, |
+DEFINE_FLAG(uint64_t, |
+ trace_sim_after, |
+ ULLONG_MAX, |
"Trace simulator execution after instruction count reached."); |
-DEFINE_FLAG(uint64_t, stop_sim_at, ULLONG_MAX, |
+DEFINE_FLAG(uint64_t, |
+ stop_sim_at, |
+ ULLONG_MAX, |
"Instruction address or instruction count to stop simulator at."); |
@@ -96,7 +100,9 @@ class SimulatorDebugger { |
static TokenPosition GetApproximateTokenIndex(const Code& code, uword pc); |
- static void PrintDartFrame(uword pc, uword fp, uword sp, |
+ static void PrintDartFrame(uword pc, |
+ uword fp, |
+ uword sp, |
const Function& function, |
TokenPosition token_pos, |
bool is_optimized, |
@@ -119,8 +125,7 @@ SimulatorDebugger::SimulatorDebugger(Simulator* sim) { |
} |
-SimulatorDebugger::~SimulatorDebugger() { |
-} |
+SimulatorDebugger::~SimulatorDebugger() {} |
void SimulatorDebugger::Stop(Instr* instr, const char* message) { |
@@ -131,24 +136,19 @@ void SimulatorDebugger::Stop(Instr* instr, const char* message) { |
static Register LookupCpuRegisterByName(const char* name) { |
static const char* kNames[] = { |
- "r0", "r1", "r2", "r3", |
- "r4", "r5", "r6", "r7", |
- "r8", "r9", "r10", "r11", |
- "r12", "r13", "r14", "r15", |
- "r16", "r17", "r18", "r19", |
- "r20", "r21", "r22", "r23", |
- "r24", "r25", "r26", "r27", |
- "r28", "r29", "r30", |
- |
- "ip0", "ip1", "pp", "ctx", "fp", "lr", "sp", "zr", |
+ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", |
+ "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", |
+ "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", |
+ "r24", "r25", "r26", "r27", "r28", "r29", "r30", |
+ |
+ "ip0", "ip1", "pp", "ctx", "fp", "lr", "sp", "zr", |
}; |
static const Register kRegisters[] = { |
- R0, R1, R2, R3, R4, R5, R6, R7, |
- R8, R9, R10, R11, R12, R13, R14, R15, |
- R16, R17, R18, R19, R20, R21, R22, R23, |
- R24, R25, R26, R27, R28, R29, R30, |
+ R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, |
+ R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, |
+ R22, R23, R24, R25, R26, R27, R28, R29, R30, |
- IP0, IP1, PP, CTX, FP, LR, R31, ZR, |
+ IP0, IP1, PP, CTX, FP, LR, R31, ZR, |
}; |
ASSERT(ARRAY_SIZE(kNames) == ARRAY_SIZE(kRegisters)); |
for (unsigned i = 0; i < ARRAY_SIZE(kNames); i++) { |
@@ -263,7 +263,7 @@ bool SimulatorDebugger::GetQValue(char* desc, simd_value_t* value) { |
TokenPosition SimulatorDebugger::GetApproximateTokenIndex(const Code& code, |
- uword pc) { |
+ uword pc) { |
TokenPosition token_pos = TokenPosition::kNoSource; |
uword pc_offset = pc - code.PayloadStart(); |
const PcDescriptors& descriptors = |
@@ -280,7 +280,9 @@ TokenPosition SimulatorDebugger::GetApproximateTokenIndex(const Code& code, |
} |
-void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp, |
+void SimulatorDebugger::PrintDartFrame(uword pc, |
+ uword fp, |
+ uword sp, |
const Function& function, |
TokenPosition token_pos, |
bool is_optimized, |
@@ -293,19 +295,15 @@ void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp, |
if (token_pos.IsReal()) { |
script.GetTokenLocation(token_pos, &line, &column); |
} |
- OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd |
- ":%" Pd ")\n", |
- pc, fp, sp, |
- is_optimized ? (is_inlined ? "inlined " : "optimized ") : "", |
- func_name.ToCString(), |
- url.ToCString(), |
- line, column); |
+ OS::Print( |
+ "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")\n", pc, |
+ fp, sp, is_optimized ? (is_inlined ? "inlined " : "optimized ") : "", |
+ func_name.ToCString(), url.ToCString(), line, column); |
} |
void SimulatorDebugger::PrintBacktrace() { |
- StackFrameIterator frames(sim_->get_register(FP), |
- sim_->get_register(SP), |
+ StackFrameIterator frames(sim_->get_register(FP), sim_->get_register(SP), |
sim_->get_pc(), |
StackFrameIterator::kDontValidateFrames); |
StackFrame* frame = frames.NextFrame(); |
@@ -330,25 +328,25 @@ void SimulatorDebugger::PrintBacktrace() { |
uword unoptimized_pc = it.pc(); |
it.Advance(); |
if (!it.Done()) { |
- PrintDartFrame(unoptimized_pc, frame->fp(), frame->sp(), |
- inlined_function, |
- GetApproximateTokenIndex(unoptimized_code, |
- unoptimized_pc), |
- true, true); |
+ PrintDartFrame( |
+ unoptimized_pc, frame->fp(), frame->sp(), inlined_function, |
+ GetApproximateTokenIndex(unoptimized_code, unoptimized_pc), |
+ true, true); |
} |
} |
// Print the optimized inlining frame below. |
} |
- PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), |
- function, |
+ PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), function, |
GetApproximateTokenIndex(code, frame->pc()), |
code.is_optimized(), false); |
} else { |
OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n", |
frame->pc(), frame->fp(), frame->sp(), |
- frame->IsEntryFrame() ? "entry" : |
- frame->IsExitFrame() ? "exit" : |
- frame->IsStubFrame() ? "stub" : "invalid"); |
+ frame->IsEntryFrame() |
+ ? "entry" |
+ : frame->IsExitFrame() |
+ ? "exit" |
+ : frame->IsStubFrame() ? "stub" : "invalid"); |
} |
frame = frames.NextFrame(); |
} |
@@ -443,27 +441,28 @@ void SimulatorDebugger::Debug() { |
"%" XSTR(ARG_SIZE) "s", |
cmd, arg1, arg2); |
if ((strcmp(cmd, "h") == 0) || (strcmp(cmd, "help") == 0)) { |
- OS::Print("c/cont -- continue execution\n" |
- "disasm -- disassemble instrs at current pc location\n" |
- " other variants are:\n" |
- " disasm <address>\n" |
- " disasm <address> <number_of_instructions>\n" |
- " by default 10 instrs are disassembled\n" |
- "del -- delete breakpoints\n" |
- "flags -- print flag values\n" |
- "gdb -- transfer control to gdb\n" |
- "h/help -- print this help string\n" |
- "break <address> -- set break point at specified address\n" |
- "p/print <reg or icount or value or *addr> -- print integer\n" |
- "pf/printfloat <vreg or *addr> --print float value\n" |
- "pd/printdouble <vreg or *addr> -- print double value\n" |
- "pq/printquad <vreg or *addr> -- print vector register\n" |
- "po/printobject <*reg or *addr> -- print object\n" |
- "si/stepi -- single step an instruction\n" |
- "trace -- toggle execution tracing mode\n" |
- "bt -- print backtrace\n" |
- "unstop -- if current pc is a stop instr make it a nop\n" |
- "q/quit -- Quit the debugger and exit the program\n"); |
+ OS::Print( |
+ "c/cont -- continue execution\n" |
+ "disasm -- disassemble instrs at current pc location\n" |
+ " other variants are:\n" |
+ " disasm <address>\n" |
+ " disasm <address> <number_of_instructions>\n" |
+ " by default 10 instrs are disassembled\n" |
+ "del -- delete breakpoints\n" |
+ "flags -- print flag values\n" |
+ "gdb -- transfer control to gdb\n" |
+ "h/help -- print this help string\n" |
+ "break <address> -- set break point at specified address\n" |
+ "p/print <reg or icount or value or *addr> -- print integer\n" |
+ "pf/printfloat <vreg or *addr> --print float value\n" |
+ "pd/printdouble <vreg or *addr> -- print double value\n" |
+ "pq/printquad <vreg or *addr> -- print vector register\n" |
+ "po/printobject <*reg or *addr> -- print object\n" |
+ "si/stepi -- single step an instruction\n" |
+ "trace -- toggle execution tracing mode\n" |
+ "bt -- print backtrace\n" |
+ "unstop -- if current pc is a stop instr make it a nop\n" |
+ "q/quit -- Quit the debugger and exit the program\n"); |
} else if ((strcmp(cmd, "quit") == 0) || (strcmp(cmd, "q") == 0)) { |
OS::Print("Quitting\n"); |
OS::Exit(0); |
@@ -488,14 +487,12 @@ void SimulatorDebugger::Debug() { |
} else { |
OS::Print("print <reg or icount or value or *addr>\n"); |
} |
- } else if ((strcmp(cmd, "pf") == 0) || |
- (strcmp(cmd, "printfloat") == 0)) { |
+ } else if ((strcmp(cmd, "pf") == 0) || (strcmp(cmd, "printfloat") == 0)) { |
if (args == 2) { |
uint32_t value; |
if (GetSValue(arg1, &value)) { |
float svalue = bit_cast<float, uint32_t>(value); |
- OS::Print("%s: %d 0x%x %.8g\n", |
- arg1, value, value, svalue); |
+ OS::Print("%s: %d 0x%x %.8g\n", arg1, value, value, svalue); |
} else { |
OS::Print("%s unrecognized\n", arg1); |
} |
@@ -508,16 +505,15 @@ void SimulatorDebugger::Debug() { |
uint64_t long_value; |
if (GetDValue(arg1, &long_value)) { |
double dvalue = bit_cast<double, uint64_t>(long_value); |
- OS::Print("%s: %" Pu64 " 0x%" Px64 " %.8g\n", |
- arg1, long_value, long_value, dvalue); |
+ OS::Print("%s: %" Pu64 " 0x%" Px64 " %.8g\n", arg1, long_value, |
+ long_value, dvalue); |
} else { |
OS::Print("%s unrecognized\n", arg1); |
} |
} else { |
OS::Print("printdouble <vreg or *addr>\n"); |
} |
- } else if ((strcmp(cmd, "pq") == 0) || |
- (strcmp(cmd, "printquad") == 0)) { |
+ } else if ((strcmp(cmd, "pq") == 0) || (strcmp(cmd, "printquad") == 0)) { |
if (args == 2) { |
simd_value_t quad_value; |
if (GetQValue(arg1, &quad_value)) { |
@@ -555,8 +551,8 @@ void SimulatorDebugger::Debug() { |
if (Isolate::Current()->heap()->Contains(value)) { |
OS::Print("%s: \n", arg1); |
#if defined(DEBUG) |
- const Object& obj = Object::Handle( |
- reinterpret_cast<RawObject*>(value)); |
+ const Object& obj = |
+ Object::Handle(reinterpret_cast<RawObject*>(value)); |
obj.Print(); |
#endif // defined(DEBUG) |
} else { |
@@ -687,9 +683,7 @@ char* SimulatorDebugger::ReadLine(const char* prompt) { |
return NULL; |
} |
intptr_t len = strlen(line_buf); |
- if (len > 1 && |
- line_buf[len - 2] == '\\' && |
- line_buf[len - 1] == '\n') { |
+ if (len > 1 && line_buf[len - 2] == '\\' && line_buf[len - 1] == '\n') { |
// When we read a line that ends with a "\" we remove the escape and |
// append the remainder. |
line_buf[len - 2] = '\n'; |
@@ -735,8 +729,8 @@ char* SimulatorDebugger::ReadLine(const char* prompt) { |
// Synchronization primitives support. |
Mutex* Simulator::exclusive_access_lock_ = NULL; |
-Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] = |
- {{NULL, 0}}; |
+Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] = { |
+ {NULL, 0}}; |
int Simulator::next_address_tag_ = 0; |
@@ -753,9 +747,9 @@ Simulator::Simulator() { |
// the size specified by the user and the buffer space needed for |
// handling stack overflow exceptions. To be safe in potential |
// stack underflows we also add some underflow buffer space. |
- stack_ = new char[(OSThread::GetSpecifiedStackSize() + |
- OSThread::kStackSizeBuffer + |
- kSimulatorStackUnderflowSize)]; |
+ stack_ = |
+ new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer + |
+ kSimulatorStackUnderflowSize)]; |
pc_modified_ = false; |
icount_ = 0; |
break_pc_ = NULL; |
@@ -857,10 +851,9 @@ class Redirection { |
Redirection* list_head = list_; |
do { |
next_ = list_head; |
- list_head = reinterpret_cast<Redirection*>( |
- AtomicOperations::CompareAndSwapWord( |
- reinterpret_cast<uword*>(&list_), |
- reinterpret_cast<uword>(next_), |
+ list_head = |
+ reinterpret_cast<Redirection*>(AtomicOperations::CompareAndSwapWord( |
+ reinterpret_cast<uword*>(&list_), reinterpret_cast<uword>(next_), |
reinterpret_cast<uword>(this))); |
} while (list_head != next_); |
} |
@@ -903,8 +896,10 @@ Simulator* Simulator::Current() { |
// Sets the register in the architecture state. |
-void Simulator::set_register( |
- Instr* instr, Register reg, int64_t value, R31Type r31t) { |
+void Simulator::set_register(Instr* instr, |
+ Register reg, |
+ int64_t value, |
+ R31Type r31t) { |
// Register is in range. |
ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters)); |
ASSERT(instr == NULL || reg != R18); // R18 is globally reserved on iOS. |
@@ -1020,9 +1015,9 @@ void Simulator::HandleIllegalAccess(uword addr, Instr* instr) { |
uword fault_pc = get_pc(); |
uword last_pc = get_last_pc(); |
char buffer[128]; |
- snprintf(buffer, sizeof(buffer), |
- "illegal memory access at 0x%" Px ", pc=0x%" Px ", last_pc=0x%" Px"\n", |
- addr, fault_pc, last_pc); |
+ snprintf(buffer, sizeof(buffer), "illegal memory access at 0x%" Px |
+ ", pc=0x%" Px ", last_pc=0x%" Px "\n", |
+ addr, fault_pc, last_pc); |
SimulatorDebugger dbg(this); |
dbg.Stop(instr, buffer); |
// The debugger will return control in non-interactive mode. |
@@ -1035,8 +1030,8 @@ void Simulator::HandleIllegalAccess(uword addr, Instr* instr) { |
// so let's just not generate any. |
void Simulator::UnalignedAccess(const char* msg, uword addr, Instr* instr) { |
char buffer[128]; |
- snprintf(buffer, sizeof(buffer), |
- "unaligned %s at 0x%" Px ", pc=%p\n", msg, addr, instr); |
+ snprintf(buffer, sizeof(buffer), "unaligned %s at 0x%" Px ", pc=%p\n", msg, |
+ addr, instr); |
SimulatorDebugger dbg(this); |
dbg.Stop(instr, buffer); |
// The debugger will not be able to single step past this instruction, but |
@@ -1048,8 +1043,8 @@ void Simulator::UnalignedAccess(const char* msg, uword addr, Instr* instr) { |
void Simulator::UnimplementedInstruction(Instr* instr) { |
char buffer[128]; |
snprintf(buffer, sizeof(buffer), |
- "Unimplemented instruction: at %p, last_pc=0x%" Px64 "\n", |
- instr, get_last_pc()); |
+ "Unimplemented instruction: at %p, last_pc=0x%" Px64 "\n", instr, |
+ get_last_pc()); |
SimulatorDebugger dbg(this); |
dbg.Stop(instr, buffer); |
FATAL("Cannot continue execution after unimplemented instruction."); |
@@ -1062,7 +1057,7 @@ uword Simulator::StackTop() const { |
// To be safe in potential stack underflows we leave some buffer above and |
// set the stack top. |
return StackBase() + |
- (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer); |
+ (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer); |
} |
@@ -1282,8 +1277,7 @@ uint32_t Simulator::CompareExchangeUint32(uint32_t* address, |
// Unsupported instructions use Format to print an error and stop execution. |
void Simulator::Format(Instr* instr, const char* format) { |
- OS::Print("Simulator found unsupported instruction:\n 0x%p: %s\n", |
- instr, |
+ OS::Print("Simulator found unsupported instruction:\n 0x%p: %s\n", instr, |
format); |
UNIMPLEMENTED(); |
} |
@@ -1321,7 +1315,9 @@ void Simulator::SetNZFlagsX(int64_t val) { |
// Calculate C flag value for additions and subtractions. |
bool Simulator::CarryFromX(int64_t alu_out, |
- int64_t left, int64_t right, bool addition) { |
+ int64_t left, |
+ int64_t right, |
+ bool addition) { |
if (addition) { |
return (((left & right) | ((left | right) & ~alu_out)) >> 63) != 0; |
} else { |
@@ -1332,7 +1328,9 @@ bool Simulator::CarryFromX(int64_t alu_out, |
// Calculate V flag value for additions and subtractions. |
bool Simulator::OverflowFromX(int64_t alu_out, |
- int64_t left, int64_t right, bool addition) { |
+ int64_t left, |
+ int64_t right, |
+ bool addition) { |
if (addition) { |
return (((alu_out ^ left) & (alu_out ^ right)) >> 63) != 0; |
} else { |
@@ -1357,8 +1355,8 @@ void Simulator::DecodeMoveWide(Instr* instr) { |
const Register rd = instr->RdField(); |
const int hw = instr->HWField(); |
const int64_t shift = hw << 4; |
- const int64_t shifted_imm = |
- static_cast<int64_t>(instr->Imm16Field()) << shift; |
+ const int64_t shifted_imm = static_cast<int64_t>(instr->Imm16Field()) |
+ << shift; |
if (instr->SFField()) { |
if (instr->Bits(29, 2) == 0) { |
@@ -1378,7 +1376,7 @@ void Simulator::DecodeMoveWide(Instr* instr) { |
} else if ((hw & 0x2) == 0) { |
if (instr->Bits(29, 2) == 0) { |
// Format(instr, "movn'sf 'rd, 'imm16 'hw"); |
- set_wregister(rd, ~shifted_imm & kWRegMask, instr->RdMode()); |
+ set_wregister(rd, ~shifted_imm & kWRegMask, instr->RdMode()); |
} else if (instr->Bits(29, 2) == 2) { |
// Format(instr, "movz'sf 'rd, 'imm16 'hw"); |
set_wregister(rd, shifted_imm & kWRegMask, instr->RdMode()); |
@@ -1438,7 +1436,8 @@ void Simulator::DecodeLogicalImm(Instr* instr) { |
const int op = instr->Bits(29, 2); |
const bool set_flags = op == 3; |
const int out_size = ((instr->SFField() == 0) && (instr->NField() == 0)) |
- ? kWRegSizeInBits : kXRegSizeInBits; |
+ ? kWRegSizeInBits |
+ : kXRegSizeInBits; |
const Register rn = instr->RnField(); |
const Register rd = instr->RdField(); |
const int64_t rn_val = get_register(rn, instr->RnMode()); |
@@ -1544,22 +1543,38 @@ bool Simulator::ConditionallyExecute(Instr* instr) { |
cond = instr->ConditionField(); |
} |
switch (cond) { |
- case EQ: return z_flag_; |
- case NE: return !z_flag_; |
- case CS: return c_flag_; |
- case CC: return !c_flag_; |
- case MI: return n_flag_; |
- case PL: return !n_flag_; |
- case VS: return v_flag_; |
- case VC: return !v_flag_; |
- case HI: return c_flag_ && !z_flag_; |
- case LS: return !c_flag_ || z_flag_; |
- case GE: return n_flag_ == v_flag_; |
- case LT: return n_flag_ != v_flag_; |
- case GT: return !z_flag_ && (n_flag_ == v_flag_); |
- case LE: return z_flag_ || (n_flag_ != v_flag_); |
- case AL: return true; |
- default: UNREACHABLE(); |
+ case EQ: |
+ return z_flag_; |
+ case NE: |
+ return !z_flag_; |
+ case CS: |
+ return c_flag_; |
+ case CC: |
+ return !c_flag_; |
+ case MI: |
+ return n_flag_; |
+ case PL: |
+ return !n_flag_; |
+ case VS: |
+ return v_flag_; |
+ case VC: |
+ return !v_flag_; |
+ case HI: |
+ return c_flag_ && !z_flag_; |
+ case LS: |
+ return !c_flag_ || z_flag_; |
+ case GE: |
+ return n_flag_ == v_flag_; |
+ case LT: |
+ return n_flag_ != v_flag_; |
+ case GT: |
+ return !z_flag_ && (n_flag_ == v_flag_); |
+ case LE: |
+ return z_flag_ || (n_flag_ != v_flag_); |
+ case AL: |
+ return true; |
+ default: |
+ UNREACHABLE(); |
} |
return false; |
} |
@@ -1582,14 +1597,24 @@ void Simulator::DecodeConditionalBranch(Instr* instr) { |
typedef void (*SimulatorRuntimeCall)(NativeArguments arguments); |
// Calls to leaf Dart runtime functions are based on this interface. |
-typedef int64_t (*SimulatorLeafRuntimeCall)( |
- int64_t r0, int64_t r1, int64_t r2, int64_t r3, |
- int64_t r4, int64_t r5, int64_t r6, int64_t r7); |
+typedef int64_t (*SimulatorLeafRuntimeCall)(int64_t r0, |
+ int64_t r1, |
+ int64_t r2, |
+ int64_t r3, |
+ int64_t r4, |
+ int64_t r5, |
+ int64_t r6, |
+ int64_t r7); |
// Calls to leaf float Dart runtime functions are based on this interface. |
-typedef double (*SimulatorLeafFloatRuntimeCall)( |
- double d0, double d1, double d2, double d3, |
- double d4, double d5, double d6, double d7); |
+typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, |
+ double d1, |
+ double d2, |
+ double d3, |
+ double d4, |
+ double d5, |
+ double d6, |
+ double d7); |
// Calls to native Dart functions are based on this interface. |
typedef void (*SimulatorBootstrapNativeCall)(NativeArguments* arguments); |
@@ -1635,7 +1660,7 @@ void Simulator::DoRedirectedCall(Instr* instr) { |
const int64_t r6 = get_register(R6); |
const int64_t r7 = get_register(R7); |
const int64_t res = target(r0, r1, r2, r3, r4, r5, r6, r7); |
- set_register(instr, R0, res); // Set returned result from function. |
+ set_register(instr, R0, res); // Set returned result from function. |
set_register(instr, R1, icount_); // Zap unused result register. |
} else if (redirection->call_kind() == kLeafFloatRuntimeCall) { |
ASSERT((0 <= redirection->argument_count()) && |
@@ -1865,8 +1890,8 @@ void Simulator::DecodeLoadStoreReg(Instr* instr) { |
const Register rt = instr->RtField(); |
const VRegister vt = instr->VtField(); |
const int64_t rn_val = get_register(rn, R31IsSP); |
- const uint32_t size = |
- (instr->Bit(26) == 1) ? ((instr->Bit(23) << 2) | instr->SzField()) |
+ const uint32_t size = (instr->Bit(26) == 1) |
+ ? ((instr->Bit(23) << 2) | instr->SzField()) |
: instr->SzField(); |
uword address = 0; |
uword wb_address = 0; |
@@ -1876,7 +1901,7 @@ void Simulator::DecodeLoadStoreReg(Instr* instr) { |
const uint32_t imm12 = static_cast<uint32_t>(instr->Imm12Field()); |
const uint32_t offset = imm12 << size; |
address = rn_val + offset; |
- } else if (instr->Bits(10, 2) == 0) { |
+ } else if (instr->Bits(10, 2) == 0) { |
// addr = rn + signed 9-bit immediate offset. |
wb = false; |
const int64_t offset = static_cast<int64_t>(instr->SImm9Field()); |
@@ -1899,8 +1924,7 @@ void Simulator::DecodeLoadStoreReg(Instr* instr) { |
// addr = rn + (rm EXT optionally scaled by operand instruction size). |
const Register rm = instr->RmField(); |
const Extend ext = instr->ExtendTypeField(); |
- const uint8_t scale = |
- (ext == UXTX) && (instr->Bit(12) == 1) ? size : 0; |
+ const uint8_t scale = (ext == UXTX) && (instr->Bit(12) == 1) ? size : 0; |
const int64_t rm_val = get_register(rm, R31IsZR); |
const int64_t offset = ExtendOperand(kXRegSizeInBits, rm_val, ext, scale); |
address = rn_val + offset; |
@@ -2170,9 +2194,7 @@ void Simulator::DecodeLoadRegLiteral(Instr* instr) { |
void Simulator::DecodeLoadStoreExclusive(Instr* instr) { |
- if ((instr->Bit(23) != 0) || |
- (instr->Bit(21) != 0) || |
- (instr->Bit(15) != 0)) { |
+ if ((instr->Bit(23) != 0) || (instr->Bit(21) != 0) || (instr->Bit(15) != 0)) { |
UNIMPLEMENTED(); |
} |
const int32_t size = instr->Bits(30, 2); |
@@ -2773,7 +2795,7 @@ void Simulator::DecodeSIMDCopy(Instr* instr) { |
// Format(instr, "vmovrd 'rd, 'vn'idx5"); |
set_register(instr, rd, get_vregisterd(vn, idx5), R31IsZR); |
} |
- } else if ((Q == 1) && (op == 0) && (imm4 == 0)) { |
+ } else if ((Q == 1) && (op == 0) && (imm4 == 0)) { |
// Format(instr, "vdup'csz 'vd, 'vn'idx5"); |
if (element_bytes == 4) { |
for (int i = 0; i < 4; i++) { |
@@ -2984,9 +3006,12 @@ void Simulator::DecodeSIMDThreeSame(Instr* instr) { |
static float arm_reciprocal_sqrt_estimate(float a) { |
// From the ARM Architecture Reference Manual A2-87. |
- if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0; |
- else if (a == 0.0) return kPosInfinity; |
- else if (isnan(a)) return a; |
+ if (isinf(a) || (fabs(a) >= exp2f(126))) |
+ return 0.0; |
+ else if (a == 0.0) |
+ return kPosInfinity; |
+ else if (isnan(a)) |
+ return a; |
uint32_t a_bits = bit_cast<uint32_t, float>(a); |
uint64_t scaled; |
@@ -3024,10 +3049,11 @@ static float arm_reciprocal_sqrt_estimate(float a) { |
// r in units of 1/256 rounded to nearest. |
int32_t s = static_cast<int>(256.0 * r + 0.5); |
double estimate = static_cast<double>(s) / 256.0; |
- ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0))); |
+ ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0))); |
// result = 0 : result_exp<7:0> : estimate<51:29> |
- int32_t result_bits = ((result_exp & 0xff) << 23) | |
+ int32_t result_bits = |
+ ((result_exp & 0xff) << 23) | |
((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff); |
return bit_cast<float, int32_t>(result_bits); |
} |
@@ -3035,9 +3061,12 @@ static float arm_reciprocal_sqrt_estimate(float a) { |
static float arm_recip_estimate(float a) { |
// From the ARM Architecture Reference Manual A2-85. |
- if (isinf(a) || (fabs(a) >= exp2f(126))) return 0.0; |
- else if (a == 0.0) return kPosInfinity; |
- else if (isnan(a)) return a; |
+ if (isinf(a) || (fabs(a) >= exp2f(126))) |
+ return 0.0; |
+ else if (a == 0.0) |
+ return kPosInfinity; |
+ else if (isnan(a)) |
+ return a; |
uint32_t a_bits = bit_cast<uint32_t, float>(a); |
// scaled = '0011 1111 1110' : a<22:0> : Zeros(29) |
@@ -3057,7 +3086,7 @@ static float arm_recip_estimate(float a) { |
// r in units of 1/256 rounded to nearest. |
int32_t s = static_cast<int32_t>(256.0 * r + 0.5); |
double estimate = static_cast<double>(s) / 256.0; |
- ASSERT((estimate >= 1.0) && (estimate <= (511.0/256.0))); |
+ ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0))); |
// result = sign : result_exp<7:0> : estimate<51:29> |
int32_t result_bits = |
@@ -3217,8 +3246,9 @@ void Simulator::DecodeFPIntCvt(Instr* instr) { |
// Format(instr, "scvtfd'sf 'vd, 'rn"); |
const int64_t rn_val64 = get_register(rn, instr->RnMode()); |
const int32_t rn_val32 = get_wregister(rn, instr->RnMode()); |
- const double vn_dbl = (instr->SFField() == 1) ? |
- static_cast<double>(rn_val64) : static_cast<double>(rn_val32); |
+ const double vn_dbl = (instr->SFField() == 1) |
+ ? static_cast<double>(rn_val64) |
+ : static_cast<double>(rn_val32); |
set_vregisterd(vd, 0, bit_cast<int64_t, double>(vn_dbl)); |
set_vregisterd(vd, 1, 0); |
} else if (instr->Bits(16, 5) == 6) { |
@@ -3605,10 +3635,10 @@ void Simulator::Longjmp(uword pc, |
set_register(NULL, kExceptionObjectReg, bit_cast<int64_t>(raw_exception)); |
set_register(NULL, kStackTraceObjectReg, bit_cast<int64_t>(raw_stacktrace)); |
// Restore pool pointer. |
- int64_t code = *reinterpret_cast<int64_t*>( |
- fp + kPcMarkerSlotFromFp * kWordSize); |
- int64_t pp = *reinterpret_cast<int64_t*>( |
- code + Code::object_pool_offset() - kHeapObjectTag); |
+ int64_t code = |
+ *reinterpret_cast<int64_t*>(fp + kPcMarkerSlotFromFp * kWordSize); |
+ int64_t pp = *reinterpret_cast<int64_t*>(code + Code::object_pool_offset() - |
+ kHeapObjectTag); |
pp -= kHeapObjectTag; // In the PP register, the pool pointer is untagged. |
set_register(NULL, CODE_REG, code); |
set_register(NULL, PP, pp); |