Changeset 34db7fa in mainline for kernel/test/fpu/fpu1.c


Ignore:
Timestamp:
2006-12-12T12:32:02Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
96348adc
Parents:
df496c5
Message:

cleanup kernel tests infrastructure

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/test/fpu/fpu1.c

    rdf496c5 r34db7fa  
    2828 */
    2929
     30#if (defined(ia32) || defined(amd64) || defined(ia64) || defined(ia32xen))
     31
    3032#include <print.h>
    3133#include <debug.h>
     
    3941#include <arch/arch.h>
    4042
    41 #ifdef CONFIG_BENCH
    42 #include <arch/cycle.h>
    43 #endif
    44 
    45 #if (defined(ia32) || defined(amd64) || defined(ia64) || defined(ia32xen))
    46 
    47 #define THREADS         150*2
     43
     44#define THREADS         150
    4845#define ATTEMPTS        100
    4946
     
    5350
    5451#ifdef KERN_ia32_ARCH_H_
    55 static inline double sqrt(double x) { double v; __asm__ ("fsqrt\n" : "=t" (v) : "0" (x)); return v; }
     52static inline double sqrt(double x)
     53{
     54        double v;
     55       
     56        asm (
     57                "fsqrt\n"
     58                : "=t" (v)
     59                : "0" (x)
     60        );
     61       
     62        return v;
     63}
    5664#endif
    5765
    5866#ifdef KERN_amd64_ARCH_H_
    59 static inline double sqrt(double x) { double v; __asm__ ("fsqrt\n" : "=t" (v) : "0" (x)); return v; }
     67static inline double sqrt(double x)
     68{
     69        double v;
     70       
     71        asm (
     72                "fsqrt\n"
     73                : "=t" (v)
     74                : "0" (x)
     75        );
     76       
     77        return v;
     78}
    6079#endif
    6180
    6281#ifdef KERN_ia64_ARCH_H_
     82
     83#undef PI_10e8 
     84#define PI_10e8 3141592
     85
    6386static inline long double sqrt(long double a)
    6487{   
     
    6689        long double lx = 0;
    6790
    68         if(a<0.00000000000000001) return 0;
     91        if (a < 0.00000000000000001)
     92                return 0;
    6993               
    70         while(x!=lx)
    71         {
    72                 lx=x;
    73                 x=(x+(a/x))/2;
    74         }
     94        while(x != lx) {
     95                lx = x;
     96                x = (x + (a / x)) / 2;
     97        }
     98       
    7599        return x;
    76100}
     
    78102
    79103
    80 
    81104static atomic_t threads_ok;
     105static atomic_t threads_fault;
    82106static waitq_t can_start;
    83107
     
    92116
    93117        for (i = 0; i<ATTEMPTS; i++) {
    94                 le=-1;
    95                 e=0;
    96                 f=1;
    97 
    98                 for(d=1;e!=le;d*=f,f+=1) {
    99                         le=e;
    100                         e=e+1/d;
    101                 }
    102 
    103                 if((int)(100000000*e)!=E_10e8)
    104                         panic("tid%d: e*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (100000000*e),(unative_t) E_10e8);
    105         }
    106 
    107         printf("tid%d: e*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (100000000*e),(unative_t) E_10e8);
     118                le = -1;
     119                e = 0;
     120                f = 1;
     121
     122                for (d = 1; e != le; d *= f, f += 1) {
     123                        le = e;
     124                        e = e + 1 / d;
     125                }
     126
     127                if ((int) (100000000 * e) != E_10e8) {
     128                        printf("tid%d: e*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (100000000 * e), (unative_t) E_10e8);
     129                        atomic_inc(&threads_fault);
     130                        break;
     131                }
     132        }
    108133        atomic_inc(&threads_ok);
    109134}
     
    111136static void pi(void *data)
    112137{
    113 
    114 #ifdef KERN_ia64_ARCH_H_
    115 #undef PI_10e8 
    116 #define PI_10e8 3141592
    117 #endif
    118 
    119 
    120138        int i;
    121139        double lpi, pi;
     
    126144        waitq_sleep(&can_start);
    127145
    128 
    129         for (i = 0; i<ATTEMPTS; i++) {
     146        for (i = 0; i < ATTEMPTS; i++) {
    130147                lpi = -1;
    131148                pi = 0;
    132149
    133                 for (n=2, ab = sqrt(2); lpi != pi; n *= 2, ab = ad) {
     150                for (n = 2, ab = sqrt(2); lpi != pi; n *= 2, ab = ad) {
    134151                        double sc, cd;
    135152
    136                         sc = sqrt(1 - (ab*ab/4));
     153                        sc = sqrt(1 - (ab * ab / 4));
    137154                        cd = 1 - sc;
    138                         ad = sqrt(ab*ab/4 + cd*cd);
     155                        ad = sqrt(ab * ab / 4 + cd * cd);
    139156                        lpi = pi;
    140157                        pi = 2 * n * ad;
     
    142159
    143160#ifdef KERN_ia64_ARCH_H_
    144                 if((int)(1000000*pi)!=PI_10e8)
    145                         panic("tid%d: pi*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (1000000*pi),(unative_t) (PI_10e8/100));
     161                if ((int) (1000000 * pi) != PI_10e8) {
     162                        printf("tid%d: pi*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (1000000 * pi), (unative_t) (PI_10e8 / 100));
     163                        atomic_inc(&threads_fault);
     164                        break;
     165                }
    146166#else
    147                 if((int)(100000000*pi)!=PI_10e8)
    148                         panic("tid%d: pi*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (100000000*pi),(unative_t) PI_10e8);
    149 #endif
    150 
    151         }
    152 
    153         printf("tid%d: pi*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (100000000*pi),(unative_t) PI_10e8);
     167                if ((int) (100000000 * pi) != PI_10e8) {
     168                        printf("tid%d: pi*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (100000000 * pi), (unative_t) PI_10e8);
     169                        atomic_inc(&threads_fault);
     170                        break;
     171                }
     172#endif
     173        }
    154174        atomic_inc(&threads_ok);
    155175}
    156176
    157 void test_fpu1(void)
    158 {
    159 #ifdef CONFIG_BENCH
    160         uint64_t t0 = get_cycle();
    161 #endif
    162         thread_t *t;
    163         int i;
     177char * test_fpu1(void)
     178{
     179        unsigned int i, total = 0;
    164180
    165181        waitq_initialize(&can_start);
    166 
    167         printf("FPU test #1\n");
    168         printf("Creating %d threads... ", THREADS);
    169 
    170         for (i=0; i<THREADS/2; i++) { 
    171                 if (!(t = thread_create(e, NULL, TASK, 0, "e")))
    172                         panic("could not create thread\n");
     182        atomic_set(&threads_ok, 0);
     183        atomic_set(&threads_fault, 0);
     184        printf("Creating %d threads... ", 2 * THREADS);
     185
     186        for (i = 0; i < THREADS; i++) { 
     187                thread_t *t;
     188               
     189                if (!(t = thread_create(e, NULL, TASK, 0, "e"))) {
     190                        printf("could not create thread %d\n", 2 * i);
     191                        break;
     192                }
    173193                thread_ready(t);
    174                 if (!(t = thread_create(pi, NULL, TASK, 0, "pi")))
    175                         panic("could not create thread\n");
     194                total++;
     195               
     196                if (!(t = thread_create(pi, NULL, TASK, 0, "pi"))) {
     197                        printf("could not create thread %d\n", 2 * i + 1);
     198                        break;
     199                }
    176200                thread_ready(t);
     201                total++;
    177202        }
    178203        printf("ok\n");
     
    180205        thread_sleep(1);
    181206        waitq_wakeup(&can_start, WAKEUP_ALL);
    182 
    183         while (atomic_get(&threads_ok) != THREADS)
    184                 ;
    185                
    186         printf("Test passed.\n");
    187 #ifdef CONFIG_BENCH
    188         uint64_t dt = get_cycle() - t0;
    189         printf("Time: %.*d cycles\n", sizeof(dt) * 2, dt);
    190 #endif
    191 }
    192 
    193 #else
    194 
    195 void test_fpu1(void)
    196 {
    197         printf("This test is available only on Intel/AMD platforms.");
    198 }
    199 
    200 #endif
     207       
     208        while (atomic_get(&threads_ok) != total) {
     209                printf("Threads left: %d\n", total - atomic_get(&threads_ok));
     210                thread_sleep(1);
     211        }
     212       
     213        if (atomic_get(&threads_fault) == 0)
     214                return NULL;
     215       
     216        return "Test failed";
     217}
     218
     219#endif
Note: See TracChangeset for help on using the changeset viewer.