SH-4 Examples
Provides examples of how to write prolog code of an SH-4 microprocessor.
Pass Address of Floating Point Parameter
The following example shows how to pass the address of float arguments to __asm call and then how to load the argument to a register within the __asm statement:
#include <stdio.h> void __asm(const char *, ...); // Compute x+y+z --> result float add_trig(float x, float y, float z) { float result; __asm( "fmov.s @r4, fr0 ; copy x to fr0 \n" "fmov.s @r5, fr1 ; copy y to fr1 \n" "fmov.s @r6, fr2 ; copy z to fr2 \n" "fadd fr0, fr1 ; compute x+y\n" "fadd fr1, fr2 ; compute x+y+z \n" "fmov.s fr2, @r7 ; store fr2 into result addr\n", &x, // pointer to x passed in r4 &y, // pointer to y passed in r5 &z, // pointer to z passed in r6 &result); // pointer to result passed in r7 return result; } void main() { float retval = add_trig(1.0f, 2.0f,3.0f); printf("%f\n", retval); }
Access Double Parameters from Integer Registers
The following example shows how to access double parameters from integer registers and local argument stack space using inline assembly:
#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); }
Compute Inner Product of Vectors
This example computes the inner products of the two dimensional vectors:
#include <stdio.h> void __asm(const char *, ...); // // Compute an inner product of v1 and v2 vectors // float dot(float *v1, float *v2) { float retval[1]; __asm( "fmov.s @r4+, fr0 ; Load v1 vector into fr0..fr3\n" "fmov.s @r4+, fr1\n" "fmov.s @r4+, fr2\n" "fmov.s @r4+, fr3\n" "fmov.s @r5+, fr4 ; Load v2 vector into fr4..fr7\n" "fmov.s @r5+, fr5\n" "fmov.s @r5+, fr6\n" "fmov.s @r5+, fr7\n" "fipr fv0, fv4 ; Do the operation\n" "fmov.s fr7, @r6 ; Store the return value\n", v1, // passed in R4 v2, // passed in R5 retval); // passed in R6 return retval[0]; } void main() { float v1[4]={1.0, 2.0, 3.0, 4.0}; float v2[4]={1.0, 2.0, 3.0, 4.0}; float retval; retval = dot(v1, v2); printf("retval=%f\n", retval); }
// range
See Also
SHx Inline Assembly Samples | SH-3 Examples
Last updated on Thursday, April 08, 2004
© 1992-2003 Microsoft Corporation. All rights reserved.