예제 #1
0
void armv7a::asr_c(bits* result, uint32_t* carry_out, const bits& x, uint32_t shift)
{
    pseudo_assert(shift > 0, "asr_c assert error");
    //pseudo_assert(shift < 32, "asr_c assert error 2");

    if(shift >= 32)
    {
        /*
        if(x(x.n - 1) == 1)
        {
            result->val = mask(x.n - 1, 0);
        }
        else
        {
            result->val = 0;
        }
        result->n = x.n;
        return;
        */
        shift = 32;
    }

    //code modified by ufoderek
    uint64_t extended_x = sign_extend64(x);
    result->val = get_field64(extended_x, shift + x.n - 1, shift);
    result->n = x.n;
    *carry_out = get_bit(extended_x, shift - 1);
}
예제 #2
0
파일: msr.c 프로젝트: EricTHTseng/linux
static void msr_event_update(struct perf_event *event)
{
	u64 prev, now;
	s64 delta;

	/* Careful, an NMI might modify the previous event value. */
again:
	prev = local64_read(&event->hw.prev_count);
	now = msr_read_counter(event);

	if (local64_cmpxchg(&event->hw.prev_count, prev, now) != prev)
		goto again;

	delta = now - prev;
	if (unlikely(event->hw.event_base == MSR_SMI_COUNT))
		delta = sign_extend64(delta, 31);

	local64_add(delta, &event->count);
}
예제 #3
0
파일: msr.c 프로젝트: CCNITSilchar/linux
static void msr_event_update(struct perf_event *event)
{
	u64 prev, now;
	s64 delta;

	/* Careful, an NMI might modify the previous event value: */
again:
	prev = local64_read(&event->hw.prev_count);
	now = msr_read_counter(event);

	if (local64_cmpxchg(&event->hw.prev_count, prev, now) != prev)
		goto again;

	delta = now - prev;
	if (unlikely(event->hw.event_base == MSR_SMI_COUNT)) {
		delta = sign_extend64(delta, 31);
		local64_add(delta, &event->count);
	} else if (unlikely(event->hw.event_base == MSR_IA32_THERM_STATUS)) {
		/* If valid, extract digital readout, otherwise set to -1: */
		now = now & (1ULL << 31) ? (now >> 16) & 0x3f :  -1;
		local64_set(&event->count, now);
	} else {
예제 #4
0
uint64_t armv7a::SInt(const bits& x)
{
    return sign_extend64(x);
}