| Index: src/s390/simulator-s390.cc
|
| diff --git a/src/s390/simulator-s390.cc b/src/s390/simulator-s390.cc
|
| index 983d71d678448874a7a0aaef94eb3ece1649f908..01c96d65e1bcc98ef130ac3472276837dc891cdf 100644
|
| --- a/src/s390/simulator-s390.cc
|
| +++ b/src/s390/simulator-s390.cc
|
| @@ -275,18 +275,40 @@ void S390Debugger::Debug() {
|
| reinterpret_cast<Instruction*>(sim_->get_pc()));
|
| }
|
|
|
| - if (argc == 2 && last_pc != sim_->get_pc() && GetValue(arg1, &value)) {
|
| - for (int i = 1; (!sim_->has_bad_pc()) && i < value; i++) {
|
| - disasm::NameConverter converter;
|
| - disasm::Disassembler dasm(converter);
|
| - // use a reasonably large buffer
|
| - v8::internal::EmbeddedVector<char, 256> buffer;
|
| - dasm.InstructionDecode(buffer,
|
| - reinterpret_cast<byte*>(sim_->get_pc()));
|
| - PrintF(" 0x%08" V8PRIxPTR " %s\n", sim_->get_pc(),
|
| - buffer.start());
|
| - sim_->ExecuteInstruction(
|
| - reinterpret_cast<Instruction*>(sim_->get_pc()));
|
| + if (argc == 2 && last_pc != sim_->get_pc()) {
|
| + disasm::NameConverter converter;
|
| + disasm::Disassembler dasm(converter);
|
| + // use a reasonably large buffer
|
| + v8::internal::EmbeddedVector<char, 256> buffer;
|
| +
|
| + if (GetValue(arg1, &value)) {
|
| + // Interpret a numeric argument as the number of instructions to
|
| + // step past.
|
| + for (int i = 1; (!sim_->has_bad_pc()) && i < value; i++) {
|
| + dasm.InstructionDecode(buffer,
|
| + reinterpret_cast<byte*>(sim_->get_pc()));
|
| + PrintF(" 0x%08" V8PRIxPTR " %s\n", sim_->get_pc(),
|
| + buffer.start());
|
| + sim_->ExecuteInstruction(
|
| + reinterpret_cast<Instruction*>(sim_->get_pc()));
|
| + }
|
| + } else {
|
| + // Otherwise treat it as the mnemonic of the opcode to stop at.
|
| + char mnemonic[256];
|
| + while (!sim_->has_bad_pc()) {
|
| + dasm.InstructionDecode(buffer,
|
| + reinterpret_cast<byte*>(sim_->get_pc()));
|
| + char* mnemonicStart = buffer.start();
|
| + while (*mnemonicStart != 0 && *mnemonicStart != ' ')
|
| + mnemonicStart++;
|
| + SScanF(mnemonicStart, "%s", mnemonic);
|
| + if (!strcmp(arg1, mnemonic)) break;
|
| +
|
| + PrintF(" 0x%08" V8PRIxPTR " %s\n", sim_->get_pc(),
|
| + buffer.start());
|
| + sim_->ExecuteInstruction(
|
| + reinterpret_cast<Instruction*>(sim_->get_pc()));
|
| + }
|
| }
|
| }
|
| } else if ((strcmp(cmd, "c") == 0) || (strcmp(cmd, "cont") == 0)) {
|
| @@ -575,6 +597,8 @@ void S390Debugger::Debug() {
|
| } else {
|
| PrintF("Wrong usage. Use help command for more information.\n");
|
| }
|
| + } else if (strcmp(cmd, "icount") == 0) {
|
| + PrintF("%05d\n", sim_->icount_);
|
| } else if ((strcmp(cmd, "t") == 0) || strcmp(cmd, "trace") == 0) {
|
| ::v8::internal::FLAG_trace_sim = !::v8::internal::FLAG_trace_sim;
|
| PrintF("Trace of executed instructions is %s\n",
|
| @@ -5563,6 +5587,8 @@ int Simulator::DecodeInstruction(Instruction* instr) {
|
|
|
| // Executes the current instruction.
|
| void Simulator::ExecuteInstruction(Instruction* instr, bool auto_incr_pc) {
|
| + icount_++;
|
| +
|
| if (v8::internal::FLAG_check_icache) {
|
| CheckICache(isolate_->simulator_i_cache(), instr);
|
| }
|
| @@ -5608,7 +5634,6 @@ void Simulator::Execute() {
|
| // should be stopping at a particular executed instruction.
|
| while (program_counter != end_sim_pc) {
|
| Instruction* instr = reinterpret_cast<Instruction*>(program_counter);
|
| - icount_++;
|
| ExecuteInstruction(instr);
|
| program_counter = get_pc();
|
| }
|
| @@ -5617,7 +5642,6 @@ void Simulator::Execute() {
|
| // we reach the particular instuction count.
|
| while (program_counter != end_sim_pc) {
|
| Instruction* instr = reinterpret_cast<Instruction*>(program_counter);
|
| - icount_++;
|
| if (icount_ == ::v8::internal::FLAG_stop_sim_at) {
|
| S390Debugger dbg(this);
|
| dbg.Debug();
|
|
|