OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [linux/] [reciprocal_div.h] - Blame information for rev 81

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
#ifndef _LINUX_RECIPROCAL_DIV_H
2
#define _LINUX_RECIPROCAL_DIV_H
3
 
4
#include <linux/types.h>
5
 
6
/*
7
 * This file describes reciprocical division.
8
 *
9
 * This optimizes the (A/B) problem, when A and B are two u32
10
 * and B is a known value (but not known at compile time)
11
 *
12
 * The math principle used is :
13
 *   Let RECIPROCAL_VALUE(B) be (((1LL << 32) + (B - 1))/ B)
14
 *   Then A / B = (u32)(((u64)(A) * (R)) >> 32)
15
 *
16
 * This replaces a divide by a multiply (and a shift), and
17
 * is generally less expensive in CPU cycles.
18
 */
19
 
20
/*
21
 * Computes the reciprocal value (R) for the value B of the divisor.
22
 * Should not be called before each reciprocal_divide(),
23
 * or else the performance is slower than a normal divide.
24
 */
25
extern u32 reciprocal_value(u32 B);
26
 
27
 
28
static inline u32 reciprocal_divide(u32 A, u32 R)
29
{
30
        return (u32)(((u64)A * R) >> 32);
31
}
32
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.