templates and assembler

James Dunne james.jdunne at gmail.com
Mon Mar 27 07:18:00 PST 2006


Don Clugston wrote:
> manu wrote:
> 
>> James Dunne says...
>>
>>> manu wrote:
>>>
>>>> Hi there!
>>>> I´m new to D and quite surprised about all the nice features it 
>>>> provides. So I
>>>> started to write some test apps and also tried to write some 
>>>> templates. It all
>>>> worked perfect until I wanted to use template identifiers in asm 
>>>> blocks.
>>>>
>>>> consider the following:
>>>>
>>>> /* file - main.d **************************************/
>>>> 01: template sine(REAL) // where REAL should be one of 
>>>> float,double,real 02: {
>>>> 03:     float sine(REAL x)
>>>> 04:    {
>>>> 05:        asm 06:        {
>>>> 07:            naked            ; // <- make it naked to get maximum 
>>>> speed
>>>> 08:        fld REAL ptr[ESP+4] ; // <- critical opcode
>>>> 09:        fsin            ;
>>>> 10:        ret            ;
>>>> 11:        }
>>>> 12:     }
>>>> 13: }
>>>> 14: alias sine!(float) sine_float; // instantiation
>>>> / *****************************************************/
>>>> An error occurs when typing the last line, due to the instantiation. 
>>>> It says:
>>>>
>>>> main.d(8): end of instruction
>>>>
>>>> I´ve figured out that it comes because of the REAL in the asm block. 
>>>> I also
>>>> tried this for line 08:
>>>>
>>>> 08:   fld x
>>>>
>>>> Though this compiles there remains an error at runtime: the program 
>>>> assumes x to
>>>> be at a different position on the stack and so just a dump of stack 
>>>> memory is
>>>> loaded into the FPU. May this an unfixed bug of the compiler(I´m 
>>>> using dmd)?
>>>> I would be very thankful to everybody who helps me fixing that problem!
>>>>
>>>>
>>> Removing 'naked' and 'ret' instructions fixes the problem.  'real 
>>> ptr[ESP+4]' also didn't work, so use 'fld x' instead.  I think you 
>>> were trying to load the pointer value into the floating point 
>>> register, which doesn't quite work. :)
>>>
>>> -- 
>>> Regards,
>>> James Dunne
>>
>>
>> First thank´s for your help, but 'real ptr[ESP+4]' works, there is no 
>> pointer
>> value
>> loaded into the FPU. 'REAL ptr[ESP+4]' is the code that doesn´t 
>> work(CAPITAL
>> letters!) cause the compiler(dmd) can´t handle template arguments in 
>> asm blocks.
> 
> 
> Actually REAL is an undocumented reserved word in D assembler! It means 
> the same as TBYTE in other assemblers. Use a different name!
> 
> Also, I don't think that 'ret' on its own works correctly.
> 
> Here's (untemplated) code that works.
> real sin(real x)
> {
>     asm {
>         naked;
>         fld real ptr [ESP+4];
>         fsin;
>         ret x.sizeof + x.alignof;
>     }
> }
> 
> 

Yes, I discovered both those oddities when I was playing with the code. 
  I think his point was to make a templated function which took in 
either a float, double, or real, and performed the fsin operation on it, 
returning the value back, obviously.  I just couldn't figure out how the 
ret instruction worked in a naked call.  This sets me right though.

That said, I don't think that templates make sense for use with asm 
blocks; there's too much incompatibility.

-- 
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/MU/S d-pu s:+ a-->? C++++$ UL+++ P--- L+++ !E W-- N++ o? K? w--- O 
M--@ V? PS PE Y+ PGP- t+ 5 X+ !R tv-->!tv b- DI++(+) D++ G e++>e 
h>--->++ r+++ y+++
------END GEEK CODE BLOCK------

James Dunne



More information about the Digitalmars-d mailing list