111 lines
3.7 KiB
C
111 lines
3.7 KiB
C
/* hp3000_cpu_fp.h: HP 3000 floating-point interface declarations
|
|
|
|
Copyright (c) 2016, J. David Bryan
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Except as contained in this notice, the name of the author shall not be used
|
|
in advertising or otherwise to promote the sale, use or other dealings in
|
|
this Software without prior written authorization from the author.
|
|
|
|
21-Jan-16 JDB First release version
|
|
29-Mar-15 JDB Created
|
|
|
|
|
|
This file contains declarations used by the CPU to interface with the
|
|
floating-point operations executor.
|
|
*/
|
|
|
|
|
|
|
|
/* Program constants */
|
|
|
|
#define SIGN_BIT 0100000
|
|
#define EXPONENT_BITS 0077700
|
|
#define ASSUMED_BIT 0000100
|
|
#define FRACTION_BITS 0000077
|
|
|
|
|
|
/* Operand precisions:
|
|
|
|
- S = 1-word integer
|
|
- D = 2-word integer
|
|
- F = 2-word single-precision floating-point
|
|
- X = 3-word extended-precision floating-point
|
|
- E = 4-word double-precision floating-point
|
|
|
|
|
|
Implementation notes:
|
|
|
|
1. The ordering of the enumeration constants is important, as we depend on
|
|
the "fp" type codes to reflect the number of words used by the packed
|
|
representation.
|
|
*/
|
|
|
|
typedef enum {
|
|
in_s = 0, /* 1-word integer */
|
|
in_d = 1, /* 2-word integer */
|
|
fp_f = 2, /* 2-word single-precision floating-point */
|
|
fp_x = 3, /* 3-word extended-precision floating-point */
|
|
fp_e = 4 /* 4-word double-precision floating-point */
|
|
} FP_OPSIZE;
|
|
|
|
|
|
/* Conversion from operand size to word count */
|
|
|
|
#define TO_COUNT(s) ((uint32) (s + (s < fp_f)))
|
|
|
|
|
|
/* Floating point operations */
|
|
|
|
typedef enum {
|
|
fp_add,
|
|
fp_sub,
|
|
fp_mpy,
|
|
fp_div,
|
|
fp_flt,
|
|
fp_fixr,
|
|
fp_fixt
|
|
} FP_OPR;
|
|
|
|
|
|
/* General operand.
|
|
|
|
An in-memory representation of an integer or packed floating-point number.
|
|
An actual value will use one, two, three, or four words, as indicated by the
|
|
"precision" specified.
|
|
|
|
"trap" is significant only for result values; it is ignored for operand
|
|
values. A good result will have trap_None.
|
|
*/
|
|
|
|
typedef struct {
|
|
HP_WORD words [4]; /* integer or floating-point value */
|
|
FP_OPSIZE precision; /* operand size descriptor */
|
|
uint32 trap; /* validity of the result */
|
|
} FP_OPND;
|
|
|
|
|
|
/* Special operands */
|
|
|
|
static const FP_OPND FP_NOP = { { 0, 0, 0, 0 }, in_s, trap_None }; /* an unneeded operand */
|
|
|
|
|
|
/* Floating-point global routines */
|
|
|
|
extern FP_OPND fp_exec (FP_OPR operator, FP_OPND left, FP_OPND right);
|