[BACK]Return to fpu_fstore.c CVS log [TXT][DIR] Up to [local] / sys / arch / m68k / fpe

Annotation of sys/arch/m68k/fpe/fpu_fstore.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: fpu_fstore.c,v 1.6 2006/06/11 20:43:28 miod Exp $     */
                      2: /*     $NetBSD: fpu_fstore.c,v 1.8 2003/07/15 02:43:10 lukem Exp $     */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995 Ken Nakata
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  *
                     17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     19:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     20:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     21:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     22:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     23:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     24:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     25:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     26:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     27:  */
                     28:
                     29: #include <sys/types.h>
                     30: #include <sys/signal.h>
                     31: #include <sys/systm.h>
                     32: #include <machine/frame.h>
                     33:
                     34: #include <m68k/fpe/fpu_emulate.h>
                     35:
                     36: /*
                     37:  * type 0: fmove mem/fpr->fpr
                     38:  * In this function, we know
                     39:  *     (opcode & 0x01c0) == 0
                     40:  *     (word1 & 0xe000) == 0x6000
                     41:  */
                     42: int
                     43: fpu_emul_fstore(struct fpemu *fe, struct instruction *insn, int *typ)
                     44: {
                     45:     struct frame *frame = fe->fe_frame;
                     46:     u_int *fpregs = fe->fe_fpframe->fpf_regs;
                     47:     int word1, sig;
                     48:     int regnum;
                     49:     int format;
                     50:     u_int buf[3];
                     51:
                     52: #if DEBUG_FPE
                     53:     printf("  fpu_emul_fstore: frame at %p fpframe at %p\n",
                     54:           frame, fe->fe_fpframe);
                     55: #endif
                     56:
                     57:     word1 = insn->is_word1;
                     58:     format = (word1 >> 10) & 7;
                     59:     regnum = (word1 >> 7) & 7;
                     60:
                     61:     insn->is_advance = 4;
                     62:
                     63:     if (format == FTYPE_DBL) {
                     64:        insn->is_datasize = 8;
                     65:     } else if (format == FTYPE_SNG || format == FTYPE_LNG) {
                     66:        insn->is_datasize = 4;
                     67:     } else if (format == FTYPE_WRD) {
                     68:        insn->is_datasize = 2;
                     69:        format = FTYPE_LNG;
                     70:     } else if (format == FTYPE_BYT) {
                     71:        insn->is_datasize = 1;
                     72:        format = FTYPE_LNG;
                     73:     } else if (format == FTYPE_EXT) {
                     74:        insn->is_datasize = 12;
                     75:     } else {
                     76:        /* invalid or unsupported operand format */
                     77: #if DEBUG_FPE
                     78:        printf("  fpu_emul_fstore: invalid format %d\n", format);
                     79: #endif
                     80:        *typ = ILL_ILLOPN;
                     81:        sig = SIGILL;
                     82:     }
                     83: #if DEBUG_FPE
                     84:     printf("  fpu_emul_fstore: format %d, size %d\n",
                     85:           format, insn->is_datasize);
                     86: #endif
                     87:
                     88:     fe->fe_fpsr &= ~FPSR_EXCP;
                     89:
                     90:     /* Get effective address. (modreg=opcode&077) */
                     91:     sig = fpu_decode_ea(frame, insn, &insn->is_ea, insn->is_opcode, typ);
                     92:     if (sig) {
                     93: #if DEBUG_FPE
                     94:        printf("  fpu_emul_fstore: failed in decode_ea sig=%d\n", sig);
                     95: #endif
                     96:        return sig;
                     97:     }
                     98:
                     99:     if (insn->is_datasize > 4 && insn->is_ea.ea_flags == EA_DIRECT) {
                    100:        /* trying to store dbl or ext into a data register */
                    101: #ifdef DEBUG
                    102:        printf("  fpu_fstore: attempted to store dbl/ext to reg\n");
                    103: #endif
                    104:        return SIGILL;
                    105:     }
                    106:
                    107: #if DEBUG_FPE
                    108:     printf("  fpu_emul_fstore: saving FP%d (%08x,%08x,%08x)\n",
                    109:           regnum, fpregs[regnum * 3], fpregs[regnum * 3 + 1],
                    110:           fpregs[regnum * 3 + 2]);
                    111: #endif
                    112:     fpu_explode(fe, &fe->fe_f3, FTYPE_EXT, &fpregs[regnum * 3]);
                    113: #if DEBUG_FPE
                    114:     {
                    115:        static char *class_name[] = { "SNAN", "QNAN", "ZERO", "NUM", "INF" };
                    116:        printf("  fpu_emul_fstore: fpn (%s,%c,%d,%08x,%08x,%08x)\n",
                    117:               class_name[fe->fe_f3.fp_class + 2],
                    118:               fe->fe_f3.fp_sign ? '-' : '+', fe->fe_f3.fp_exp,
                    119:               fe->fe_f3.fp_mant[0], fe->fe_f3.fp_mant[1],
                    120:               fe->fe_f3.fp_mant[2]);
                    121:     }
                    122: #endif
                    123:     fpu_implode(fe, &fe->fe_f3, format, buf);
                    124:
                    125:     fpu_store_ea(frame, insn, &insn->is_ea, (char *)buf);
                    126: #if DEBUG_FPE
                    127:     printf("  fpu_emul_fstore: %08x,%08x,%08x size %d\n",
                    128:           buf[0], buf[1], buf[2], insn->is_datasize);
                    129: #endif
                    130:
                    131:     return 0;
                    132: }

CVSweb