コード例 #1
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_xchg_dx_ax(void)
{
  if (!lbl)
  {
    m--;
    if (*m == 146) { DID(-1); }
    m++;
  }
  GEN(146);
  DID(1);
}
コード例 #2
0
bool lookahead(FastVolume * in, std::vector<int> &res, int start, int dir, int amount, int cur_gen){
  int cur = start;
  for(int i = 0; i <= amount; i++){
    cur += dir;
    if(in->mask[cur] & TRU)return false;
    if(in->mask[cur] & (ZRO | MASK)){//we are out; mark everything in between
      for(int j = i; j > 0; j--){
	cur -= dir;	
	if(!(BDR & in->mask[cur])){
	  if(GEN((in->mask[cur])) != 0) //check if the cell already had a generation
	    in->record_operation(cur, BDR | (GEN(in->mask[cur])));
	  else
	    in->record_operation(cur, BDR | cur_gen);

	  res.push_back(cur);
	    };
	
      };
      return true;  // was able to jump
    };
  };
  return false; //no luck; just propagate one step.
};
コード例 #3
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_pop_dx(void)
{
  if (!lbl)
  {
    m--;
    if (*m == 82) { DID(-1); }
    if (*m == 80)
    {
      return g_mov_dx_ax() - 1;
    }
    if (*m == 83)
    {
      return g_mov_dx_bx() - 1;
    }
    if (*m == 81)
    {
      return g_mov_dx_cx() - 1;
    }
    m++;
  }
  GEN(90);
  DID(1);
}
コード例 #4
0
ファイル: parse.c プロジェクト: catseye/Illgol-Grand-Mal
void primitive(void)
{
  int ptr = 0;
  if(tokeq("call"))
  {
    byte * b = m; int l; int c; int v; int a = 0; int i;
    scan();
    boolexpr();
    if(tokeq("("))
    {
      scan();
      a++;
      boolexpr();
      g_pop_ax();
      g_pop_bx();
      g_push_ax();
      g_push_bx();
      while (tokeq(","))
      {
	scan();
	a++;
	boolexpr();
	g_pop_ax();
	g_pop_bx();
	g_push_ax();
	g_push_bx();
      }
      if(tokeq(")"))
      {
	scan();
      } else
      {
	error("Missing )");
      }
    }
    g_pop_bx();
    g_push_bp();
    g_mov_ax_sp();
    g_add_ax(a << 1);
    g_mov_bp_ax();
    g_call_bx();
    g_pop_dx();
    g_pop_bp();
    for(i=0;i<a;i++)
    {
      g_pop_ax();
    }
    g_push_dx();
    return;
  }

  if(tokeq("poll"))
  {
    scan();
    if(tokeq("tty"))
    {
      scan();
      g_mov_ah(11);
      g_int(0x21);
      g_xor_ah_ah();
      g_push_ax();
      return;
    }
    error("You can only poll the tty");
    return;
  }

  if(tokeq("Ypush"))
  {
    scan();
    if(tokeq("("))
    {
      scan();
      boolexpr();
      if(tokeq(")"))
      {
        g_xor_ax_ax();
        g_push_ax();
        scan();
        return;
      }
      if(tokeq(","))
      {
        scan();
        boolexpr();
        if(tokeq(")"))
        {
          scan();
          return;
        }
      }
    }
    error("Usage is Ypush(boolexpr[,boolexpr]) in function");
    return;
  }

  if(tokeq("Ypop"))
  {
    scan();
    if(tokeq("("))
    {
      scan();
      if(tokeq(")"))
      {
        scan();
        return;
      }
    }
    error("Usage would be Ypop() in function");
    return;
  }

  if(tokeq("eof"))
  {
    scan();
    g_mov_bx(caddr(eofflag));
    g_push_BX();
    g_xor_ax_ax();
    g_mov_BX_ax();
    return;
  }

  if(tokeq("gpos"))
  {
    scan();
    if(tokeq("("))
    {
      scan();
      boolexpr();
      if (tokeq(","))
      {
        scan();
        boolexpr();
	g_xor_cx_cx();
        g_pop_dx();
	g_mov_ax(0x4201);
        g_pop_bx();
        g_int(0x21);
        g_push_ax();
        if (tokeq(")"))
        {
          scan();
          return;
        }
      }
    }
    error("Malformed way to use 'gpos'");
  }

  if(tokeq("sin"))
  {
    runtime_trig();
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_bx(caddr(sin_routine));
    g_call_bx();
    g_push_cx();
    return;
  }

  if(tokeq("cos"))
  {
    runtime_trig();
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_bx(caddr(cos_routine));
    g_call_bx();
    g_push_cx();
    return;
  }

  if(tokeq("abs"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_and_ax(0x7fff);
    g_push_ax();
    return;
  }

  if(tokeq("asc"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_and_ax(0x007f);
    g_push_ax();
    return;
  }

  if(tokeq("low"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_and_ax(0x00ff);
    g_push_ax();
    return;
  }

  if(tokeq("med"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_cl(4);
    g_shr_ax_cl();
    g_and_ax(0x00ff);
    g_push_ax();
    return;
  }

  if(tokeq("fix"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_ah_al();
    g_xor_al_al();
    g_push_ax();
    return;
  }

  if(tokeq("int") || tokeq("hig"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_al_ah();
    g_xor_ah_ah();
    g_push_ax();
    return;
  }

  if(tokeq("fre"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_ax_I(caddr(d)-2);
    g_neg_ax();
    g_push_ax();
    return;
  }

  if(tokeq("rnd"))
  {
    symbol * q = NULL;
    scan();
    if(tokeq("("))
    {
      scan();
      q = name(0);
      if(tokeq(")"))
      {
	scan();
      } else error("Missing )");
    } else
    {
      error("Need identifier in rnd()");
    }
    g_pop_bx();
    g_mov_ax_BX();
    g_mov_dx(58653U);
    g_imul_dx();
    g_mov_dx(13849U);
    g_add_ax_dx();
    g_mov_BX_ax();
    g_push_ax();
    if (q != NULL && q->hook_addr != NULL)
    {
      g_mov_ax(caddr(q->hook_addr));
      g_call_ax();
    }
    return;
  }

  if(tokeq("stu"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_bx(caddr(sbuffer + 14));
    g_label(); g_xor_dx_dx();
    g_mov_cx(10);
    g_idiv_cx();
    g_add_dx('0');
    g_mov_BX_dl();
    g_dec_bx();
    g_or_ax_ax();
    g_jnz(-18);
    g_inc_bx();
    g_push_bx();
    return;
  }

  if(tokeq("str"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_push_ax();
    g_cmp_ax(0);
    g_jg(+2);
    g_neg_ax();
    g_label(); g_mov_bx(caddr(sbuffer + 14));
    g_label(); g_xor_dx_dx();
    g_mov_cx(10);
    g_idiv_cx();
    g_add_dx('0');
    g_mov_BX_dl();
    g_dec_bx();
    g_or_ax_ax();
    g_jnz(-18);
    g_pop_ax();
    g_cmp_ax(0);
    g_jge(+5);
    g_mov_al('-');
    g_mov_BX_al();
    g_dec_bx();
    g_label(); g_inc_bx();
    g_push_bx();
    return;
  }

  if(tokeq("sif"))
  {
    scan();
    boolexpr();

    g_pop_ax();
    g_push_ax();
    g_xor_ah_ah();
    g_mov_dx(39);
    g_imul_dx();
    /* g_mov_al_ah();
    g_mov_ah_dl(); */

    g_mov_bx(caddr(sbuffer + 14));
    g_mov_cx(10);
    g_label(); g_xor_dx_dx();
    g_idiv_cx();
    g_add_dx('0');
    g_mov_BX_dl();
    g_dec_bx();
    g_cmp_bx(caddr(sbuffer + 10));
    g_jnz(-17);

    g_mov_dx('.');
    g_mov_BX_dl();
    g_dec_bx();

    g_pop_ax();
    g_mov_al_ah();
    g_xor_ah_ah();

    g_label(); g_xor_dx_dx();
    g_idiv_cx();
    g_add_dx('0');
    g_mov_BX_dl();
    g_dec_bx();
    g_or_ax_ax();
    g_jnz(-15);
    g_inc_bx();

    g_push_bx();

    return;
  }

  if(tokeq("nameof"))
  {
    char * q;
    byte * b;
    scan();
    if(tokeq("("))
    {
      scan();
      q = (token+1);
      b = stalloc(strlen(q)+1);
      name(0);
      if(tokeq(")"))
      {
        scan();
        strcpy((char *)b, q);
        g_mov_ax(caddr(b));
        g_push_ax();
      } else error("Missing (");
    } else error("Missing )");
    return;
  }

  if(tokeq("^"))
  {
    scan(); ptr = 1;
  }
  if(tokeq("#"))
  {
    scan();
    if (tokeq("("))
    {
      scan();
      boolexpr();
      if (tokeq(")"))
      {
	scan();
	g_pop_ax();
	g_shl_ax_1();
	g_neg_ax();
	g_xchg_si_ax();
	g_mov_ax_BP_SI();
	g_push_ax();
	return;
      }
      error("Missing )");
      return;
    }
    g_mov_ax_BP(-2 * member());
    g_push_ax();
    return;
  }
  if(sym_exists(token))
  {
    symbol * q = NULL;
    q = name(0);
    if (!ptr)
    {
      g_pop_bx();
      g_push_BX();
      if (tokeq("++"))
      {
	scan();
	g_mov_ax_BX();
	g_inc_ax();
	g_mov_BX_ax();
	if (q != NULL && q->hook_addr != NULL)
	{
	  g_mov_ax(caddr(q->hook_addr));
	  g_call_ax();
	}
      }
      if (tokeq("--"))
      {
	scan();
	g_mov_ax_BX();
	g_dec_ax();
	g_mov_BX_ax();
	if (q != NULL && q->hook_addr != NULL)
	{
	  g_mov_ax(caddr(q->hook_addr));
	  g_call_ax();
	}
      }
    }
    return;
  }
  if (ptr)
  {
    error("Identifier should follow ^");
  }
  if(token[0] >= '0' && token[0] <= '9')
  {
    int v = atoi(token);
    g_mov_ax(v);
    g_push_ax();
    scan();
    if (tokeq("."))
    {
      scan();
      while(strlen(token) < 4)
      {
	strcat(token, "0");
      }
      v = atoi(token) / 39;
      scan();
      if (v > 255) v = 255;
      g_pop_ax();
      g_mov_ah_al();
      g_mov_al(v & 0xff);
      g_push_ax();
    }
    return;
  }
  if(token[0] == '"')
  {
    char * q = (token+1);
    byte * b = stalloc(strlen(q)+1);
    strcpy((char *)b, q);
    g_mov_ax(caddr(b));
    g_push_ax();
    scan();
    while(token[0] == '"')
    {
      char * q = (token+1);
      byte * b;
      stretract();
      b = stalloc(strlen(q)+1);
      strcpy((char *)b, q);
      scan();
    }
    return;
  }
  if(tokeq("{"))
  {
    byte * l; byte * q; int c=0; int v=0; int lc;
    scan();
    l = m;
    g_label();
    g_nop();
    assignments();
    if (tokeq("}"))
    {
      scan();
      g_ret();
      q = stalloc(m - l);
      memcpy(q, l, m - l);
      m = l;
      g_mov_ax(caddr(q));
      g_push_ax();
      return;
    }
    error("Missing }");
    return;
  }
  if(tokeq("INLINE"))
  {
    byte * l; byte * q; int c=0; int v=0; int lc;
    scan();
    if(tokeq("{")) scan();
    l = m;
    g_label();
    g_nop();
    while(tokne("}"))
    {
      GEN(atoi(token));
      scan();
    }
    scan();
    g_ret();
    q = stalloc(m - l);
    memcpy(q, l, m - l);
    m = l;
    g_mov_ax(caddr(q));
    g_push_ax();
    return;
  }
  if(tokeq("("))
  {
    scan();
    boolexpr();
    if (tokeq(")"))
    {
      scan();
      return;
    }
    error("Missing )");
    return;
  }
  if(tokeq("*"))
  {
    scan();
    boolexpr();
    g_mov_bx(260);
    g_mov_ax_BX();
    g_pop_dx();
    g_push_ax();
    g_add_ax_dx();
    g_mov_BX_ax();
    return;
  }
  error("Unrecognized primitive");
}
コード例 #5
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_mov_ah_al(void)   { GEN(0x88); GEN(0xC4); DID(2); }
コード例 #6
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_mov_al_ah(void)   { GEN(0x88); GEN(0xE0); DID(2); }
コード例 #7
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_add_al(sbyte s)   { GEN(4); GEN(s); DID(2); }
コード例 #8
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_jg(sbyte d)       { GEN(0x7F); GEN(d); DID(2); }
コード例 #9
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_shl_ax_1(void)    { GEN(209); GEN(224); DID(2); }
コード例 #10
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_sub_BX_al(void)   { GEN(0x28); GEN(7); DID(2); }
コード例 #11
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_add_BX_al(void)   { GEN(0); GEN(7); DID(2); }
コード例 #12
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_sub_BX_ax(void)   { GEN(0x29); GEN(7); DID(2); }
コード例 #13
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_add_BX_ax(void)   { GEN(1); GEN(7); DID(2); }
コード例 #14
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_cmp_al_dl(void)   { GEN(0x38); GEN(0xD0); DID(2); }
コード例 #15
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_cmp_dl(byte q)    { GEN(0x80); GEN(0xFA); GEN(q); DID(3); }
コード例 #16
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_jge(sbyte d)      { GEN(0x7D); GEN(d); DID(2); }
コード例 #17
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_jl(sbyte d)       { GEN(0x7C); GEN(d); DID(2); }
コード例 #18
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_shr_ax_1(void)    { GEN(209); GEN(232); DID(2); }
コード例 #19
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_add_bx_ax(void)   { GEN(1); GEN(0xC3); DID(2); }
コード例 #20
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_shl_ax_cl(void)   { GEN(211); GEN(224); DID(2); }
コード例 #21
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_jmp_bx(void)      { GEN(0xff); GEN(0xe3); DID(2); }
コード例 #22
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_shr_ax_cl(void)   { GEN(211); GEN(232); DID(2); }
コード例 #23
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_mov_ah_dl(void)   { GEN(0x88); GEN(0xD4); DID(2); }
コード例 #24
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_cmp_ax(word i)    { GEN(0x3D); GENW(i); g_label(); DID(3); }
コード例 #25
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_mov_dl_ah(void)   { GEN(0x88); GEN(0xE2); DID(2); }
コード例 #26
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_cmp_bx(word i)    { GEN(0x81); GEN(0xFB); GENW(i); g_label(); DID(4); }
コード例 #27
0
/*
 * Process a single instruction.
 *
 * Returns "false" if something goes fatally wrong.
 */
static bool processInstruction(VerifierData* vdata, u4 insnIdx,
    BitVector* workBits)
{
    const Method* meth = vdata->method;
    const u2* insns = meth->insns + insnIdx;
    DecodedInstruction decInsn;

    dexDecodeInstruction(insns, &decInsn);

    /*
     * Add registers to the "GEN" or "KILL" sets.  We want to do KILL
     * before GEN to handle cases where the source and destination
     * register is the same.
     */
    switch (decInsn.opcode) {
    case OP_NOP:
    case OP_RETURN_VOID:
    case OP_GOTO:
    case OP_GOTO_16:
    case OP_GOTO_32:
        /* no registers are used */
        break;

    case OP_RETURN:
    case OP_RETURN_OBJECT:
    case OP_MONITOR_ENTER:
    case OP_MONITOR_EXIT:
    case OP_CHECK_CAST:
    case OP_THROW:
    case OP_PACKED_SWITCH:
    case OP_SPARSE_SWITCH:
    case OP_FILL_ARRAY_DATA:
    case OP_IF_EQZ:
    case OP_IF_NEZ:
    case OP_IF_LTZ:
    case OP_IF_GEZ:
    case OP_IF_GTZ:
    case OP_IF_LEZ:
    case OP_SPUT:
    case OP_SPUT_BOOLEAN:
    case OP_SPUT_BYTE:
    case OP_SPUT_CHAR:
    case OP_SPUT_SHORT:
    case OP_SPUT_OBJECT:
        /* action <- vA */
        GEN(workBits, decInsn.vA);
        break;

    case OP_RETURN_WIDE:
    case OP_SPUT_WIDE:
        /* action <- vA(wide) */
        GENW(workBits, decInsn.vA);
        break;

    case OP_IF_EQ:
    case OP_IF_NE:
    case OP_IF_LT:
    case OP_IF_GE:
    case OP_IF_GT:
    case OP_IF_LE:
    case OP_IPUT:
    case OP_IPUT_BOOLEAN:
    case OP_IPUT_BYTE:
    case OP_IPUT_CHAR:
    case OP_IPUT_SHORT:
    case OP_IPUT_OBJECT:
        /* action <- vA, vB */
        GEN(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        break;

    case OP_IPUT_WIDE:
        /* action <- vA(wide), vB */
        GENW(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        break;

    case OP_APUT:
    case OP_APUT_BOOLEAN:
    case OP_APUT_BYTE:
    case OP_APUT_CHAR:
    case OP_APUT_SHORT:
    case OP_APUT_OBJECT:
        /* action <- vA, vB, vC */
        GEN(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        GEN(workBits, decInsn.vC);
        break;

    case OP_APUT_WIDE:
        /* action <- vA(wide), vB, vC */
        GENW(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        GEN(workBits, decInsn.vC);
        break;

    case OP_FILLED_NEW_ARRAY:
    case OP_INVOKE_VIRTUAL:
    case OP_INVOKE_SUPER:
    case OP_INVOKE_DIRECT:
    case OP_INVOKE_STATIC:
    case OP_INVOKE_INTERFACE:
        /* action <- vararg */
        {
            unsigned int idx;
            for (idx = 0; idx < decInsn.vA; idx++) {
                GEN(workBits, decInsn.arg[idx]);
            }
        }
        break;

    case OP_FILLED_NEW_ARRAY_RANGE:
    case OP_INVOKE_VIRTUAL_RANGE:
    case OP_INVOKE_SUPER_RANGE:
    case OP_INVOKE_DIRECT_RANGE:
    case OP_INVOKE_STATIC_RANGE:
    case OP_INVOKE_INTERFACE_RANGE:
        /* action <- vararg/range */
        {
            unsigned int idx;
            for (idx = 0; idx < decInsn.vA; idx++) {
                GEN(workBits, decInsn.vC + idx);
            }
        }
        break;

    case OP_MOVE_RESULT:
    case OP_MOVE_RESULT_WIDE:
    case OP_MOVE_RESULT_OBJECT:
    case OP_MOVE_EXCEPTION:
    case OP_CONST_4:
    case OP_CONST_16:
    case OP_CONST:
    case OP_CONST_HIGH16:
    case OP_CONST_STRING:
    case OP_CONST_STRING_JUMBO:
    case OP_CONST_CLASS:
    case OP_NEW_INSTANCE:
    case OP_SGET:
    case OP_SGET_BOOLEAN:
    case OP_SGET_BYTE:
    case OP_SGET_CHAR:
    case OP_SGET_SHORT:
    case OP_SGET_OBJECT:
        /* vA <- value */
        KILL(workBits, decInsn.vA);
        break;

    case OP_CONST_WIDE_16:
    case OP_CONST_WIDE_32:
    case OP_CONST_WIDE:
    case OP_CONST_WIDE_HIGH16:
    case OP_SGET_WIDE:
        /* vA(wide) <- value */
        KILLW(workBits, decInsn.vA);
        break;

    case OP_MOVE:
    case OP_MOVE_FROM16:
    case OP_MOVE_16:
    case OP_MOVE_OBJECT:
    case OP_MOVE_OBJECT_FROM16:
    case OP_MOVE_OBJECT_16:
    case OP_INSTANCE_OF:
    case OP_ARRAY_LENGTH:
    case OP_NEW_ARRAY:
    case OP_IGET:
    case OP_IGET_BOOLEAN:
    case OP_IGET_BYTE:
    case OP_IGET_CHAR:
    case OP_IGET_SHORT:
    case OP_IGET_OBJECT:
    case OP_NEG_INT:
    case OP_NOT_INT:
    case OP_NEG_FLOAT:
    case OP_INT_TO_FLOAT:
    case OP_FLOAT_TO_INT:
    case OP_INT_TO_BYTE:
    case OP_INT_TO_CHAR:
    case OP_INT_TO_SHORT:
    case OP_ADD_INT_LIT16:
    case OP_RSUB_INT:
    case OP_MUL_INT_LIT16:
    case OP_DIV_INT_LIT16:
    case OP_REM_INT_LIT16:
    case OP_AND_INT_LIT16:
    case OP_OR_INT_LIT16:
    case OP_XOR_INT_LIT16:
    case OP_ADD_INT_LIT8:
    case OP_RSUB_INT_LIT8:
    case OP_MUL_INT_LIT8:
    case OP_DIV_INT_LIT8:
    case OP_REM_INT_LIT8:
    case OP_SHL_INT_LIT8:
    case OP_SHR_INT_LIT8:
    case OP_USHR_INT_LIT8:
    case OP_AND_INT_LIT8:
    case OP_OR_INT_LIT8:
    case OP_XOR_INT_LIT8:
        /* vA <- vB */
        KILL(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        break;

    case OP_IGET_WIDE:
    case OP_INT_TO_LONG:
    case OP_INT_TO_DOUBLE:
    case OP_FLOAT_TO_LONG:
    case OP_FLOAT_TO_DOUBLE:
        /* vA(wide) <- vB */
        KILLW(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        break;

    case OP_LONG_TO_INT:
    case OP_LONG_TO_FLOAT:
    case OP_DOUBLE_TO_INT:
    case OP_DOUBLE_TO_FLOAT:
        /* vA <- vB(wide) */
        KILL(workBits, decInsn.vA);
        GENW(workBits, decInsn.vB);
        break;

    case OP_MOVE_WIDE:
    case OP_MOVE_WIDE_FROM16:
    case OP_MOVE_WIDE_16:
    case OP_NEG_LONG:
    case OP_NOT_LONG:
    case OP_NEG_DOUBLE:
    case OP_LONG_TO_DOUBLE:
    case OP_DOUBLE_TO_LONG:
        /* vA(wide) <- vB(wide) */
        KILLW(workBits, decInsn.vA);
        GENW(workBits, decInsn.vB);
        break;

    case OP_CMPL_FLOAT:
    case OP_CMPG_FLOAT:
    case OP_AGET:
    case OP_AGET_BOOLEAN:
    case OP_AGET_BYTE:
    case OP_AGET_CHAR:
    case OP_AGET_SHORT:
    case OP_AGET_OBJECT:
    case OP_ADD_INT:
    case OP_SUB_INT:
    case OP_MUL_INT:
    case OP_REM_INT:
    case OP_DIV_INT:
    case OP_AND_INT:
    case OP_OR_INT:
    case OP_XOR_INT:
    case OP_SHL_INT:
    case OP_SHR_INT:
    case OP_USHR_INT:
    case OP_ADD_FLOAT:
    case OP_SUB_FLOAT:
    case OP_MUL_FLOAT:
    case OP_DIV_FLOAT:
    case OP_REM_FLOAT:
        /* vA <- vB, vC */
        KILL(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        GEN(workBits, decInsn.vC);
        break;

    case OP_AGET_WIDE:
        /* vA(wide) <- vB, vC */
        KILLW(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        GEN(workBits, decInsn.vC);
        break;

    case OP_CMPL_DOUBLE:
    case OP_CMPG_DOUBLE:
    case OP_CMP_LONG:
        /* vA <- vB(wide), vC(wide) */
        KILL(workBits, decInsn.vA);
        GENW(workBits, decInsn.vB);
        GENW(workBits, decInsn.vC);
        break;

    case OP_SHL_LONG:
    case OP_SHR_LONG:
    case OP_USHR_LONG:
        /* vA(wide) <- vB(wide), vC */
        KILLW(workBits, decInsn.vA);
        GENW(workBits, decInsn.vB);
        GEN(workBits, decInsn.vC);
        break;

    case OP_ADD_LONG:
    case OP_SUB_LONG:
    case OP_MUL_LONG:
    case OP_DIV_LONG:
    case OP_REM_LONG:
    case OP_AND_LONG:
    case OP_OR_LONG:
    case OP_XOR_LONG:
    case OP_ADD_DOUBLE:
    case OP_SUB_DOUBLE:
    case OP_MUL_DOUBLE:
    case OP_DIV_DOUBLE:
    case OP_REM_DOUBLE:
        /* vA(wide) <- vB(wide), vC(wide) */
        KILLW(workBits, decInsn.vA);
        GENW(workBits, decInsn.vB);
        GENW(workBits, decInsn.vC);
        break;

    case OP_ADD_INT_2ADDR:
    case OP_SUB_INT_2ADDR:
    case OP_MUL_INT_2ADDR:
    case OP_REM_INT_2ADDR:
    case OP_SHL_INT_2ADDR:
    case OP_SHR_INT_2ADDR:
    case OP_USHR_INT_2ADDR:
    case OP_AND_INT_2ADDR:
    case OP_OR_INT_2ADDR:
    case OP_XOR_INT_2ADDR:
    case OP_DIV_INT_2ADDR:
        /* vA <- vA, vB */
        /* KILL(workBits, decInsn.vA); */
        GEN(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        break;

    case OP_SHL_LONG_2ADDR:
    case OP_SHR_LONG_2ADDR:
    case OP_USHR_LONG_2ADDR:
        /* vA(wide) <- vA(wide), vB */
        /* KILLW(workBits, decInsn.vA); */
        GENW(workBits, decInsn.vA);
        GEN(workBits, decInsn.vB);
        break;

    case OP_ADD_LONG_2ADDR:
    case OP_SUB_LONG_2ADDR:
    case OP_MUL_LONG_2ADDR:
    case OP_DIV_LONG_2ADDR:
    case OP_REM_LONG_2ADDR:
    case OP_AND_LONG_2ADDR:
    case OP_OR_LONG_2ADDR:
    case OP_XOR_LONG_2ADDR:
    case OP_ADD_FLOAT_2ADDR:
    case OP_SUB_FLOAT_2ADDR:
    case OP_MUL_FLOAT_2ADDR:
    case OP_DIV_FLOAT_2ADDR:
    case OP_REM_FLOAT_2ADDR:
    case OP_ADD_DOUBLE_2ADDR:
    case OP_SUB_DOUBLE_2ADDR:
    case OP_MUL_DOUBLE_2ADDR:
    case OP_DIV_DOUBLE_2ADDR:
    case OP_REM_DOUBLE_2ADDR:
        /* vA(wide) <- vA(wide), vB(wide) */
        /* KILLW(workBits, decInsn.vA); */
        GENW(workBits, decInsn.vA);
        GENW(workBits, decInsn.vB);
        break;

    /* we will only see this if liveness analysis is done after general vfy */
    case OP_THROW_VERIFICATION_ERROR:
        /* no registers used */
        break;

    /* quickened instructions, not expected to appear */
    case OP_EXECUTE_INLINE:
    case OP_EXECUTE_INLINE_RANGE:
    case OP_IGET_QUICK:
    case OP_IGET_WIDE_QUICK:
    case OP_IGET_OBJECT_QUICK:
    case OP_IPUT_QUICK:
    case OP_IPUT_WIDE_QUICK:
    case OP_IPUT_OBJECT_QUICK:
    case OP_INVOKE_VIRTUAL_QUICK:
    case OP_INVOKE_VIRTUAL_QUICK_RANGE:
    case OP_INVOKE_SUPER_QUICK:
    case OP_INVOKE_SUPER_QUICK_RANGE:
        /* fall through to failure */

    /* correctness fixes, not expected to appear */
    case OP_INVOKE_OBJECT_INIT_RANGE:
    case OP_RETURN_VOID_BARRIER:
    case OP_SPUT_VOLATILE:
    case OP_SPUT_OBJECT_VOLATILE:
    case OP_SPUT_WIDE_VOLATILE:
    case OP_IPUT_VOLATILE:
    case OP_IPUT_OBJECT_VOLATILE:
    case OP_IPUT_WIDE_VOLATILE:
    case OP_SGET_VOLATILE:
    case OP_SGET_OBJECT_VOLATILE:
    case OP_SGET_WIDE_VOLATILE:
    case OP_IGET_VOLATILE:
    case OP_IGET_OBJECT_VOLATILE:
    case OP_IGET_WIDE_VOLATILE:
        /* fall through to failure */

    /* these should never appear during verification */
    case OP_UNUSED_3E:
    case OP_UNUSED_3F:
    case OP_UNUSED_40:
    case OP_UNUSED_41:
    case OP_UNUSED_42:
    case OP_UNUSED_43:
    case OP_UNUSED_73:
    case OP_UNUSED_79:
    case OP_UNUSED_7A:
    case OP_BREAKPOINT:
    case OP_UNUSED_FF:
        return false;
    }

    return true;
}
コード例 #28
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_cmp_ax_dx(void)   { GEN(0x39); GEN(0xD0); DID(2); }
コード例 #29
0
ファイル: psc.c プロジェクト: phines/cosmic
/*
 * Read power system data from a file and load it into a PS struct.
 */
PS GetPS(const char* file_name){
	
	//numbers of various items in the ps file.
	int i, num_buses, num_branches, num_gens, num_shunts, *ids, pv=0, sh=0, src=0;
	double base_mva;
	PS ps;
	
	//check input
	if(file_name == NULL) return NULL;
	FILE *ps_file = fopen(file_name, "r");
	if(ps_file == NULL) return NULL;
	
	//read off ps data sizes
	if(fscanf(ps_file, "BASE_MVA %lg\n", &base_mva) != 1) return NULL;
	if(fscanf(ps_file, "BUS %d\n", &num_buses) != 1) return NULL;
	if(fscanf(ps_file, "BRANCH %d\n", &num_branches) != 1) return NULL;
	if(fscanf(ps_file, "GEN %d\n", &num_gens) != 1) return NULL;
	if(fscanf(ps_file, "SHUNT %d\n", &num_shunts) != 1) return NULL;
	
	ps = malloc(sizeof(_PS));
	if(!ps) return NULL;
	ps->base_mva = base_mva;
	ps->num_buses = num_buses;
	ps->num_branches = num_branches;
	ps->num_gens = num_gens;
	ps->num_shunts = num_shunts;
	ps->num_macs = num_gens;
	
	//allocate memory for buses, branches, etc.
	ps->buses = malloc(num_buses*sizeof(Bus));	
	ps->branches = malloc(num_branches*sizeof(Branch));
	ps->gens = malloc(num_gens*sizeof(Gen));
	ps->shunts = malloc(num_shunts*sizeof(Shunt));
	ids = malloc(num_buses*sizeof(int));
	ps->src_buses = malloc((num_shunts+num_gens)*sizeof(int));
	
	//check out memory allocations
	if(!ps->buses || !ps->branches || !ps->gens || !ps->shunts || !ids || !ps->src_buses){
		FreePS(&ps);
		if(ids) free(ids);
		return NULL;
	}
	
	//read data from file and populate ps 
	fscanf(ps_file, "\n");
	for(i = 0; i < num_buses; i++){
		fscanf(ps_file, "%d %d %lg %lg %lg %lg %d %lg %lg %lg %d %lg %lg\n", BUS(id), BUS(type), BUS(pd), BUS(qd), BUS(gs), BUS(bs), BUS(area), BUS(vmag), BUS(vang), BUS(base_kv), BUS(zone), BUS(vmax), BUS(vmin));
		ids[i] = ps->buses[i].id;	
	}
	 
	//sort the bus array, get local indices, and locate the swing bus index
	qsort(ps->buses, num_buses, sizeof(Bus), CompareBuses);
	for(i = 0; i < num_buses; i++){ 
		ps->buses[i].index = i;
		ids[i] = ps->buses[i].id;
		if(ps->buses[i].type == 3) ps->swing_bus = i;	
	}
	
	//branches
	int swap_temp;
	fscanf(ps_file, "\n");
	for(i = 0; i < num_branches; i++){
		fscanf(ps_file, "%d %d %lg %lg %lg %lg %lg %lg\n", BR(from), BR(to), BR(r), BR(x), BR(b), BR(rate_a), BR(rate_b), BR(rate_c));
		
		//check whether from is greater than to, and if so, swap. this
		//helps identify parallel branches.
		if(ps->branches[i].from > ps->branches[i].to){
			swap_temp = ps->branches[i].from;
			ps->branches[i].from = ps->branches[i].to;
			ps->branches[i].to = swap_temp;
		}
		ps->branches[i].from_index = (int*)bsearch(&(ps->branches[i].from), ids, num_buses, sizeof(int), CompareBuses) - ids;
		ps->branches[i].to_index = (int*)bsearch(&(ps->branches[i].to), ids, num_buses, sizeof(int), CompareBuses) - ids;
	}
	
	//generators
	fscanf(ps_file, "\n");
	for(i = 0; i < num_gens; i++){
		fscanf(ps_file, "%d %lg %lg %lg %lg %lg %lg %d %lg %lg\n", GEN(bus), GEN(pg), GEN(qg), GEN(qmax), GEN(qmin), GEN(vsp), GEN(m_base), GEN(status), GEN(pmax), GEN(pmin));
		ps->gens[i].index = (int*)bsearch(&(ps->gens[i].bus), ids, num_buses, sizeof(int), CompareBuses) - ids;
		ps->gens[i].pg/=base_mva;
		ps->gens[i].qg/=base_mva;
	}
	qsort(ps->gens, ps->num_gens, sizeof(Gen), CompareGen);
	
	//shunts
	fscanf(ps_file, "\n");
	for(i = 0; i < num_shunts; i++){
		fscanf(ps_file, "%d %lg %lg\n", SH(bus), SH(p), SH(q));
		ps->shunts[i].index = (int*)bsearch(&(ps->shunts[i].bus), ids, num_buses, sizeof(int), CompareBuses) - ids;
		ps->shunts[i].p/=base_mva;
		ps->shunts[i].q/=base_mva;
	}
	qsort(ps->shunts, ps->num_shunts, sizeof(Shunt), CompareShunt);
	
	//find the set union of load and generator buses
	while(sh < num_shunts || pv < num_gens){
		if(pv==num_gens){ps->src_buses[src++] = ps->shunts[sh++].index; continue;}
		if(sh==num_shunts){ps->src_buses[src++] = ps->gens[pv++].index; continue;}
		if(ps->shunts[sh].index==ps->gens[pv].index){ 
			ps->src_buses[src++] = ps->shunts[sh++].index;
			pv++;
			continue;
		}
		ps->src_buses[src++] = (ps->shunts[sh].index < ps->gens[pv].index ? ps->shunts[sh++].index : ps->gens[pv++].index);
	}
	
	//free up any extra memory in the source bus array
	realloc(ps->src_buses, src*sizeof(int));
	ps->num_src = src;
	
	//create ybus. if there are any errors, free allocated memory and
	//return NULL
	if(CreateYBus(ps, ids)){
		FreePS(&ps);
		free(ids);
		return NULL;
	}
	
	//release the bus map
	free(ids); 
	 
	//return success
	return ps;
};
コード例 #30
0
ファイル: 8086.c プロジェクト: catseye/Illgol-Grand-Mal
int g_jle(sbyte d)      { GEN(0x7E); GEN(d); DID(2); }