Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/tester/float/softfloat1.c

    rc0c38c7c r3e6a98c5  
    2929#include <stdio.h>
    3030#include <stdlib.h>
    31 #include <mathtypes.h>
     31#include <sftypes.h>
    3232#include <add.h>
    3333#include <sub.h>
     
    3939#include "../tester.h"
    4040
    41 #define add_float  __addsf3
    42 #define sub_float  __subsf3
    43 #define mul_float  __mulsf3
    44 #define div_float  __divsf3
    45 
    46 #define is_float_lt  __ltsf2
    47 #define is_float_gt  __gtsf2
    48 #define is_float_eq  __eqsf2
    49 
    50 #define add_double  __adddf3
    51 #define sub_double  __subdf3
    52 #define mul_double  __muldf3
    53 #define div_double  __divdf3
    54 
    55 #define is_double_lt  __ltdf2
    56 #define is_double_gt  __gtdf2
    57 #define is_double_eq  __eqdf2
    58 
    59 #define uint_to_double  __floatsidf
    60 #define double_to_uint  __fixunsdfsi
    61 #define double_to_int   __fixdfsi
    62 
    63 #define OPERANDS   10
    64 #define PRECISION  1000
     41#define OPERANDS  10
     42#define PRECISION  10000
    6543
    6644#define PRIdCMPTYPE  PRId32
     
    6846typedef int32_t cmptype_t;
    6947
    70 typedef void (* uint_to_double_op_t)(unsigned int, double *, double *);
     48typedef void (* uint_to_double_op_t)(unsigned int, double *, double_t *);
    7149typedef void (* double_to_uint_op_t)(double, unsigned int *, unsigned int *);
    72 typedef void (* float_binary_op_t)(float, float, float *, float *);
    73 typedef void (* float_cmp_op_t)(float, float, cmptype_t *, cmptype_t *);
    74 typedef void (* double_binary_op_t)(double, double, double *, double *);
     50typedef void (* float_binary_op_t)(float, float, float *, float_t *);
     51typedef void (* double_binary_op_t)(double, double, double *, double_t *);
    7552typedef void (* double_cmp_op_t)(double, double, cmptype_t *, cmptype_t *);
    7653
     
    7956    cmptype_t *);
    8057
    81 #define NUMBERS \
     58#define NUMBERS \
    8259        3.5, -2.1, 100.0, 50.0, -1024.0, 0.0, 768.3156, 1080.499999, -600.0, 1.0
    8360
     
    8663};
    8764
    88 static double dop_a[OPERANDS] = {
     65static double dop_a[OPERANDS] = {
    8966        NUMBERS
    9067};
    9168
    9269static unsigned int uop_a[OPERANDS] = {
    93         4, 2, 100, 50, 1024, 0, 1000000, 1, 0x8000000, 500
     70        4, -100, 100, 50, 1024, 0, 1000000, -1U, 0x80000000U, 500
    9471};
    9572
    96 static int fcmp(float a, float b)
     73static cmptype_t cmpabs(cmptype_t a)
     74{
     75        if (a >= 0)
     76                return a;
     77       
     78        return -a;
     79}
     80
     81static int dcmp(double a, double b)
    9782{
    9883        if (a < b)
    9984                return -1;
    100        
    101         if (a > b)
     85        else if (a > b)
    10286                return 1;
    103        
     87
    10488        return 0;
    10589}
    10690
    107 static int dcmp(double a, double b)
    108 {
    109         if (a < b)
    110                 return -1;
    111        
    112         if (a > b)
    113                 return 1;
    114        
    115         return 0;
    116 }
    117 
    118 static void uint_to_double_template(void *f, unsigned i, cmptype_t *pic,
    119     cmptype_t *pisc)
    120 {
     91static void
     92uint_to_double_template(void *f, unsigned i, cmptype_t *pic, cmptype_t *pisc)
     93{
     94        double c;
     95        double_t sc;
     96
    12197        uint_to_double_op_t op = (uint_to_double_op_t) f;
    12298       
    123         double c;
    124         double sc;
    12599        op(uop_a[i], &c, &sc);
    126        
     100
    127101        *pic = (cmptype_t) (c * PRECISION);
    128         *pisc = (cmptype_t) (sc * PRECISION);
    129 }
    130 
    131 static void double_to_uint_template(void *f, unsigned i, cmptype_t *pic,
    132     cmptype_t *pisc)
    133 {
    134         double_to_uint_op_t op = (double_to_uint_op_t) f;
    135        
     102        *pisc = (cmptype_t) (sc.val * PRECISION);
     103}
     104
     105static void
     106double_to_uint_template(void *f, unsigned i, cmptype_t *pic, cmptype_t *pisc)
     107{
    136108        unsigned int c;
    137109        unsigned int sc;
     110
     111        double_to_uint_op_t op = (double_to_uint_op_t) f;
     112       
    138113        op(dop_a[i], &c, &sc);
    139        
     114
    140115        *pic = (cmptype_t) c;
    141116        *pisc = (cmptype_t) sc;
    142117}
    143118
    144 static void float_template_binary(void *f, unsigned i, unsigned j,
    145     cmptype_t *pic, cmptype_t *pisc)
    146 {
     119
     120static void
     121float_template_binary(void *f, unsigned i, unsigned j, cmptype_t *pic,
     122    cmptype_t *pisc)
     123{
     124        float c;
     125        float_t sc;
     126
    147127        float_binary_op_t op = (float_binary_op_t) f;
    148128       
    149         float c;
    150         float sc;
    151129        op(fop_a[i], fop_a[j], &c, &sc);
    152        
     130
    153131        *pic = (cmptype_t) (c * PRECISION);
    154         *pisc = (cmptype_t) (sc * PRECISION);
    155 }
    156 
    157 static void float_compare_template(void *f, unsigned i, unsigned j,
    158     cmptype_t *pis, cmptype_t *piss)
    159 {
    160         float_cmp_op_t op = (float_cmp_op_t) f;
    161        
    162         op(dop_a[i], dop_a[j], pis, piss);
    163 }
    164 
    165 static void double_template_binary(void *f, unsigned i, unsigned j,
    166     cmptype_t *pic, cmptype_t *pisc)
    167 {
     132        *pisc = (cmptype_t) (sc.val * PRECISION);
     133}
     134
     135static void
     136double_template_binary(void *f, unsigned i, unsigned j, cmptype_t *pic,
     137    cmptype_t *pisc)
     138{
     139        double c;
     140        double_t sc;
     141
    168142        double_binary_op_t op = (double_binary_op_t) f;
    169143       
    170         double c;
    171         double sc;
    172144        op(dop_a[i], dop_a[j], &c, &sc);
    173        
     145
    174146        *pic = (cmptype_t) (c * PRECISION);
    175         *pisc = (cmptype_t) (sc * PRECISION);
    176 }
    177 
    178 static void double_compare_template(void *f, unsigned i, unsigned j,
    179     cmptype_t *pis, cmptype_t *piss)
     147        *pisc = (cmptype_t) (sc.val * PRECISION);
     148}
     149
     150static void
     151double_compare_template(void *f, unsigned i, unsigned j, cmptype_t *pis,
     152    cmptype_t *piss)
    180153{
    181154        double_cmp_op_t op = (double_cmp_op_t) f;
     
    191164                cmptype_t ic;
    192165                cmptype_t isc;
    193                
    194                 template(f, i, &ic, &isc);
    195                 cmptype_t diff = ic - isc;
    196                
     166
     167                template(f, i, &ic, &isc);     
     168                cmptype_t diff = cmpabs(ic - isc);
     169                       
    197170                if (diff != 0) {
    198                         TPRINTF("i=%u ic=%" PRIdCMPTYPE " isc=%" PRIdCMPTYPE "\n",
    199                             i, ic, isc);
     171                        TPRINTF("i=%u diff=%" PRIdCMPTYPE "\n", i, diff);
    200172                        correct = false;
    201173                }
     
    210182       
    211183        for (unsigned int i = 0; i < OPERANDS; i++) {
    212                 for (unsigned int j = 0; j < OPERANDS; j++) {
     184                for (unsigned int j = 0; j < OPERANDS; j++) {                   
    213185                        cmptype_t ic;
    214186                        cmptype_t isc;
    215                        
    216                         template(f, i, j, &ic, &isc);
    217                         cmptype_t diff = ic - isc;
     187
     188                        template(f, i, j, &ic, &isc);   
     189                        cmptype_t diff = cmpabs(ic - isc);
    218190                       
    219191                        if (diff != 0) {
    220                                 TPRINTF("i=%u, j=%u ic=%" PRIdCMPTYPE
    221                                     " isc=%" PRIdCMPTYPE "\n", i, j, ic, isc);
     192                                TPRINTF("i=%u, j=%u diff=%" PRIdCMPTYPE "\n",
     193                                    i, j, diff);
    222194                                correct = false;
    223195                        }
     
    228200}
    229201
    230 static void uint_to_double_operator(unsigned int a, double *pc, double *psc)
     202static void uint_to_double_operator(unsigned int a, double *pc, double_t *psc)
    231203{
    232204        *pc = (double) a;
    233         *psc = uint_to_double(a);
    234 }
    235 
    236 static void double_to_uint_operator(double a, unsigned int *pc,
    237     unsigned int *psc)
    238 {
     205        psc->data = uint_to_double(a);
     206}
     207
     208static void
     209double_to_uint_operator(double a, unsigned int *pc, unsigned int *psc)
     210{
     211        double_t sa;
     212
     213        sa.val = a;
     214
    239215        *pc = (unsigned int) a;
    240         *psc = double_to_uint(a);
    241 }
    242 
    243 static void double_to_int_operator(double a, unsigned int *pc,
    244     unsigned int *psc)
    245 {
     216        *psc = double_to_uint(sa.data);
     217}
     218
     219static void
     220double_to_int_operator(double a, unsigned int *pc, unsigned int *psc)
     221{
     222        double_t sa;
     223
     224        sa.val = a;
     225
    246226        *pc = (int) a;
    247         *psc = double_to_int(a);
    248 }
    249 
    250 static void float_add_operator(float a, float b, float *pc, float *psc)
     227        *psc = double_to_int(sa.data);
     228}
     229
     230static void float_add_operator(float a, float b, float *pc, float_t *psc)
    251231{
    252232        *pc = a + b;
    253         *psc = add_float(a, b);
    254 }
    255 
    256 static void float_sub_operator(float a, float b, float *pc, float *psc)
    257 {
    258         *pc = a - b;
    259         *psc = sub_float(a, b);
    260 }
    261 
    262 static void float_mul_operator(float a, float b, float *pc, float *psc)
     233       
     234        float_t sa;
     235        float_t sb;
     236       
     237        sa.val = a;
     238        sb.val = b;
     239        if (sa.data.parts.sign == sb.data.parts.sign)
     240                psc->data = add_float(sa.data, sb.data);
     241        else if (sa.data.parts.sign) {
     242                sa.data.parts.sign = 0;
     243                psc->data = sub_float(sb.data, sa.data);
     244        } else {
     245                sb.data.parts.sign = 0;
     246                psc->data = sub_float(sa.data, sb.data);
     247        }
     248}
     249
     250static void float_mul_operator(float a, float b, float *pc, float_t *psc)
    263251{
    264252        *pc = a * b;
    265         *psc = mul_float(a, b);
    266 }
    267 
    268 static void float_div_operator(float a, float b, float *pc, float *psc)
     253       
     254        float_t sa;
     255        float_t sb;
     256       
     257        sa.val = a;
     258        sb.val = b;
     259        psc->data = mul_float(sa.data, sb.data);
     260}
     261
     262static void float_div_operator(float a, float b, float *pc, float_t *psc)
    269263{
    270264        if ((cmptype_t) b == 0) {
    271265                *pc = 0.0;
    272                 *psc = 0.0;
     266                psc->val = 0.0;
    273267                return;
    274268        }
    275        
     269
    276270        *pc = a / b;
    277         *psc = div_float(a, b);
    278 }
    279 
    280 static void float_cmp_operator(float a, float b, cmptype_t *pis,
    281     cmptype_t *piss)
    282 {
    283         *pis = fcmp(a, b);
    284        
    285         if (is_float_lt(a, b) == -1)
     271       
     272        float_t sa;
     273        float_t sb;
     274       
     275        sa.val = a;
     276        sb.val = b;
     277        psc->data = div_float(sa.data, sb.data);
     278}
     279
     280static void double_add_operator(double a, double b, double *pc, double_t *psc)
     281{
     282        *pc = a + b;
     283       
     284        double_t sa;
     285        double_t sb;
     286       
     287        sa.val = a;
     288        sb.val = b;
     289        if (sa.data.parts.sign == sb.data.parts.sign)
     290                psc->data = add_double(sa.data, sb.data);
     291        else if (sa.data.parts.sign) {
     292                sa.data.parts.sign = 0;
     293                psc->data = sub_double(sb.data, sa.data);
     294        } else {
     295                sb.data.parts.sign = 0;
     296                psc->data = sub_double(sa.data, sb.data);
     297        }
     298}
     299
     300static void double_mul_operator(double a, double b, double *pc, double_t *psc)
     301{
     302        *pc = a * b;
     303       
     304        double_t sa;
     305        double_t sb;
     306       
     307        sa.val = a;
     308        sb.val = b;
     309        psc->data = mul_double(sa.data, sb.data);
     310}
     311
     312static void double_div_operator(double a, double b, double *pc, double_t *psc)
     313{
     314        if ((cmptype_t) b == 0) {
     315                *pc = 0.0;
     316                psc->val = 0.0;
     317                return;
     318        }
     319
     320        *pc = a / b;
     321       
     322        double_t sa;
     323        double_t sb;
     324       
     325        sa.val = a;
     326        sb.val = b;
     327        psc->data = div_double(sa.data, sb.data);
     328}
     329
     330static void
     331double_cmp_operator(double a, double b, cmptype_t *pis, cmptype_t *piss)
     332{
     333        *pis = dcmp(a, b);
     334
     335        double_t sa;
     336        double_t sb;
     337
     338        sa.val = a;
     339        sb.val = b;
     340
     341        if (is_double_lt(sa.data, sb.data))
    286342                *piss = -1;
    287         else if (is_float_gt(a, b) == 1)
     343        else if (is_double_gt(sa.data, sb.data))
    288344                *piss = 1;
    289         else if (is_float_eq(a, b) == 0)
     345        else if (is_double_eq(sa.data, sb.data))
    290346                *piss = 0;
    291347        else
     
    293349}
    294350
    295 static void double_add_operator(double a, double b, double *pc, double *psc)
    296 {
    297         *pc = a + b;
    298         *psc = add_double(a, b);
    299 }
    300 
    301 static void double_sub_operator(double a, double b, double *pc, double *psc)
    302 {
    303         *pc = a - b;
    304         *psc = sub_double(a, b);
    305 }
    306 
    307 static void double_mul_operator(double a, double b, double *pc, double *psc)
    308 {
    309         *pc = a * b;
    310         *psc = mul_double(a, b);
    311 }
    312 
    313 static void double_div_operator(double a, double b, double *pc, double *psc)
    314 {
    315         if ((cmptype_t) b == 0) {
    316                 *pc = 0.0;
    317                 *psc = 0.0;
    318                 return;
    319         }
    320        
    321         *pc = a / b;
    322         *psc = div_double(a, b);
    323 }
    324 
    325 static void double_cmp_operator(double a, double b, cmptype_t *pis,
    326     cmptype_t *piss)
    327 {
    328         *pis = dcmp(a, b);
    329        
    330         if (is_double_lt(a, b) == -1)
    331                 *piss = -1;
    332         else if (is_double_gt(a, b) == 1)
    333                 *piss = 1;
    334         else if (is_double_eq(a, b) == 0)
    335                 *piss = 0;
    336         else
    337                 *piss = 42;
    338 }
    339 
    340351const char *test_softfloat1(void)
    341352{
    342         bool err = false;
    343        
     353        const char *err = NULL;
     354
    344355        if (!test_template_binary(float_template_binary, float_add_operator)) {
    345                 err = true;
    346                 TPRINTF("%s\n", "Float addition failed");
    347         }
    348        
    349         if (!test_template_binary(float_template_binary, float_sub_operator)) {
    350                 err = true;
    351                 TPRINTF("%s\n", "Float addition failed");
    352         }
    353        
     356                err = "Float addition failed";
     357                TPRINTF("%s\n", err);
     358        }
    354359        if (!test_template_binary(float_template_binary, float_mul_operator)) {
    355                 err = true;
    356                 TPRINTF("%s\n", "Float multiplication failed");
    357         }
    358        
     360                err = "Float multiplication failed";
     361                TPRINTF("%s\n", err);
     362        }
    359363        if (!test_template_binary(float_template_binary, float_div_operator)) {
    360                 err = true;
    361                 TPRINTF("%s\n", "Float division failed");
    362         }
    363        
    364         if (!test_template_binary(float_compare_template, float_cmp_operator)) {
    365                 err = true;
    366                 TPRINTF("%s\n", "Float comparison failed");
    367         }
    368        
     364                err = "Float division failed";
     365                TPRINTF("%s\n", err);
     366        }
    369367        if (!test_template_binary(double_template_binary, double_add_operator)) {
    370                 err = true;
    371                 TPRINTF("%s\n", "Double addition failed");
    372         }
    373        
    374         if (!test_template_binary(double_template_binary, double_sub_operator)) {
    375                 err = true;
    376                 TPRINTF("%s\n", "Double addition failed");
    377         }
    378        
     368                err = "Double addition failed";
     369                TPRINTF("%s\n", err);
     370        }
    379371        if (!test_template_binary(double_template_binary, double_mul_operator)) {
    380                 err = true;
    381                 TPRINTF("%s\n", "Double multiplication failed");
    382         }
    383        
     372                err = "Double multiplication failed";
     373                TPRINTF("%s\n", err);
     374        }
    384375        if (!test_template_binary(double_template_binary, double_div_operator)) {
    385                 err = true;
    386                 TPRINTF("%s\n", "Double division failed");
    387         }
    388        
     376                err = "Double division failed";
     377                TPRINTF("%s\n", err);
     378        }
    389379        if (!test_template_binary(double_compare_template, double_cmp_operator)) {
    390                 err = true;
    391                 TPRINTF("%s\n", "Double comparison failed");
    392         }
    393        
     380                err = "Double comparison failed";
     381                TPRINTF("%s\n", err);
     382        }
    394383        if (!test_template_unary(uint_to_double_template,
    395384            uint_to_double_operator)) {
    396                 err = true;
    397                 TPRINTF("%s\n", "Conversion from unsigned int to double failed");
    398         }
    399        
     385                err = "Conversion from unsigned int to double failed";
     386                TPRINTF("%s\n", err);
     387        }
    400388        if (!test_template_unary(double_to_uint_template,
    401389            double_to_uint_operator)) {
    402                 err = true;
    403                 TPRINTF("%s\n", "Conversion from double to unsigned int failed");
    404         }
    405        
     390                err = "Conversion from double to unsigned int failed";
     391                TPRINTF("%s\n", err);
     392        }
    406393        if (!test_template_unary(double_to_uint_template,
    407394            double_to_int_operator)) {
    408                 err = true;
    409                 TPRINTF("%s\n", "Conversion from double to signed int failed");
    410         }
    411        
    412         if (err)
    413                 return "Software floating point imprecision";
    414        
    415         return NULL;
    416 }
     395                err = "Conversion from double to signed int failed";
     396                TPRINTF("%s\n", err);
     397        }
     398       
     399        return err;
     400}
     401
Note: See TracChangeset for help on using the changeset viewer.