Ejemplo n.º 1
0
  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...);
  }
Ejemplo n.º 2
0
Archivo: vm.c Proyecto: q6r/risc
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;
}