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