예제 #1
0
파일: translate.c 프로젝트: binape/qemu
static void dec_bi(DisasContext *dc)
{
    LOG_DIS("bi %d\n", sign_extend(dc->imm26 << 2, 26));

    gen_goto_tb(dc, 0, dc->pc + (sign_extend(dc->imm26 << 2, 26)));

    dc->is_jmp = DISAS_TB_JUMP;
}
예제 #2
0
파일: translate.c 프로젝트: binape/qemu
static void dec_calli(DisasContext *dc)
{
    LOG_DIS("calli %d\n", sign_extend(dc->imm26, 26) * 4);

    tcg_gen_movi_tl(cpu_R[R_RA], dc->pc + 4);
    gen_goto_tb(dc, 0, dc->pc + (sign_extend(dc->imm26 << 2, 26)));

    dc->is_jmp = DISAS_TB_JUMP;
}
예제 #3
0
파일: translate.c 프로젝트: binape/qemu
static void dec_lw(DisasContext *dc)
{
    TCGv t0;

    LOG_DIS("lw r%d, (r%d+%d)\n", dc->r1, dc->r0, sign_extend(dc->imm16, 16));

    t0 = tcg_temp_new();
    tcg_gen_addi_tl(t0, cpu_R[dc->r0], sign_extend(dc->imm16, 16));
    tcg_gen_qemu_ld32s(cpu_R[dc->r1], t0, MEM_INDEX);
    tcg_temp_free(t0);
}
예제 #4
0
파일: translate.c 프로젝트: binape/qemu
static void dec_sw(DisasContext *dc)
{
    TCGv t0;

    LOG_DIS("sw (r%d+%d), r%d\n", dc->r0, sign_extend(dc->imm16, 16), dc->r1);

    t0 = tcg_temp_new();
    tcg_gen_addi_tl(t0, cpu_R[dc->r0], sign_extend(dc->imm16, 16));
    tcg_gen_qemu_st32(cpu_R[dc->r1], t0, MEM_INDEX);
    tcg_temp_free(t0);
}
예제 #5
0
파일: convert.c 프로젝트: CSU-GH/okl4_3.0
/**
 * sensor_convert_from_raw: convert raw sensor values to interpreted values.
 * It can be used to convert raw data, raw thresholds or raw hysteresis of a sensor
 * to human readable format.
 *
 * @sensor: sensor.
 * @val: raw sensor value.
 * @result: the interpreted value
 *
 * Return value: SA_OK if conversion possible
 **/
