OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openrisc/tags/gnu-src/newlib-1.18.0/newlib-1.18.0-or32-1.0rc1/newlib/libc/sys/a29khif/sys
    from Rev 207 to Rev 345
    Reverse comparison

Rev 207 → Rev 345

/fpsymbol.h
0,0 → 1,2970
; @(#)fpsymbol.h 1.4 90/10/14 20:55:59, Copyright 1989, 1990 AMD
; start of fpsymbol.h file
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Copyright 1989, 1990 Advanced Micro Devices, Inc.
;
; This software is the property of Advanced Micro Devices, Inc (AMD) which
; specifically grants the user the right to modify, use and distribute this
; software provided this notice is not removed or altered. All other rights
; are reserved by AMD.
;
; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS
; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL
; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR
; USE OF THIS SOFTWARE.
;
; So that all may benefit from your experience, please report any problems
; or suggestions about this software to the 29K Technical Support Center at
; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or
; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118.
;
; Advanced Micro Devices, Inc.
; 29K Support Products
; Mail Stop 573
; 5900 E. Ben White Blvd.
; Austin, TX 78741
; 800-292-9263
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; ______________________________________________________________________
;|______________________________________________________________________|
;| |
;| SYMBOLS FOR DEFINING THE INSTRUCTION WORD |
;| |
;|______________________________________________________________________|
;|______________________________________________________________________|
;
;
; Revision Information:
;------------------------------------------------------------------------
; Date: March 31, 1989
; Author: Roy Carlson per Bob Perlman and Richard Relph
;
; The symbols section describing transactions was modified to contain
; several new symbol values. The reason for the change was to force the
; CA bit to be set--and remain set--once code accesses the coprocessor.
;
; Future operating systems will use the Coprocessor Active (CA) bit in
; the Old Processor Status Register to determine whether or not to save
; coprocessor state, etc.. This means that the instruction control field
; Set Coprocessor Active (SA) bit should be used as follows:
;
; (1) any coprocessor STORE must have its SA bit set to 1,
; so as to set CA,
;
; and (2) any coprocessor LOAD must have its SA bit set to 0,
; so as to prevent clearing CA.
;------------------------------------------------------------------------
; Date: 89/01/30 12:32:13; author: jim; lines added/del: 5/4
; Corrected CP_IEEE_GRADUAL_UFLOW_MODE and CP_RMS_MASK.
; Added CP_EXCPS_POSITION, the ls bit of the CP_XXX_EXCP ensemble.
; fixed a few typos in comments.
;------------------------------------------------------------------------
; Date: 89/01/23 18:00:26; author: jim; lines added/del: 488/468
; Richard O. Parker
; January 5, 1989
;
; 1) The _cp_prec_field in the "cp_build_inst", "cp_build_inst_h"
; and "cp_build_inst_l" macros was not being defined in the case
; of Am29K-supported floating-point instructions (e.g., FADD, FSUB,
; DADD, etc.).
;
; 2) The multiplexor select codes in the opcode table entries
; associated with the "cp_build_inst", "cp_build_inst_h" and
; "cp_build_inst_l" macros, pertaining to the CONVERT_F_TO_D
; and CONVERT_D_TO_F instructions were incorrect.
;------------------------------------------------------------------------
; Date: 88/12/20 14:28:26; author: jim; lines added/del: 1/1
; Larry Westerman corrected definition of CP_MOVE_P.
; Version required for Release 1.1 of the Intrinsics shipped 12/12/88.
;------------------------------------------------------------------------
; Date: 88/11/18 15:44:45; author: law;
; Initial revision
;
;
;========================================================================
;
; The following mnemonics are used to specify the 14 LSBs of the
; instruction word (fields SIP, SIQ, SIT, SIF, IF, and CO).
;
;========================================================================
;
; floating point operation codes.
;
.equ CP_PASS_P, 0x00000000 ; pass P
.equ CP_MINUSP, 0x00000040 ; -P
.equ CP_ABSP, 0x00000080 ; |P|
.equ CP_SIGNT_TIMES_ABSP, 0x00000C00 ; SIGN(T) * |P|
;
.equ CP_P_PLUS_T, 0x00000001 ; P + T
.equ CP_P_MINUS_T, 0x00000101 ; P - T
.equ CP_MINUSP_PLUS_T, 0x00001001 ; -P + T
.equ CP_MINUSP_MINUS_T, 0x00001101 ; -P - T
.equ CP_ABS_P_PLUS_T, 0x00000081 ; |P + T|
.equ CP_ABS_P_MINUS_T, 0x00000181 ; |P - T|
.equ CP_ABSP_PLUS_ABST, 0x00002201 ; |P| + |T|
.equ CP_ABSP_MINUS_ABST, 0x00002301 ; |P| - |T|
.equ CP_ABS_ABSP_MINUS_ABST, 0x00002381 ; ||P| - |T||
;
.equ CP_P_TIMES_Q, 0x00000002 ; P * Q
.equ CP_MINUSP_TIMES_Q, 0x00001002 ; -P * Q
.equ CP_ABS_P_TIMES_Q, 0x00000082 ; |P * Q|
;
.equ CP_COMPARE_P_AND_T, 0x00000103 ; compare P and T
;
.equ CP_MAX_P_AND_T, 0x00000104 ; max P,T
.equ CP_MAX_ABSP_AND_ABST, 0x00002304 ; max |P|, |T|
;
.equ CP_MIN_P_AND_T, 0x00001005 ; min P,T
.equ CP_MIN_ABSP_AND_ABST, 0x00003205 ; min |P|,|T|
.equ CP_LIMIT_P_TO_MAGT, 0x00003A05 ; limit P to magnitude of T
;
.equ CP_CONVERT_T_TO_INT, 0x00000006 ; convert T to integer
;
.equ CP_SCALE_T_TO_INT_BY_Q, 0x00000007 ; scale T to integer by Q
;
.equ CP_PQ_PLUS_T, 0x00000008 ; (P * Q) + T
.equ CP_MINUSPQ_PLUS_T, 0x00001008 ; (-P * Q) + T
.equ CP_PQ_MINUS_T, 0x00000108 ; (P * Q) - T
.equ CP_MINUSPQ_MINUS_T, 0x00001108 ; (-P * Q) - T
.equ CP_ABSPQ_PLUS_ABST, 0x00002A08 ; |(P * Q)| + T
.equ CP_MINUSABSPQ_PLUS_ABST, 0x00003A08 ;-|(P * Q)| + T
.equ CP_ABSPQ_MINUS_ABST, 0x00002B08 ; |(P * Q)| - |T|
;
.equ CP_ROUND_T_TO_INT, 0x00000009 ; round T to integral value
;
.equ CP_RECIPROCAL_OF_P, 0x0000000A ; reciprocal of P
;
.equ CP_CONVERT_T_TO_ALT, 0x0000000B ; convert T to alt. f.p. format
.equ CP_CONVERT_T_FROM_ALT, 0x0000000C ; convert T to alt. f.p. format
;
;
; integer operation codes.
;
.equ CP_I_PASS_P, 0x00000020 ; integer pass P
.equ CP_I_MINUSP, 0x00000060 ; integer -P
.equ CP_I_ABSP, 0x000000A0 ; integer |P|
.equ CP_I_SIGNT_TIMES_ABSP, 0x00000C20 ; integer SIGN(T) * |P|
;
.equ CP_I_P_PLUS_T, 0x00000021 ; integer P + T
.equ CP_I_P_MINUS_T, 0x00000121 ; integer P - T
.equ CP_I_MINUSP_PLUS_T, 0x00001021 ; integer -P + T
.equ CP_I_ABS_P_PLUS_T, 0x000000A1 ; integer |P + T|
.equ CP_I_ABS_P_MINUS_T, 0x000001A1 ; integer |P - T|
;
.equ CP_I_P_TIMES_Q, 0x00000022 ; integer P * Q
;
.equ CP_I_COMPARE_P_AND_T, 0x00000123 ; integer compare P and T
;
.equ CP_I_MAX_P_AND_T, 0x00000124 ; integer max P,T
;
.equ CP_I_MIN_P_AND_T, 0x00001025 ; integer min P,T
;
.equ CP_I_CONVERT_T_TO_FLOAT, 0x00000026 ; integer convert T to f.p.
;
.equ CP_I_SCALE_T_TO_FLOAT_BY_Q, 0x00000027 ; integer scale T to f.p. by Q
;
.equ CP_I_P_OR_T, 0x00000030 ; integer P OR T
;
.equ CP_I_P_AND_T, 0x00000031 ; integer P AND T
;
.equ CP_I_P_XOR_T, 0x00000032 ; integer P XOR T
;
.equ CP_I_NOT_T, 0x00000032 ; integer NOT T
;
.equ CP_I_LSHIFT_P_BY_Q, 0x00000033 ; integer logical shift P by Q
; places
;
.equ CP_I_ASHIFT_P_BY_Q, 0x00000034 ; integer arith. shift P by Q
; places
;
.equ CP_I_FSHIFT_PT_BY_Q, 0x00000035 ; integer funnel shift PT by Q
; places
;
;
; move instruction (f.p. or integer)
;
.equ CP_MOVE_P, 0x00000018 ; move operand P
;
;
;========================================================================
;
; precision codes for the the operands in registers R and S, and for
; the result (instruction word fields IPR, RPR).
;
;========================================================================
;
;
.equ CP_D_S, 0x00008000 ;Double result, single input(s)
.equ CP_S_D, 0x00004000 ;Single result, double input(s)
.equ CP_D_D, 0x00000000 ;Double result, double input(s)
.equ CP_S_S, 0x0000C000 ;Single result, single input(s)
;
;========================================================================
;
; The following mnemonics are used to specify the 16 LSBs of an Am29027
; instruction word for floating-point instructions supported by the
; Am29000 instruction set.
;
;========================================================================
;
.equ CP_FADD, 0x0000C001
.equ CP_DADD, 0x00000001
.equ CP_FSUB, 0x0000C101
.equ CP_DSUB, 0x00000101
.equ CP_FMUL, 0x0000C002
.equ CP_DMUL, 0x00000002
.equ CP_FEQ, 0x0000C103
.equ CP_DEQ, 0x00000103
.equ CP_FGE, 0x0000C103
.equ CP_DGE, 0x00000103
.equ CP_FGT, 0x0000C103
.equ CP_DGT, 0x00000103
.equ CP_CONVERT_I_TO_F, 0x0000C026 ; CONVERT (int -> s.p.)
.equ CP_CONVERT_I_TO_D, 0x00008026 ; CONVERT (int -> d.p.)
.equ CP_CONVERT_F_TO_I, 0x0000C006 ; CONVERT (s.p.-> int)
.equ CP_CONVERT_D_TO_I, 0x00004006 ; CONVERT (d.p.-> int)
.equ CP_CONVERT_F_TO_D, 0x00008000 ; CONVERT (s.p.-> d.p.)
.equ CP_CONVERT_D_TO_F, 0x00004000 ; CONVERT (d.p.-> s.p.)
;
;
;========================================================================
;
; operand select codes (instruction word fields PMS, QMS, TMS).
;
;========================================================================
;
;
.equ CP_P_EQ_R, 0x00000000
.equ CP_P_EQ_S, 0x01000000
.equ CP_P_EQ_0, 0x02000000
.equ CP_P_EQ_ONE_HALF, 0x03000000
.equ CP_P_EQ_IMINUS1, 0x03000000
.equ CP_P_EQ_1, 0x04000000
.equ CP_P_EQ_2, 0x05000000
.equ CP_P_EQ_3, 0x06000000
.equ CP_P_EQ_PI, 0x07000000
.equ CP_P_EQ_IMINUSMAX, 0x07000000
.equ CP_P_EQ_RF0, 0x08000000
.equ CP_P_EQ_RF1, 0x09000000
.equ CP_P_EQ_RF2, 0x0A000000
.equ CP_P_EQ_RF3, 0x0B000000
.equ CP_P_EQ_RF4, 0x0C000000
.equ CP_P_EQ_RF5, 0x0D000000
.equ CP_P_EQ_RF6, 0x0E000000
.equ CP_P_EQ_RF7, 0x0F000000
;
.equ CP_Q_EQ_R, 0x00000000
.equ CP_Q_EQ_S, 0x00100000
.equ CP_Q_EQ_0, 0x00200000
.equ CP_Q_EQ_ONE_HALF, 0x00300000
.equ CP_Q_EQ_IMINUS1, 0x00300000
.equ CP_Q_EQ_1, 0x00400000
.equ CP_Q_EQ_2, 0x00500000
.equ CP_Q_EQ_3, 0x00600000
.equ CP_Q_EQ_PI, 0x00700000
.equ CP_Q_EQ_IMINUSMAX, 0x00700000
.equ CP_Q_EQ_RF0, 0x00800000
.equ CP_Q_EQ_RF1, 0x00900000
.equ CP_Q_EQ_RF2, 0x00A00000
.equ CP_Q_EQ_RF3, 0x00B00000
.equ CP_Q_EQ_RF4, 0x00C00000
.equ CP_Q_EQ_RF5, 0x00D00000
.equ CP_Q_EQ_RF6, 0x00E00000
.equ CP_Q_EQ_RF7, 0x00F00000
;
.equ CP_T_EQ_R, 0x00000000
.equ CP_T_EQ_S, 0x00010000
.equ CP_T_EQ_0, 0x00020000
.equ CP_T_EQ_ONE_HALF, 0x00030000
.equ CP_T_EQ_IMINUS1, 0x00030000
.equ CP_T_EQ_1, 0x00040000
.equ CP_T_EQ_2, 0x00050000
.equ CP_T_EQ_3, 0x00060000
.equ CP_T_EQ_PI, 0x00070000
.equ CP_T_EQ_IMINUSMAX, 0x00070000
.equ CP_T_EQ_RF0, 0x00080000
.equ CP_T_EQ_RF1, 0x00090000
.equ CP_T_EQ_RF2, 0x000A0000
.equ CP_T_EQ_RF3, 0x000B0000
.equ CP_T_EQ_RF4, 0x000C0000
.equ CP_T_EQ_RF5, 0x000D0000
.equ CP_T_EQ_RF6, 0x000E0000
.equ CP_T_EQ_RF7, 0x000F0000
;
;
;========================================================================
;
; destination select codes (instruction word fields RF, RFS)
;
;========================================================================
;
;
.equ CP_DEST_EQ_GP, 0x00000000
.equ CP_DEST_EQ_RF0, 0x80000000
.equ CP_DEST_EQ_RF1, 0x90000000
.equ CP_DEST_EQ_RF2, 0xA0000000
.equ CP_DEST_EQ_RF3, 0xB0000000
.equ CP_DEST_EQ_RF4, 0xC0000000
.equ CP_DEST_EQ_RF5, 0xD0000000
.equ CP_DEST_EQ_RF6, 0xE0000000
.equ CP_DEST_EQ_RF7, 0xF0000000
;
;
; ______________________________________________________________________
;|______________________________________________________________________|
;| |
;| SYMBOLS FOR DEFINING THE MODE REGISTER DOUBLE WORD |
;| |
;|______________________________________________________________________|
;|______________________________________________________________________|
;
;
;
.equ CP_PFF_MASK, 0x00000003 ; primary f.p. format mask
.equ CP_PFF_EQ_IEEE, 0x00000000 ; primary f.p. format = IEEE
.equ CP_PFF_EQ_DECD, 0x00000001 ; primary f.p. format = DEC D
.equ CP_PFF_EQ_DECG, 0x00000002 ; primary f.p. format = DEC G
.equ CP_PFF_EQ_IBM, 0x00000003 ; primary f.p. format = IBM
.equ CP_PFF_POSITION, 0
;
.equ CP_AFF_MASK, 0x0000000C ; alternate f.p. format mask
.equ CP_AFF_EQ_IEEE, 0x00000000 ; alternate f.p. format = IEEE
.equ CP_AFF_EQ_DECD, 0x00000004 ; alternate f.p. format = DEC D
.equ CP_AFF_EQ_DECG, 0x00000008 ; alternate f.p. format = DEC G
.equ CP_AFF_EQ_IBM, 0x0000000C ; alternate f.p. format = IBM
.equ CP_AFF_POSITION, 2
;
.equ CP_SAT_MASK, 0x00000010 ; saturate mode (SAT) mask
.equ CP_SATURATE_MODE, 0x00000010 ; enable saturate mode (SAT=1)
.equ CP_SAT_POSITION, 4
;
.equ CP_AP_MASK, 0x00000020 ; affine/proj. mode (AP) mask
.equ CP_AFFINE_MODE, 0x00000020 ; enable affine mode (AP=1)
.equ CP_PROJECTIVE_MODE, 0x00000000 ; enable projective mode (AP=0)
.equ CP_AP_POSITION, 5
;
.equ CP_TRP_MASK, 0x00000040 ; IEEE trap mode (TRP) mask
.equ CP_IEEE_TRAPS_ENABLED, 0x00000040 ; IEEE trap mode enabled (TRP=1)
.equ CP_IEEE_TRAPS_DISABLED, 0x00000000 ; IEEE trap mode disabled (TRP=0)
.equ CP_TRP_POSITION, 6
;
.equ CP_SU_MASK, 0x00000080 ; IEEE sud. uflow (SU) mask
.equ CP_IEEE_SUDDEN_UFLOW_MODE, 0x00000080 ; IEEE sud. uflow mode (SU=1)
.equ CP_IEEE_GRADUAL_UFLOW_MODE,0x00000000 ; IEEE grad uflow mode (SU=0)
.equ CP_SU_POSITION, 7
;
.equ CP_BS_MASK, 0x00000100 ; IBM sig. mask (BS)
.equ CP_BS_POSITION, 8
;
.equ CP_BU_MASK, 0x00000200 ; IBM underflow mask (BU)
.equ CP_BU_POSITION, 9
;
.equ CP_MS_MASK, 0x00000800 ; signed int. mpy (MS) mask
.equ CP_SIGNED_INT_MPY_MODE, 0x00000800 ; signed int. mpy mode (MS=1)
.equ CP_UNSIGNED_INT_MPY_MODE, 0x00000000 ; unsigned int. mpy mode (MS=0)
.equ CP_MS_POSITION, 11
;
.equ CP_MF_MASK, 0x00003000 ; int. mult. fmt. mode (MF) mask
.equ CP_MF_EQ_LSBS, 0x00000000 ; int. mult. fmt. = LSBs
.equ CP_MF_EQ_LSBSFA, 0x00001000 ; int. mult. fmt. = LSBs,fmt. adj.
.equ CP_MF_EQ_MSBS, 0x00002000 ; int. mult. fmt. = MSBs
.equ CP_MF_EQ_MSBSFA, 0x00003000 ; int. mult. fmt. = MSBs,fmt. adj.
.equ CP_MF_POSITION, 12
;
.equ CP_RMS_MASK, 0x0001C000 ; round mode (RMS) mask
.equ CP_RMS_EQ_NEAREST, 0x00000000 ; round mode = to nearest
.equ CP_RMS_EQ_MINUS_INF, 0x00004000 ; round mode = toward -oo
.equ CP_RMS_EQ_PLUS_INF, 0x00008000 ; round mode = toward +oo
.equ CP_RMS_EQ_ZERO, 0x0000C000 ; round mode = toward zero
.equ CP_RMS_POSITION, 14
;
.equ CP_PL_MASK, 0x00100000 ; pipeline mode (PL) mask
.equ CP_FLOWTHROUGH_MODE, 0x00000000 ; select flow-through mode
.equ CP_PIPELINE_MODE, 0x00100000 ; select pipeline mode
.equ CP_PL_POSITION, 20
;
.equ CP_INVALID_OP_EXCP_MASK, 0x00400000 ; invalid operation excp. mask(IM)
.equ CP_RESERVED_OP_EXCP_MASK,0x00800000 ; reserved operand excp. mask(RM)
.equ CP_OVERFLOW_EXCP_MASK, 0x01000000 ; overflow exception mask (VM)
.equ CP_UNDERFLOW_EXCP_MASK, 0x02000000 ; underflow exception mask(UM)
.equ CP_INEXACT_EXCP_MASK, 0x04000000 ; inexact result excp. mask(XM)
.equ CP_ZERO_EXCP_MASK, 0x08000000 ; zero result exception mask (ZM)
.equ CP_EXCPS_POSITION, 22
;
.equ CP_PLTC_MASK, 0x0000000F ; pipeline timer count (PLTC) mask
.equ CP_PLTC_EQ_2, 0x00000002 ; pipeline timer count = 2
.equ CP_PLTC_EQ_3, 0x00000003 ; pipeline timer count = 3
.equ CP_PLTC_EQ_4, 0x00000004 ; pipeline timer count = 4
.equ CP_PLTC_EQ_5, 0x00000005 ; pipeline timer count = 5
.equ CP_PLTC_EQ_6, 0x00000006 ; pipeline timer count = 6
.equ CP_PLTC_EQ_7, 0x00000007 ; pipeline timer count = 7
.equ CP_PLTC_EQ_8, 0x00000008 ; pipeline timer count = 8
.equ CP_PLTC_EQ_9, 0x00000009 ; pipeline timer count = 9
.equ CP_PLTC_EQ_10, 0x0000000A ; pipeline timer count = 10
.equ CP_PLTC_EQ_11, 0x0000000B ; pipeline timer count = 11
.equ CP_PLTC_EQ_12, 0x0000000C ; pipeline timer count = 12
.equ CP_PLTC_EQ_13, 0x0000000D ; pipeline timer count = 13
.equ CP_PLTC_EQ_14, 0x0000000E ; pipeline timer count = 14
.equ CP_PLTC_EQ_15, 0x0000000F ; pipeline timer count = 15
.equ CP_PLTC_POSITION, 0
;
.equ CP_MATC_MASK, 0x000000F0 ; mpy-acc timer count (MATC) mask
.equ CP_MATC_EQ_2, 0x00000020 ; mpy-acc timer count = 2
.equ CP_MATC_EQ_3, 0x00000030 ; mpy-acc timer count = 3
.equ CP_MATC_EQ_4, 0x00000040 ; mpy-acc timer count = 4
.equ CP_MATC_EQ_5, 0x00000050 ; mpy-acc timer count = 5
.equ CP_MATC_EQ_6, 0x00000060 ; mpy-acc timer count = 6
.equ CP_MATC_EQ_7, 0x00000070 ; mpy-acc timer count = 7
.equ CP_MATC_EQ_8, 0x00000080 ; mpy-acc timer count = 8
.equ CP_MATC_EQ_9, 0x00000090 ; mpy-acc timer count = 9
.equ CP_MATC_EQ_10, 0x000000A0 ; mpy-acc timer count = 10
.equ CP_MATC_EQ_11, 0x000000B0 ; mpy-acc timer count = 11
.equ CP_MATC_EQ_12, 0x000000C0 ; mpy-acc timer count = 12
.equ CP_MATC_EQ_13, 0x000000D0 ; mpy-acc timer count = 13
.equ CP_MATC_EQ_14, 0x000000E0 ; mpy-acc timer count = 14
.equ CP_MATC_EQ_15, 0x000000F0 ; mpy-acc timer count = 15
.equ CP_MATC_POSITION, 4
;
.equ CP_MVTC_MASK, 0x00000F00 ; MOVE P timer count (MVTC) mask
.equ CP_MVTC_EQ_2, 0x00000200 ; MOVE P timer count = 2
.equ CP_MVTC_EQ_3, 0x00000300 ; MOVE P timer count = 3
.equ CP_MVTC_EQ_4, 0x00000400 ; MOVE P timer count = 4
.equ CP_MVTC_EQ_5, 0x00000500 ; MOVE P timer count = 5
.equ CP_MVTC_EQ_6, 0x00000600 ; MOVE P timer count = 6
.equ CP_MVTC_EQ_7, 0x00000700 ; MOVE P timer count = 7
.equ CP_MVTC_EQ_8, 0x00000800 ; MOVE P timer count = 8
.equ CP_MVTC_EQ_9, 0x00000900 ; MOVE P timer count = 9
.equ CP_MVTC_EQ_10, 0x00000A00 ; MOVE P timer count = 10
.equ CP_MVTC_EQ_11, 0x00000B00 ; MOVE P timer count = 11
.equ CP_MVTC_EQ_12, 0x00000C00 ; MOVE P timer count = 12
.equ CP_MVTC_EQ_13, 0x00000D00 ; MOVE P timer count = 13
.equ CP_MVTC_EQ_14, 0x00000E00 ; MOVE P timer count = 14
.equ CP_MVTC_EQ_15, 0x00000F00 ; MOVE P timer count = 15
.equ CP_MVTC_POSITION, 8
;
.equ CP_AD_MASK, 0x00001000 ;
.equ CP_ADVANCE_DRDY_MODE, 0x00001000 ;
.equ CP_NORMAL_DRDY_MODE, 0x00000000 ;
.equ CP_AD_POSITION, 12
;
.equ CP_HE_MASK, 0x00002000 ; Halt-on-error mask (HE)
.equ CP_HALT_ON_ERROR_ENABLED, 0x00002000 ; Halt-on-error enabled (HE=1)
.equ CP_HALT_ON_ERROR_DISABLED,0x00000000 ; Halt-on-error disabled (HE=0)
.equ CP_HE_POSITION, 13
;
.equ CP_EX_MASK, 0x00004000 ; EXCP enable mask (EX)
.equ CP_EXCP_ENABLED, 0x00004000 ; EXCP enabled (EX=1)
.equ CP_EXCP_DISABLED, 0x00000000 ; EXCP disabled (EX=0)
.equ CP_EX_POSITION, 14
;
;
;
; ______________________________________________________________________
;|______________________________________________________________________|
;| |
;| SYMBOLS FOR DEFINING THE STATUS REGISTER WORD |
;| |
;|______________________________________________________________________|
;|______________________________________________________________________|
;
;
.equ CP_INVALID_OP_EXCP, 0x00000001
.equ CP_INVALID_OP_EXCP_POSITION, 0
;
.equ CP_RESERVED_OP_EXCP, 0x00000002
.equ CP_RESERVED_OP_EXCP_POSITION, 1
;
.equ CP_OVERFLOW_EXCP, 0x00000004
.equ CP_OVERFLOW_EXCP_POSITION, 2
;
.equ CP_UNDERFLOW_EXCP, 0x00000008
.equ CP_UNDERFLOW_EXCP_POSITION, 3
;
.equ CP_INEXACT_EXCP, 0x00000010
.equ CP_INEXACT_EXCP_POSITION, 4
;
.equ CP_ZERO_EXCP, 0x00000020
.equ CP_ZERO_EXCP_POSITION, 5
;
.equ CP_EXCP_STATUS_MASK, 0x00000040
.equ CP_EXCP_STATUS_FLAG_POSITION, 6
;
.equ CP_R_TEMP_VALID_MASK, 0x00000080
.equ R_TEMP_VALID_POSITION, 7
;
.equ CP_S_TEMP_VALID_MASK, 0x00000100
.equ CP_S_TEMP_VALID_POSITION, 8
;
.equ CP_I_TEMP_VALID_FLAG, 0x00000200
.equ CP_I_TEMP_VALID_POSITION, 9
;
.equ CP_OPERATION_PENDING_MASK, 0x00000400
.equ CP_OPERATION_PENDING_POSITION,10
;
;
; ______________________________________________________________________
;|______________________________________________________________________|
;| |
;| SYMBOLS FOR DEFINING THE FLAG REGISTER WORD |
;| |
;|______________________________________________________________________|
;|______________________________________________________________________|
;
;
.equ CP_INVALID_OP_FLAG, 0x00000001
.equ CP_INVALID_OP_FLAG_POSITION, 0
;
.equ CP_CARRY_FLAG, 0x00000001
.equ CP_CARRY_FLAG_POSITION, 0
;
.equ CP_RESERVED_OP_FLAG, 0x00000002
.equ CP_RESERVED_OP_FLAG_POSITION, 1
;
.equ CP_OVERFLOW_FLAG, 0x00000004
.equ CP_OVERFLOW_FLAG_POSITION, 2
;
.equ CP_UNORDERED_FLAG, 0x00000004
.equ CP_UNORDERED_FLAG_POSITION, 2
;
.equ CP_UNDERFLOW_FLAG, 0x00000008
.equ CP_UNDERFLOW_FLAG_POSITION, 3
;
.equ CP_LESS_THAN_FLAG, 0x00000008
.equ CP_LESS_THAN_POSITION, 3
;
.equ CP_WINNER_FLAG, 0x00000008
.equ CP_WINNER_FLAG_POSITION, 3
;
.equ CP_INEXACT_FLAG, 0x00000010
.equ CP_INEXACT_FLAG_POSITION, 4
;
.equ CP_GREATER_THAN_FLAG, 0x00000010
.equ CP_GREATER_THAN_FLAG_POSITION,4
;
.equ CP_ZERO_FLAG, 0x00000020
.equ CP_ZERO_FLAG_POSITION, 5
;
.equ CP_EQUAL_FLAG, 0x00000020
.equ CP_EQUAL_FLAG_POSITION, 5
;
.equ CP_SIGN_FLAG, 0x00000040
.equ CP_SIGN_FLAG_POSITION, 6
;
;
; ______________________________________________________________________
;|______________________________________________________________________|
;| |
;| SYMBOLS FOR TRANSACTION REQUEST TYPES |
;| |
;|______________________________________________________________________|
;|______________________________________________________________________|
;
;
; write requests
;
; Note: Each WRITE_* transaction request, plus ADV_TEMPS sets the CA
; (Coprocessor Active) bit in the 29000 Current Processor Status Register.
;
.equ CP_WRITE_R, 0x20 ;write sing or doub to R register
.equ CP_WRITE_S, 0x21 ;write sing or doub to S register
.equ CP_WRITE_RS, 0x22 ;write sing operands to R and S
.equ CP_WRITE_MODE, 0x23 ;write mode double word to 29027
.equ CP_WRITE_STATUS, 0x24 ;write status word to 29027
.equ CP_WRITE_PREC, 0x25 ;write reg. file precision word
; to 29027
.equ CP_WRITE_INST, 0x26 ;write instruction to 29027
.equ CP_ADV_TEMPS, 0x27 ;move R-Temp, S-Temp into R,S
;
; read requests
;
.equ CP_READ_MSBS, 0x00 ;read sing result or MSB of doub
.equ CP_READ_LSBS, 0x01 ;read LSB of doub result
.equ CP_READ_FLAGS, 0x02 ;read 29027 flag register
.equ CP_READ_STATUS, 0x03 ;read 29027 status register
.equ CP_SAVE_STATE, 0x04 ;read one word of 29027 state
;
; "start operation" symbol; this is "OR"ed with a WRITE_R, WRITE_S,
; WRITE_RS, or WRITE_INST symbol.
;
 
