Re: How can I link the kernel with libgcc ?

From: linux-os (Dick Johnson)
Date: Fri Mar 10 2006 - 13:30:32 EST



On Fri, 10 Mar 2006, Carlos Munoz wrote:

> Denis Vlasenko wrote:
>
>> On Friday 10 March 2006 05:47, Carlos Munoz wrote:
>>
>>
>>> Lee Revell wrote:
>>>
>>>
>>>
>>>> On Thu, 2006-03-09 at 19:25 -0800, Carlos Munoz wrote:
>>>>
>>>>
>>>>
>>>>
>>>>> I figured out how to get the driver to use floating point operations.
>>>>> I included source code (from an open source math library) for the
>>>>> log10 function in the driver. Then I added the following lines to the
>>>>> file arch/sh/kernel/sh_ksyms.c:
>>>>>
>>>>>
>>>>>
>>>>>
>>>> Where is the source code to your driver?
>>>>
>>>> Lee
>>>>
>>>>
>>>>
>>>>
>>>>
>>> Hi Lee,
>>>
>>> Be warned. This driver is in the early stages of development. There is
>>> still a lot of work that needs to be done (interrupt, dma, etc, etc).
>>>
>>>
>>
>> What? You are using log10 only twice!
>>
>> if (!(siu_obj_status & ST_OPEN)) {
>> ...
>> /* = log2(over) */
>> ydef[22] = (u_int32_t)(log10((double)(over & 0x0000003f)) /
>> log10(2));
>> ...
>> }
>> else {
>> ...
>> if (coef) {
>> ydef[16] = 0x03045000 | (over << 26) | (tap - 4);
>> ydef[17] = (tap * 2 + 1);
>> /* = log2(over) */
>> ydef[22] = (u_int32_t)
>> (log10((double)(over & 0x0000003f)) / log10(2));
>> }
>>
>> Don't you think that log10((double)(over & 0x0000003f)) / log10(2)
>> can have only 64 different values depending on the result of (over & 0x3f)?
>>
>> Obtain them from precomputed uint32_t log10table[64].
>> --
>> vda
>>
>>
> Hi Denis,
>
> Yes, the driver code so far only uses log10 twice, but there will be
> more uses for it as I populate the rest of the tables. However, I think
> its use will be some what limited. I wasn't aware that the floating
> point registers are not saved. I'll investigate a way to create a table
> with pre-calculated log10 values.
>
> Thanks,
>
>
> Carlos

Since the log in base n is the log in any base times a constant,
you can probably use log base 2 (binary bit position) and multiply
the result by a constant, which may simply be shifts and adds.

I assume you are using 16-bit audio. If so, the dynamic range
is only 20 * log10(2^16) = 96.3 dB. That means that attenuation
from mininum to maximum, in 1 dB steps, requires only 94 values.

Your code shows something whacked off at 0x3f = 0->0x40 = 64
20 * log10(64) = 36 dB for only 36 values. Clearly, you don't
need floating point, just some thought ahead of time.

Cheers,
Dick Johnson
Penguin : Linux version 2.6.15.4 on an i686 machine (5589.54 BogoMips).
Warning : 98.36% of all statistics are fiction, book release in April.
_


****************************************************************
The information transmitted in this message is confidential and may be privileged. Any review, retransmission, dissemination, or other use of this information by persons or entities other than the intended recipient is prohibited. If you are not the intended recipient, please notify Analogic Corporation immediately - by replying to this message or by sending an email to DeliveryErrors@xxxxxxxxxxxx - and destroy all copies of this information, including any attachments, without reading or disclosing them.

Thank you.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/