Annotation of nono/fpe/fpu_cmp.c, revision 1.1.1.1

1.1       root        1: /*     $NetBSD$        */
                      2: 
                      3: /*
                      4:  * Copyright (C) 2019 Y.Sugahara (moveccr). All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  * 1. Redistributions of source code must retain the above copyright
                     10:  *    notice, this list of conditions and the following disclaimer.
                     11:  * 2. Redistributions in binary form must reproduce the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer in the
                     13:  *    documentation and/or other materials provided with the distribution.
                     14:  *
                     15:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     16:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     17:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     18:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     19:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
                     20:  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
                     21:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
                     22:  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
                     23:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     24:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     25:  * SUCH DAMAGE.
                     26:  */
                     27: 
                     28: #include "fpu_emulate.h"
                     29: 
                     30: struct fpn *
                     31: fpu_cmp(struct fpemu *fe)
                     32: {
                     33:        struct fpn *x = &fe->fe_f1, *y = &fe->fe_f2;
                     34:        int N;
                     35:        int Z;
                     36: 
                     37:        N = x->fp_sign;
                     38:        Z = 0;
                     39: 
                     40:        if (ISNAN(x)) {
                     41:                return x;
                     42:        } else if (ISNAN(y)) {
                     43:                return y;
                     44:        } else if (ISINF(x)) {
                     45:                /* dst:INF src:NUM,ZERO,INF */
                     46:                Z = ISINF(y) && (x->fp_sign == y->fp_sign);
                     47:        } else if (ISINF(y)) {
                     48:                /* dst:NUM,ZERO src:INF */
                     49:                N = !y->fp_sign;
                     50:        } else if (ISZERO(x)) {
                     51:                /* dst:ZERO src:NUM,ZERO */
                     52:                if (ISZERO(y)) {
                     53:                        Z = 1;
                     54:                } else {
                     55:                        N = !y->fp_sign;
                     56:                }
                     57:        } else if (ISZERO(y)) {
                     58:                /* dst:NUM src:ZERO */
                     59:                /* nop. done by initial */
                     60:        } else {
                     61:                /* dst:NUM src:NUM */
                     62:                if (x->fp_sign != y->fp_sign) {
                     63:                        /* dst:+ src:- or dst:- src:+ */
                     64:                        /* nop. done by initial */
                     65:                } else {
                     66:                        /* dst:+ src:+ or dst:- src:- */
                     67:                        if (x->fp_exp > y->fp_exp) {
                     68:                                /* nop. done by initial */
                     69:                        } else if (x->fp_exp < y->fp_exp) {
                     70:                                N = !N;
                     71:                        } else {
                     72:                                /* if block when nop, done by initial */
                     73:                                if (x->fp_mant[0] > y->fp_mant[0]) {
                     74:                                } else if (x->fp_mant[0] < y->fp_mant[0]) {
                     75:                                        N = !N;
                     76:                                } else if (x->fp_mant[1] > y->fp_mant[1]) {
                     77:                                } else if (x->fp_mant[1] < y->fp_mant[1]) {
                     78:                                        N = !N;
                     79:                                } else if (x->fp_mant[2] > y->fp_mant[2]) {
                     80:                                } else if (x->fp_mant[2] < y->fp_mant[2]) {
                     81:                                        N = !N;
                     82:                                } else {
                     83:                                        Z = 1;
                     84:                                }
                     85:                        }
                     86:                }
                     87:        }
                     88:        if (Z) {
                     89:                x->fp_class = FPC_ZERO;
                     90:        } else {
                     91:                /* Any non-zero value */
                     92:                x->fp_class = FPC_NUM;
                     93:                x->fp_exp = 0;
                     94:                x->fp_mant[0] = FP_1;
                     95:                x->fp_mant[1] = 0;
                     96:                x->fp_mant[2] = 0;
                     97:        }
                     98:        x->fp_sign = N;
                     99: 
                    100:        return x;
                    101: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.