1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndouble do_fsqrt ( double x ) 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown double block[2]; 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown block[0] = x; 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __asm__ __volatile__( 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "lfd %%f1, 0(%0)\n\t" 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "fsqrt %%f1,%%f1\n\t" 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "stfd %%f1, 8(%0)" 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : /*out*/ 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : /*in*/ "b" (&block[0]) 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : /*trash*/ "memory", "fr1" 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return block[1]; 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndouble do_fsqrts ( double x ) 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown double block[2]; 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown block[0] = x; 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown __asm__ __volatile__( 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "lfd %%f1, 0(%0)\n\t" 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "fsqrts %%f1,%%f1\n\t" 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown "stfd %%f1, 8(%0)" 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : /*out*/ 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : /*in*/ "b" (&block[0]) 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown : /*trash*/ "memory", "fr1" 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return block[1]; 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown//////////////////////////////////////////////////////////// 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid do_one ( char* name, 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown double(*f)(double), 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown double* args, int nargs, 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char* argfmt, char* resfmt ) 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int i; 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown double a, r; 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("\n"); 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (i = 0; i < nargs; i++) { 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown a = args[i]; 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown r = f(a); 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("%s ", name); 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf(argfmt, a); 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf(" -> "); 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf(resfmt, r); 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("\n"); 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void ) 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int nargs = 19; 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown double* args = malloc(nargs * sizeof(double)); 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[0] = 0.0; 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[1] = 1.0 / 0.0; // inf 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[2] = -args[1]; // -inf 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[3] = args[2]/args[2]; // nan 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[4] = -args[3]; // -nan 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[5] = -5e100; 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[6] = -5e20; 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[7] = -501.0; 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[8] = -6.0; 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[9] = -1.0; 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[10] = -2e-20; 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[11] = -2e-200; 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[12] = 2e-200; 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[13] = 2e-20; 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[14] = 1.0; 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[15] = 6.0; 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[16] = 501.0; 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[17] = 5e20; 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown args[18] = 5e100; 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do_one( "fsqrt", do_fsqrt, args, nargs, "%e", "%20.14e"); 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do_one( "fsqrts", do_fsqrts, args, nargs, "%e", "%e"); 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown free(args); 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return 0; 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 87