Annotation of 43BSDReno/old/games.vax/compat/dofloat.c, revision 1.1

1.1     ! root        1: #ifndef        lint
        !             2: static char sccsid[] = "       dofloat.c       4.3     88/04/24        ";
        !             3: #endif
        !             4: 
        !             5: /* From Lou Salkind: compat/RCS/dofloat.c,v 1.2 84/01/31 13:33:53 */
        !             6: 
        !             7: /*
        !             8:  * Partial PDP-11 floating-point simulator.  Always in double mode,
        !             9:  * chop mode.  All arithmetic done in double-precision. Storing longs
        !            10:  * into or taking longs from general registers doesn't work.
        !            11:  * Overflow is never detected.
        !            12:  */
        !            13: 
        !            14: #include <stdio.h>
        !            15: #include "defs.h"
        !            16: 
        !            17: #define TRUE 1
        !            18: #define FALSE 0
        !            19: 
        !            20: #define ABSD   0170600
        !            21: #define ADDD   0172000
        !            22: #define CFCC   0170000
        !            23: #define CLRD   0170400
        !            24: #define CMPD   0173400
        !            25: #define DIVD   0174400
        !            26: #define LDCFD  0177400
        !            27: #define LDCLD  0177000
        !            28: #define LDD    0172400
        !            29: #define LDEXP  0176400
        !            30: #define MODD   0171400
        !            31: #define MULD   0171000
        !            32: #define NEGD   0170700
        !            33: #define SETD   0170011
        !            34: #define SETI   0170002
        !            35: #define SETL   0170012
        !            36: #define STCDL  0175400
        !            37: #define STCDF  0176000
        !            38: #define STD    0174000
        !            39: #define STEXP  0175000
        !            40: #define SUBD   0173000
        !            41: #define TSTD   0170500
        !            42: 
        !            43: static struct {
        !            44:        unsigned fc :1;
        !            45:        unsigned fv :1;
        !            46:        unsigned fz :1;
        !            47:        unsigned fn :1;
        !            48:        unsigned fmm :1;
        !            49:        unsigned ft :1;
        !            50:        unsigned fl :1;
        !            51:        unsigned fd :1;
        !            52: } fps;
        !            53: 
        !            54: #define FZ fps.fz
        !            55: #define FN fps.fn
        !            56: #define FL fps.fl
        !            57: #define FD fps.fd
        !            58: 
        !            59: #define LMODE FL
        !            60: #define IMODE (!LMODE)
        !            61: 
        !            62: static double fregs[6];
        !            63: 
        !            64: dofloat(instr)
        !            65: unsigned int instr;
        !            66: {
        !            67:        int mode, reg, ac;
        !            68:        unsigned short * x, * resolve();
        !            69:        long fliplong();
        !            70: #define DOUBLE (*((double *)x))
        !            71: #define FLOAT (*(float *)x)
        !            72: #define LONG (*(long *)x)
        !            73: #define SHORT (*(short *)x)
        !            74: #define GETDOUBLE (x = resolve(mode, reg, 8, TRUE))
        !            75: #define GETFLOAT (x = resolve(mode, reg, 4, TRUE))
        !            76: #define GETLONG (x = resolve(mode, reg, 4, FALSE))
        !            77: #define GETSHORT (x = resolve(mode, reg, 2, FALSE))
        !            78: #define FREG fregs[ac]
        !            79:        double temp;
        !            80:        union {
        !            81:                double d;
        !            82:                short s;
        !            83:        } bits;
        !            84: 
        !            85:        switch (instr & 0170000) {
        !            86:        case 0170000:
        !            87:                break;
        !            88:        default:
        !            89:                fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
        !            90:                return (-1);
        !            91:        }
        !            92: 
        !            93:        switch (instr & 07000) {
        !            94:        case 0:
        !            95:                switch (instr & 0700) {
        !            96:                case 0:
        !            97:                        switch (instr) {
        !            98:                        case CFCC:
        !            99:                                psl &= ~017;
        !           100:                                if (FN) {
        !           101:                                        psl |= 010;
        !           102:                                }
        !           103:                                if (FZ) {
        !           104:                                        psl |= 04;
        !           105:                                }
        !           106:                                return (0);
        !           107:                        case SETD:
        !           108:                                FD = TRUE;
        !           109:                                return (0);
        !           110:                        case SETI:
        !           111:                                FL = FALSE;
        !           112:                                return (0);
        !           113:                        case SETL:
        !           114:                                FL = TRUE;
        !           115:                                return (0);
        !           116:                        default:
        !           117:                                fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
        !           118:                                return (-1);
        !           119:                        }
        !           120:                default:
        !           121:                        break;
        !           122:                }
        !           123: 
        !           124:                mode = (instr & 070) >> 3;
        !           125:                reg = instr & 07;
        !           126: 
        !           127:                switch (instr & 0177700) {
        !           128:                case ABSD:
        !           129:                        GETDOUBLE;
        !           130:                        if (DOUBLE < 0.0) {
        !           131:                                DOUBLE = -DOUBLE;
        !           132:                        }
        !           133:                        FZ = (DOUBLE == 0.0);
        !           134:                        FN = (DOUBLE < 0.0);
        !           135:                        return (0);
        !           136:                case CLRD:
        !           137:                        GETDOUBLE;
        !           138:                        DOUBLE = 0.0;
        !           139:                        FZ = TRUE;
        !           140:                        FN = FALSE;
        !           141:                        return (0);
        !           142:                case NEGD:
        !           143:                        GETDOUBLE;
        !           144:                        DOUBLE = -DOUBLE;
        !           145:                        FZ = (DOUBLE == 0.0);
        !           146:                        FN = (DOUBLE < 0.0);
        !           147:                        return (0);
        !           148:                case TSTD:
        !           149:                        GETDOUBLE;
        !           150:                        FZ = (DOUBLE == 0.0);
        !           151:                        FN = (DOUBLE < 0.0);
        !           152:                        return (0);
        !           153:                default:
        !           154:                        fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
        !           155:                        return (-1);
        !           156:                }
        !           157:        default:
        !           158:                break;
        !           159:        }
        !           160: 
        !           161:        ac = (instr & 0300) >> 6;
        !           162:        mode = (instr & 070) >> 3;
        !           163:        reg = instr & 07;
        !           164: 
        !           165:        switch (instr & 0177400) {
        !           166:        case ADDD:
        !           167:                GETDOUBLE;
        !           168:                FREG += DOUBLE;
        !           169:                FZ = (FREG == 0.0);
        !           170:                FN = (FREG < 0.0);
        !           171:                return (0);
        !           172:        case CMPD:
        !           173:                GETDOUBLE;
        !           174:                FZ = (DOUBLE == FREG);
        !           175:                FN = (DOUBLE < FREG);
        !           176:                return (0);
        !           177:        case DIVD:
        !           178:                GETDOUBLE;
        !           179:                FREG /= DOUBLE;
        !           180:                FZ = (FREG == 0.0);
        !           181:                FN = (FREG < 0.0);
        !           182:                return (0);
        !           183:        case LDCFD:
        !           184:                GETFLOAT;
        !           185:                FREG = FLOAT;
        !           186:                FZ = (FREG == 0.0);
        !           187:                FN = (FREG < 0.0);
        !           188:                return (0);
        !           189:        case LDCLD:
        !           190:                if (IMODE) {
        !           191:                        GETSHORT;
        !           192:                        FREG = SHORT;
        !           193:                } else {
        !           194:                        GETLONG;
        !           195:                        FREG = fliplong(LONG);
        !           196:                }
        !           197:                FZ = (FREG == 0.0);
        !           198:                FN = (FREG < 0.0);
        !           199:                return (0);
        !           200:        case LDD:
        !           201:                GETDOUBLE;
        !           202:                FREG = DOUBLE;
        !           203:                FZ = (FREG == 0.0);
        !           204:                FN = (FREG < 0.0);
        !           205:                return (0);
        !           206:        case LDEXP:
        !           207:                GETSHORT;
        !           208:                bits.d = FREG;
        !           209:                bits.s &= ~077600;
        !           210:                bits.s |= (SHORT + 0200) << 7;
        !           211:                FREG = bits.d;
        !           212:                FZ = (SHORT == 0);
        !           213:                FN = (FREG < 0.0);
        !           214:                return (0);
        !           215:        case MODD:
        !           216:                GETDOUBLE;
        !           217:                temp = FREG * DOUBLE;
        !           218:                fregs[ac|1] = (long) temp;
        !           219:                FREG = temp - (long) temp;
        !           220:                FZ = (FREG == 0.0);
        !           221:                FN = (FREG < 0.0);
        !           222:                return (0);
        !           223:        case MULD:
        !           224:                GETDOUBLE;
        !           225:                FREG = FREG * DOUBLE;
        !           226:                FZ = (FREG == 0.0);
        !           227:                FN = (FREG < 0.0);
        !           228:                return (0);
        !           229:        case STCDF:
        !           230:                GETFLOAT;
        !           231:                FLOAT = FREG;
        !           232:                FZ = (FREG == 0.0);
        !           233:                FN = (FREG < 0.0);
        !           234:                return (0);
        !           235:        case STCDL:
        !           236:                if (IMODE) {
        !           237:                        GETSHORT;
        !           238:                        SHORT = FREG;
        !           239:                        psl &= ~017;
        !           240:                        if (SHORT == 0) {
        !           241:                                psl |= 04;
        !           242:                        }
        !           243:                        if (SHORT < 0) {
        !           244:                                psl |= 010;
        !           245:                        }
        !           246:                } else {
        !           247:                        GETLONG;
        !           248:                        LONG = fliplong((long) FREG);
        !           249:                        psl &= ~017;
        !           250:                        if (fliplong(LONG) == 0) {
        !           251:                                psl |= 04;
        !           252:                        }
        !           253:                        if (fliplong(LONG) < 0) {
        !           254:                                psl |= 010;
        !           255:                        }
        !           256:                }
        !           257:                FZ = (FREG == 0.0);
        !           258:                FN = (FREG < 0.0);
        !           259:                return (0);
        !           260:        case STD:
        !           261:                GETDOUBLE;
        !           262:                DOUBLE = FREG;
        !           263:                return (0);
        !           264:        case STEXP:
        !           265:                GETSHORT;
        !           266:                bits.d = FREG;
        !           267:                SHORT = ((bits.s & 077600) >> 7) - 0200;
        !           268:                FZ = (SHORT == 0);
        !           269:                FN = (SHORT < 0);
        !           270:                psl &= ~017;
        !           271:                if (FZ) {
        !           272:                        psl |= 04;
        !           273:                }
        !           274:                if (FN) {
        !           275:                        psl |= 010;
        !           276:                }
        !           277:                return (0);
        !           278:        case SUBD:
        !           279:                GETDOUBLE;
        !           280:                FREG -= DOUBLE;
        !           281:                FZ = (FREG == 0.0);
        !           282:                FN = (FREG < 0.0);
        !           283:                return (0);
        !           284:        default:
        !           285:                fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
        !           286:                return (-1);
        !           287:        }
        !           288: }
        !           289: 
        !           290: unsigned short *
        !           291: resolve(mode, reg, bytes, floating)
        !           292: {
        !           293:        static unsigned short *x;
        !           294:        static union {
        !           295:                double d;
        !           296:                unsigned short s;
        !           297:        } bits;
        !           298: 
        !           299:        switch (mode) {
        !           300:        case 0:
        !           301:                if (floating) {
        !           302:                        if (bytes != 8) {
        !           303:                                fprintf(stderr, "Bad length in dofloat\n");
        !           304:                                return ((unsigned short *) -1);
        !           305:                        }
        !           306:                        x = (unsigned short *) &fregs[reg];
        !           307:                } else {
        !           308:                        if (bytes != 2) {
        !           309:                                fprintf(stderr, "Bad length in dofloat\n");
        !           310:                                return ((unsigned short *) -1);
        !           311:                        }
        !           312:                        x = (unsigned short *) &regs[reg];
        !           313:                }
        !           314:                break;
        !           315:        case 1:
        !           316:                x = (unsigned short *) regs[reg];
        !           317:                break;
        !           318:        case 2:
        !           319:                if (reg == 7 && floating) {
        !           320:                        bits.d = 0.0;
        !           321:                        bits.s = *(unsigned short *) regs[7];
        !           322:                        x = (unsigned short *) &bits;
        !           323:                        regs[7] += 2;
        !           324:                        pc = (unsigned short *) regs[7];
        !           325:                } else {
        !           326:                        x = (unsigned short *) regs[reg];
        !           327:                        regs[reg] += bytes;
        !           328:                        if (reg == 7) {
        !           329:                                if (bytes != 2) {
        !           330:                                        return((unsigned short *) -1);
        !           331:                                }
        !           332:                                pc = (unsigned short *) regs[7];
        !           333:                        }
        !           334:                }
        !           335:                break;
        !           336:        case 3:
        !           337:                x = (unsigned short *) regs[reg];
        !           338:                x = (unsigned short *) *x;
        !           339:                regs[reg] += 2;
        !           340:                if (reg == 7) {
        !           341:                        pc = (unsigned short *) regs[7];
        !           342:                }
        !           343:                break;
        !           344:        case 4:
        !           345:                regs[reg] -= bytes;
        !           346:                if (reg == 7) {
        !           347:                        pc = (unsigned short *) regs[7];
        !           348:                }
        !           349:                x = (unsigned short *) regs[reg];
        !           350:                break;
        !           351:        case 5:
        !           352:                regs[reg] -= 2;
        !           353:                if (reg == 7) {
        !           354:                        pc = (unsigned short *) regs[7];
        !           355:                }
        !           356:                x = (unsigned short *) regs[reg];
        !           357:                x = (unsigned short *) *x;
        !           358:                break;
        !           359:        case 6:
        !           360:                x = (unsigned short *) (unsigned short) (regs[reg] + *(pc++));
        !           361:                if (reg == 7) {
        !           362:                        ++x;
        !           363:                }
        !           364:                break;
        !           365:        case 7:
        !           366:                x = (unsigned short *) (unsigned short) (regs[reg] + *(pc++));
        !           367:                if (reg == 7) {
        !           368:                        ++x;
        !           369:                }
        !           370:                x = (unsigned short *) *x;
        !           371:                break;
        !           372:        }
        !           373: 
        !           374:        return (x);
        !           375: }
        !           376: 
        !           377: long
        !           378: fliplong(l)
        !           379: long l;
        !           380: {
        !           381:        union {
        !           382:                long l;
        !           383:                short s[2];
        !           384:        } bits[2];
        !           385: 
        !           386:        bits[0].l = l;
        !           387:        bits[1].s[1] = bits[0].s[0];
        !           388:        bits[1].s[0] = bits[0].s[1];
        !           389:        return (bits[1].l);
        !           390: }

unix.superglobalmegacorp.com

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