.equ CP_START, 0b1000000 ;bit to start 29027 operation
;
; "suppress exceptions reporting" symbol; this is "OR"ed with a ed
;
;
 
.equ CP_NO_ERR, 0b1000000 ;suppress exception reporting
; ; during load.
; cp_write_r - transfers 32- or 64-bit operand to Am29027
; register R
; cp_write_s - transfers 32- or 64-bit operand to Am29027
; register S
; cp_write_rs - transfers two 32-bit floating-point operands to
; Am29027 registers R and S
; cp_write_prec - transfers a word to the Am29027 precision register
; cp_write_status - transfers a word to the Am29027 status register
; cp_write_inst - transfers an instruction to the Am29027
; instruction register
; cp_advance_temps - transfers the contents of the Am29027 temporary
; registers to the corresponding working registers
; cp_write_mode - transfers a mode specification the the Am29027
; mode register
; cp_read_dp - read a double-precision floating-point result
; from the Am29027
; cp_read_sp - read a single-precision floating-point result
; from the Am29027
; cp_read_int - read an integer result from the Am29027
; cp_read_flags - read the contents of the Am29027 flag register
; cp_read_status - read the contents of the Am29027 status register
; cp_read_state_wd - read a single Am29027 state word
; cp_save_state - save Am29027 state
; cp_restore_state - restore Am29027 state
; cp_build_inst - build an Am29027 instruction
; cp_build_inst_h - build 16 MSBs of an Am29027 instruction
; cp_build_inst_l - build 16 LSBs of an Am29027 instruction
;
;
;
;============================================================================
; MACRO NAME: cp_write_r
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 16, 1988
;
; FUNCTION: Transfers a 32- or 64-bit operand to Am29027 input register R
;
; PARAMETERS:
; reg - the Am29000 g.p. register containing the 32-bit operand to be
; transferred, or the 32 MSBs of the 64-bit operand to be
; transferred.
;
; LSB_reg - the Am29000 g.p. register containing the 32 LSBs of the
; 64-bit operand to be transferred
;
; INT - indicates that the operand to be transferred is a 32-bit
; integer
;
; START - indicates that a new Am29027 operation is to be started
; once the operand has been transferred
;
;
; USAGE:
;
; cp_write_r reg [,LSB_reg] [,START] for floating-point operands
; or cp_write_r reg, INT [,START] for integer operands
;
; Transferring double-precision floating-point operands - Either of
; two forms is acceptable:
;
; cp_write_r reg
; or cp_write_r reg, LSB_reg
;
; If LSB_reg is omitted, the LSBs are taken from the next g.p.
; register.
;
; Ex: cp_write_r lr2 Transfers the contents of lr2 to
; the most-significant half of Am29027
; register R, and the contents of lr3
; to the least-significant half.
;
; cp_write_r lr2,lr5 Transfers the contents of lr2 to
; the most-significant half of Am29027
; register R, and the contents of lr5
; to the least-significant half.
;
;
; Transferring single-precision floating-point operands - Use the
; form:
;
; cp_write_r reg
;
;
; Ex: cp_write_r lr2 Transfers the contents of lr2 to
; the most-significant half of Am29027
; register R, (the contents of lr3
; will be transferred to the least-
; significant half of register R, but
; these bits are don't cares).
;
;
; Transferring integer operands - Use the form:
;
; cp_write_r reg,INT
;
;
; Ex: cp_write_r lr2,INT Transfers the contents of lr2 to
; the least-significant half of Am29027
; register R, (the contents of lr2
; will also be transferred to the most-
; significant half of register R, but
; these bits are don't cares).
;
;
; Starting an Am29027 operation - Any of the forms above may be
; appended with parameter START, e.g.:
;
; cp_write_r lr2,START
;
; cp_write_r lr2,lr5,START
;
; cp_write_r lr2,INT,START
;
;
;============================================================================
;
.macro cp_write_r,p1,p2,p3
;
.if $narg==0
.err
.print "cp_WRITE_R: missing parameter(s)"
.endif
;
;
.if $narg==1
store 1,CP_WRITE_R,p1,%%((&p1)+1)
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","INT"
store 1,CP_WRITE_R,p1,p1
.exitm
.endif
;
.ifeqs "@p2@","START"
store 1,CP_WRITE_R|CP_START,p1,%%((&p1)+1)
.exitm
.endif
;
store 1,CP_WRITE_R,p1,p2
.exitm
;
.endif
;
;
.if $narg==3
;
.ifeqs "@p2@","START"
.ifeqs "@p3@","INT"
store 1,CP_WRITE_R|CP_START,p1,p1
.else
.err
.print "cp_write_r: bad parameter list"
.endif
.exitm
.endif
;
.ifeqs "@p2@","INT"
.ifeqs "@p3@","START"
store 1,CP_WRITE_R|CP_START,p1,p1
.else
.err
.print "cp_write_r: bad parameter list"
.endif
.exitm
.endif
;
.ifeqs "@p3@","START"
store 1,CP_WRITE_R|CP_START,p1,p2
.else
.err
.print "cp_write_r: bad parameter list"
.endif
.exitm
;
.endif
;
;
.if $narg>=4
.err
.print "cp_write_r: too many parameters"
.endif
;
.endm
;
;
;
;
;
;============================================================================
; MACRO NAME: cp_write_s
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 16, 1988
;
; FUNCTION: Transfers a 32- or 64-bit operand to Am29027 input register S
;
; PARAMETERS:
; reg - the Am29000 g.p. register containing the 32-bit operand to be
; transferred, or the 32 MSBs of the 64-bit operand to be
; transferred.
;
; LSB_reg - the Am29000 g.p. register containing the 32 LSBs of the
; 64-bit operand to be transferred
;
; INT - indicates that the operand to be transferred is a 32-bit
; integer
;
; START - indicates that a new Am29027 operation is to be started
; once the operand has been transferred
;
;
; USAGE:
;
; cp_write_s reg [,LSB_reg] [,START] for floating-point operands
; or cp_write_s reg, INT [,START] for integer operands
;
; Transferring double-precision floating-point operands - Either of
; two forms is acceptable:
;
; cp_write_s reg
; or cp_write_s reg, LSB_reg
;
; If LSB_reg is omitted, the LSBs are taken from the next g.p.
; register.
;
; Ex: cp_write_s lr2 Transfers the contents of lr2 to
; the most-significant half of Am29027
; register S, and the contents of lr3
; to the least-significant half.
;
; cp_write_s lr2,lr5 Transfers the contents of lr2 to
; the most-significant half of Am29027
; register S, and the contents of lr5
; to the least-significant half.
;
;
; Transferring single-precision floating-point operands - Use the
; form:
;
; cp_write_s reg
;
;
; Ex: cp_write_s lr2 Transfers the contents of lr2 to
; the most-significant half of Am29027
; register S, (the contents of lr3
; will be transferred to the least-
; significant half of register S, but
; these bits are don't cares).
;
;
; Transferring integer operands - Use the form:
;
; cp_write_s reg,INT
;
;
; Ex: cp_write_s lr2,INT Transfers the contents of lr2 to
; the least-significant half of Am29027
; register S, (the contents of lr2
; will also be transferred to the most-
; significant half of register S, but
; these bits are don't cares).
;
;
; Starting an Am29027 operation - Any of the forms above may be
; appended with parameter START, e.g.:
;
; cp_write_s lr2,START
;
; cp_write_s lr2,lr5,START
;
; cp_write_s lr2,INT,START
;
;
;============================================================================
;
.macro cp_write_s,p1,p2,p3
;
.if $narg==0
.err
.print "cp_write_s: missing parameter(s)"
.endif
;
;
.if $narg==1
store 1,CP_WRITE_S,p1,%%((&p1)+1)
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","INT"
store 1,CP_WRITE_S,p1,p1
.exitm
.endif
;
.ifeqs "@p2@","START"
store 1,CP_WRITE_S|CP_START,p1,%%((&p1)+1)
.exitm
.endif
;
store 1,CP_WRITE_S,p1,p2
.exitm
;
.endif
;
;
.if $narg==3
;
.ifeqs "@p2@","START"
.ifeqs "@p3@","INT"
store 1,CP_WRITE_S|CP_START,p1,p1
.else
.err
.print "cp_write_s: bad parameter list"
.endif
.exitm
.endif
;
.ifeqs "@p2@","INT"
.ifeqs "@p3@","START"
store 1,CP_WRITE_S|CP_START,p1,p1
.else
.err
.print "cp_write_s: bad parameter list"
.endif
.exitm
.endif
;
.ifeqs "@p3@","START"
store 1,CP_WRITE_S|CP_START,p1,p2
.else
.err
.print "cp_write_s: bad parameter list"
.endif
.exitm
;
.endif
;
;
.if $narg>=4
.err
.print "cp_write_s: too many parameters"
.endif
;
.endm
;
;
;
;
;============================================================================
; MACRO NAME: cp_write_rs
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 16, 1988
;
; FUNCTION: Transfers two 32-bit floating-point operands to Am29027
; input registers R and S
;
; PARAMETERS:
; reg1 - the Am29000 g.p. register containing the 32-bit operand to be
; transferred to register R
;
; reg2 - the Am29000 g.p. register containing the 32-bit operand to be
; transferred to register S
;
; START - indicates that a new Am29027 operation is to be started
; once the operands have been transferred
;
;
; USAGE:
;
; cp_write_rs reg1, reg2 [,START]
;
; Ex: cp_write_rs lr2,lr5 Transfers the contents of lr2 to
; the most-significant half of Am29027
; register R, and the contents of lr5
; to the most-significant half of Am29027
; register S.
;
; cp_write_rs lr2,lr5,START Transfers the contents of lr2 to
; the most-significant half of Am29027
; register R, and the contents of lr5
; to the most-significant half of Am29027
; register S; a new operation is started
; once the transfer is complete.
;
;
;
;============================================================================
;
.macro cp_write_rs,p1,p2,p3
;
;
.if $narg<=1
.err
.print "cp_write_rs: missing parameter(s)"
.exitm
.endif
;
;
.if $narg==2
.ifeqs "@p2@","START"
.err
.print "cp_write_rs: bad parameter list"
.else
store 1,CP_WRITE_RS,p1,p2
.endif
.exitm
.endif
;
;
.if $narg==3
.ifeqs "@p3@","START"
store 1,CP_WRITE_RS|CP_START,p1,p2
.else
.err
.print "cp_write_rs: bad parameter list"
.endif
.exitm
.endif
;
;
.if $narg>=4
.err
.print "cp_write_rs: too many parameters"
.exitm
.endif
;
.endm
;
;
;
;
;
;
;============================================================================
; MACRO NAME: cp_write_prec
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 16, 1988
;
; FUNCTION: Transfers a word to the Am29027 precision register
;
; PARAMETERS:
; reg - the Am29000 g.p. register containing the word to be
; transferred to the Am29027 precision register
;
; USAGE:
;
; cp_write_prec reg
;
; Ex: cp_write_prec lr2 Transfers the contents of lr2 to
; the Am29027 precision register.
;
;
;============================================================================
;
.macro cp_write_prec,p1
;
;
.if $narg!=1
.err
.print "cp_write_prec: bad parameter list"
.else
store 1,CP_WRITE_PREC,p1,0
.endif
;
.endm
;
;
;
;
;
;
;============================================================================
; MACRO NAME: cp_write_status
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 16, 1988
;
; FUNCTION: Transfers a word to the Am29027 precision register
;
; PARAMETERS:
; reg - the Am29000 g.p. register containing the word to be
; transferred to the Am29027 status register
;
; RESTORE - indicates that this is the last step of a state restoration
; sequence (flow-through mode only)
;
; INVALIDATE - indicates that the current contents of the ALU pipeline
; register are to be invalidated (pipeline mode only)
;
; USAGE:
;
; cp_write_status reg [,RESTORE|INVALIDATE]
;
; Ex: cp_write_status lr2 Transfers the contents of lr2 to
; the Am29027 status register.
;
;
; cp_write_status lr2,RESTORE Transfers the contents of lr2 to
; the Am29027 status register, and
; completes the state restore
; sequence
;
; cp_write_status lr2,INVALIDATE Transfers the contents of lr2 to
; the Am29027 status register, and
; invalidates the contents of the
; ALU pipeline.
;
;
;============================================================================
;
.macro cp_write_status,p1,p2
;
.if $narg==0
.err
.print "cp_write_status: missing parameter(s)"
.endif
;
;
.if $narg==1
store 1,CP_WRITE_STATUS,p1,0
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","RESTORE"
store 1,CP_WRITE_STATUS|CP_START,p1,0
.exitm
.endif
;
.ifeqs "@p2@","INVALIDATE"
store 1,CP_WRITE_STATUS|CP_START,p1,0
.exitm
.endif
;
.err
.print "cp_write_status: bad parameter list"
.exitm
;
.endif
;
;
.if $narg >=3
.err
.print "cp_write_status: too many parameters"
.exitm
.endif
;
.endm
;
;
;
;
;
;============================================================================
; MACRO NAME: cp_write_inst
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 16, 1988
;
; FUNCTION: Transfers an instruction word to the Am29027 instruction
; register
;
; PARAMETERS:
; reg - the Am29000 g.p. register containing the word to be
; transferred to the Am29027 instruction register
;
; START - indicates that a new Am29027 operation is to be started
; once the instruction word has been transferred
;
; USAGE:
;
; cp_write_inst reg [,START]
;
; Ex: cp_write_inst lr2 Transfers the contents of lr2 to
; the Am29027 instruction register.
;
;
; cp_write_inst lr2,START Transfers the contents of lr2 to
; the Am29027 status register; a
; new operation is started once the
; transfer is complete.
;
;
;============================================================================
;
.macro cp_write_inst,p1,p2
;
.if $narg==0
.err
.print "cp_write_inst: missing parameter(s)"
.endif
;
;
.if $narg==1
store 1,CP_WRITE_INST,p1,p1
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","START"
store 1,CP_WRITE_INST|CP_START,p1,p1
.else
.err
.print "cp_write_inst: bad parameter list"
.endif
.exitm
;
.endif
;
;
.if $narg >=3
.err
.print "cp_write_inst: too many parameters"
.exitm
.endif
;
.endm
;
;
;
;
;
;
;============================================================================
; MACRO NAME: cp_advance_temps
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 17, 1988
;
; FUNCTION: Transfers the contents of Am29027 registers R-Temp, S-Temp,
; and I-Temp to register R, register S, and the instruction
; register, respectively.
;
; PARAMETERS: none
;
; USAGE:
;
; cp_advance_temps
;
;
;
;============================================================================
;
.macro cp_advance_temps
;
;
.if $narg!=0
.err
.print "cp_advance_temp: takes no parameters"
.else
store 1,CP_ADV_TEMPS,gr1,0 ; use gr1 because it's never protected
.endif
;
.endm
;
;
;
;
;============================================================================
; MACRO NAME: cp_write_mode
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 17, 1988
;
; FUNCTION: Transfers a 64-bit mode specification to the Am29027 mode
; register
;
; PARAMETERS:
; reg - the Am29000 g.p. register containing the 32 MSBs of the
; 64-bit mode specification to be transferred.
;
; LSB_reg - the Am29000 g.p. register containing the 32 LSBs of the
; 64-bit mode specification to be transferred.
;
; USAGE:
;
; cp_write_mode reg [,LSB_reg]
;
; Either of two forms is acceptable:
;
; cp_write_mode reg
; or cp_write_mode reg, LSB_reg
;
; If LSB_reg is omitted, the LSBs are taken from the next g.p.
; register.
;
; Ex: cp_write_mode lr2 Transfers the contents of lr2 to
; the most-significant half of the Am29027
; mode register, and the contents of lr3
; to the least-significant half.
;
; cp_write_mode lr2,lr5 Transfers the contents of lr2 to
; the most-significant half of the Am29027
; mode register, and the contents of lr5
; to the least-significant half.
;
;
;
;============================================================================
;
.macro cp_write_mode,p1,p2
;
.if $narg==0
.err
.print "cp_write_mode: missing parameter(s)"
.endif
;
;
.if $narg==1
store 1,CP_WRITE_MODE,%%((&p1)+1),p1
.exitm
.endif
;
;
.if $narg==2
store 1,CP_WRITE_MODE,p2,p1
.exitm
.endif
;
;
.if $narg>=3
.err
.print "cp_write_mode: too many parameters"
.endif
;
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_read_dp
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 17, 1988
;
; FUNCTION: Transfers the current Am29027 double-precison floating-point
; result to the Am29000
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the 32 MSBs of the
; current Am29027 result are to be written.
;
; LSB_reg - the Am29000 g.p. register into which the 32 LSBs of the
; current Am29027 result are to be written.
;
; NO_ERR - indicates that exception reporting is to be suppressed for this
; transfer.
;
; USAGE:
;
; cp_read_dp reg [,LSB_reg] [,START]
;
; Either of two forms is acceptable:
;
; cp_read_dp reg
; or cp_read_dp reg, LSB_reg
;
; If LSB_reg is omitted, the LSBs are written to the next g.p. register.
;
; Ex: cp_read_dp lr2 Transfers the 32 MSBs of the current
; Am29027 result to lr2, and the 32 LSBs
; to lr3.
;
; cp_read_dp lr2,lr5 Transfers the 32 MSBs of the current
; Am29027 result to lr2, and the 32 LSBs
; to lr5.
;
; Exception reporting can be suppressed by appending NO_ERR to either
; of the above, e.g.:
;
; cp_read_dp lr2,NO_ERR
; cp_read_dp lr2,lr5,NO_ERR
;
;
;============================================================================
;
.macro cp_read_dp,p1,p2,p3
;
.if $narg==0
.err
.print "cp_read_dp: missing parameter(s)"
.endif
;
;
.if $narg==1
load 1,CP_READ_LSBS,%%((&p1)+1),0
load 1,CP_READ_MSBS,p1,0
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","NO_ERR"
load 1,CP_READ_LSBS|CP_NO_ERR,%%((&p1)+1),0
load 1,CP_READ_MSBS|CP_NO_ERR,p1,0
.exitm
.endif
;
load 1,CP_READ_LSBS,p2,0
load 1,CP_READ_MSBS,p1,0
.exitm
;
.endif
;
;
.if $narg==3
;
.ifeqs "@p3@","NO_ERR"
load 1,CP_READ_LSBS|CP_NO_ERR,p2,0
load 1,CP_READ_MSBS|CP_NO_ERR,p1,0
.else
.err
.print "cp_read_dp: bad parameter list"
.endif
.exitm
;
.endif
;
;
.if $narg>=4
.err
.print "cp_read_dp: too many parameters"
.endif
;
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_read_sp
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 17, 1988
;
; FUNCTION: Transfers the current Am29027 single-precison floating-point
; result to the Am29000
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the current Am29027
; result is to be written.
;
; NO_ERR - indicates that exception reporting is to be suppressed for this
; transfer.
;
; USAGE:
;
; cp_read_sp reg [,START]
;
; Ex: cp_read_sp lr2 Transfers the current Am29027 result
; to lr2.
;
; cp_read_sp lr2,NO_ERR Transfers the current Am29027 result
; to lr2, and suppresses exception
; reporting for this transfer.
;
;
;============================================================================
;
.macro cp_read_sp,p1,p2
;
.if $narg==0
.err
.print "cp_read_sp: missing parameter(s)"
.endif
;
;
.if $narg==1
load 1,CP_READ_MSBS,p1,0
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","NO_ERR"
load 1,CP_READ_MSBS|CP_NO_ERR,p1,0
.else
.err
.print "cp_read_sp: bad parameter list"
.endif
.exitm
;
.endif
;
;
.if $narg>=3
.err
.print "cp_read_sp: too many parameters"
.endif
;
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_read_int
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 17, 1988
;
; FUNCTION: Transfers the current Am29027 integer result to the Am29000
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the current Am29027
; result is to be written.
;
; NO_ERR - indicates that exception reporting is to be suppressed for this
; transfer.
;
; USAGE:
;
; cp_read_int reg [,START]
;
; Ex: cp_read_int lr2 Transfers the current Am29027 result
; to lr2.
;
; cp_read_int lr2,NO_ERR Transfers the current Am29027 result
; to lr2, and suppresses exception
; reporting for this transfer.
;
;
;============================================================================
;
.macro cp_read_int,p1,p2
;
.if $narg==0
.err
.print "cp_read_int: missing parameter(s)"
.endif
;
;
.if $narg==1
load 1,CP_READ_LSBS,p1,0
nop ; leave a cycle for the MSBs to come out
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","NO_ERR"
load 1,CP_READ_LSBS|CP_NO_ERR,p1,0
nop ; leave a cycle for the MSBs to come out
.else
.err
.print "cp_read_int: bad parameter list"
.endif
.exitm
;
.endif
;
;
.if $narg>=3
.err
.print "cp_read_int: too many parameters"
.endif
;
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_read_flags
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 17, 1988
;
; FUNCTION: Transfers the contents of the Am29027 flag register
; to the Am29000
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the current Am29027
; flag register contents are to be written.
;
; NO_ERR - indicates that exception reporting is to be suppressed for this
; transfer.
;
; USAGE:
;
; cp_read_flags reg [,START]
;
; Ex: cp_read_flags lr2 Transfers the Am29027 flag register
; contents to lr2.
;
; cp_read_flags lr2,NO_ERR Transfers the Am29027 flag register
; contents to lr2, and suppresses
; exception reporting for this
; transfer.
;
;
;============================================================================
;
.macro cp_read_flags,p1,p2
;
.if $narg==0
.err
.print "cp_read_flags: missing parameter(s)"
.endif
;
;
.if $narg==1
load 1,CP_READ_FLAGS,p1,0
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","NO_ERR"
load 1,CP_READ_FLAGS|CP_NO_ERR,p1,0
.else
.err
.print "cp_read_flags: bad parameter list"
.endif
.exitm
;
.endif
;
;
.if $narg>=3
.err
.print "cp_read_flags: too many parameters"
.endif
;
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_read_status
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 18, 1988
;
; FUNCTION: Transfers the contents of the Am29027 status register
; to the Am29000
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the current Am29027
; status register contents are to be written.
;
; NO_ERR - indicates that exception reporting is to be suppressed for this
; transfer.
;
; USAGE:
;
; cp_read_status reg [,START]
;
; Ex: cp_read_status lr2 Transfers the Am29027 status register
; contents to lr2.
;
; cp_read_status lr2,NO_ERR Transfers the Am29027 status register
; contents to lr2, and suppresses
; exception reporting for this
; transfer.
;
;
;============================================================================
;
.macro cp_read_status,p1,p2
;
.if $narg==0
.err
.print "cp_read_status: missing parameter(s)"
.endif
;
;
.if $narg==1
load 1,CP_READ_STATUS,p1,0
.exitm
.endif
;
;
.if $narg==2
;
.ifeqs "@p2@","NO_ERR"
load 1,CP_READ_STATUS|CP_NO_ERR,p1,0
.else
.err
.print "cp_read_status: bad parameter list"
.endif
.exitm
;
.endif
;
;
.if $narg>=3
.err
.print "cp_read_status: too many parameters"
.endif
;
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_read_state_wd
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 18, 1988
;
; FUNCTION: Transfers the next Am29027 state word to the Am29000
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the next Am29027
; state word contents are to be written.
;
; USAGE:
;
; cp_read_state_wd reg
;
; Ex: cp_read_state_wd lr2 Transfers the next Am29027 state word
; to lr2.
;
;============================================================================
;
.macro cp_read_state_wd,p1
;
.if $narg==0
.err
.print "cp_read_state_wd: missing parameter"
.endif
;
;
.if $narg==1
load 1,CP_SAVE_STATE,p1,0
.exitm
.endif
;
;
.if $narg>=2
.err
.print "cp_read_state_wd: too many parameters"
.endif
;
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_save_state
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 18, 1988
;
; FUNCTION: Transfers the current Am29027 state to the Am29000
;
; PARAMETERS:
; reg - the first of 30 Am29000 g.p. registers in which Am29027 state
; is saved.
;
; USAGE:
;
; cp_save_state reg
;
; This macro transfers the current Am29027 state to a block of 30 Am29000
; registers. State is stored in the following order:
;
; reg instruction register
; reg+1 I-Temp
; reg+2 R MSBs
; reg+3 R LSBs
; reg+4 S MSBs
; reg+5 S LSBs
; reg+6 R-Temp MSBs
; reg+7 R-Temp LSBs
; reg+8 S-Temp MSBs
; reg+9 S-Temp LSBs
; reg+10 status
; reg+11 precision
; reg+12 RF0 MSBs
; reg+13 RF0 LSBs
; . .
; . .
; . .
; reg+26 RF7 MSBs
; reg+27 RF7 LSBs
; reg+28 mode MSBs
; reg+29 mode LSBs
;
;
; Ex: cp_save_state lr2 Transfers the current Am29027 state to
; the Am29000, starting at lr2.
;
; NOTES:
; 1) This macro stores all 64-bit quantities in "big-endian" order,
; i.e. MSBs first. For example, the 32 MSBs of register R are
; stored in reg+2, and the 32 LSBs are stored in reg+3. The Am29027
; transfers these quantites in "little-endian" order; the macro
; is responsible for swapping MS and LS words.
;
;============================================================================
;
.macro cp_save_state,p1
;
.if $narg==0
.err
.print "cp_save_state: missing parameter"
.endif
;
;
.if $narg==1
cp_read_sp p1,NO_ERR
;guarantee that we're at beginning of
; save state sequence
cp_read_state_wd %%((&p1)+ 0) ; instruction
cp_read_state_wd %%((&p1)+ 1) ; I-Temp
cp_read_state_wd %%((&p1)+ 3) ; R MSBs
cp_read_state_wd %%((&p1)+ 2) ; R LSBs
cp_read_state_wd %%((&p1)+ 5) ; S MSBs
cp_read_state_wd %%((&p1)+ 4) ; S LSBs
cp_read_state_wd %%((&p1)+ 7) ; R-Temp MSBs
cp_read_state_wd %%((&p1)+ 6) ; R-Temp LSBs
cp_read_state_wd %%((&p1)+ 9) ; S-Temp MSBs
cp_read_state_wd %%((&p1)+ 8) ; S-Temp LSBs
cp_read_state_wd %%((&p1)+10) ; status
cp_read_state_wd %%((&p1)+11) ; precision
cp_read_state_wd %%((&p1)+13) ; RF0 MSBs
cp_read_state_wd %%((&p1)+12) ; RF0 LSBs
cp_read_state_wd %%((&p1)+15) ; RF1 MSBs
cp_read_state_wd %%((&p1)+14) ; RF1 LSBs
cp_read_state_wd %%((&p1)+17) ; RF2 MSBs
cp_read_state_wd %%((&p1)+16) ; RF2 LSBs
cp_read_state_wd %%((&p1)+19) ; RF3 MSBs
cp_read_state_wd %%((&p1)+18) ; RF3 LSBs
cp_read_state_wd %%((&p1)+21) ; RF4 MSBs
cp_read_state_wd %%((&p1)+20) ; RF4 LSBs
cp_read_state_wd %%((&p1)+23) ; RF5 MSBs
cp_read_state_wd %%((&p1)+22) ; RF5 LSBs
cp_read_state_wd %%((&p1)+25) ; RF6 MSBs
cp_read_state_wd %%((&p1)+24) ; RF6 LSBs
cp_read_state_wd %%((&p1)+27) ; RF7 MSBs
cp_read_state_wd %%((&p1)+26) ; RF7 LSBs
cp_read_state_wd %%((&p1)+29) ; mode MSBs
cp_read_state_wd %%((&p1)+28) ; mode LSBs
.exitm
.endif
;
;
.if $narg>=2
.err
.print "cp_save_state: too many parameters"
.endif
;
.endm
;
;
;
;
;
;============================================================================
; MACRO NAME: cp_restore_state
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 18, 1988
;
; FUNCTION: Restores Am29027 state
;
; PARAMETERS:
; reg - the first of 30 Am29000 g.p. registers containing Am29027
; state.
;
; temp - a scratch register used by cp_restore_state
;
; USAGE:
;
; cp_restore_state reg,temp
;
; This macro restores Am29027 state by transferring 30 words to the
; Am29027; these words are taken from a block of Am29000 g.p. registers
; starting at "reg." The words are assumed to be stored in the following
; order:
;
; reg instruction register
; reg+1 I-Temp
; reg+2 R MSBs
; reg+3 R LSBs
; reg+4 S MSBs
; reg+5 S LSBs
; reg+6 R-Temp MSBs
; reg+7 R-Temp LSBs
; reg+8 S-Temp MSBs
; reg+9 S-Temp LSBs
; reg+10 status
; reg+11 precision
; reg+12 RF0 MSBs
; reg+13 RF0 LSBs
; . .
; . .
; . .
; reg+26 RF7 MSBs
; reg+27 RF7 LSBs
; reg+28 mode MSBs
; reg+29 mode LSBs
;
;
; Ex: cp_restore_state lr2,gr70 Restores Am29027 state by
; transferring a block of 30 words
; that begins at lr2. Register gr70
; is used as scratch storage by this
; macro.
;
;
;============================================================================
;
.macro cp_restore_state,p1,p2
;
.if $narg<=1
.err
.print "cp_restore_state: missing parameter(s)"
.endif
;
;
.if $narg==2
 
const p2,0 ;clear the status register
cp_write_status p2
;
cp_write_mode %%((&p1)+28) ;restore the mode register
;
const p2,0x80000018 ; restore RF0
consth p2,0x80000018
cp_write_inst p2
cp_write_r %%((&p1)+12),START
;
consth p2,0x90000018 ; restore RF1
cp_write_inst p2
cp_write_r %%((&p1)+14),START
;
consth p2,0xA0000018 ; restore RF2
cp_write_inst p2
cp_write_r %%((&p1)+16),START
;
consth p2,0xB0000018 ; restore RF3
cp_write_inst p2
cp_write_r %%((&p1)+18),START
;
consth p2,0xC0000018 ; restore RF4
cp_write_inst p2
cp_write_r %%((&p1)+20),START
;
consth p2,0xD0000018 ; restore RF5
cp_write_inst p2
cp_write_r %%((&p1)+22),START
;
consth p2,0xE0000018 ; restore RF6
cp_write_inst p2
cp_write_r %%((&p1)+24),START
;
consth p2,0xF0000018 ; restore RF7
cp_write_inst p2
cp_write_r %%((&p1)+26),START
;
cp_read_sp p2 ; do a dummy read, to guarantee that
; the last operation is complete
;
cp_write_prec %%((&p1)+11) ; restore precision
;
cp_write_r %%((&p1)+2) ; restore R
cp_write_s %%((&p1)+4) ; restore S
cp_write_inst %%((&p1)+0) ; restore instruction
cp_advance_temps ; move R,S, and inst. to working registers
;
cp_write_r %%((&p1)+6) ; restore R-Temp
cp_write_s %%((&p1)+8) ; restore S-Temp
cp_write_inst %%((&p1)+1) ; restore I-Temp
;
; restore the status register, retime last operation
;
cp_write_status %%((&p1)+10),RESTORE
;
.exitm
.endif
;
;
.if $narg>=3
.err
.print "cp_restore_state: too many parameters"
.endif
;
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_build_inst
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 24, 1988
; : January 4, 1989 Rich Parker
;
; FUNCTION: Builds a 32-bit Am29027 instruction in an Am29000 g.p.
; register.
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the instruction word
; is to be written
;
; op_code - mnemonic specifying the operation to be performed
; (e.g. FADD, P_TIMES_Q)
;
; precision - precision specification for destination, source operands:
; D_S - double-prec. result, single-prec. input(s)
; D_D - double-prec. result, double-prec. input(s)
; S_S - single-prec. result, single-prec. input(s)
; S_D - single-prec. result, double-prec. input(s)
;
; dest - destination for the operation result:
; RF0 - store result in Am29027 register file location RF0
; RF1 - store result in Am29027 register file location RF1
; RF2 - store result in Am29027 register file location RF2
; RF3 - store result in Am29027 register file location RF3
; RF4 - store result in Am29027 register file location RF4
; RF5 - store result in Am29027 register file location RF5
; RF6 - store result in Am29027 register file location RF6
; RF7 - store result in Am29027 register file location RF7
; GP - result is to be stored in an Am29000 g.p. register
; with a read_dp, read_sp, or read_int macro.
;
; source1,
; source2,
; source3 - source operand specifications:
; R - take source from Am29027 register R
; S - take source from Am29027 register S
; RF0 - take source from Am29027 register file location RF0
; RF1 - take source from Am29027 register file location RF1
; RF2 - take source from Am29027 register file location RF2
; RF3 - take source from Am29027 register file location RF3
; RF4 - take source from Am29027 register file location RF4
; RF5 - take source from Am29027 register file location RF5
; RF6 - take source from Am29027 register file location RF6
; RF7 - take source from Am29027 register file location RF7
; 0 - source is 0
; ONE_HALF - source is constant .5 (f.p. operations only)
; IMINUS1 - source is constant -1 (integer operations only)
; 1 - source is constant 1
; 2 - source is constant 2
; 3 - source is constant 3
; PI - source is constant pi (f.p. operations only)
; IMINUSMAX - source is -(2**63) (integer operations only)
;
;
; USAGE:
;
; cp_build_inst reg,op_code,[precision,]dest,source1[,source2][,source3]
;
; Op-codes fall into two categories: those that correspond to Am29000
; floating-point op-codes, and for which the precision is implicit (e.g.
; FADD, DMUL); and those that correspond to Am29027 base operations
; (e.g. P_PLUS_T, P_TIMES_Q), and which require an explicit precision
; specification.
;
; Every operation specified must have a destination; if the operation
; does not write a result to the Am29027 register file, destination GP
; must be specified. The number of source operands specified must agree
; with the number of source operands required by the operation specified.
;
; Ex:
;
; cp_build_inst lr2,FADD,RF7,R,S
; Builds an instruction word to
; perform the operation:
; RF7 <- R + S
; where R, S, and RF7 are single-
; precision f.p. operands. The
; instruction word is placed in lr2.
;
; cp_build_inst gr119,DMUL,GP,R,ONE_HALF
; Builds an instruction word to
; perform the operation:
; R * .5
; where R, .5, and the result
; are double-precision f.p. operands.
; The result is not written to the
; Am29027 register file. The
; instruction word is written to
; gr119.
;
;
; cp_build_inst lr3,MIN_P_AND_T,S_D,RF7,R,S
; Builds an instruction word to
; perform the operation:
; RF7 <- smaller of(R,S)
; where R and S are double-precision
; f.p. operands, and RF7 is a single-
; precison f.p. operand. The
; instruction word is written to
; lr3.
;
;
; cp_build_inst gr97,I_P_TIMES_Q,S_S,GP,R,2
; Builds an instruction word to
; perform the operation:
; R * 2
; where R, .5, and the result
; are single-precision integer operands.
; The result is not written to the
; Am29027 register file. The
; instruction word is written to
; gr97
;
;
; cp_build_inst lr7,ABS_P,D_D,RF6,S
; Builds an instruction word to
; perform the operation:
; RF6 <- |S|
; where S and RF7 are double-precision
; f.p. operands. The instruction
; word is written to gr7.
;
;
; cp_build_inst gr127,PQ_PLUS_T,D_D,RF6,R,S,RF6
; Builds an instruction word to
; perform the operation:
; RF6 <- (R * S) + RF6
; where R, S and the result are
; double-precision f.p. operands.
; The instruction word is written
; to gr127.
;
;
;
;============================================================================
;
.macro cp_build_inst,p1,p2,p3,p4,p5,p6,p7
;
.if $narg<=3
.err
.print "cp_build_inst: missing parameter(s)"
.exitm
.endif
;
; classify operation type
;
.set _cp_op_type,255
 
_cp_set_op_params p2,FADD,1,5,4,0,5
_cp_set_op_params p2,DADD,1,5,4,0,5
_cp_set_op_params p2,FSUB,1,5,4,0,5
_cp_set_op_params p2,DSUB,1,5,4,0,5
_cp_set_op_params p2,FMUL,1,5,4,5,0
_cp_set_op_params p2,DMUL,1,5,4,5,0
_cp_set_op_params p2,FEQ,1,5,4,0,5
_cp_set_op_params p2,DEQ,1,5,4,0,5
_cp_set_op_params p2,FGE,1,5,4,0,5
_cp_set_op_params p2,DGE,1,5,4,0,5
_cp_set_op_params p2,FGT,1,5,4,0,5
_cp_set_op_params p2,DGT,1,5,4,0,5
_cp_set_op_params p2,CONVERT_I_TO_F,1,4,0,0,4
_cp_set_op_params p2,CONVERT_I_TO_D,1,4,0,0,4
_cp_set_op_params p2,CONVERT_F_TO_I,1,4,0,0,4
_cp_set_op_params p2,CONVERT_D_TO_I,1,4,0,0,4
;
; The next two lines were corrected on 1-4-89, Rich Parker
;
_cp_set_op_params p2,CONVERT_F_TO_D,1,4,4,0,0
_cp_set_op_params p2,CONVERT_D_TO_F,1,4,4,0,0
;
_cp_set_op_params p2,PASS_P,0,5,5,0,0
_cp_set_op_params p2,MINUSP,0,5,5,0,0
_cp_set_op_params p2,ABSP,0,5,5,0,0
_cp_set_op_params p2,SIGNT_TIMES_ABSP,0,6,6,0,5
_cp_set_op_params p2,P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,MINUSP_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,MINUSP_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,ABS_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,ABS_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,ABSP_PLUS_ABST,0,6,5,0,6
_cp_set_op_params p2,ABSP_MINUS_ABST,0,6,5,0,6
_cp_set_op_params p2,ABS_ABSP_MINUS_ABST,0,6,5,0,6
_cp_set_op_params p2,P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,MINUSP_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,ABS_P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,COMPARE_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MAX_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MAX_ABSP_AND_ABST,0,6,5,0,6
_cp_set_op_params p2,MIN_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MIN_ABSP_AND_ABST,0,6,5,0,6
_cp_set_op_params p2,LIMIT_P_TO_MAGT,0,6,5,0,6
_cp_set_op_params p2,CONVERT_T_TO_INT,0,5,0,0,5
_cp_set_op_params p2,SCALE_T_TO_INT_BY_Q,0,6,0,6,5
_cp_set_op_params p2,PQ_PLUS_T,0,7,5,6,7
_cp_set_op_params p2,MINUSPQ_PLUS_T,0,7,5,6,7
_cp_set_op_params p2,PQ_MINUS_T,0,7,5,6,7
_cp_set_op_params p2,MINUSPQ_MINUS_T,0,7,5,6,7
_cp_set_op_params p2,ABSPQ_PLUS_ABST,0,7,5,6,7
_cp_set_op_params p2,MINUSABSPQ_PLUS_ABST,0,7,5,6,7
_cp_set_op_params p2,ABSPQ_MINUS_ABST,0,7,5,6,7
_cp_set_op_params p2,ROUND_T_TO_INT,0,5,0,0,5
_cp_set_op_params p2,RECIPROCAL_OF_P,0,5,5,0,0
_cp_set_op_params p2,CONVERT_T_TO_ALT,0,5,0,0,5
_cp_set_op_params p2,CONVERT_T_FROM_ALT,0,5,0,0,5
_cp_set_op_params p2,I_PASS_P,0,5,5,0,0
_cp_set_op_params p2,I_MINUSP,0,5,5,0,0
_cp_set_op_params p2,I_ABSP,0,5,5,0,0
_cp_set_op_params p2,I_SIGNT_TIMES_ABSP,0,6,6,0,5
_cp_set_op_params p2,I_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,I_MINUSP_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_ABS_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_ABS_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,I_P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,I_COMPARE_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_MAX_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_MIN_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_CONVERT_T_TO_FLOAT,0,5,0,0,5
_cp_set_op_params p2,I_SCALE_T_TO_FLOAT_BY_Q,0,6,0,6,5
_cp_set_op_params p2,I_P_OR_T,0,6,5,0,6
_cp_set_op_params p2,I_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_P_XOR_T,0,6,5,0,6
_cp_set_op_params p2,I_NOT_T,0,5,0,0,5
_cp_set_op_params p2,I_LSHIFT_P_BY_Q,0,6,5,6,0
_cp_set_op_params p2,I_ASHIFT_P_BY_Q,0,6,5,6,0
_cp_set_op_params p2,I_FSHIFT_PT_BY_Q,0,7,5,7,6
_cp_set_op_params p2,MOVE_P,0,5,5,0,0
;
;
; if we couldn't find the op_code, flag an error
;
.if _cp_op_type>=2
.err
.print "cp_build_inst: invalid Am29027 instruction mnemonic"
.exitm
.endif
;
; if number of parameters is incorrect, flag error
;
.if $narg!=_cp_no_params
.err
.print "cp_build_inst: incorrect number of parameters"
.exitm
.endif
;
; find correct value for precision field, if appropriate
;
.set _cp_prec_field,0 ; ** CORRECTION (1/4/89 ROP)
.if _cp_op_type==0 ; need to look for precision
.set _cp_found_precision,0
.ifeqs "@p3@","D_D"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","D_S"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","S_D"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","S_S"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.if _cp_found_precision==0
.err
.print "cp_build_inst: missing precision field"
.exitm
.endif
.endif
;
; find value for destination field
;
.if _cp_op_type==0
.set _cp_dest_field_val,CP_DEST_EQ_@p4
.else
.set _cp_dest_field_val,CP_DEST_EQ_@p3
.endif
;
; find correct value for p select field
;
.if _cp_p_paramno==0
.set _cp_p_field_val,0x00000000
.endif
.if _cp_p_paramno==4
.set _cp_p_field_val,CP_P_EQ_@p4
.endif
.if _cp_p_paramno==5
.set _cp_p_field_val,CP_P_EQ_@p5
.endif
.if _cp_p_paramno==6
.set _cp_p_field_val,CP_P_EQ_@p6
.endif
.if _cp_p_paramno==7
.set _cp_p_field_val,CP_P_EQ_@p7
.endif
.ifeqs "@p2@","I_NOT_T"
.set _cp_p_field_val,CP_P_EQ_IMINUS1
.endif
;
; find correct value for q select field
;
.if _cp_q_paramno==0
.set _cp_q_field_val,0x00000000
.endif
.if _cp_q_paramno==4
.set _cp_q_field_val,CP_Q_EQ_@p4
.endif
.if _cp_q_paramno==5
.set _cp_q_field_val,CP_Q_EQ_@p5
.endif
.if _cp_q_paramno==6
.set _cp_q_field_val,CP_Q_EQ_@p6
.endif
.if _cp_q_paramno==7
.set _cp_q_field_val,CP_Q_EQ_@p7
.endif
;
; find correct value for t select field
;
.if _cp_t_paramno==0
.set _cp_t_field_val,0x00000000
.endif
.if _cp_t_paramno==4
.set _cp_t_field_val,CP_T_EQ_@p4
.endif
.if _cp_t_paramno==5
.set _cp_t_field_val,CP_T_EQ_@p5
.endif
.if _cp_t_paramno==6
.set _cp_t_field_val,CP_T_EQ_@p6
.endif
.if _cp_t_paramno==7
.set _cp_t_field_val,CP_T_EQ_@p7
.endif
;
;
.set _cp_inst_word,CP_@p2@|_cp_prec_field|_cp_dest_field_val
.set _cp_inst_word,_cp_inst_word|_cp_p_field_val
.set _cp_inst_word,_cp_inst_word|_cp_q_field_val
.set _cp_inst_word,_cp_inst_word|_cp_t_field_val
 
const p1,_cp_inst_word
consth p1,_cp_inst_word
;
.endm
;
;
;
.macro _cp_set_op_params,par1,par2,par3,par4,par5,par6,par7
.ifeqs "@par1@","@par2@"
.set _cp_op_type,par3
.set _cp_no_params,par4
.set _cp_p_paramno,par5
.set _cp_q_paramno,par6
.set _cp_t_paramno,par7
.endif
.endm
;
;
;
;============================================================================
; MACRO NAME: cp_build_inst_h
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 24, 1988
; : January 4, 1989 Rich Parker
;
; FUNCTION: Builds a 16 MSBs of a 32-bit Am29027 instruction in an
; Am29000 g.p. register.
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the instruction word
; is to be written
;
; op_code - mnemonic specifying the operation to be performed
; (e.g. FADD, P_TIMES_Q)
;
; precision - precision specification for destination, source operands:
; D_S - double-prec. result, single-prec. input(s)
; D_D - double-prec. result, double-prec. input(s)
; S_S - single-prec. result, single-prec. input(s)
; S_D - single-prec. result, double-prec. input(s)
;
; dest - destination for the operation result:
; RF0 - store result in Am29027 register file location RF0
; RF1 - store result in Am29027 register file location RF1
; RF2 - store result in Am29027 register file location RF2
; RF3 - store result in Am29027 register file location RF3
; RF4 - store result in Am29027 register file location RF4
; RF5 - store result in Am29027 register file location RF5
; RF6 - store result in Am29027 register file location RF6
; RF7 - store result in Am29027 register file location RF7
; GP - result is to be stored in an Am29000 g.p. register
; with a read_dp, read_sp, or read_int macro.
;
; source1,
; source2,
; source3 - source operand specifications:
; R - take source from Am29027 register R
; S - take source from Am29027 register S
; RF0 - take source from Am29027 register file location RF0
; RF1 - take source from Am29027 register file location RF1
; RF2 - take source from Am29027 register file location RF2
; RF3 - take source from Am29027 register file location RF3
; RF4 - take source from Am29027 register file location RF4
; RF5 - take source from Am29027 register file location RF5
; RF6 - take source from Am29027 register file location RF6
; RF7 - take source from Am29027 register file location RF7
; 0 - source is 0
; ONE_HALF - source is constant .5 (f.p. operations only)
; IMINUS1 - source is constant -1 (integer operations only)
; 1 - source is constant 1
; 2 - source is constant 2
; 3 - source is constant 3
; PI - source is constant pi (f.p. operations only)
; IMINUSMAX - source is -(2**63) (integer operations only)
;
;
; USAGE:
;
; cp_build_inst_h reg,op_code,[precision,]dest,source1[,source2][,source3]
;
; This macro is similar to cp_build_inst, but creates only the 16 MSBs
; of the 32-bit Am29027 instruction word. This macro is useful in cases
; where the 16 LSBs of instruction word, which specify the operation
; to be performed, already exist in an Am29000 g.p. register, but where
; the 16 MSBs, which specify operand sources and destination, must be
; changed. In such cases, one Am29000 instruction can be saved by using
; cp_build_inst_h instead of cp_build_inst.
;
; Syntax and usage are identical to that of cp_build_inst.
;
; NOTE: This macro references macro _cp_set_op_params, which appears
; in the assembly listing for macro _cp_build_inst.
;
;
;
;
;============================================================================
;
.macro cp_build_inst_h,p1,p2,p3,p4,p5,p6,p7
;
.if $narg<=3
.err
.print "cp_build_inst_h: missing parameter(s)"
.exitm
.endif
;
; classify operation type
;
.set _cp_op_type,255
 
_cp_set_op_params p2,FADD,1,5,4,0,5
_cp_set_op_params p2,DADD,1,5,4,0,5
_cp_set_op_params p2,FSUB,1,5,4,0,5
_cp_set_op_params p2,DSUB,1,5,4,0,5
_cp_set_op_params p2,FMUL,1,5,4,5,0
_cp_set_op_params p2,DMUL,1,5,4,5,0
_cp_set_op_params p2,FEQ,1,5,4,0,5
_cp_set_op_params p2,DEQ,1,5,4,0,5
_cp_set_op_params p2,FGE,1,5,4,0,5
_cp_set_op_params p2,DGE,1,5,4,0,5
_cp_set_op_params p2,FGT,1,5,4,0,5
_cp_set_op_params p2,DGT,1,5,4,0,5
_cp_set_op_params p2,CONVERT_I_TO_F,1,4,0,0,4
_cp_set_op_params p2,CONVERT_I_TO_D,1,4,0,0,4
_cp_set_op_params p2,CONVERT_F_TO_I,1,4,0,0,4
_cp_set_op_params p2,CONVERT_D_TO_I,1,4,0,0,4
;
; The next two lines were corrected on 1-4-89, Rich Parker
;
_cp_set_op_params p2,CONVERT_F_TO_D,1,4,4,0,0
_cp_set_op_params p2,CONVERT_D_TO_F,1,4,4,0,0
;
_cp_set_op_params p2,PASS_P,0,5,5,0,0
_cp_set_op_params p2,MINUSP,0,5,5,0,0
_cp_set_op_params p2,ABSP,0,5,5,0,0
_cp_set_op_params p2,SIGNT_TIMES_ABSP,0,6,6,0,5
_cp_set_op_params p2,P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,MINUSP_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,MINUSP_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,ABS_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,ABS_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,ABSP_PLUS_ABST,0,6,5,0,6
_cp_set_op_params p2,ABSP_MINUS_ABST,0,6,5,0,6
_cp_set_op_params p2,ABS_ABSP_MINUS_ABST,0,6,5,0,6
_cp_set_op_params p2,P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,MINUSP_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,ABS_P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,COMPARE_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MAX_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MAX_ABSP_AND_ABST,0,6,5,0,6
_cp_set_op_params p2,MIN_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MIN_ABSP_AND_ABST,0,6,5,0,6
_cp_set_op_params p2,LIMIT_P_TO_MAGT,0,6,5,0,6
_cp_set_op_params p2,CONVERT_T_TO_INT,0,5,0,0,5
_cp_set_op_params p2,SCALE_T_TO_INT_BY_Q,0,6,0,6,5
_cp_set_op_params p2,PQ_PLUS_T,0,7,5,6,7
_cp_set_op_params p2,MINUSPQ_PLUS_T,0,7,5,6,7
_cp_set_op_params p2,PQ_MINUS_T,0,7,5,6,7
_cp_set_op_params p2,MINUSPQ_MINUS_T,0,7,5,6,7
_cp_set_op_params p2,ABSPQ_PLUS_ABST,0,7,5,6,7
_cp_set_op_params p2,MINUSABSPQ_PLUS_ABST,0,7,5,6,7
_cp_set_op_params p2,ABSPQ_MINUS_ABST,0,7,5,6,7
_cp_set_op_params p2,ROUND_T_TO_INT,0,5,0,0,5
_cp_set_op_params p2,RECIPROCAL_OF_P,0,5,5,0,0
_cp_set_op_params p2,CONVERT_T_TO_ALT,0,5,0,0,5
_cp_set_op_params p2,CONVERT_T_FROM_ALT,0,5,0,0,5
_cp_set_op_params p2,I_PASS_P,0,5,5,0,0
_cp_set_op_params p2,I_MINUSP,0,5,5,0,0
_cp_set_op_params p2,I_ABSP,0,5,5,0,0
_cp_set_op_params p2,I_SIGNT_TIMES_ABSP,0,6,6,0,5
_cp_set_op_params p2,I_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,I_MINUSP_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_ABS_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_ABS_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,I_P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,I_COMPARE_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_MAX_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_MIN_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_CONVERT_T_TO_FLOAT,0,5,0,0,5
_cp_set_op_params p2,I_SCALE_T_TO_FLOAT_BY_Q,0,6,0,6,5
_cp_set_op_params p2,I_P_OR_T,0,6,5,0,6
_cp_set_op_params p2,I_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_P_XOR_T,0,6,5,0,6
_cp_set_op_params p2,I_NOT_T,0,5,0,0,5
_cp_set_op_params p2,I_LSHIFT_P_BY_Q,0,6,5,6,0
_cp_set_op_params p2,I_ASHIFT_P_BY_Q,0,6,5,6,0
_cp_set_op_params p2,I_FSHIFT_PT_BY_Q,0,7,5,7,6
_cp_set_op_params p2,MOVE_P,0,5,5,0,0
;
;
; if we couldn't find the op_code, flag an error
;
.if _cp_op_type>=2
.err
.print "cp_build_inst_h: invalid Am29027 instruction mnemonic"
.exitm
.endif
;
; if number of parameters is incorrect, flag error
;
.if $narg!=_cp_no_params
.err
.print "cp_build_inst_h: incorrect number of parameters"
.exitm
.endif
;
; find correct value for precision field, if appropriate
;
.set _cp_prec_field,0 ; ** CORRECTION (1-4-89 Rich Parker)
.if _cp_op_type==0 ; need to look for precision
.set _cp_found_precision,0
.ifeqs "@p3@","D_D"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","D_S"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","S_D"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","S_S"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.if _cp_found_precision==0
.err
.print "cp_build_inst_h: missing precision field"
.exitm
.endif
.endif
;
; find value for destination field
;
.if _cp_op_type==0
.set _cp_dest_field_val,CP_DEST_EQ_@p4
.else
.set _cp_dest_field_val,CP_DEST_EQ_@p3
.endif
;
; find correct value for p select field
;
.if _cp_p_paramno==0
.set _cp_p_field_val,0x00000000
.endif
.if _cp_p_paramno==4
.set _cp_p_field_val,CP_P_EQ_@p4
.endif
.if _cp_p_paramno==5
.set _cp_p_field_val,CP_P_EQ_@p5
.endif
.if _cp_p_paramno==6
.set _cp_p_field_val,CP_P_EQ_@p6
.endif
.if _cp_p_paramno==7
.set _cp_p_field_val,CP_P_EQ_@p7
.endif
.ifeqs "@p2@","I_NOT_T"
.set _cp_p_field_val,CP_P_EQ_IMINUS1
.endif
;
; find correct value for q select field
;
.if _cp_q_paramno==0
.set _cp_q_field_val,0x00000000
.endif
.if _cp_q_paramno==4
.set _cp_q_field_val,CP_Q_EQ_@p4
.endif
.if _cp_q_paramno==5
.set _cp_q_field_val,CP_Q_EQ_@p5
.endif
.if _cp_q_paramno==6
.set _cp_q_field_val,CP_Q_EQ_@p6
.endif
.if _cp_q_paramno==7
.set _cp_q_field_val,CP_Q_EQ_@p7
.endif
;
; find correct value for t select field
;
.if _cp_t_paramno==0
.set _cp_t_field_val,0x00000000
.endif
.if _cp_t_paramno==4
.set _cp_t_field_val,CP_T_EQ_@p4
.endif
.if _cp_t_paramno==5
.set _cp_t_field_val,CP_T_EQ_@p5
.endif
.if _cp_t_paramno==6
.set _cp_t_field_val,CP_T_EQ_@p6
.endif
.if _cp_t_paramno==7
.set _cp_t_field_val,CP_T_EQ_@p7
.endif
;
;
.set _cp_inst_word,CP_@p2@|_cp_prec_field|_cp_dest_field_val
.set _cp_inst_word,_cp_inst_word|_cp_p_field_val
.set _cp_inst_word,_cp_inst_word|_cp_q_field_val
.set _cp_inst_word,_cp_inst_word|_cp_t_field_val
;
consth p1,_cp_inst_word
;
.endm
;
;
;
;
;============================================================================
; MACRO NAME: cp_build_inst_l
;
; WRITTEN BY: Bob Perlman
;
; MOST RECENT UPDATE: April 24, 1988
; : January 4, 1989 Rich Parker
;
; FUNCTION: Builds a 16 LSBs of a 32-bit Am29027 instruction in an
; Am29000 g.p. register; the 16 MSBs of the register are
; set to 0..
;
; PARAMETERS:
; reg - the Am29000 g.p. register into which the instruction word
; is to be written
;
; op_code - mnemonic specifying the operation to be performed
; (e.g. FADD, P_TIMES_Q)
;
; precision - precision specification for destination, source operands:
; D_S - double-prec. result, single-prec. input(s)
; D_D - double-prec. result, double-prec. input(s)
; S_S - single-prec. result, single-prec. input(s)
; S_D - single-prec. result, double-prec. input(s)
;
; dest - destination for the operation result:
; RF0 - store result in Am29027 register file location RF0
; RF1 - store result in Am29027 register file location RF1
; RF2 - store result in Am29027 register file location RF2
; RF3 - store result in Am29027 register file location RF3
; RF4 - store result in Am29027 register file location RF4
; RF5 - store result in Am29027 register file location RF5
; RF6 - store result in Am29027 register file location RF6
; RF7 - store result in Am29027 register file location RF7
; GP - result is to be stored in an Am29000 g.p. register
; with a read_dp, read_sp, or read_int macro.
;
; source1,
; source2,
; source3 - source operand specifications:
; R - take source from Am29027 register R
; S - take source from Am29027 register S
; RF0 - take source from Am29027 register file location RF0
; RF1 - take source from Am29027 register file location RF1
; RF2 - take source from Am29027 register file location RF2
; RF3 - take source from Am29027 register file location RF3
; RF4 - take source from Am29027 register file location RF4
; RF5 - take source from Am29027 register file location RF5
; RF6 - take source from Am29027 register file location RF6
; RF7 - take source from Am29027 register file location RF7
; 0 - source is 0
; ONE_HALF - source is constant .5 (f.p. operations only)
; IMINUS1 - source is constant -1 (integer operations only)
; 1 - source is constant 1
; 2 - source is constant 2
; 3 - source is constant 3
; PI - source is constant pi (f.p. operations only)
; IMINUSMAX - source is -(2**63) (integer operations only)
;
;
; USAGE:
;
; cp_build_inst_l reg,op_code,[precision,]dest,source1[,source2][,source3]
;
; This macro is similar to cp_build_inst, but creates only the 16 LSBs
; of the 32-bit Am29027 instruction word; the 16 MSBs of the target
; register are set to 0. This macro is useful in cases
; where it is helpful to specify instruction LSBs and MSBs separately,
; to improve instruction scheduling.
;
; Syntax and usage are identical to that of cp_build_inst.
;
; NOTE: This macro references macro _cp_set_op_params, which appears
; in the assembly listing for macro _cp_build_inst.
;
;
;============================================================================
;
.macro cp_build_inst_l,p1,p2,p3,p4,p5,p6,p7
;
.if $narg<=3
.err
.print "cp_build_inst_h: missing parameter(s)"
.exitm
.endif
;
; classify operation type
;
.set _cp_op_type,255
 
_cp_set_op_params p2,FADD,1,5,4,0,5
_cp_set_op_params p2,DADD,1,5,4,0,5
_cp_set_op_params p2,FSUB,1,5,4,0,5
_cp_set_op_params p2,DSUB,1,5,4,0,5
_cp_set_op_params p2,FMUL,1,5,4,5,0
_cp_set_op_params p2,DMUL,1,5,4,5,0
_cp_set_op_params p2,FEQ,1,5,4,0,5
_cp_set_op_params p2,DEQ,1,5,4,0,5
_cp_set_op_params p2,FGE,1,5,4,0,5
_cp_set_op_params p2,DGE,1,5,4,0,5
_cp_set_op_params p2,FGT,1,5,4,0,5
_cp_set_op_params p2,DGT,1,5,4,0,5
_cp_set_op_params p2,CONVERT_I_TO_F,1,4,0,0,4
_cp_set_op_params p2,CONVERT_I_TO_D,1,4,0,0,4
_cp_set_op_params p2,CONVERT_F_TO_I,1,4,0,0,4
_cp_set_op_params p2,CONVERT_D_TO_I,1,4,0,0,4
;
; The next two lines were corrected on 1-4-89, Rich Parker
;
_cp_set_op_params p2,CONVERT_F_TO_D,1,4,4,0,0
_cp_set_op_params p2,CONVERT_D_TO_F,1,4,4,0,0
;
_cp_set_op_params p2,PASS_P,0,5,5,0,0
_cp_set_op_params p2,MINUSP,0,5,5,0,0
_cp_set_op_params p2,ABSP,0,5,5,0,0
_cp_set_op_params p2,SIGNT_TIMES_ABSP,0,6,6,0,5
_cp_set_op_params p2,P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,MINUSP_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,MINUSP_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,ABS_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,ABS_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,ABSP_PLUS_ABST,0,6,5,0,6
_cp_set_op_params p2,ABSP_MINUS_ABST,0,6,5,0,6
_cp_set_op_params p2,ABS_ABSP_MINUS_ABST,0,6,5,0,6
_cp_set_op_params p2,P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,MINUSP_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,ABS_P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,COMPARE_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MAX_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MAX_ABSP_AND_ABST,0,6,5,0,6
_cp_set_op_params p2,MIN_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,MIN_ABSP_AND_ABST,0,6,5,0,6
_cp_set_op_params p2,LIMIT_P_TO_MAGT,0,6,5,0,6
_cp_set_op_params p2,CONVERT_T_TO_INT,0,5,0,0,5
_cp_set_op_params p2,SCALE_T_TO_INT_BY_Q,0,6,0,6,5
_cp_set_op_params p2,PQ_PLUS_T,0,7,5,6,7
_cp_set_op_params p2,MINUSPQ_PLUS_T,0,7,5,6,7
_cp_set_op_params p2,PQ_MINUS_T,0,7,5,6,7
_cp_set_op_params p2,MINUSPQ_MINUS_T,0,7,5,6,7
_cp_set_op_params p2,ABSPQ_PLUS_ABST,0,7,5,6,7
_cp_set_op_params p2,MINUSABSPQ_PLUS_ABST,0,7,5,6,7
_cp_set_op_params p2,ABSPQ_MINUS_ABST,0,7,5,6,7
_cp_set_op_params p2,ROUND_T_TO_INT,0,5,0,0,5
_cp_set_op_params p2,RECIPROCAL_OF_P,0,5,5,0,0
_cp_set_op_params p2,CONVERT_T_TO_ALT,0,5,0,0,5
_cp_set_op_params p2,CONVERT_T_FROM_ALT,0,5,0,0,5
_cp_set_op_params p2,I_PASS_P,0,5,5,0,0
_cp_set_op_params p2,I_MINUSP,0,5,5,0,0
_cp_set_op_params p2,I_ABSP,0,5,5,0,0
_cp_set_op_params p2,I_SIGNT_TIMES_ABSP,0,6,6,0,5
_cp_set_op_params p2,I_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,I_MINUSP_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_ABS_P_PLUS_T,0,6,5,0,6
_cp_set_op_params p2,I_ABS_P_MINUS_T,0,6,5,0,6
_cp_set_op_params p2,I_P_TIMES_Q,0,6,5,6,0
_cp_set_op_params p2,I_COMPARE_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_MAX_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_MIN_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_CONVERT_T_TO_FLOAT,0,5,0,0,5
_cp_set_op_params p2,I_SCALE_T_TO_FLOAT_BY_Q,0,6,0,6,5
_cp_set_op_params p2,I_P_OR_T,0,6,5,0,6
_cp_set_op_params p2,I_P_AND_T,0,6,5,0,6
_cp_set_op_params p2,I_P_XOR_T,0,6,5,0,6
_cp_set_op_params p2,I_NOT_T,0,5,0,0,5
_cp_set_op_params p2,I_LSHIFT_P_BY_Q,0,6,5,6,0
_cp_set_op_params p2,I_ASHIFT_P_BY_Q,0,6,5,6,0
_cp_set_op_params p2,I_FSHIFT_PT_BY_Q,0,7,5,7,6
_cp_set_op_params p2,MOVE_P,0,5,5,0,0
;
;
; if we couldn't find the op_code, flag an error
;
.if _cp_op_type>=2
.err
.print "cp_build_inst_h: invalid Am29027 instruction mnemonic"
.exitm
.endif
;
; if number of parameters is incorrect, flag error
;
.if $narg!=_cp_no_params
.err
.print "cp_build_inst_h: incorrect number of parameters"
.exitm
.endif
;
; find correct value for precision field, if appropriate
;
.set _cp_prec_field,0 ; CORRECTION (1-4-89 Rich Parker)
.if _cp_op_type==0 ; need to look for precision
.set _cp_found_precision,0
.ifeqs "@p3@","D_D"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","D_S"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","S_D"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.ifeqs "@p3@","S_S"
.set _cp_prec_field,CP_@p3
.set _cp_found_precision,1
.endif
.if _cp_found_precision==0
.err
.print "cp_build_inst_h: missing precision field"
.exitm
.endif
.endif
;
; find value for destination field
;
.if _cp_op_type==0
.set _cp_dest_field_val,CP_DEST_EQ_@p4
.else
.set _cp_dest_field_val,CP_DEST_EQ_@p3
.endif
;
; find correct value for p select field
;
.if _cp_p_paramno==0
.set _cp_p_field_val,0x00000000
.endif
.if _cp_p_paramno==4
.set _cp_p_field_val,CP_P_EQ_@p4
.endif
.if _cp_p_paramno==5
.set _cp_p_field_val,CP_P_EQ_@p5
.endif
.if _cp_p_paramno==6
.set _cp_p_field_val,CP_P_EQ_@p6
.endif
.if _cp_p_paramno==7
.set _cp_p_field_val,CP_P_EQ_@p7
.endif
.ifeqs "@p2@","I_NOT_T"
.set _cp_p_field_val,CP_P_EQ_IMINUS1
.endif
;
; find correct value for q select field
;
.if _cp_q_paramno==0
.set _cp_q_field_val,0x00000000
.endif
.if _cp_q_paramno==4
.set _cp_q_field_val,CP_Q_EQ_@p4
.endif
.if _cp_q_paramno==5
.set _cp_q_field_val,CP_Q_EQ_@p5
.endif
.if _cp_q_paramno==6
.set _cp_q_field_val,CP_Q_EQ_@p6
.endif
.if _cp_q_paramno==7
.set _cp_q_field_val,CP_Q_EQ_@p7
.endif
;
; find correct value for t select field
;
.if _cp_t_paramno==0
.set _cp_t_field_val,0x00000000
.endif
.if _cp_t_paramno==4
.set _cp_t_field_val,CP_T_EQ_@p4
.endif
.if _cp_t_paramno==5
.set _cp_t_field_val,CP_T_EQ_@p5
.endif
.if _cp_t_paramno==6
.set _cp_t_field_val,CP_T_EQ_@p6
.endif
.if _cp_t_paramno==7
.set _cp_t_field_val,CP_T_EQ_@p7
.endif
;
;
.set _cp_inst_word,CP_@p2@|_cp_prec_field|_cp_dest_field_val
.set _cp_inst_word,_cp_inst_word|_cp_p_field_val
.set _cp_inst_word,_cp_inst_word|_cp_q_field_val
.set _cp_inst_word,_cp_inst_word|_cp_t_field_val
;
const p1,_cp_inst_word
;
.endm
;
; end of file fpsymbol.h
fpsymbol.h Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: proreg.h =================================================================== --- proreg.h (nonexistent) +++ proreg.h (revision 345) @@ -0,0 +1,60 @@ +; @(#)proreg.h 1.3 90/10/14 20:56:11, AMD +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Copyright 1989, 1990 Advanced Micro Devices, Inc. +; +; This software is the property of Advanced Micro Devices, Inc (AMD) which +; specifically grants the user the right to modify, use and distribute this +; software provided this notice is not removed or altered. All other rights +; are reserved by AMD. +; +; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS +; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL +; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR +; USE OF THIS SOFTWARE. +; +; So that all may benefit from your experience, please report any problems +; or suggestions about this software to the 29K Technical Support Center at +; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or +; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. +; +; Advanced Micro Devices, Inc. +; 29K Support Products +; Mail Stop 573 +; 5900 E. Ben White Blvd. +; Austin, TX 78741 +; 800-292-9263 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; proreg.h +; + ; 16 function value return regs + .reg v0, gr96 + .reg v1, gr97 + .reg v2, gr98 + .reg v3, gr99 + .reg v4, gr100 + .reg v5, gr101 + .reg v6, gr102 + .reg v7, gr103 + .reg v8, gr104 + .reg v9, gr105 + .reg v10, gr106 + .reg v11, gr107 + .reg v12, gr108 + .reg v13, gr109 + .reg v14, gr110 + .reg v15, gr111 +; + .reg rsp, gr1 ; Register Stack Pointer + .reg ret, gr96 ; First word of return value + .reg rp0, gr112 ; Reserved for Programmer, #0 + .reg rp1, gr113 ; Reserved for Programmer, #1 + .reg rp2, gr114 ; Reserved for Programmer, #2 + .reg rp3, gr115 ; Reserved for Programmer, #3 + .reg tav, gr121 ; Temporary, Argument for Trap Handlers + .reg tpc, gr122 ; Temporary, Return PC for Trap Handlers + .reg lrp, gr123 ; Large Return Pointer + .reg slp, gr124 ; Static Link Pointer + .reg msp, gr125 ; Memory Stack Pointer + .reg rab, gr126 ; Register Allocate Bound + .reg rfb, gr127 ; Register Free Bound
proreg.h Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: intrinsi.h =================================================================== --- intrinsi.h (nonexistent) +++ intrinsi.h (revision 345) @@ -0,0 +1,457 @@ +; @(#)intrinsi.h 1.4 90/10/14 20:56:06, Copyright 1988, 1989, 1990 AMD +; start of file intrinsi.h +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Copyright 1990 Advanced Micro Devices, Inc. +; +; This software is the property of Advanced Micro Devices, Inc (AMD) which +; specifically grants the user the right to modify, use and distribute this +; software provided this notice is not removed or altered. All other rights +; are reserved by AMD. +; +; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS +; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL +; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR +; USE OF THIS SOFTWARE. +; +; So that all may benefit from your experience, please report any problems +; or suggestions about this software to the 29K Technical Support Center at +; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or +; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. +; +; Advanced Micro Devices, Inc. +; 29K Support Products +; Mail Stop 573 +; 5900 E. Ben White Blvd. +; Austin, TX 78741 +; 800-292-9263 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; + .title "QTC Intrinsics Header file" +; +; Floating point library package for AMD 29000 family +; +; Copyright 1988 Advanced Micro Devices, Inc. +; +; All rights reserved +; +; Developed for AMD by Quantitative Technology Corporation +; 8700 SW Creekside Place Suite D +; Beaverton OR 97005 +; (503) 626-3081 +; +; Version information : +; +; Revision 1.6 89/06/29 16:08:51 jimh +; Fixed two bugs regarding compatiblility with the fpsymbol file. The +; definitions of ROUND_TO_PLUS/MINUS_INFINITY were reversed. Set_Rounding +; _Mode was fixed to set the local copy (29000 resident) of rounding mode +; in 29027 mode. +; +; +; Revision 1.5 89/04/17 11:20:49 jim +; replaced emfsr and emtsr macro calls with mfsr and mtsr instructions. +; +; Revision 1.4 89/02/24 15:18:04 jimh +; Added the definitions of FP_ENV_MODE_1_DEFAULT, FP_ENV_MODE_2_DEFAULT, +; FP_FLAGS_DEFAULT. +; Added macro clear_Flags. +; Changed the operation of set_Invalid_Op_flag, set_Reserved_Op_flag. +; +; Revision 1.3 89/02/01 18:30:12 jimh +; Changed the way set_Rounding_Mode, extract_Rounding_Mode, set_Invalid_Op_flag +; and set_Reserved_Op_flag are done. Changed save_FP_regs. +; +; Revision 1.2 89/01/31 10:01:54 jimh +; Updated to the new standard. This includes moving in register +; definitions, changing old symbols to reflect those in fpsymbol.h, +; and changing the include file to smartmac.h. +; +; + .include "../traps/fpenv.h" ; RPD 8/21/89 + .include "sys/smartmac.h" + + .equ DOUBLE_EXP_WIDTH, 11 + .equ DOUBLE_EXTENDED_WIDTH, 56 + + .equ SIGNED, 0 + .equ UNSIGNED, 1 + + .equ ROUND_TO_NEAREST, 0 + .equ ROUND_TO_MINUS_INFINITY, 1 + .equ ROUND_TO_PLUS_INFINITY, 2 + .equ ROUND_TO_ZERO, 3 + .equ ROUNDING_MODE_POSITION, 14 + + .equ FORMAT_INTEGER, 0 + .equ FORMAT_SINGLE, 1 + .equ FORMAT_DOUBLE, 2 + + .equ DOUBLE_MSB_MASK,0x00080000 +; +; The following are definitions used in the smart macro package, defining +; the 29000 shadow registers for the floating-point register file, and +; some temporary registers used during the library routines +; + .reg FP0, gr96 + .reg FP1, gr98 + .reg FP2, gr100 + .reg FP3, gr102 + .reg FP4, gr104 + .reg FP5, gr106 + .reg FP6, gr108 + .reg FP7, gr110 +; +; GR60 through GR6F are used to return the value of a function +; + .reg rtn0, gr96 + .reg rtn1, gr97 + .reg rtn2, gr98 + .reg rtn3, gr99 + .reg rtn4, gr100 + .reg rtn5, gr101 + .reg rtn6, gr102 + .reg rtn7, gr103 + .reg rtn8, gr104 + .reg rtn9, gr105 + .reg rtn10, gr106 + .reg rtn11, gr107 + .reg rtn12, gr108 + .reg rtn13, gr109 + .reg rtn14, gr110 + .reg rtn15, gr111 +; +; GR74..GR78 (116-120) - temporaries +; + .reg t0, gr116 + .reg t1, gr117 + .reg t2, gr118 + .reg t3, gr119 + .reg t4, gr120 +; +; FP_ENV_MODE_1 and FP_ENV_MODE_2 are based on 64-bit 29027 Mode register, +; and thus the fpsymbol.h CP_ constants may be used directly. +; +; FP_ENV_MODE_1 (Bits 0-31) +; +; 0-3 - floating-point format select, always 0 +; 4 - Saturate enable +; 5 - IEEE Affine/Projective mode (ignored by traps code) +; 6 - IEEE Trap enable +; 7 - IEEE Sudden underflow / FP Environment Fast Float Select +; 8-10 - ignored +; 11 - Integer multiplication signed/unsigned select +; 12-13 - Integer multiplication format adjust +; 14-16 - Rounding mode select +; 17-19 - ignored +; 20 - Pipeline mode select +; 21 - ignored +; 22 - Invalid operation mask bit +; 23 - Reserved operand mask bit +; 24 - Overflow mask bit +; 25 - Underflow mask bit +; 26 - Inexact result mask bit +; 27 - Zero mask bit +; 28-31 - ignored +; +; FP_ENV_MODE_2 (Bits 32-63) [Hardware configuration register, rarely modified] +; +; 32-35 - Pipeline timer count +; 36-39 - Timer count for multiply-accumulate operation +; 40-43 - Timer count for save state transaction request +; 44-63 - ignored +; +; FP_ENV_MODE_1 definitions +; + .set FP_ENV_MODE_1_DEFAULT, CP_PFF_EQ_IEEE + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_AFF_EQ_IEEE + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_AFFINE_MODE + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_IEEE_TRAPS_DISABLED + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_IEEE_GRADUAL_UFLOW_MODE + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_UNSIGNED_INT_MPY_MODE + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_MF_EQ_LSBS + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_RMS_EQ_NEAREST + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_FLOWTHROUGH_MODE + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_INVALID_OP_EXCP_MASK + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_RESERVED_OP_EXCP_MASK + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_OVERFLOW_EXCP_MASK + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_UNDERFLOW_EXCP_MASK + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_INEXACT_EXCP_MASK + .set FP_ENV_MODE_1_DEFAULT,FP_ENV_MODE_1_DEFAULT|CP_ZERO_EXCP_MASK +; +; FP_ENV_MODE_2 definitions +; + .set FP_ENV_MODE_2_DEFAULT, CP_PLTC_EQ_6 + .set FP_ENV_MODE_2_DEFAULT,FP_ENV_MODE_2_DEFAULT|CP_MATC_EQ_9 + .set FP_ENV_MODE_2_DEFAULT,FP_ENV_MODE_2_DEFAULT|CP_MVTC_EQ_3 + .set FP_ENV_MODE_2_DEFAULT,FP_ENV_MODE_2_DEFAULT|CP_NORMAL_DRDY_MODE + .set FP_ENV_MODE_2_DEFAULT,FP_ENV_MODE_2_DEFAULT|CP_HALT_ON_ERROR_DISABLED + .set FP_ENV_MODE_2_DEFAULT,FP_ENV_MODE_2_DEFAULT|CP_EXCP_DISABLED +; +; FP_FLAGS_DEFAULT definitions +; + .equ FP_FLAGS_DEFAULT, 0x00000000 ; No flags set +; +; The following macros are used by transcendentals to access the environment. +; +; MACRO NAME: clear_Flags +; +; FUNCTION: to clear the flags on entry to a transcendental routine. +; +; INPUT PARAMETERS: reg - temporary working register +; reg2 - temporary working register +; + .macro clear_Flags,reg,reg2 + .endm +; +; MACRO NAME: set_Invalid_Op_flag +; +; FUNCTION: to set the Invalid operation flag in the floating-point status +; register +; +; INPUT PARAMETERS: reg - temporary working register +; reg2 - 2nd temporary working register +; + .macro set_Invalid_Op_flag,reg,reg2 + .endm + +; +; MACRO NAME: set_Reserved_Op_flag +; +; FUNCTION: to set the Reserved Op flag in the floating-point status register +; +; INPUT PARAMETERS: reg - temporary working register +; reg2 - 2nd temporary working register +; + .macro set_Reserved_Op_flag,reg,reg2 + .endm + +; +; MACRO NAME: extract_Rounding_Mode +; +; FUNCTION: to extract the Rounding Mode portion of the floating-point +; invironment mode register, shift the value to the range of +; 0-7, and leave it in a register +; +; INPUT PARAMETERS: reg - destination for the mode +; + .macro extract_Rounding_Mode,reg + .ifdef _29027_MODE + .extern __29027Mode + const reg,__29027Mode + consth reg,__29027Mode + load 0,0,reg,reg + srl reg,reg,CP_RMS_POSITION + and reg,reg,CP_RMS_MASK >> CP_RMS_POSITION + .else + mfsr reg,FPE + and reg,reg,FPE_FPRND_MASK + srl reg,reg,FPE_FPRND_POSITION + .endif + .endm + +; +; MACRO NAME: set_Rounding_Mode +; +; FUNCTION: to set the 29027 Rounding Mode to a given value +; +; INPUT PARAMETERS: reg - working register +; reg2 - second working register +; rounding_mode - value of the rounding mode +; 0 - round to nearest +; 1 - round to minus infinity +; 2 - round to plus infinity +; 3 - round to zero +; +; NOTES: rounding_mode value is not checked +; 29027 Mode register is NOT written by this macro +; + .macro set_Rounding_Mode,reg,reg2,mode + .ifdef _29027_MODE + .extern __29027Mode + const reg2,__29027Mode + consth reg2,__29027Mode + load 0,0,reg,reg2 + const reg2,CP_RMS_MASK + consth reg2,CP_RMS_MASK + andn reg,reg,reg2 + const reg2,mode + sll reg2,reg2,CP_RMS_POSITION + or reg,reg,reg2 + const reg2,__29027Mode + consth reg2,__29027Mode + store 0,0,reg,reg2 + add reg2,reg2,4 + load 0,0,reg2,reg2 + cp_write_mode reg2,reg + .else + mfsr reg,FPE + andn reg,reg,FPE_FPRND_MASK + const reg2,mode + sll reg2,reg2,FPE_FPRND_POSITION + or reg,reg,reg2 + mtsr FPE,reg + .endif + .endm +; +; +; NOTE: The 29027 is the floating point coprocessor for the 29000. +; It contains 8 floating point registers FP0 to FP7. Three of +; these, FP0, FP1, and FP2, are currently designated as scratch, +; that is, they will not be preserved across calls. The other +; five contain values that must be saved whenever they are used +; in code, and restored before the exit of the routine. The 29027 +; registers are tagged with a single bit indicating the precision +; of the current value. When numbers are read into the 29027, +; they are always stored in double precision, so that single +; precision values are converted on input. Only the MOVE instruction +; fails to do this automatic widening. If the result from calculations +; in the 29027 ALU (determined by the result precision bit in the +; instruction word) is to be single precision and the result saved in +; an FP reg, the result precision bit from the instruction gets copied +; into the precision bit for the register. If a single precision +; SNaN is saved from the 29027, it will be converted to a double +; precision QNaN. Along the way it will cause an unmasked exception +; when read off the chip and cause changes to the status register. +; So the preservation routine will need to modify the mode register to +; mask off the exceptions, save the state of the status register before +; saving the FP regs, and restore the status and mode registers to their +; original settings when the save is complete. +; +; REFERENCE: The instructions to drive the Am29027 are described in the +; Am29027 manual beginning on page 17. Table 4 describes the +; operation codes and table 3 the multiplexer codes. Communication +; with the 29000 is described on pages 11 and 12 of the Am29027 +; manual and chapters 6 and 8 of the Am29000 User's Manual +; +; MACRO NAME: save_FP_regs +; +; FUNCTION: to save the AMD 29027 floating point register values in the +; 29000 general purpose registers +; +; INPUT PARAMETERS: fp_register, one of the 29027 registers FP3 - FP7 +; +; REGISTER USAGE: the following registers are used in save_FP_regs +; +; rtn0 this register is used in setting the mode and status registers +; rtn1 this register is used in setting the mode and status registers +; rtn6 this register is used to store the MSW when FP3 is saved +; rtn7 this register is used to store the LSW when FP3 is saved +; rtn8 this register is used to store the MSW when FP4 is saved +; rtn9 this register is used to store the LSW when FP4 is saved +; + + .macro save_FP_regs,fp_register + .ifdef _29027_MODE + ; + ; For 29027 mode, expand the macro into 29027 code to preserve FP register + ; + .ifeqs "@fp_register@","FP3" + const rtn6,__29027Mode ; Load the address of FP mode + consth rtn6,__29027Mode + load 0,0,rtn0,rtn6 ; Load MSW of FP mode into rtn0 + add rtn6,rtn6,4 ; Increment rtn6 + 4 + load 0,0,rtn1,rtn6 ; Load LSW of FP mode into rtn1 + const rtn6,CP_RESERVED_OP_EXCP_MASK ; Load mask to disable exception + consth rtn6,CP_RESERVED_OP_EXCP_MASK + or rtn0,rtn0,rtn6 ; OR in disable of exception mask + cp_write_mode rtn1, rtn0 ; Reset mode w/exception disabled + cp_read_status rtn0 ; Read status and save in rtn1 + const rtn6,CP_PASS_P | CP_P_EQ_RF3 ; Instruction is PASS_P from RF3 + consth rtn6,CP_PASS_P | CP_P_EQ_RF3 + ; Load & execute the instruction + ; + store 1,CP_WRITE_INST | CP_START,rtn6,rtn6 + load 1,CP_READ_MSBS,rtn6,rtn6 ; Read the MSW to first register + load 1,CP_READ_LSBS,rtn7,rtn7 ; Read the LSW to second register + cp_write_status rtn0 ; Restore the original status + const rtn1,__29027Mode ; Load the address of FP mode + consth rtn1,__29027Mode + load 0,0,rtn0,rtn1 ; Load MSW of FP mode into rtn0 + add rtn1,rtn1,4 ; Increment rtn6 to __29027Mode+4 + load 0,0,rtn1,rtn1 ; Load LSW of FP mode into rtn1 + cp_write_mode rtn1, rtn0 ; Restore the original write mode + .endif + .ifeqs "@fp_register@","FP4" + const rtn8,__29027Mode ; Load the address of FP mode + consth rtn8,__29027Mode + load 0,0,rtn0,rtn8 ; Load MSW of FP mode into rtn0 + add rtn8,rtn8,4 ; Increment rtn6 + 4 + load 0,0,rtn1,rtn8 ; Load LSW of FP mode into rtn1 + const rtn8,CP_RESERVED_OP_EXCP_MASK ; Load mask to disable exception + consth rtn8,CP_RESERVED_OP_EXCP_MASK + or rtn0,rtn0,rtn8 ; OR in disable of exception mask + cp_write_mode rtn1, rtn0 ; Reset mode w/exception disabled + cp_read_status rtn0 ; Read status and save in rtn1 + const rtn8,CP_PASS_P | CP_P_EQ_RF4 ; Instruction is PASS_P from RF4 + consth rtn8,CP_PASS_P | CP_P_EQ_RF4 + ; Load & execute the instruction + ; + store 1,CP_WRITE_INST | CP_START,rtn8,rtn8 + load 1,CP_READ_MSBS,rtn8,rtn8 ; Read the MSW to first register + load 1,CP_READ_LSBS,rtn9,rtn9 ; Read the LSW to second register + cp_write_status rtn0 ; Restore the original status + const rtn1,__29027Mode ; Load the address of FP mode + consth rtn1,__29027Mode + load 0,0,rtn0,rtn1 ; Load MSW of FP mode into rtn0 + add rtn1,rtn1,4 ; Increment rtn6 + 4 + load 0,0,rtn1,rtn1 ; Load LSW of FP mode into rtn1 + cp_write_mode rtn1, rtn0 ; Restore the original write mode + .endif + .else + ; + ; For 29000 mode, do nothing + ; + .endif + .endm +; +; MACRO NAME: restore_FP_regs +; +; FUNCTION: to restore the AMD 29027 floating point register values from the +; 29000 general purpose registers +; +; INPUT PARAMETERS: fp_register, one of the 29027 registers FP3 - FP7 +; +; REGISTER USAGE: the following registers are used in restore_FP_regs +; +; rtn0 this register is used in setting the mode and status registers +; rtn6 the value in this register is stored as the MSW of FP3 +; rtn7 the value in this register is stored as the LSW of FP3 +; rtn8 the value in this register is stored as the MSW of FP4 +; rtn9 the value in this register is stored as the LSW of FP4 +; + .macro restore_FP_regs,fp_register + .ifdef _29027_MODE + ; + ; For 29027 mode, move data from return registers to the correct FP register + ; + .ifeqs "@fp_register@","FP3" + store 1,CP_WRITE_R ,rtn6,rtn7 ; Move the data to the R register + ; Then create the instruction + ; + const rtn0,CP_MOVE_P|CP_D_D|CP_P_EQ_R|CP_DEST_EQ_RF3 + consth rtn0,CP_MOVE_P|CP_D_D|CP_P_EQ_R|CP_DEST_EQ_RF3 + ; + ; Perform the write + ; + store 1,(CP_WRITE_INST | CP_START),rtn0,0 + .endif + .ifeqs "@fp_register@","FP4" + store 1,CP_WRITE_R ,rtn8,rtn9 ; Move the data to the R register + ; Then create the instruction + ; + const rtn0,CP_MOVE_P|CP_D_D|CP_P_EQ_R|CP_DEST_EQ_RF4 + consth rtn0,CP_MOVE_P|CP_D_D|CP_P_EQ_R|CP_DEST_EQ_RF4 + ; + ; Perform the write + ; + store 1,(CP_WRITE_INST | CP_START),rtn0,0 + .endif + .else + ; + ; For 29000 mode, do nothing. + ; + .endif + .endm +; +; end of file intrinsi.h
intrinsi.h Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: sysmac.h =================================================================== --- sysmac.h (nonexistent) +++ sysmac.h (revision 345) @@ -0,0 +1,165 @@ +; @(#)sysmac.h 1.7 90/10/14 20:56:17, Copyright 1988, 1989, 1990 AMD +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Copyright 1988, 1989, 1990 Advanced Micro Devices, Inc. +; +; This software is the property of Advanced Micro Devices, Inc (AMD) which +; specifically grants the user the right to modify, use and distribute this +; software provided this notice is not removed or altered. All other rights +; are reserved by AMD. +; +; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS +; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL +; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR +; USE OF THIS SOFTWARE. +; +; So that all may benefit from your experience, please report any problems +; or suggestions about this software to the 29K Technical Support Center at +; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or +; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. +; +; Advanced Micro Devices, Inc. +; 29K Support Products +; Mail Stop 573 +; 5900 E. Ben White Blvd. +; Austin, TX 78741 +; 800-292-9263 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; sysmac.h +; + .include "sys/proreg.h" + +; Supported system call function numbers - BSD emulation + + .equ BSD_exit, 1 + .equ BSD_open, 5 + .equ BSD_close, 6 + .equ BSD_remove, 10 + .equ BSD_lseek, 19 + .equ BSD_sbrk, 69 + .equ BSD_readv, 120 + .equ BSD_writev, 121 + .equ BSD_rename, 128 +; Functions above 0x100 are handled by Am29000 code + .equ BSD_alloc, 0x101 + .equ BSD_free, 0x102 + .equ BSD_getpagesize, 0x103 + + .equ BSD_clock, 0x111 + +; Supported system call function numbers - HIF version 2.0 + + .equ HIF_exit, 0x01 + + .equ HIF_open, 0x11 + .equ HIF_close, 0x12 + .equ HIF_read, 0x13 + .equ HIF_write, 0x14 + .equ HIF_lseek, 0x15 + .equ HIF_remove, 0x16 + .equ HIF_rename, 0x17 + .equ HIF_ioctl, 0x18 + .equ HIF_iowait, 0x19 + .equ HIF_iostat, 0x1a + + .equ HIF_tmpnam, 0x21 + + .equ HIF_time, 0x31 + + .equ HIF_getenv, 0x41 + .equ HIF_gettz, 0x43 + + .equ HIF_sysalloc, 0x101 + .equ HIF_alloc, HIF_sysalloc ;Synonym. + .equ HIF_sysfree, 0x102 + .equ HIF_free, HIF_sysfree ;Synonym. + .equ HIF_getpsize, 0x103 + .equ HIF_getpagesize,HIF_getpsize ;Synonym. + .equ HIF_getargs, 0x104 + + .equ HIF_clock, 0x111 + .equ HIF_cycles, 0x112 + + .equ HIF_setvec, 0x121 + .equ HIF_settrap, 0x122 + .equ HIF_setim, 0x123 + + .equ HIF_query, 0x131 + + .equ HIF_signal, 0x141 + .equ HIF_sigdfl, 0x142 + .equ HIF_sigret, 0x143 + .equ HIF_sigrep, 0x144 + .equ HIF_sigskp, 0x145 + .equ HIF_sendsig, 0x146 + +;Maintain compatibility with HIF 1.0 code. + + .equ EPI_exit, HIF_exit + + .equ EPI_open, HIF_open + .equ EPI_close, HIF_close + .equ EPI_read, HIF_read + .equ EPI_write, HIF_write + .equ EPI_lseek, HIF_lseek + .equ EPI_remove, HIF_remove + .equ EPI_rename, HIF_rename + + .equ EPI_tmpnam, HIF_tmpnam + + .equ EPI_time, HIF_time + + .equ EPI_getenv, HIF_getenv + .equ EPI_gettz, HIF_gettz + .equ EPI_alloc, HIF_sysalloc + .equ EPI_free, HIF_sysfree + .equ EPI_getpagesize, HIF_getpsize + .equ EPI_getargs, HIF_getargs + + .equ EPI_clock, HIF_clock + .equ EPI_cycles, HIF_cycles + + .equ EPI_setvec, HIF_setvec + + .equ V_SYSCALL, 69 + +; System call macros +/* Now that source files have been sed'd to avoid these macros, they + are just commented out. -- gnu@cygnus.com Oct 90 + + .ifdef _BSD_OS + .equ V_SYSCALL, 66 + .else + .equ V_SYSCALL, 69 + .endif + + .macro syscall, name + .ifdef _BSD_OS + const tav, SYS_@name + .else + const tav, HIF_@name + .endif + asneq V_SYSCALL, gr1, gr1 + .endm + +; error return +; set errno to the error value in tav. +; return -1 +; + .macro returnerr +;; .extern _errno ; rather have undef'd sym than multiple def's + const tpc, _errno + consth tpc, _errno + store 0, 0, tav, tpc + jmpi lr0 + constn v0, -1 + .endm + +; package the most common case in one macro +; + .macro system, name + syscall name + jmpti tav, lr0 + returnerr + .endm + */
sysmac.h Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: romdcl.h =================================================================== --- romdcl.h (nonexistent) +++ romdcl.h (revision 345) @@ -0,0 +1,392 @@ +; @(#)romdcl.h 1.4 90/10/14 20:56:12, Copyright 1988, 1989, 1990 AMD +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Copyright 1990 Advanced Micro Devices, Inc. +; +; This software is the property of Advanced Micro Devices, Inc (AMD) which +; specifically grants the user the right to modify, use and distribute this +; software provided this notice is not removed or altered. All other rights +; are reserved by AMD. +; +; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS +; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL +; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR +; USE OF THIS SOFTWARE. +; +; So that all may benefit from your experience, please report any problems +; or suggestions about this software to the 29K Technical Support Center at +; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or +; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. +; +; Advanced Micro Devices, Inc. +; 29K Support Products +; Mail Stop 573 +; 5900 E. Ben White Blvd. +; Austin, TX 78741 +; 800-292-9263 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + .sbttl "Register, Constant and Macro Declarations - v1.4" + +; Copyright 1988, Advanced Micro Devices +; Written by Gibbons and Associates, Inc. + +;v1.4 JG correct FUNCTION macro - fault in register padding to even + +;----------------------------------------------------------------------- +;Global registers +;----------------------------------------------------------------------- + .reg rsp, gr1 ;local reg. var. stack pointer + + .equ SYS_TEMP, 64 ;system temp registers + + .reg st0, gr64 + .reg st1, gr65 + .reg st2, gr66 + .reg st3, gr67 + .reg st4, gr68 + .reg st5, gr69 + .reg st6, gr70 + .reg st7, gr71 + .reg st8, gr72 + .reg st9, gr73 + .reg st10, gr74 + .reg st11, gr75 + .reg st12, gr76 + .reg st13, gr77 + .reg st14, gr78 + .reg st15, gr79 + + .equ SYS_STAT, 80 ;system static registers + + .reg ss0, gr80 + .reg ss1, gr81 + .reg ss2, gr82 + .reg ss3, gr83 + .reg ss4, gr84 + .reg ss5, gr85 + .reg ss6, gr86 + .reg ss7, gr87 + .reg ss8, gr88 + .reg ss9, gr89 + .reg ss10, gr90 + .reg ss11, gr91 + .reg ss12, gr92 + .reg ss13, gr93 + .reg ss14, gr94 + .reg ss15, gr95 + + .equ RET_VAL, 96 ;return registers + + .reg v0, gr96 + .reg v1, gr97 + .reg v2, gr98 + .reg v3, gr99 + .reg v4, gr100 + .reg v5, gr101 + .reg v6, gr102 + .reg v7, gr103 + .reg v8, gr104 + .reg v9, gr105 + .reg v10, gr106 + .reg v11, gr107 + .reg v12, gr108 + .reg v13, gr109 + .reg v14, gr110 + .reg v15, gr111 + + .equ TEMP_REG, 96 ;temp registers + + .reg t0, gr96 + .reg t1, gr97 + .reg t2, gr98 + .reg t3, gr99 + .reg t4, gr100 + .reg t5, gr101 + .reg t6, gr102 + .reg t7, gr103 + .reg t8, gr104 + .reg t9, gr105 + .reg t10, gr106 + .reg t11, gr107 + .reg t12, gr108 + .reg t13, gr109 + .reg t14, gr110 + .reg t15, gr111 + + .equ RES_REG, 112 ;reserved (for user) + + .reg r0, gr112 + .reg r1, gr113 + .reg r2, gr114 + .reg r3, gr115 + + .equ TEMP_EXT, 116 ;temp extension (and shared) + + .reg x0, gr116 + .reg x1, gr117 + .reg x2, gr118 + .reg x3, gr119 + .reg x4, gr120 + .reg x5, gr121 + .reg x6, gr122 + .reg x7, gr123 + .reg x8, gr124 + +;----------------------------------------------------------------------- +;Global registers with special calling convention uses +;----------------------------------------------------------------------- + + .reg tav, gr121 ;trap handler argument (also x6) + .reg tpc, gr122 ;trap handler return (also x7) + .reg lsrp, gr123 ;large return pointer (also x8) + .reg slp, gr124 ;static link pointer (also x9) + .reg msp, gr125 ;memory stack pointer + .reg rab, gr126 ;register alloc bound + .reg rfb, gr127 ;register frame bound + +;----------------------------------------------------------------------- +;Local compiler registers - output parameters, etc. +; (only valid if frame has been established) +;----------------------------------------------------------------------- + + .reg p15, lr17 ;parameter registers + .reg p14, lr16 + .reg p13, lr15 + .reg p12, lr14 + .reg p11, lr13 + .reg p10, lr12 + .reg p9, lr11 + .reg p8, lr10 + .reg p7, lr9 + .reg p6, lr8 + .reg p5, lr7 + .reg p4, lr6 + .reg p3, lr5 + .reg p2, lr4 + .reg p1, lr3 + .reg p0, lr2 + + +;----------------------------------------------------------------------- +;TLB register count +;----------------------------------------------------------------------- + + .equ TLB_CNT, 128 + + .eject + +;----------------------------------------------------------------------- +;constants for general use +;----------------------------------------------------------------------- + .equ WRD_SIZ, 4 ;word size + .equ TRUE, 0x80000000 ;logical true -- bit 31 + .equ FALSE, 0x00000000 ;logical false -- 0 + .equ CHKPAT_a5, 0xa5a5a5a5 ;check pattern + +;----------------------------------------------------------------------- +;constants for data access control +;----------------------------------------------------------------------- + .equ CE, 0b1 ;coprocessor enable + .equ CD, 0b0 ;coprocessor disable + + .equ AS, 0b1000000 ;set for I/O + .equ PA, 0b0100000 ;set for physical ad + .equ SB, 0b0010000 ;set for set BP + .equ UA, 0b0001000 ;set for user access + + .equ ROM_OPT, 0b100 ;OPT values for acc + .equ DATA_OPT, 0b000 + .equ INST_OPT, 0b000 + + .equ ROM_CTL, (PA + ROM_OPT) ;control field + .equ DATA_CTL, (PA + DATA_OPT) + .equ INST_CTL, (PA + INST_OPT) + .equ IO_CTL, (AS + PA + DATA_OPT) + + + .eject + +;----------------------------------------------------------------------- +;defined vectors +;----------------------------------------------------------------------- + + .equ V_IllegalOp, 0 + .equ V_Unaligned, 1 + .equ V_OutOfRange, 2 + .equ V_NoCoProc, 3 + .equ V_CoProcExcept, 4 + .equ V_ProtViol, 5 + .equ V_InstAccExcept, 6 + .equ V_DataAccExcept, 7 + .equ V_UserInstTLB, 8 + .equ V_UserDataTLB, 9 + .equ V_SupInstTLB, 10 + .equ V_SupDataTLB, 11 + .equ V_InstTLBProt, 12 + .equ V_DataTLBProt, 13 + .equ V_Timer, 14 + .equ V_Trace, 15 + .equ V_INTR0, 16 + .equ V_INTR1, 17 + .equ V_INTR2, 18 + .equ V_INTR3, 19 + .equ V_TRAP0, 20 + .equ V_TRAP1, 21 + + ; 22 - 31 reserved + + .equ V_MULTIPLY, 32 + .equ V_DIVIDE, 33 + .equ V_MULTIPLU, 34 + .equ V_DIVIDU, 35 + .equ V_CONVERT, 36 + + ; 37 - 41 reserved + + .equ V_FEQ, 42 + .equ V_DEQ, 43 + .equ V_FGT, 44 + .equ V_DGT, 45 + .equ V_FGE, 46 + .equ V_DGE, 47 + .equ V_FADD, 48 + .equ V_DADD, 49 + .equ V_FSUB, 50 + .equ V_DSUB, 51 + .equ V_FMUL, 52 + .equ V_DMUL, 53 + .equ V_FDIV, 54 + .equ V_DDIV, 55 + + ; 56 - 63 reserved + + .equ V_SPILL, 64 + .equ V_FILL, 65 + .equ V_BSDCALL, 66 + .equ V_SYSVCALL, 67 + .equ V_BRKPNT, 68 + .equ V_EPI_OS, 69 + + .eject + + .macro R_LEFT,REGVAR + + ;Rotate left + ; + ; Parameters: REGVAR register to rotate + + add REGVAR, REGVAR, REGVAR ;shift left by 1 bit, C = MSB + addc REGVAR, REGVAR, 0 ;add C to LSB + + .endm +;---------------------------------------------------------------------- + + + .macro FUNCTION,NAME,INCNT,LOCCNT,OUTCNT + + ;Introduces a non-leaf routine. + ; + ;This macro defines the standard tag word before the function, + ;then establishes the statement label with the function's name + ;and finally allocates a register stack frame. It may not be used + ;if a memory stack frame is required. + ; + ;Note also that the size of the register stack frame is limited. + ;Neither this nor the lack of a memory frame is considered to be + ;a severe restriction in an assembly language environment. The + ;assembler will report errors if the requested frame is too large + ;for this macro. + ; + ;It may be good practice to allocate an even number of both output + ;registers and local registers. This will help in maintaining + ;double word alignment within these groups. The macro will assure + ;double word alignment of the stack frame as a whole as required + ;for correct linkage. + ; + ; Paramters: NAME the function name + ; INCNT input parameter count + ; LOCCNT local register count + ; OUTCNT output parameter count + + .set ALLOC_CNT, ((2 + OUTCNT + LOCCNT) << 2) + .set PAD_CNT, (ALLOC_CNT & 4) + .set ALLOC_CNT, (ALLOC_CNT + PAD_CNT) + .set REG_PAD, (PAD_CNT >> 2) + .if (INCNT) + .set IN_PRM, (4 + OUTCNT + REG_PAD + LOCCNT + 0x80) + .endif + .if (LOCCNT) + .set LOC_REG, (2 + OUTCNT + REG_PAD + 0x80) + .endif + .if (OUTCNT) + .set OUT_PRM, (2 + 0x80) + .endif + + .word ((2 + OUTCNT + LOCCNT) << 16) +NAME: + sub rsp, rsp, ALLOC_CNT + asgeu V_SPILL, rsp, rab + add lr1, rsp, ((4 + OUTCNT + LOCCNT + REG_PAD + INCNT) << 2) + + .endm +;---------------------------------------------------------------------- + + + .macro LEAF,NAME,INCNT + + ;Introduces a leaf routine + ; + ;This macro defines the standard tag word before the function, + ;then establishes the statement label with the function's name. + ; + ; Paramters: NAME the function name + ; INCNT input parameter count + + .if (INCNT) + .set IN_PRM, (2 + 0x80) + .endif + .set ALLOC_CNT, 0 + + .word 0 +NAME: + + .endm +;---------------------------------------------------------------------- + + + .macro EPILOGUE + + ;De-allocates register stack frame (only and only if necessary). + + .if (ALLOC_CNT) + + add rsp, rsp, ALLOC_CNT + nop + jmpi lr0 + asleu V_FILL, lr1, rfb + + .else + + jmpi lr0 + nop + + .endif + + .set IN_PRM, (1024) ;illegal, to cause err on ref + .set LOC_REG, (1024) ;illegal, to cause err on ref + .set OUT_PRM, (1024) ;illegal, to cause err on ref + .set ALLOC_CNT, (1024) ;illegal, to cause err on ref + + .endm +;---------------------------------------------------------------------- + + +;Initial values for macro set variables to guard against misuse + + .set IN_PRM, (1024) ;illegal, to cause err on ref + .set LOC_REG, (1024) ;illegal, to cause err on ref + .set OUT_PRM, (1024) ;illegal, to cause err on ref + .set ALLOC_CNT, (1024) ;illegal, to cause err on ref + +;...................................................................... +; end of romdcl.h
romdcl.h Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: macros.h =================================================================== --- macros.h (nonexistent) +++ macros.h (revision 345) @@ -0,0 +1,37 @@ +; @(#)macros.h 1.3 90/10/14 20:56:10, Copyright 1989, 1990 AMD +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Copyright 1989, 1990 Advanced Micro Devices, Inc. +; +; This software is the property of Advanced Micro Devices, Inc (AMD) which +; specifically grants the user the right to modify, use and distribute this +; software provided this notice is not removed or altered. All other rights +; are reserved by AMD. +; +; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS +; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL +; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR +; USE OF THIS SOFTWARE. +; +; So that all may benefit from your experience, please report any problems +; or suggestions about this software to the 29K Technical Support Center at +; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or +; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. +; +; Advanced Micro Devices, Inc. +; 29K Support Products +; Mail Stop 573 +; 5900 E. Ben White Blvd. +; Austin, TX 78741 +; 800-292-9263 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; macros.h +; Short macros of general utility + + .macro mov, dest,src + add dest, src, 0 + .endm + + .macro not, dest,src + nand dest, src, src + .endm
macros.h Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: cpudef.h =================================================================== --- cpudef.h (nonexistent) +++ cpudef.h (revision 345) @@ -0,0 +1,270 @@ +; @(#)cpudef.h 2.3 90/10/14 20:55:56, Copyright 1989, 1990 AMD +;----------------------------------------------------------------------- +; Useful equates +;----------------------------------------------------------------------- +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Copyright 1989, 1990 Advanced Micro Devices, Inc. +; +; This software is the property of Advanced Micro Devices, Inc (AMD) which +; specifically grants the user the right to modify, use and distribute this +; software provided this notice is not removed or altered. All other rights +; are reserved by AMD. +; +; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS +; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL +; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR +; USE OF THIS SOFTWARE. +; +; So that all may benefit from your experience, please report any problems +; or suggestions about this software to the 29K Technical Support Center at +; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or +; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. +; +; Advanced Micro Devices, Inc. +; 29K Support Products +; Mail Stop 573 +; 5900 E. Ben White Blvd. +; Austin, TX 78741 +; 800-292-9263 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ; Processor status registers OPS (sr1) and CPS (sr2) + .equ CA,0x8000 ; Coprocessor active + .equ IP,0x4000 ; Interrupt pending + .equ TE,0x2000 ; Trace enable + .equ TP,0x1000 ; Trace pending + .equ TU,0x0800 ; Trap unaligned access + .equ FZ,0x0400 ; Freeze + .equ LK,0x0200 ; Lock + .equ RE,0x0100 ; ROM enable + .equ WM,0x0080 ; Wait mode + .equ PD,0x0040 ; No translation for Data + .equ PI,0x0020 ; No translation for Instr + .equ SM,0x0010 ; Supervisor mode + .equ IM,0x000C ; Interrupt mask + .equ IM1,0x0100 ; enable INTR0-1 + .equ IM2,0x1000 ; enable INTR0-2 + .equ IM3,0x1100 ; enable INTR0-3 + .equ DI,0x0002 ; Disable ints + .equ DA,0x0001 ; Disable ints and traps + + ; Configuration register CFG (sr3) + .equ PRL,0xFF000000 ; Processor release level + .equ VF,0x10 ; Vector fetch + .equ RV,0x08 ; ROM Vector area + .equ BO,0x04 ; Byte order + .equ CP,0x02 ; Coprocessor present + .equ CD,0x01 ; BTC disable + + ; Channel control register CHC (sr6) + .equ LS,0x8000 ; Load store + .equ ML,0x4000 ; Multiple operation + .equ ST,0x2000 ; Set + .equ LA,0x1000 ; Lock active + .equ TF,0x0400 ; Transaction faulted + .equ TR,0x03FC ; Target register + .equ NN,0x0002 ; Not needed + .equ CV,0x0001 ; Contents valid + + ; Timer reload register TMR (sr9) + .equ IE,0x01000000 ; timer int enable + .equ IN,0x02000000 ; timer int pending + .equ OV,0x04000000 ; timer Overflow + + ; MMU configuration register MMU (sr13) + .equ PS,0x300 ; Page size + .equ PID,0xFF ; Process identifier + + ; ALU status register ALU (sr132) + .equ DF,0x800 ; Divide flag + .equ V,0x400 ; Overflow + .equ N,0x200 ; Negative + .equ Z,0x100 ; Zero + .equ C,0x080 ; Carry + + ; TLB entry + .equ VTAG,0xFFFF8000 ; Virtual tag + .equ VE,0x4000 ; Valid entry + .equ SR,0x2000 ; Supervisor read + .equ SW,0x1000 ; Supervisor write + .equ SE,0x0800 ; Supervisor execute + .equ UR,0x0400 ; User read + .equ UW,0x0200 ; User write + .equ UE,0x0100 ; User execute + .equ TID,0x00FF ; Task identifier + .equ RPN,0xFFFFFC00 ; Real page number + .equ PGM,0x00C0 ; User programmable + .equ U,0x0002 ; Usage + .equ F,0x0001 ; Flag + +;----------------------------------------------------------------------- +;Global registers +;----------------------------------------------------------------------- + + .reg rsp, gr1 ; local register stack pointer + + ; System-wide statics + .reg s0, gr64 + .reg spillreg, s0 ; pointer to user spill handler + .reg s1, gr65 + .reg fillreg, s1 ; pointer to user fill handler + .reg s2, gr66 + .reg heapptr, s2 ; pointer to heap area + .reg s3, gr67 + .reg s4, gr68 + .reg s5, gr69 + .reg s6, gr70 + .reg s7, gr71 + .reg s8, gr72 + .reg s9, gr73 + .reg s10, gr74 + .reg s11, gr75 + .reg s12, gr76 + .reg s13, gr77 + .reg s14, gr78 + .reg s15, gr79 + + ; Interrupt handler temporaries + .reg i0, gr80 + .reg i1, gr81 + .reg i2, gr82 + .reg i3, gr83 + .reg i4, gr84 + .reg i5, gr85 + .reg i6, gr86 + .reg i7, gr87 + .reg i8, gr88 + .reg i9, gr89 + .reg i10, gr90 + .reg i11, gr91 + .reg i12, gr92 + .reg i13, gr93 + .reg i14, gr94 + .reg i15, gr95 + + ; Subroutine/function temporaries + ; also used for function return values + .reg t0, gr96 + .reg rtn, t0 + .reg t1, gr97 + .reg t2, gr98 + .reg t3, gr99 + .reg t4, gr100 + .reg t5, gr101 + .reg t6, gr102 + .reg t7, gr103 + .reg t8, gr104 + .reg t9, gr105 + .reg t10, gr106 + .reg t11, gr107 + .reg t12, gr108 + .reg t13, gr109 + .reg t14, gr110 + .reg t15, gr111 + + ; User process statics + .reg u0, gr112 + .reg u1, gr113 + .reg u2, gr114 + .reg u3, gr115 + + ; More subroutine/function temporaries + .reg t16, gr116 + .reg t17, gr117 + .reg t18, gr118 + .reg t19, gr119 + .reg t20, gr120 + + ; Older names for the same registers + .reg tmp0, gr116 + .reg tmp1, gr117 + .reg tmp2, gr118 + .reg tmp3, gr119 + .reg tmp4, gr120 + + ; Trap handler temporaries + .reg tav, gr121 ; arg/temp + .reg tpc, gr122 ; rtn/temp + + ; Linkage pointers + .reg lrp, gr123 ; large rtn ptr + .reg slp, gr124 ; static link ptr + .reg msp, gr125 ; memory stack ptr + .reg rab, gr126 ; register allocate bound + .reg rfb, gr127 ; register free bound + +;----------------------------------------------------------------------- +;Local compiler registers +; (only valid if frame has been established) +;----------------------------------------------------------------------- + + .reg p15, lr17 ; outgoing arg 16 + .reg p14, lr16 ; outgoing arg 15 + .reg p13, lr15 ; outgoing arg 14 + .reg p12, lr14 ; outgoing arg 13 + .reg p11, lr13 ; outgoing arg 12 + .reg p10, lr12 ; outgoing arg 11 + .reg p9, lr11 ; outgoing arg 10 + .reg p8, lr10 ; outgoing arg 9 + .reg p7, lr9 ; outgoing arg 8 + .reg p6, lr8 ; outgoing arg 7 + .reg p5, lr7 ; outgoing arg 6 + .reg p4, lr6 ; outgoing arg 5 + .reg p3, lr5 ; outgoing arg 4 + .reg p2, lr4 ; outgoing arg 3 + .reg p1, lr3 ; outgoing arg 2 + .reg p0, lr2 ; outgoing arg 1 + .reg fp, lr1 ; frame pointer + .reg raddr, lr0 ; return address + +;----------------------------------------------------------------------- +; Vectors +;----------------------------------------------------------------------- + + .equ V_ILLEG, 0 ; Illegal opcode + .equ V_ALIGN, 1 ; Unaligned access + .equ V_RANGE, 2 ; Out of range + .equ V_COPRE, 3 ; Coprocessor not present + .equ V_COEXC, 4 ; Coprocessor exception + .equ V_PROT, 5 ; Protection violation + .equ V_INSTR, 6 ; Instruction access exception + .equ V_DATA, 7 ; Data access exception + .equ V_UITLB, 8 ; User-mode instruction TLB miss + .equ V_UDTLB, 9 ; User-mode data TLB miss + .equ V_SITLB, 10 ; Supervisor-mode instr TLB miss + .equ V_SDTLB, 11 ; Supervisor-mode data TLB miss + .equ V_ITLB, 12 ; Instruction TLB violation + .equ V_DTLB, 13 ; Data TLB violation + .equ V_TIMER, 14 ; Timer + .equ V_TRACE, 15 ; Trace + .equ V_INTR0, 16 ; Interrupt 0 + .equ V_INTR1, 17 ; Interrupt 1 + .equ V_INTR2, 18 ; Interrupt 2 + .equ V_INTR3, 19 ; Interrupt 3 + .equ V_TRAP0, 20 ; Trap 0 + .equ V_TRAP1, 21 ; Trap 1 + +;----------------------------------------------------------------------- +;constants for LOAD and STORE operations +;----------------------------------------------------------------------- + +; CE operand values + .equ CE, 0b1 ;coprocessor enable + .equ ME, 0b0 ; memory enable + +; CNTL operand values + .equ IO, 0b1000000 ;set for I/O + .equ PA, 0b0100000 ;force physical addr + .equ SB, 0b0010000 ;set for set BP + .equ UA, 0b0001000 ;force user mode access + .equ ROM, 0b0000100 ;ROM access + .equ HWORD, 0b0000010 ;Half word access + .equ BYTE, 0b0000001 ;Byte access + .equ WORD, 0b0000000 ;Word access + +;----------------------------------------------------------------------- +; stack alignment value +;----------------------------------------------------------------------- + .equ STKALIGN, 8 ; double word align +
cpudef.h Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: smartmac.h =================================================================== --- smartmac.h (nonexistent) +++ smartmac.h (revision 345) @@ -0,0 +1,1491 @@ +; @(#)smartmac.h 1.2 90/10/14 20:56:14, AMD +; start of smartmac.h file +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Copyright 1988, 1989, 1990 Advanced Micro Devices, Inc. +; +; This software is the property of Advanced Micro Devices, Inc (AMD) which +; specifically grants the user the right to modify, use and distribute this +; software provided this notice is not removed or altered. All other rights +; are reserved by AMD. +; +; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS +; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL +; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR +; USE OF THIS SOFTWARE. +; +; So that all may benefit from your experience, please report any problems +; or suggestions about this software to the 29K Technical Support Center at +; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or +; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118. +; +; Advanced Micro Devices, Inc. +; 29K Support Products +; Mail Stop 573 +; 5900 E. Ben White Blvd. +; Austin, TX 78741 +; 800-292-9263 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; + .title "AM29000 Smart Macro Package" +; +; Floating point package for AMD 29000 family +; +; Copyright 1988 Advanced Micro Devices, Inc. +; +; All rights reserved +; +; Developed for AMD by Quantitative Technology Corporation +; 8700 SW Creekside Place Suite D +; Beaverton OR 97005 +; (503) 626-3081 +; +; Version information : +; +; Version 1.0 - 1 June 1988 - Larry Westerman (smart_macros.h) +; +; Revision 1.4 89/02/01 18:26:03 jimh +; Changed to relect the new symbols from Bob Perlman, and the new include file.s +; +; Revision 1.3 89/01/31 10:13:34 jimh +; Updated to use symbols from Bob Perlmans fpsymbol.h file. This is +; an extensive change. +; +; Revision 1.2 89/01/26 09:23:50 jimh +; This version checked in previous to substituting Bob Perlman's floating +; point symbols. +; +; Revision 1.1 89/01/24 13:23:29 jim +; Initial revision +; Replaces smart_macros.h ver 1.11. +; +; +; +; +; NOTES: +; +; This package makes the following assumptions about the use of these +; smart macros: +; +; 1. These macros will be after the entry code for a transcendental +; routine. This entry code will move the original function arguments +; (by value, if the target language is FORTRAN) into the global +; registers t0/t1 and t2/t3 (t0 and t2 for single precision +; routines). +; 2. The sources of all operands will be one register from the +; following list: +; t0 or t2 - the source is one of the original input operands +; rtn0 - the source is rtn0, which should be used as the +; source for all constant values to be sent to the +; AM29027 (when used) +; FP0 - FP7 - the source is one of the fp registers +; 3. The destination of all operations will be a register from the +; following list: +; rtn0 - the destination is the function return value +; FP0 - FP7 - the destination is one of the fp registers +; 4. The additional registers available for temporary use are +; t4, lrp, and slp. +; +; These register definitions are all taken from the file "proregs.a" +; which was supplied by AMD. NOTE that the FP0-FP7 registers, for the +; Am29000 version of the file, overlap with the rtn0-rtn15 registers, so +; that FP0 corresponds to rtn0/rtn1, FP1 to rtn2/rtn3, and so forth. +; + .equ ERROR,0 + .equ NO_ERROR,1 + + .equ DOUBLE_FUNCTION,0 + .equ SINGLE_FUNCTION,1 + + .equ T_OPERATION,0 + .equ Q_OPERATION,1 + + .equ R_SOURCE_29000,0 + .equ R_SOURCE_29027,1 + + .equ S_SOURCE_29000,0 + .equ S_SOURCE_29027,1 + + .equ DESTINATION_29000, 0 + .equ DESTINATION_29027, 1 + +; +; SMART MACRO : mfadd +; +; FUNCTION : single-precision floating point addition +; +; Required arguments : destination - one of possible destinations +; operand1 - one of possible sources +; operand2 - one of possible sources +; + .macro mfadd,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "mfadd: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; For 29027 mode, perform full suite of checking + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_S_S | CP_P_PLUS_T + .set OPERATION_TYPE, T_OPERATION + perform_single_operation destination,operand1,operand2 + read_single_result destination + ; + ; Save the instruction for the next macro invocation + ; + .set PREVIOUS_INSTRUCTION, CURRENT_INSTRUCTION + + .else + ; + ; For 29000 mode, simply produce equivalent trap-inducing instruction + ; + fadd destination,operand1,operand2 + + .endif + + .endm ; end of mfadd macro definition + +; +; SMART MACRO : mfsub +; +; FUNCTION : single-precision floating point subtraction +; +; Required arguments : destination - one of possible destinations +; operand1 - one of possible sources +; operand2 - one of possible sources +; + .macro mfsub,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "mfsub: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; For 29027 mode, perform full suite of checking + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_S_S | CP_P_MINUS_T + .set OPERATION_TYPE, T_OPERATION + perform_single_operation destination,operand1,operand2 + read_single_result destination + ; + ; Save the instruction for the next macro invocation + ; + .set PREVIOUS_INSTRUCTION, CURRENT_INSTRUCTION + + .else + ; + ; For 29000 mode, simply produce equivalent trap-inducing instruction + ; + fsub destination,operand1,operand2 + + .endif + + .endm ; end of mfsub macro definition + +; +; SMART MACRO : mfmul +; +; FUNCTION : single-precision floating point multiplication +; +; Required arguments : destination - one of possible destinations +; operand1 - one of possible sources +; operand2 - one of possible sources +; + .macro mfmul,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "mfmul: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; For 29027 mode, perform full suite of checking + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_S_S | CP_P_TIMES_Q + .set OPERATION_TYPE, Q_OPERATION + perform_single_operation destination,operand1,operand2 + read_single_result destination + ; + ; Save the instruction for the next macro invocation + ; + .set PREVIOUS_INSTRUCTION, CURRENT_INSTRUCTION + + .else + ; + ; For 29000 mode, simply produce equivalent trap-inducing instruction + ; + fmul destination,operand1,operand2 + + .endif + + .endm ; end of mfmul macro definition + +; +; SMART MACRO : mfdiv +; +; FUNCTION : single-precision floating point divide +; +; Required arguments : destination - one of possible destinations +; operand1 - one of possible sources +; operand2 - one of possible sources +; + .macro mfdiv,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "mfdiv: missing parameter(s)" + .exitm + .endif + + ; + ; Generate the trap instruction in all cases + ; + fdiv destination, operand1, operand2 + + .endm ; end of mfdiv macro definition + + +; +; SMART MACRO : mdadd +; +; FUNCTION : double-precision floating point addition +; +; Required arguments : destination - one of possible destinations +; operand1 - one of possible sources +; operand2 - one of possible sources +; + .macro mdadd,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "mdadd: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; For 29027 mode, perform full suite of checking + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_D_D | CP_P_PLUS_T + .set OPERATION_TYPE, T_OPERATION + perform_double_operation destination,operand1,operand2 + read_double_result destination + ; + ; Save the instruction for the next macro invocation + ; + .set PREVIOUS_INSTRUCTION, CURRENT_INSTRUCTION + + .else + ; + ; For 29000 mode, simply produce equivalent trap-inducing instruction + ; + dadd destination,operand1,operand2 + + .endif + + .endm ; end of mdadd macro definition + +; +; SMART MACRO : mdsub +; +; FUNCTION : double-precision floating point subtraction +; +; Required arguments : destination - one of possible destinations +; operand1 - one of possible sources +; operand2 - one of possible sources +; + .macro mdsub,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "mdsub: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; For 29027 mode, perform full suite of checking + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_D_D | CP_P_MINUS_T + .set OPERATION_TYPE, T_OPERATION + perform_double_operation destination,operand1,operand2 + read_double_result destination + ; + ; Save the instruction for the next macro invocation + ; + .set PREVIOUS_INSTRUCTION, CURRENT_INSTRUCTION + + .else + ; + ; For 29000 mode, simply produce equivalent trap-inducing instruction + ; + dsub destination,operand1,operand2 + + .endif + + .endm ; end of mdsub macro definition + +; +; SMART MACRO : mdmul +; +; FUNCTION : double-precision floating point multiplication +; +; Required arguments : destination - one of possible destinations +; operand1 - one of possible sources +; operand2 - one of possible sources +; + .macro mdmul,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "mdmul: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; For 29027 mode, perform full suite of checking + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_D_D | CP_P_TIMES_Q + .set OPERATION_TYPE, Q_OPERATION + perform_double_operation destination,operand1,operand2 + read_double_result destination + ; + ; Save the instruction for the next macro invocation + ; + .set PREVIOUS_INSTRUCTION, CURRENT_INSTRUCTION + + .else + ; + ; For 29000 mode, simply produce equivalent trap-inducing instruction + ; + dmul destination,operand1,operand2 + + .endif + + .endm ; end of mdmul macro definition + +; +; SMART MACRO : mddiv +; +; FUNCTION : double-precision floating point divide +; +; Required arguments : destination - one of possible destinations +; operand1 - one of possible sources +; operand2 - one of possible sources +; + .macro mddiv,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "mddiv: missing parameter(s)" + .exitm + .endif + + ; + ; Generate the trap instruction in all cases + ; + ddiv destination, operand1, operand2 + + .endm ; end of mfdiv macro definition + +; +; SMART MACRO: mconvert +; +; FUNCTION: Floating point/integer conversion +; +; PARAMETERS: destination - one of the possible destinations +; source - one of the possible sources +; sign_flag - one of SIGNED or UNSIGNED +; rounding_mode - one of ROUND_TO_NEAREST, ROUND_TO_PLUS, +; ROUND_TO_MINUS, ROUND_TO_ZERO +; destination_precision - one of FORMAT_INTEGER, FORMAT_DOUBLE, +; or FORMAT_SINGLE +; source_precision - one of FORMAT_INTEGER, FORMAT_DOUBLE, +; or FORMAT_SINGLE +; + .macro mconvert, destination, source, sign_flag, rounding_mode, destination_precision, source_precision + + .if $narg!=6 + .err + .print "mconvert: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; Generate in line 29027 code + ; + initialize_previous_instruction + .if ( destination_precision == FORMAT_INTEGER ) + .set CURRENT_INSTRUCTION, CP_CONVERT_T_TO_INT + select_T_operand source + .if ( source_precision == FORMAT_DOUBLE ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_S_D + .else + .if ( source_precision == FORMAT_SINGLE ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_S_S + .else + .err + .print "mconvert: invalid source type" + .exitm + .endif + .endif + .else + .if ( destination_precision == FORMAT_DOUBLE ) + .if ( source_precision == FORMAT_SINGLE ) + .set CURRENT_INSTRUCTION, CP_PASS_P | CP_P_EQ_R | CP_D_S + select_P_operand source + .else + .if ( source_precision == FORMAT_INTEGER ) + .set CURRENT_INSTRUCTION, CP_I_CONVERT_T_TO_FLOAT | CP_D_S + select_T_operand source + .else + .err + .print "mconvert: invalid source type" + .exitm + .endif + .endif + .else + .if ( destination_precision == FORMAT_SINGLE ) + .if ( source_precision == FORMAT_DOUBLE ) + .set CURRENT_INSTRUCTION, CP_PASS_P | CP_P_EQ_R | CP_S_D + select_P_operand source + .else + .if ( source_precision == FORMAT_INTEGER ) + .set CURRENT_INSTRUCTION, CP_I_CONVERT_T_TO_FLOAT | CP_S_S + select_T_operand source + .else + .err + .print "mconvert: invalid source type" + .exitm + .endif + .endif + .else + .err + .print "mconvert: invalid destination type " + .exitm + .endif + .endif + .endif + ; + ; Perform the operation, using a 29027 dummy register as the second + ; source operand, to avoid writing any data inappropriately to the + ; 29027 + ; + select_destination destination + .set S_SOURCE, S_SOURCE_29027 + .if ( source_precision == FORMAT_DOUBLE ) + write_and_execute_double_operation source, FP0 + .else + write_and_execute_single_operation source, FP0 + .endif + .if ( destination_precision == FORMAT_DOUBLE ) + read_double_result destination + .else + .if ( destination_precision == FORMAT_SINGLE ) + read_single_result destination + .else + read_integer_result destination + .endif + .endif + .else + ; + ; For 29000 mode (the default) just invoke the trap-inducing instruction + ; + convert destination,source,sign_flag,rounding_mode,destination_precision,source_precision + + .endif + + .endm ; end of mfeq macro definition + +; +; SMART MACRO: mfeq +; +; FUNCTION: Single precision, floating point compare +; +; PARAMETERS: destination - one of the possible destinations +; operand1 - one of the possible sources +; operand2 - one of the possible sources +; + .macro mfeq, destination, operand1, operand2 + + .if $narg!=3 + .err + .print "mfeq: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; Generate in line 29027 code + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_S_S | CP_COMPARE_P_AND_T + .set OPERATION_TYPE, T_OPERATION + select_destination destination + ; + ; 29027 registers are not valid destinations for compare operations + ; If the destination is a 29000 register, write the appropriate + ; Boolean value to that register. + ; + .if ( DESTINATION == DESTINATION_29027 ) + .err + .print "29027 destinations invalid for compares - @destination@" + .exitm + .else + perform_single_operation destination, operand1, operand2 + cp_read_flags destination + srl destination, destination, CP_EQUAL_FLAG_POSITION + sll destination, destination, 31 + .endif + + .else + ; + ; For 29000 mode (the default) just invoke the trap-inducing instruction + ; + feq destination,operand1,operand2 + + .endif + + .endm ; end of mfeq macro definition + +; +; SMART MACRO: mfge +; +; FUNCTION: Single precision, floating point compare +; +; PARAMETERS: destination - one of the possible destinations +; operand1 - one of the possible sources +; operand2 - one of the possible sources +; + .macro mfge, destination, operand1, operand2 + + .if $narg!=3 + .err + .print "mfge: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; Generate in line 29027 code + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_S_S | CP_COMPARE_P_AND_T + .set OPERATION_TYPE, T_OPERATION + select_destination destination + ; + ; 29027 registers are not valid destinations for compare operations + ; If the destination is a 29000 register, write the appropriate + ; Boolean value to that register. + ; + .if ( DESTINATION == DESTINATION_29027 ) + .err + .print "29027 destinations invalid for compares - @destination@" + .exitm + .else + perform_single_operation destination, operand1, operand2 + cp_read_flags destination + and destination, destination, CP_EQUAL_FLAG | CP_GREATER_THAN_FLAG + cpneq destination, destination, 0x0 + .endif + + .else + ; + ; For 29000 mode (the default) just invoke the trap-inducing instruction + ; + fge destination,operand1,operand2 + + .endif + + .endm ; end of mfge macro definition + +; +; SMART MACRO: mfgt +; +; FUNCTION: Single precision, floating point compare +; +; PARAMETERS: destination - one of the possible destinations +; operand1 - one of the possible sources +; operand2 - one of the possible sources +; + .macro mfgt, destination, operand1, operand2 + + .if $narg!=3 + .err + .print "mfgt: missing parameter(s)" + .exitm + .endif + + .ifdef _29027_MODE + ; + ; Generate in line 29027 code + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_S_S | CP_COMPARE_P_AND_T + .set OPERATION_TYPE, T_OPERATION + select_destination destination + ; + ; 29027 registers are not valid destinations for compare operations + ; If the destination is a 29000 register, write the appropriate + ; Boolean value to that register. + ; + .if ( DESTINATION == DESTINATION_29027 ) + .err + .print "29027 destinations invalid for compares - @destination@" + .exitm + .else + perform_single_operation destination, operand1, operand2 + cp_read_flags destination + srl destination, destination, CP_GREATER_THAN_FLAG_POSITION + sll destination, destination, 31 + .endif + + .else + ; + ; For 29000 mode (the default) just invoke the trap-inducing instruction + ; + fgt destination,operand1,operand2 + + .endif + + .endm ; end of mfgt macro definition + +; +; SMART MACRO: mdeq +; +; FUNCTION: Double precision, floating point compare +; +; PARAMETERS: destination - one of the possible destinations +; operand1 - one of the possible sources +; operand2 - one of the possible sources +; + .macro mdeq, destination, operand1, operand2 + + .if $narg!=3 + .err + .print "mdeq: missing parameter(s)" + .exitm + .endif + + + .ifdef _29027_MODE + ; + ; Generate in line 29027 code + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_D_D | CP_COMPARE_P_AND_T + .set OPERATION_TYPE, T_OPERATION + select_destination destination + ; + ; 29027 registers are not valid destinations for compare operations + ; If the destination is a 29000 register, write the appropriate + ; Boolean value to that register. + ; + .if ( DESTINATION == DESTINATION_29027 ) + .err + .print "29027 destinations invalid for compare - @destination@" + .exitm + .else + perform_double_operation destination, operand1, operand2 + cp_read_flags destination + srl destination, destination, CP_EQUAL_FLAG_POSITION + sll destination, destination, 31 + .endif + .else + ; + ; For 29000 mode (the default) just invoke the trap-inducing instruction + ; + deq destination,operand1,operand2 + + .endif + + .endm ; end of mdeq macro definition + +; +; SMART MACRO: mdge +; +; FUNCTION: Double precision, floating point compare +; +; PARAMETERS: destination - one of the possible destinations +; operand1 - one of the possible sources +; operand2 - one of the possible sources +; + .macro mdge, destination, operand1, operand2 + + .if $narg!=3 + .err + .print "mdge: missing parameter(s)" + .exitm + .endif + + + .ifdef _29027_MODE + ; + ; Generate in line 29027 code + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_D_D | CP_COMPARE_P_AND_T + .set OPERATION_TYPE, T_OPERATION + select_destination destination + ; + ; 29027 registers are not valid destinations for compare operations + ; If the destination is a 29000 register, write the appropriate + ; Boolean value to that register. + ; + .if ( DESTINATION == DESTINATION_29027 ) + .err + .print "29027 destinations invalid for compare - @destination@" + .exitm + .else + perform_double_operation destination, operand1, operand2 + cp_read_flags destination + and destination, destination, CP_EQUAL_FLAG | CP_GREATER_THAN_FLAG + cpneq destination, destination, 0x0 + .endif + .else + ; + ; For 29000 mode (the default) just invoke the trap-inducing instruction + ; + dge destination,operand1,operand2 + + .endif + + .endm ; end of mdge macro definition + +; +; SMART MACRO: mdgt +; +; FUNCTION: Double precision, floating point compare +; +; PARAMETERS: destination - one of the possible destinations +; operand1 - one of the possible sources +; operand2 - one of the possible sources +; + .macro mdgt, destination, operand1, operand2 + + .if $narg!=3 + .err + .print "mdgt: missing parameter(s)" + .exitm + .endif + + + .ifdef _29027_MODE + ; + ; Generate in line 29027 code + ; + initialize_previous_instruction + .set CURRENT_INSTRUCTION, CP_D_D | CP_COMPARE_P_AND_T + .set OPERATION_TYPE, T_OPERATION + select_destination destination + ; + ; 29027 registers are not valid destinations for compare operations + ; If the destination is a 29000 register, write the appropriate + ; Boolean value to that register. + ; + .if ( DESTINATION == DESTINATION_29027 ) + .err + .print "29027 destinations invalid for compare - @destination@" + .exitm + .else + perform_double_operation destination, operand1, operand2 + cp_read_flags destination + srl destination, destination, CP_GREATER_THAN_FLAG_POSITION + sll destination, destination, 31 + .endif + .else + ; + ; For 29000 mode (the default) just invoke the trap-inducing instruction + ; + dgt destination,operand1,operand2 + + .endif + + .endm ; end of mdgt macro definition + +; +; MACRO NAME : perform_double_operation +; +; FUNCTION : After the instruction base is set up, do the appropriate checking +; to send the instruction if necessary, send the double-precision +; operands if necessary, and start the operation +; +; PARAMETERS : destination - one of possible destination operands +; operand1 - one of possible source operands +; operand2 - one of possible source operands +; + .macro perform_double_operation,destination,operand1,operand2 + + .if $narg!=3 + .err + .print "perform_double_operation: missing parameter(s)" + .exitm + .endif + + ; + ; Start defining the instruction + ; + select_destination destination + select_P_operand operand1 + select_S_operand operand2 + + write_and_execute_double_operation operand1, operand2 + + .endm ; End of perform_double_operation macro definition + +; +; MACRO NAME : perform_single_operation +; +; FUNCTION : After the instruction base is set up, do the appropriate checking +; to send the instruction if necessary, send the single-precision +; operands if necessary and start the operation +; +; PARAMETERS : destination - one of possible destination operands +; operand1 - one of possible source operands +; operand2 - one of possible source operands +; + .macro perform_single_operation,destination,operand1,operand2 + + ; + ; Start defining the instruction + ; + select_destination destination + select_P_operand operand1 + select_S_operand operand2 + write_and_execute_single_operation operand1,operand2 + + .endm ; End of perform_single_operation macro definition + +; +; MACRO NAME : write_and_execute_double_operation +; +; FUNCTION : Write the instruction and operands for a double-precision +; operation, and start the operation +; +; PARAMETER : operand1 - first operand of double-precision operation +; operand2 - second operand of operation +; + .macro write_and_execute_double_operation,operand1,operand2 + .if ( ( R_SOURCE == R_SOURCE_29027 ) && ( S_SOURCE == S_SOURCE_29027 ) ) + ; + ; If both sources are within the 29027, write the instruction + ; and start the operation + ; + const t4, CURRENT_INSTRUCTION + consth t4, CURRENT_INSTRUCTION + cp_write_inst t4, START + .else + ; + ; One or both of the sources must be written first, so check the + ; previous instruction + ; + const t4, CURRENT_INSTRUCTION + consth t4, CURRENT_INSTRUCTION + cp_write_inst t4 + .if ( R_SOURCE == R_SOURCE_29000 ) && ( S_SOURCE == S_SOURCE_29027 ) + .ifeqs "@operand1@","t0" + cp_write_r t0, t1, START + .else + .ifeqs "@operand1@","t2" + cp_write_r t2, t3, START + .else + .ifeqs "@operand1@","rtn0" + cp_write_r rtn0, rtn1, START + .else + .err + .print "Invalid source for double operation - @operand1@" + .exitm + .endif + .endif + .endif + .endif + .if ( R_SOURCE == R_SOURCE_29027 ) && ( S_SOURCE == S_SOURCE_29000 ) + .ifeqs "@operand2@","t0" + cp_write_s t0, t1, START + .else + .ifeqs "@operand2@","t2" + cp_write_s t2, t3, START + .else + .ifeqs "@operand2@","rtn0" + cp_write_s rtn0, rtn1, START + .else + .err + .print "Invalid source for double operation - @operand1@" + .exitm + .endif + .endif + .endif + .endif + .if ( R_SOURCE == R_SOURCE_29000 ) && ( S_SOURCE == S_SOURCE_29000 ) + .ifeqs "@operand1@","t0" + cp_write_r t0, t1 + .else + .ifeqs "@operand1@","t2" + cp_write_r t2, t3 + .else + .ifeqs "@operand1@","rtn0" + cp_write_r rtn0, rtn1 + .else + .err + .print "Invalid source for double operation - @operand1@" + .exitm + .endif + .endif + .endif + .ifeqs "@operand2@","t0" + cp_write_s t0, t1, START + .else + .ifeqs "@operand2@","t2" + cp_write_s t2, t3, START + .else + .ifeqs "@operand2@","rtn0" + cp_write_s rtn0, rtn1, START + .else + .err + .print "Invalid source for double operation - @operand1@" + .exitm + .endif + .endif + .endif + .endif + .endif + + .endm ; end of write_and_execute_double_operation macro definition + +; +; MACRO NAME : write_and_execute_single_operation +; +; FUNCTION : If necessary, read the result from the 29027 into a +; register on the 29000 +; +; PARAMETER : operand1 - first source for single-precision operation +; operand2 - second source for operation +; + .macro write_and_execute_single_operation,operand1,operand2 + + .if ( ( R_SOURCE == R_SOURCE_29027 ) && ( S_SOURCE == S_SOURCE_29027 ) ) + ; + ; If both sources are within the 29027, write the instruction + ; and start the operation + ; + const t4, CURRENT_INSTRUCTION + consth t4, CURRENT_INSTRUCTION + cp_write_inst t4, START + .else + ; + ; One or both of the sources must be written first, so check the + ; previous instruction + ; + const t4,CURRENT_INSTRUCTION + consth t4,CURRENT_INSTRUCTION + cp_write_inst t4, START + .if ( R_SOURCE == R_SOURCE_29000 ) && ( S_SOURCE == S_SOURCE_29027 ) + cp_write_r operand1, operand1, START + .endif + .if ( R_SOURCE == R_SOURCE_29027 ) && ( S_SOURCE == S_SOURCE_29000 ) + cp_write_s operand2, operand2, START + .endif + .if ( R_SOURCE == R_SOURCE_29000 ) && ( S_SOURCE == S_SOURCE_29000 ) + cp_write_rs operand1, operand2, START + .endif + .endif + + .endm ; End of write_and_execute_single_operation macro definition + +; +; MACRO NAME : read_double_result +; +; FUNCTION : If necessary, read the result from the 29027 into a +; register on the 29000 +; +; PARAMETER : destination - one of the possible destination registers +; + .macro read_double_result,destination + .if ( DESTINATION == DESTINATION_29000 ) + ; + ; If the destination is not within the 29027 register file, read + ; the result and store it into the correct register in the 29000 + ; + .ifeqs "@destination@","rtn0" + cp_read_dp rtn0, rtn1 + .else + .err + .print "Invalid destination for double result - @destination@" + .exitm + .endif + .endif + + .endm ; End of read_double_result macro definition + +; +; MACRO NAME : read_single_result +; +; FUNCTION : If necessary, read the result from the 29027 into a +; register on the 29000 +; +; PARAMETER : destination +; + .macro read_single_result,destination + + .if ( DESTINATION == DESTINATION_29000 ) + ; + ; If the destination is not within the 29027 register file, read + ; the result and store it into the correct register in the 29000 + ; + .ifeqs "@destination@","rtn0" + cp_read_sp rtn0 + .else + .err + .print "Invalid destination for single result - @destination@" + .exitm + .endif + .endif + + .endm ; End of read_single_result macro definition + +; +; MACRO NAME : read_integer_result +; +; FUNCTION : If necessary, read the result from the 29027 into a +; register on the 29000 +; +; PARAMETER : destination +; + .macro read_integer_result,destination + + .if ( DESTINATION == DESTINATION_29000 ) + ; + ; If the destination is not within the 29027 register file, read + ; the result and store it into the correct register in the 29000 + ; + .ifeqs "@destination@","rtn0" + cp_read_int rtn0 + .else + .err + .print "Invalid destination for single result - @destination@" + .exitm + .endif + .endif + + .endm ; End of read_integer_result macro definition + +; +; MACRO NAME : select_P_operand +; +; FUNCTION : Given an operand, determine if the operand is from the +; register file, and if so, set the appropriate bits in +; the current instruction word. In addition, set the +; variable R_SOURCE to 0 for local register file, or 1 for +; floating-point register file. +; +; PARAMETER : operand1 - one of the possible source operands +; + .macro select_P_operand,operand1 + .ifeqs "@operand1@","t0" + .set R_SOURCE,R_SOURCE_29000 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_R + .exitm + .endif + .ifeqs "@operand1@","t2" + .set R_SOURCE,R_SOURCE_29000 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_R + .exitm + .endif + .ifeqs "@operand1@","rtn0" + .set R_SOURCE,R_SOURCE_29000 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_R + .exitm + .endif + .ifeqs "@operand1@","FP0" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_RF0 + .exitm + .endif + .ifeqs "@operand1@","FP1" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_RF1 + .exitm + .endif + .ifeqs "@operand1@","FP2" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_RF2 + .exitm + .endif + .ifeqs "@operand1@","FP3" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_RF3 + .exitm + .endif + .ifeqs "@operand1@","FP4" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_RF4 + .exitm + .endif + .ifeqs "@operand1@","FP5" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_RF5 + .exitm + .endif + .ifeqs "@operand1@","FP6" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_RF6 + .exitm + .endif + .ifeqs "@operand1@","FP7" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_P_EQ_RF7 + .exitm + .endif + .err + .print "@operand1@ - Invalid operand" + + .endm ; end of select_P_operand macro definition + +; +; MACRO NAME : select_S_operand +; +; FUNCTION : Given an operand, determine if the operand is from the +; register file, and if so, set the appropriate bits in +; the current instruction word. In addition, set the +; variable S_SOURCE to S_SOURCE_29000 or S_SOURCE_29027 +; as appropriate +; +; PARAMETER : operand2 - one of the possible source operands +; + .macro select_S_operand,operand2 + .ifeqs "@operand2@","t0" + .set S_SOURCE,S_SOURCE_29000 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_S + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_S + .endif + .exitm + .endif + .ifeqs "@operand2@","t2" + .set S_SOURCE,S_SOURCE_29000 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_S + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_S + .endif + .exitm + .endif + .ifeqs "@operand2@","rtn0" + .set S_SOURCE,S_SOURCE_29000 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_S + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_S + .endif + .exitm + .endif + .ifeqs "@operand2@","FP0" + .set S_SOURCE,S_SOURCE_29027 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF0 + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_RF0 + .endif + .exitm + .endif + .ifeqs "@operand2@","FP1" + .set S_SOURCE,S_SOURCE_29027 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF1 + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_RF1 + .endif + .exitm + .endif + .ifeqs "@operand2@","FP2" + .set S_SOURCE,S_SOURCE_29027 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF2 + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_RF2 + .endif + .exitm + .endif + .ifeqs "@operand2@","FP3" + .set S_SOURCE,S_SOURCE_29027 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF3 + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_RF3 + .endif + .exitm + .endif + .ifeqs "@operand2@","FP4" + .set S_SOURCE,S_SOURCE_29027 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF4 + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_RF4 + .endif + .exitm + .endif + .ifeqs "@operand2@","FP5" + .set S_SOURCE,S_SOURCE_29027 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF5 + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_RF5 + .endif + .exitm + .endif + .ifeqs "@operand2@","FP6" + .set S_SOURCE,S_SOURCE_29027 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF6 + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_RF6 + .endif + .exitm + .endif + .ifeqs "@operand2@","FP7" + .set S_SOURCE,S_SOURCE_29027 + .if ( OPERATION_TYPE == T_OPERATION ) + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF7 + .else + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_Q_EQ_RF7 + .endif + .exitm + .endif + .err + .print "@operand2@ - Invalid operand" + + .endm ; end of select_S_operand macro definition + +; +; MACRO NAME : select_T_operand +; +; FUNCTION : Given an operand, determine if the operand is from the +; register file, and if so, set the appropriate bits in +; the current instruction word, to read the corresponding +; source into the T operand. In addition, set the +; variable R_SOURCE to 0 for local register file, or 1 for +; floating-point register file. +; +; PARAMETER : operand1 - one of the possible source operands +; + .macro select_T_operand,operand1 + .ifeqs "@operand1@","t0" + .set R_SOURCE,R_SOURCE_29000 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_R + .exitm + .endif + .ifeqs "@operand1@","t2" + .set R_SOURCE,R_SOURCE_29000 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_R + .exitm + .endif + .ifeqs "@operand1@","rtn0" + .set R_SOURCE,R_SOURCE_29000 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_R + .exitm + .endif + .ifeqs "@operand1@","FP0" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF0 + .exitm + .endif + .ifeqs "@operand1@","FP1" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF1 + .exitm + .endif + .ifeqs "@operand1@","FP2" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF2 + .exitm + .endif + .ifeqs "@operand1@","FP3" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF3 + .exitm + .endif + .ifeqs "@operand1@","FP4" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF4 + .exitm + .endif + .ifeqs "@operand1@","FP5" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF5 + .exitm + .endif + .ifeqs "@operand1@","FP6" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF6 + .exitm + .endif + .ifeqs "@operand1@","FP7" + .set R_SOURCE,R_SOURCE_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_T_EQ_RF7 + .exitm + .endif + .err + .print "@operand1@ - Invalid operand" + + .endm ; end of select_T_operand macro definition + +; +; MACRO NAME : select_destination +; +; FUNCTION : Given a destination, determine if the operand is from the +; register file, and if so, set the appropriate bits in +; the current instruction word. In addition, set the +; variable DESTINATION to DESTINATION_29000 or +; DESTINATION_29027 as appropriate +; +; PARAMETER : destination - one of the possible destination operands +; + .macro select_destination,destination + .ifeqs "@destination@","rtn0" + .set DESTINATION,DESTINATION_29000 + .exitm + .endif + .ifeqs "@destination@","FP0" + .set DESTINATION,DESTINATION_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_DEST_EQ_RF0 + .exitm + .endif + .ifeqs "@destination@","FP1" + .set DESTINATION,DESTINATION_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_DEST_EQ_RF1 + .exitm + .endif + .ifeqs "@destination@","FP2" + .set DESTINATION,DESTINATION_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_DEST_EQ_RF2 + .exitm + .endif + .ifeqs "@destination@","FP3" + .set DESTINATION,DESTINATION_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_DEST_EQ_RF3 + .exitm + .endif + .ifeqs "@destination@","FP4" + .set DESTINATION,DESTINATION_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_DEST_EQ_RF4 + .exitm + .endif + .ifeqs "@destination@","FP5" + .set DESTINATION,DESTINATION_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_DEST_EQ_RF5 + .exitm + .endif + .ifeqs "@destination@","FP6" + .set DESTINATION,DESTINATION_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_DEST_EQ_RF6 + .exitm + .endif + .ifeqs "@destination@","FP7" + .set DESTINATION,DESTINATION_29027 + .set CURRENT_INSTRUCTION, CURRENT_INSTRUCTION | CP_DEST_EQ_RF7 + .exitm + .endif + .err + .print "@destination@ - Invalid operand" + + .endm ; end of select_destination macro definition + +; MACRO NAME : initialize_previous_instruction +; +; FUNCTION : Make sure the previous instruction is defined and set to zero +; + .macro initialize_previous_instruction + + .ifndef PREVIOUS_INSTRUCTION + ; + ; Make sure that the previous instruction variable is initialized + ; + .set PREVIOUS_INSTRUCTION,0 + .endif + + .endm ; end of initialize_previous_instruction macro definition + + +; MACRO NAME : prepare_function_parameters +; +; FUNCTION : To place the input parameters into the correct position for +; use by the function body. When the target language is +; FORTRAN, the values of the input arguments are read from the +; supplied addresses and moved to the t0-t3 temporary area. +; When the target language is C or Pascal, the values of the +; input arguments are simply moved to the t0-t3 temporary area. +; + .macro prepare_function_parameters,arg1,arg2 + + .if $narg==0 + .err + .print "Missing function argument(s)" + .exitm + .endif + + .if $narg>2 + .err + .print "Too many function arguments + .exitm + .endif + + .if $narg>=1 + .if $isreg(@arg1) + .ifdef FORTRAN + load 0,0,t0,arg1 + .if ( FUNCTION_TYPE == DOUBLE_FUNCTION ) + add t1,arg1,4 + load 0,0,t1,t1 + .endif + .else + add t0,arg1,0 + .if ( FUNCTION_TYPE == DOUBLE_FUNCTION ) + add t1,%%(&arg1+1),0 + .endif + .endif + .else + .err + .print "Function argument not register - @arg1@" + .endif + .endif + .if $narg==2 + .if $isreg (@arg2) + .ifdef FORTRAN + load 0,0,t2,arg2 + .if ( FUNCTION_TYPE == DOUBLE_FUNCTION ) + add t3,arg2,4 + load 0,0,t3,t3 + .endif + .else + add t2,arg2,0 + .if ( FUNCTION_TYPE == DOUBLE_FUNCTION ) + add t3,%%(&arg2+1),0 + .endif + .endif + .else + .err + .print "Function argument not register - @arg2@" + .endif + .endif + + .endm ; end of prepare_function_parameters macro definition + +; end of smartmac.h file
smartmac.h Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.