inline bool run(Environment& environment, Suite& tests, Setup const&... setup) { // retrieve compact status auto is_compact = args("compact",false); auto is_fail_only = args("fail-only",false); environment.compact(is_compact); environment.fail_only(is_fail_only); // randomize test on non-null random seed option if(auto seed = args("random",0u)) { ::stf::detail::shuffle( tests.begin(), tests.end(), std::mt19937{seed} ); } for(auto& t : tests ) { scenario_header(environment,t); auto count = environment.tests(); t(environment); process_invalid(environment, count); environment.stream() << std::endl; } return ::stf::report(environment,setup...); }
bool process_code(vm_t * vm, bool verbose) { for (vm->regs.pc = 0; vm->regs.pc < (reg_t) vm->code_size;) { u8 opcode = vm->code[vm->regs.pc]; inst c_inst = get_instruction(opcode); bool pstat = false; switch (c_inst.name) { // op reg, reg case ADD: case SUB: case MUL: case DIV: case XOR: case MOV: { pstat = process_reg_reg(c_inst, vm, true); break; } // op reg, immb case ADDIB: case SUBIB: case MULIB: case DIVIB: case XORIB: case MOVIB: { pstat = process_reg_immb(c_inst, vm, true); break; } // op reg, immw case ADDIW: case SUBIW: case MULIW: case DIVIW: case XORIW: case MOVIW: { pstat = process_reg_immw(c_inst, vm, true); break; } // op reg, immd case ADDID: case SUBID: case MULID: case DIVID: case XORID: case MOVID: { pstat = process_reg_immd(c_inst, vm, true); break; } // op reg case INC: case DEC: { pstat = process_reg(c_inst, vm, true); break; } case PUSHB: { pstat = process_pushb(c_inst, vm, true); break; } case PUSHW: { pstat = process_pushw(c_inst, vm, true); break; } case PUSHD: { pstat = process_pushd(c_inst, vm, true); break; } case POPB: { pstat = process_popb(c_inst, vm, true); break; } case POPW: { pstat = process_popw(c_inst, vm, true); break; } case POPD: { pstat = process_popd(c_inst, vm, true); break; } case PUSHIB: { pstat = process_pushib(c_inst, vm, true); break; } case PUSHIW: { pstat = process_pushiw(c_inst, vm, true); break; } case PUSHID: { pstat = process_pushid(c_inst, vm, true); break; } case GSTK: { pstat = process_gstk(c_inst, vm, true); break; } case PSTK: { pstat = process_pstk(c_inst, vm, true); break; } case EXIT: { pstat = process_exit(c_inst, vm, true); break; } case SYSCALL: { reg_t scall = vm->regs.r1; reg_t nargs = get_syscall_nargs(scall); pstat = process_syscall(scall, nargs, c_inst, vm, true); break; } case INVALID_OPCODE: { pstat = process_invalid(c_inst, vm, true); break; } default: return false; }; if(verbose) { show_regs(vm); } // previous processed opcode failed || exit if(pstat == false) { return false; } vm->regs.pc++; } return true; }