SaErrorT 
sensor_convert_from_raw (SaHpiSensorRecT *sensor,
                         SaHpiUint32T     val,
                         SaHpiFloat32T   *result)
{
        SaHpiFloat32T m, b, b_exp, r_exp, fval;
        linearizer c_func;
        SaHpiSensorFactorsT *factors = &sensor->DataFormat.Factors;

        if ( factors->Linearization == SAHPI_SL_NONLINEAR )
                c_func = c_linear;
        else if ( factors->Linearization <= 11 )
                c_func = linearize[factors->Linearization];
        else
                return SA_ERR_HPI_INVALID_DATA;

        val &= 0xff;

        m     = (SaHpiFloat32T)factors->M_Factor;
        b     = (SaHpiFloat32T)factors->B_Factor;
        r_exp = (SaHpiFloat32T)factors->ExpR;
        b_exp = (SaHpiFloat32T)factors->ExpB;

        switch( sensor->DataFormat.SignFormat ) {
        case SAHPI_SDF_UNSIGNED:
                fval = (SaHpiFloat32T)val;
                break;

        case SAHPI_SDF_1S_COMPLEMENT:
                val = sign_extend( val, 8 );
                if ( val < 0 )
                        val += 1;

                fval = (SaHpiFloat32T)val;
                break;

        case SAHPI_SDF_2S_COMPLEMENT:
                fval = (SaHpiFloat32T)sign_extend( val, 8 );
                break;

        default:
                return SA_ERR_HPI_INVALID_DATA;
        }

        *result = c_func(   ((m * fval) + (b * pow(10, b_exp)))
                          * pow(10, r_exp) );

        return SA_OK;
}
예제 #6
0
파일: translate.c 프로젝트: binape/qemu
static void dec_bg(DisasContext *dc)
{
    LOG_DIS("bg r%d, r%d, %d\n", dc->r0, dc->r1,
            sign_extend(dc->imm16, 16 * 4));

    gen_cond_branch(dc, TCG_COND_GT);
}
예제 #7
0
static int paf_audio_decode(AVCodecContext *avctx, void *data,
                            int *got_frame, AVPacket *pkt)
{
    AVFrame *frame = data;
    int16_t *output_samples;
    const uint8_t *src = pkt->data;
    int frames, ret, i, j;
    int16_t cb[256];

    frames = pkt->size / PAF_SOUND_FRAME_SIZE;
    if (frames < 1)
        return AVERROR_INVALIDDATA;

    frame->nb_samples = PAF_SOUND_SAMPLES * frames;
    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
        return ret;

    output_samples = (int16_t *)frame->data[0];
    // codebook of 256 16-bit samples and 8-bit indices to it
    for (j = 0; j < frames; j++) {
        for (i = 0; i < 256; i++)
            cb[i] = sign_extend(AV_RL16(src + i * 2), 16);
        src += 256 * 2;
        // always 2 channels
        for (i = 0; i < PAF_SOUND_SAMPLES * 2; i++)
            *output_samples++ = cb[*src++];
    }
    *got_frame = 1;

    return pkt->size;
}
예제 #8
0
static int cinaudio_decode_frame(AVCodecContext *avctx, void *data,
                                 int *got_frame_ptr, AVPacket *avpkt)
{
    AVFrame *frame         = data;
    const uint8_t *buf     = avpkt->data;
    CinAudioContext *cin   = avctx->priv_data;
    const uint8_t *buf_end = buf + avpkt->size;
    int16_t *samples;
    int delta, ret;

    /* get output buffer */
    frame->nb_samples = avpkt->size - cin->initial_decode_frame;
    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
        return ret;
    samples = (int16_t *)frame->data[0];

    delta = cin->delta;
    if (cin->initial_decode_frame) {
        cin->initial_decode_frame = 0;
        delta                     = sign_extend(AV_RL16(buf), 16);
        buf                      += 2;
        *samples++                = delta;
    }
    while (buf < buf_end) {
        delta     += cinaudio_delta16_table[*buf++];
        delta      = av_clip_int16(delta);
        *samples++ = delta;
    }
    cin->delta = delta;

    *got_frame_ptr = 1;

    return avpkt->size;
}
예제 #9
0
파일: translate.c 프로젝트: binape/qemu
static void dec_bne(DisasContext *dc)
{
    LOG_DIS("bne r%d, r%d, %d\n", dc->r0, dc->r1,
            sign_extend(dc->imm16, 16) * 4);

    gen_cond_branch(dc, TCG_COND_NE);
}
예제 #10
0
파일: translate.c 프로젝트: Mellanox/qemu
static void dec_bgeu(DisasContext *dc)
{
    LOG_DIS("bgeu r%d, r%d, %d\n", dc->r1, dc->r0,
            sign_extend(dc->imm16, 16) * 4);

    gen_cond_branch(dc, TCG_COND_GEU);
}
예제 #11
0
파일: ituh263dec.c 프로젝트: cxxg/FFmpeg
int ff_h263_decode_motion(MpegEncContext * s, int pred, int f_code)
{
    int code, val, sign, shift;
    code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);

    if (code == 0)
        return pred;
    if (code < 0)
        return 0xffff;

    sign = get_bits1(&s->gb);
    shift = f_code - 1;
    val = code;
    if (shift) {
        val = (val - 1) << shift;
        val |= get_bits(&s->gb, shift);
        val++;
    }
    if (sign)
        val = -val;
    val += pred;

    /* modulo decoding */
    if (!s->h263_long_vectors) {
        val = sign_extend(val, 5 + f_code);
    } else {
        /* horrible h263 long vector mode */
        if (pred < -31 && val < -63)
            val += 64;
        if (pred > 32 && val > 63)
            val -= 64;

    }
    return val;
}
예제 #12
0
CORE_ADDR
arm_wince_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
{
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
  ULONGEST this_instr;

  this_instr = read_memory_unsigned_integer (pc, 4, byte_order);

  /* bl offset <__gccmain> */
  if ((this_instr & 0xfff00000) == 0xeb000000)
    {
#define sign_extend(V, N) \
  (((long) (V) ^ (1L << ((N) - 1))) - (1L << ((N) - 1)))

      long offset = sign_extend (this_instr & 0x000fffff, 23) << 2;
      CORE_ADDR call_dest = (pc + 8 + offset) & 0xffffffffU;
      struct minimal_symbol *s = lookup_minimal_symbol_by_pc (call_dest);

      if (s != NULL
	  && SYMBOL_LINKAGE_NAME (s) != NULL
	  && strcmp (SYMBOL_LINKAGE_NAME (s), "__gccmain") == 0)
	pc += 4;
    }

  return pc;
}
예제 #13
0
static void twl6030battery_current(struct twl6030_bci_device_info *di)
{
	int ret = 0;
	u16 read_value = 0;
	s16 temp = 0;
	int current_now = 0;

	/* FG_REG_10, 11 is 14 bit signed instantaneous current sample value */
	ret = twl_i2c_read(TWL6030_MODULE_GASGAUGE, (u8 *)&read_value,
								FG_REG_10, 2);
	if (ret < 0) {
		dev_dbg(di->dev, "failed to read FG_REG_10: current_now\n");
		return;
	}

	temp = sign_extend(read_value, 14);
	current_now = temp - di->cc_offset;

	/* current drawn per sec */
	current_now = current_now * fuelgauge_rate[0 /*di->fuelgauge_mode*/];
	/* current in mAmperes */
	current_now = (current_now * 3000) >> 14;
	/* current in uAmperes */
	current_now = current_now * 1000;
	di->current_uA = current_now;

	return;
}
예제 #14
0
파일: mips_mts.c 프로젝트: GNS3/dynamips
/* LB: Load Byte */
fastcall void MTS_PROTO(lb)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg)
{
   m_uint64_t data;
   void *haddr;

   haddr = MTS_PROTO(access)(cpu,vaddr,MIPS_MEMOP_LB,1,MTS_READ,&data);
   if (likely(haddr != NULL)) data = *(m_uint8_t *)haddr;
   cpu->gpr[reg] = sign_extend(data,8);
}
예제 #15
0
void fastcall mips_cp0_exec_mfc0_fastcall (cpu_mips_t * cpu,
    mips_insn_t insn)
{
    int rt = bits (insn, 16, 20);
    int rd = bits (insn, 11, 15);
    int sel = bits (insn, 0, 2);

    cpu->reg_set (cpu, rt, sign_extend (mips_cp0_get_reg_fast (cpu, rd, sel), 32));
}
예제 #16
0
파일: mips_mts.c 프로젝트: GNS3/dynamips
/* LW: Load Word */
fastcall void MTS_PROTO(lw)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg)
{
   m_uint64_t data;
   void *haddr;

   haddr = MTS_PROTO(access)(cpu,vaddr,MIPS_MEMOP_LW,4,MTS_READ,&data);
   if (likely(haddr != NULL)) data = vmtoh32(*(m_uint32_t *)haddr);
   cpu->gpr[reg] = sign_extend(data,32);
}
예제 #17
0
파일: translate.c 프로젝트: binape/qemu
static inline void gen_cond_branch(DisasContext *dc, int cond)
{
    TCGLabel *l1 = gen_new_label();
    tcg_gen_brcond_tl(cond, cpu_R[dc->r0], cpu_R[dc->r1], l1);
    gen_goto_tb(dc, 0, dc->pc + 4);
    gen_set_label(l1);
    gen_goto_tb(dc, 1, dc->pc + (sign_extend(dc->imm16 << 2, 16)));
    dc->is_jmp = DISAS_TB_JUMP;
}
예제 #18
0
static int twl6030_read_gasguage_regs(struct twl6030_bci_device_info *di)
{
	int ret;
	u32 data[2];

#if 0
	s16 integ;

	ret = twl_i2c_read_u8(TWL6030_MODULE_GASGAUGE, (u8 *) data, FG_REG_00);
	if (ret < 0) {
		pr_err("twl6030: failed to read gasgauge config\n");
		goto done;
	}
#endif

	/* must pause updates while reading multibyte registers to avoid bogus data */
	ret = twl_i2c_write_u8(TWL6030_MODULE_GASGAUGE, CC_PAUSE, FG_REG_00);
	if (ret < 0) {
		pr_err("twl6030: cannot pause gasgauge\n");
		goto done;
	}

	ret = twl_i2c_read(TWL6030_MODULE_GASGAUGE, ((u8*) data) + 1, FG_REG_01, 7);
	if (ret < 0) {
		pr_err("twl6030: cannot read gasgauge\n");
		goto err;
	}

	di->timer_n1 = data[0] >> 8;	/* FG_REG_{01..03} is 24 bit unsigned sample counter */
	di->charge_n1 = data[1];	/* FG_REG_{04..07} is 32 bit signed accumulator */

#if 0
	ret = twl_i2c_read(TWL6030_MODULE_GASGAUGE, (u8 *) &integ, FG_REG_10, 2);
	if (ret < 0) {
		pr_err("twl6030: failed to read integrator\n");
		goto err;
	}

	/* sign extend the value */
	integ = sign_extend(integ, 14);

	printk("battery: data[0] = %08x data[1] = %08x\n", data[0], data[1]);
	printk("battery: integ = %02x (%d)\n", (unsigned) integ, (int) integ);
#endif

err:
	ret = twl_i2c_write_u8(TWL6030_MODULE_GASGAUGE, 0, FG_REG_00);
	if (ret < 0) {
		pr_err("twl6030: cannot resume gasgauge\n");
	}

done:
	return ret;
}
예제 #19
0
/* Execute a memory operation (2) */
static int forced_inline mips_exec_memop2 (cpu_mips_t * cpu, int memop,
    m_va_t base, int offset, u_int dst_reg, int keep_ll_bit)
{
    m_va_t vaddr = cpu->gpr[base] + sign_extend (offset, 16);
    mips_memop_fn fn;

    if (!keep_ll_bit)
        cpu->ll_bit = 0;
    fn = cpu->mem_op_fn[memop];
    return (fn (cpu, vaddr, dst_reg));
}
예제 #20
0
파일: translate.c 프로젝트: binape/qemu
static void dec_cmpne(DisasContext *dc)
{
    if (dc->format == OP_FMT_RI) {
        LOG_DIS("cmpnei r%d, r%d, %d\n", dc->r0, dc->r1,
                sign_extend(dc->imm16, 16));
    } else {
        LOG_DIS("cmpne r%d, r%d, r%d\n", dc->r2, dc->r0, dc->r1);
    }

    gen_compare(dc, TCG_COND_NE);
}
예제 #21
0
파일: translate.c 프로젝트: binape/qemu
static void dec_mul(DisasContext *dc)
{
    if (dc->format == OP_FMT_RI) {
        LOG_DIS("muli r%d, r%d, %d\n", dc->r0, dc->r1,
                sign_extend(dc->imm16, 16));
    } else {
        LOG_DIS("mul r%d, r%d, r%d\n", dc->r2, dc->r0, dc->r1);
    }

    if (!(dc->features & LM32_FEATURE_MULTIPLY)) {
        qemu_log_mask(LOG_GUEST_ERROR,
                      "hardware multiplier is not available\n");
        t_gen_illegal_insn(dc);
        return;
    }

    if (dc->format == OP_FMT_RI) {
        tcg_gen_muli_tl(cpu_R[dc->r1], cpu_R[dc->r0],
                sign_extend(dc->imm16, 16));
    } else {
        tcg_gen_mul_tl(cpu_R[dc->r2], cpu_R[dc->r0], cpu_R[dc->r1]);
    }
}
예제 #22
0
파일: translate.c 프로젝트: binape/qemu
static void dec_add(DisasContext *dc)
{
    if (dc->format == OP_FMT_RI) {
        if (dc->r0 == R_R0) {
            if (dc->r1 == R_R0 && dc->imm16 == 0) {
                LOG_DIS("nop\n");
            } else {
                LOG_DIS("mvi r%d, %d\n", dc->r1, sign_extend(dc->imm16, 16));
            }
        } else {
            LOG_DIS("addi r%d, r%d, %d\n", dc->r1, dc->r0,
                    sign_extend(dc->imm16, 16));
        }
    } else {
        LOG_DIS("add r%d, r%d, r%d\n", dc->r2, dc->r0, dc->r1);
    }

    if (dc->format == OP_FMT_RI) {
        tcg_gen_addi_tl(cpu_R[dc->r1], cpu_R[dc->r0],
                sign_extend(dc->imm16, 16));
    } else {
        tcg_gen_add_tl(cpu_R[dc->r2], cpu_R[dc->r0], cpu_R[dc->r1]);
    }
}
예제 #23
0
void print_code_immed( int opcode, int imme ) {
    int se_imme = (sign_extend(imme));
    switch( opcode ) {
        case op_call:
            printf("call %d\n", se_imme); break;
        case op_jump:
            printf("jump %d\n", se_imme); break;
        case op_mova:
            printf("mova %d\n", se_imme); break;
        case op_movb:
            printf("movb %d\n", se_imme); break;
        case op_push:
            printf("push %d\n", se_imme); break;
        default:
            break;
    }
}
예제 #24
0
static int twl6030_calibrate_fuelgauge(struct twl6030_bci_device_info *di)
{
	s16 cc_offset;
	int n, ret;
	u8 reg;

	ret = twl_i2c_write_u8(TWL6030_MODULE_GASGAUGE, CC_AUTOCLEAR, FG_REG_00);
	if (ret)
		goto err;

	/* ensure autoclear completes before we calibrate */
	msleep(300);

	ret = twl_i2c_write_u8(TWL6030_MODULE_GASGAUGE, CC_CAL_EN, FG_REG_00);
	if (ret)
		goto err;

	/* TODO: use IRQ to detect complete, plus timeout in case of failure */
	for (n = 0; n < 25; n++) {
		ret = twl_i2c_read_u8(TWL6030_MODULE_GASGAUGE, &reg, FG_REG_00);
		if (ret)
			goto err;
		if ((reg & CC_CAL_EN) == 0) break;
		msleep(100);
	}

	/* FG_REG_08, 09 is 10 bit signed calibration offset value */
	ret = twl_i2c_read(TWL6030_MODULE_GASGAUGE, (u8 *) &cc_offset, FG_REG_08, 2);
	if (ret < 0)
		goto err;

	cc_offset = sign_extend(cc_offset, 10);
	di->cc_offset = cc_offset;

	printk("battery: calibration took %d ms, offset = %d\n", n * 100, cc_offset);

	di->charge_n1 = 0;
	di->timer_n1 = 0;
	return 0;

err:
	return ret;
}
예제 #25
0
파일: t_vobj.c 프로젝트: deplinenoise/vlink
static taddr read_number(void)
{
  taddr val;
  uint8_t n,*q;
  int size;

  if ((n = *p++) <= 0x7f)
    return (taddr)n;

  val = 0;
  if (n -= 0x80) {
    size = n << 3;
    p += n;
    q = p;
    while (n--)
      val = (val<<8) | *(--q);
    val = sign_extend(val,size);
  }
  return val;
}
예제 #26
0
파일: translate.c 프로젝트: Mellanox/qemu
static inline void gen_compare(DisasContext *dc, int cond)
{
    int i;

    if (dc->format == OP_FMT_RI) {
        switch (cond) {
        case TCG_COND_GEU:
        case TCG_COND_GTU:
            i = zero_extend(dc->imm16, 16);
            break;
        default:
            i = sign_extend(dc->imm16, 16);
            break;
        }

        tcg_gen_setcondi_tl(cond, cpu_R[dc->r1], cpu_R[dc->r0], i);
    } else {
        tcg_gen_setcond_tl(cond, cpu_R[dc->r2], cpu_R[dc->r0], cpu_R[dc->r1]);
    }
}
예제 #27
0
void Step(void)
{
	/* fetch instruction from memory */
	Halt = instruction_fetch(PC,Mem,&instruction);
    
	if(!Halt)
	{
		/* partition the instruction */
		instruction_partition(instruction,&op,&r1,&r2,&r3,&funct,&offset,&jsec);
        
		/* instruction decode */
		Halt = instruction_decode(op,&controls);
	}
    
	if(!Halt)
	{
		/* read_register */
		read_register(r1,r2,Reg,&data1,&data2);
        
		/* sign_extend */
		sign_extend(offset,&extended_value);
        
		/* ALU */
		Halt = ALU_operations(data1,data2,extended_value,funct,controls.ALUOp,controls.ALUSrc,&ALUresult,&Zero);
	}
    
	if(!Halt)
	{
		/* read/write memory */
		Halt = rw_memory(ALUresult,data2,controls.MemWrite,controls.MemRead,&memdata,Mem);
	}
    
	if(!Halt)
	{
		/* write to register */
		write_register(r2,r3,memdata,ALUresult,controls.RegWrite,controls.RegDst,controls.MemtoReg,Reg);
        
		/* PC update */
		PC_update(jsec,extended_value,controls.Branch,controls.Jump,Zero,&PC);
	}
}
예제 #28
0
파일: mips_mts.c 프로젝트: GNS3/dynamips
/* LWL: Load Word Left */
fastcall void MTS_PROTO(lwl)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg)
{
   m_uint64_t r_mask,naddr;
   m_uint64_t data;
   u_int m_shift;
   void *haddr;

   naddr = vaddr & ~(0x03);
   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_LWL,4,MTS_READ,&data);

   if (likely(haddr != NULL))
      data = vmtoh32(*(m_uint32_t *)haddr);

   m_shift = (vaddr & 0x03) << 3;
   r_mask = (1ULL << m_shift) - 1;
   data <<= m_shift;

   cpu->gpr[reg] &= r_mask;
   cpu->gpr[reg] |= data;
   cpu->gpr[reg] = sign_extend(cpu->gpr[reg],32);
}
예제 #29
0
파일: branch.c 프로젝트: iamedu/armdev
void bl_inst(int inst, ARMProc *proc) {
	int l;
	int signed_immed_24;
	int branch_addr;

	if(!check_condition(proc, inst))
		return;
	l = getbit(inst, 24);
	signed_immed_24 = getbits(inst, 0, 24);

	if(l) {
		*proc->lr = *proc->pc;
	}

	branch_addr = sign_extend(signed_immed_24, 24, 30);

	branch_addr <<= 2;


	*proc->pc += 4 + branch_addr;
}
예제 #30
0
파일: t_vobj.c 프로젝트: 8l/vlink
static taddr read_number(int is_signed)
{
  int bitcnt;
  taddr val;
  uint8_t n,*q;

  if ((n = *p++) <= 0x7f)
    return (taddr)n;

  val = 0;
  if (n -= 0x80) {
    p += n;
    q = p;
    bitcnt = n << 3;
    while (n--)
      val = (val<<8) | *(--q);
    if (is_signed)
      val = sign_extend(val,bitcnt);
  }
  return val;
}