templates and assembler

James Dunne james.jdunne at gmail.com
Sat Mar 25 13:21:35 PST 2006


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



More information about the Digitalmars-d mailing list