#include <stdio.h>
void __asm(const char *, ...);
// Compute x+y+z --> result
double add_trig(double x, double y, double z)
{
double result;
__asm(
"lds r4, fpul ; load lw-part of x to fpul \n"
"fsts fpul, fr5 ; copy lw-part of x to fr5 \n"
"lds r5, fpul ; load hi-part of x to fpul \n"
"fsts fpul, fr4 ; copy hi-part of x to fr4 \n"
"lds r6, fpul ; load lw-part of y to fpul \n"
"fsts fpul, fr7 ; copy lw-part of y to fr7 \n"
"lds r7, fpul ; load hi-part of y to fpul \n"
"fsts fpul, fr6 ; copy hi-part of y to fr6 \n"
"mov.l @(16,sp),r0 ; load lw-part of z to r0 \n"
"lds r0, fpul ; \n"
"fsts fpul, fr9 ; copy lw-part of z to fr9 \n"
"mov.l @(20,sp),r0 ; load hi-part of z to r0 \n"
"lds r0, fpul ; \n"
"fsts fpul, fr8 ; copy hi-part of z to fr8 \n"
"mov #8, r0 ; prepare to mask the pr bit \n"
"shll16 r0 ; \n"
"sts fpscr,r1 ; \n"
"xor r0, r1 ; toggle pr bit \n"
"lds r1, fpscr ; turn-on pr bit \n"
"fadd dr4, dr6 ; compute x+y \n"
"fadd dr6, dr8 ; compute x+y+z \n"
"xor r0, r1 ; toggle pr bit \n"
"lds r1, fpscr ; turn-off pr bit\n"
"mov.l @(24,sp), r0 ; load result address\n"
"add #4, r0 ; increment result addr by 4\n"
"fmov.s fr8, @r0 ; store hi-part into result addr\n"
"fmov.s fr9, @-r0 ; store lw-part into result addr\n",
x, // passed in r4 and r5
y, // passed in r6 and r7
z, // passed in @(16,sp) and @(20,sp)
&result); // passed in @(24,sp)
return result;
}
void main()
{
double retval = add_trig(1.0, 2.0,3.0);
printf("%g\n", retval);
}