18.08.2013 Views

Level Epsilon Architecture Support Reference Manual

Level Epsilon Architecture Support Reference Manual

Level Epsilon Architecture Support Reference Manual

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ClearPath Enterprise Servers<br />

<strong>Level</strong> <strong>Epsilon</strong><br />

<strong>Architecture</strong> <strong>Support</strong> <strong>Reference</strong> <strong>Manual</strong><br />

September 2012 6878 7530–007<br />

unisys


NO WARRANTIES OF ANY NATURE ARE EXTENDED BY THIS DOCUMENT. Any product or related information<br />

described herein is only furnished pursuant and subject to the terms and conditions of a duly executed agreement to<br />

purchase or lease equipment or to license software. The only warranties made by Unisys, if any, with respect to the<br />

products described in this document are set forth in such agreement. Unisys cannot accept any financial or other<br />

responsibility that may be the result of your use of the information in this document or software material, including<br />

direct, special, or consequential damages.<br />

You should be very careful to ensure that the use of this information and/or software material complies with the laws,<br />

rules, and regulations of the jurisdictions with respect to which it is used.<br />

The information contained herein is subject to change without notice. Revisions may be issued to advise of such<br />

changes and/or additions.<br />

Notice to U.S. Government End Users: This is commercial computer software or hardware documentation developed at<br />

private expense. Use, reproduction, or disclosure by the Government is subject to the terms of Unisys standard<br />

commercial license for the products, and where applicable, the restricted/limited rights provisions of the contract data<br />

rights clauses.<br />

Unisys and ClearPath are registered trademarks of Unisys Corporation in the United States and other countries.<br />

All other brands and products referenced in this document are acknowledged to be the trademarks or registered<br />

trademarks of their respective holders.


Contents<br />

Section 1. Introduction<br />

Purpose ................................................................................................. 1–1<br />

Scope .................................................................................................... 1–1<br />

Audience ............................................................................................... 1–1<br />

Prerequisites ......................................................................................... 1–1<br />

Documentation Updates ....................................................................... 1–1<br />

Section 2. Process Model<br />

Addressing Granularity: Words ............................................................. 2–1<br />

Segments and Descriptors ................................................................... 2–1<br />

Actual Segments and Actual Segment Descriptors<br />

(ASDs) ............................................................................. 2–2<br />

Virtual Segments and Virtual Segment Descriptors<br />

(DDs and CSDs) ............................................................... 2–2<br />

Procedures: Activation Records ............................................................ 2–3<br />

Processes: Stacks ................................................................................. 2–4<br />

Programs: Code Segment Dictionaries ................................................. 2–4<br />

Linkages and Addressing Environments ............................................... 2–5<br />

<strong>Reference</strong>s ............................................................................................ 2–6<br />

Protection .............................................................................................. 2–7<br />

Accessing Segments ........................................................... 2–7<br />

Access Control..................................................................... 2–8<br />

Addressing ............................................................................................ 2–9<br />

Procedure Entry/Exit ............................................................................. 2–9<br />

Expression Stack and Stack Frames ................................................... 2–10<br />

Stack and Display Registers ................................................................ 2–11<br />

Executable Code Streams ................................................................... 2–11<br />

General Boolean Accumulators........................................................... 2–12<br />

ASD Memory <strong>Architecture</strong> .................................................................. 2–12<br />

Section 3. Data Structure and Text<br />

Word Format ......................................................................................... 3–1<br />

Data Words ........................................................................................... 3–2<br />

Operands (Single and Double Precision) ............................. 3–2<br />

Tag-4 Word and Tag-6 Word ................................................ 3–5<br />

Program Code Words ........................................................................... 3–5<br />

Actual Segment Descriptors (ASD) ....................................................... 3–5<br />

Actual Segment Descriptor, First Word (ASD1) .................. 3–6<br />

Actual Segment Descriptor, Second Word (ASD2) ............. 3–6<br />

Absolute Store <strong>Reference</strong> Word (ASRW) ............................................. 3–7<br />

6878 7530–007 iii


Contents<br />

Section 4. Interrupts<br />

Virtual Segment Descriptor (VSD) ......................................................... 3–7<br />

Untouched DD ...................................................................... 3–7<br />

Unindexed (Original and Copy) DD ....................................... 3–7<br />

IndexedDD (Indexed Data Descriptor .................................. 3–8<br />

Code Segment Descriptor (CSD) ......................................... 3–9<br />

Virtual Segments ................................................................................. 3–10<br />

Virtual Index ......................................................................................... 3–11<br />

<strong>Reference</strong>s .......................................................................................... 3–12<br />

Address Couples ................................................................ 3–12<br />

Environment Links .............................................................. 3–13<br />

Stuffed Indirect <strong>Reference</strong> Word (SIRW) ........................... 3–14<br />

Program Control Word (PCW) ............................................ 3–14<br />

Stack Structure and Linkage ................................................................ 3–15<br />

Stack Frame Linkage .......................................................... 3–16<br />

Top-of-Stack Linkage .......................................................... 3–17<br />

Protected Object Word (POW) ............................................................ 3–18<br />

Tag Values ........................................................................................... 3–19<br />

Data Structure Access ......................................................................... 3–20<br />

Interrupt Mechanism ............................................................................. 4–1<br />

Superhalt .............................................................................. 4–1<br />

Interrupt <strong>Reference</strong>s ............................................................ 4–2<br />

Vector Interrupt Formats ...................................................... 4–2<br />

Code Stream Designation and Resumption ......................... 4–3<br />

Interrupt Parameters ............................................................ 4–4<br />

Restart Configuration ........................................................... 4–5<br />

Operator Subdivision ............................................................ 4–5<br />

Interrupt Definition ................................................................................. 4–6<br />

Arithmetic Interrupts ............................................................ 4–7<br />

Service Interrupts ............................................................... 4–10<br />

Enforcement Interrupts ...................................................... 4–14<br />

Alarm Interrupts (Libra 6xx and 7xx Systems) ................... 4–22<br />

Asynchronous Interrupts .................................................... 4–26<br />

External Interrupts .............................................................. 4–27<br />

Maskable External Interrupts ............................................. 4–28<br />

Interrupt Vector .................................................................................... 4–29<br />

Section 5. Operator Set<br />

General Information ............................................................................... 5–1<br />

Operators and Code Streams ............................................... 5–1<br />

Interrupts and Resumption .................................................. 5–3<br />

Operator Applicability ........................................................... 5–4<br />

Expression Stack Control ..................................................... 5–5<br />

Stack-State Transformation .................................................. 5–6<br />

Expression Stack Treatment of Word Extension ................. 5–7<br />

Descriptor Interpretation ...................................................... 5–7<br />

Computational Operators ...................................................................... 5–8<br />

Numeric Operand Interpretation .......................................... 5–8<br />

iv 6878 7530–007


Contents<br />

Numeric-Interpretation Operators ..................................... 5–19<br />

Bit Vector Interpretation .................................................... 5–29<br />

Linear Index-Function Operator ......................................... 5–39<br />

<strong>Reference</strong> Generation and Evaluation Operators ............................... 5–41<br />

Double Precision ................................................................ 5–41<br />

Stack <strong>Reference</strong>s .............................................................. 5–41<br />

Environment Link Evaluation ............................................. 5–41<br />

Evaluation of <strong>Reference</strong>s ................................................... 5–41<br />

<strong>Reference</strong> Generation Operators ...................................... 5–44<br />

<strong>Reference</strong> Modification Operators .................................... 5–50<br />

Descriptor Attribute Extraction Operators ......................... 5–51<br />

Read Evaluation Operators ................................................ 5–52<br />

Normal Store Operators .................................................... 5–59<br />

Overwrite Operators .......................................................... 5–61<br />

Character <strong>Reference</strong> Evaluation Operators ....................... 5–63<br />

Processor State Operators .................................................................. 5–65<br />

Code Stream Pointer Distribution ...................................... 5–65<br />

Branching Operators .......................................................... 5–65<br />

Stack Frame Operators ...................................................... 5–67<br />

Assertion Operators .......................................................... 5–73<br />

Top-Of-Stack Operators ..................................................... 5–73<br />

Processor-State Manipulation Operators .......................... 5–75<br />

Data Array Operators .......................................................................... 5–77<br />

Paged Array Operations ..................................................... 5–77<br />

Searching Operators .......................................................... 5–78<br />

Pointer Operators .............................................................. 5–80<br />

Vector Operators ............................................................. 5–109<br />

Miscellaneous Operators .................................................................. 5–121<br />

Program Restrictions Due to Hidden State ....................................... 5–122<br />

Section 6. Restricted Operators<br />

Restricted General Operators ............................................................... 6–1<br />

Restricted <strong>Reference</strong> Operators.......................................... 6–1<br />

Program Restrictions Due to Hidden State ......................... 6–3<br />

Restricted Processor State Operators ................................. 6–4<br />

Restricted Task Control Operators ...................................... 6–8<br />

Restricted Time of Day Operators ..................................... 6–10<br />

Restricted Platform Operators ............................................................ 6–11<br />

Restricted Memory Access Functions .............................. 6–11<br />

Restricted System Interrupt Functions ............................. 6–15<br />

Restricted Time of Day Functions (Libra 6xx and<br />

7xx Systems) ................................................................. 6–21<br />

Time Management (Libra 4000 System) ........................... 6–23<br />

System-Specific Platform <strong>Support</strong> Operator ..................... 6–26<br />

Restricted I/O <strong>Support</strong> Operator........................................ 6–27<br />

Restricted Word Extension Operators ................................................ 6–28<br />

Appendix A. Alphabetical Operator Code List<br />

6878 7530–007 v


Contents<br />

Appendix B. Boolean Accumulator X-Ref<br />

TFFF (true/false flip-flop) ....................................................................... B–1<br />

OFFF (overflow flip-flop) ....................................................................... B–2<br />

EXTF (external sign flip-flop) ................................................................. B–2<br />

FLTF (float flip-flop) ............................................................................... B–2<br />

TFFF, OFFF, and EXTF .......................................................................... B–3<br />

FLTF ...................................................................................................... B–3<br />

Appendix C. Operator Encoding<br />

Primary Mode Operators ...................................................................... C–2<br />

Variant Mode Operators ....................................................................... C–4<br />

Edit Mode Operators ............................................................................ C–6<br />

Appendix D. Data Type Formats<br />

Appendix E. Processor Features Operators<br />

Appendix F. Operator and Common Action <strong>Reference</strong><br />

Appendix G. Interupt <strong>Reference</strong><br />

Index ............................................................................................. 1<br />

vi 6878 7530–007


Contents<br />

6878 7530–007 vii


Contents<br />

viii 6878 7530–007


Section 1<br />

Introduction<br />

Purpose<br />

Scope<br />

Audience<br />

This manual describes the system concepts needed as background to understand the<br />

hardware and software interface of Libra systems running under level <strong>Epsilon</strong> compatible<br />

MCP. The information in this manual applies to Libra 680, 690, 750, 780, 790, 880, 890,<br />

4000, 4100, 4200, and 6200 systems, unless specified otherwise.<br />

Incorporated in this manual are descriptions of supported data types, the processor<br />

state, and operator set. In addition there are appendixes that list the alphabetical<br />

operator codes, the numeric operator codes, common actions, and interrupts.<br />

The primary audience for this manual is system analysts, whose responsibilities include<br />

the need to gather and analyze information in order to provide software support for Libra<br />

systems running under level <strong>Epsilon</strong> compatible MCP.<br />

Prerequisites<br />

Users of this manual are expected to have full knowledge of the capabilities, features,<br />

and operation of Libra systems running under level <strong>Epsilon</strong> compatible MCP.<br />

Documentation Updates<br />

This document contains all the information that was available at the time of publication.<br />

Changes identified after release of this document are included in problem list entry (PLE)<br />

18875373. To obtain a copy of the PLE, contact your Unisys representative or access the<br />

current PLE from the Unisys Product <strong>Support</strong> Web site:<br />

http://www.support.unisys.com/all/ple/18875373<br />

Note: If you are not logged into the Product <strong>Support</strong> site, you will be asked to do so.<br />

6878 7530–007 1–1


Introduction<br />

1–2 6878 7530–007


Section 2<br />

Process Model<br />

This section discusses concepts associated with the process model that is implemented<br />

by level <strong>Epsilon</strong> MCP systems. It introduces fundamental data types and the processor<br />

state required for functional specification of the operator set.<br />

Addressing Granularity: Words<br />

The unit of addressing in the ClearPath MCP systems is the word, a memory unit made<br />

up of 48 data bits, a 4-bit tag, and a 4-bit data extension. Operators exist that can deal<br />

with parts of words; however, memory is addressed and accessed in whole words. The<br />

term item is more general than word; an item contains one or two words.<br />

The tag determines, at least in part, the item type. Tags are four bits wide.<br />

The most common data type is the single-precision operand with a tag of zero. Such<br />

words are used for numbers (integer and floating point), Boolean values, characters, and<br />

arbitrary encodings. For some purposes, pairs of words are joined to form double<br />

precision operands with tags equal to two. Most other tag values are used for words<br />

with special functions that are recognized by the processor. Some of these data types<br />

are distinguished entirely by their tag, some by a combination of tag and other fields<br />

within the word, and some by a combination of tag and context.<br />

Segments and Descriptors<br />

An aggregate of memory words associated for addressing purposes is called a segment.<br />

Segments may contain either data or code. This document refers to two classes of<br />

segments: virtual and actual. (The term virtual, as applied to segments, is not to be<br />

confused with the ordinary use of the term virtual memory; an actual segment may or<br />

may not be present in main memory.)<br />

Virtual segments are the objects manipulated by user programs; they are defined and<br />

referenced by special words called Data Segment Descriptors (DSDs) and Code<br />

Segment Descriptors (CSDs). The term Virtual Segment Descriptor (VSD) refers to the<br />

union of DSD and CSD. VSDs occur within the addressing environments of user<br />

programs, where they can be accessed and manipulated in limited ways.<br />

6878 7530–007 2–1


Process Model<br />

Actual Segments and Actual Segment Descriptors (ASDs)<br />

An actual segment is a contiguous group of memory words.<br />

An actual segment is defined by a special object called an Actual Segment Descriptor<br />

(ASD). An ASD is a multi-word data structure that specifies the location, length, and<br />

other attributes of an actual segment. All the ASDs in the system are in an array called<br />

the ASD table; each entry has a unique index called its ASD_number. Once "touched,"<br />

each VSD contains the ASD_number of the actual segment to which it refers.<br />

The ASD table is outside the addressing environment of user programs; such programs<br />

refer to ASDs indirectly, by evaluating VSDs and other items that contain ASD<br />

references, but they do not manipulate the ASD_number references or ASD entries<br />

directly.<br />

Virtual Segments and Virtual Segment Descriptors (DDs and<br />

CSDs)<br />

Virtual data segments may be unpaged (represented by one actual segment of arbitrary<br />

length) or paged (subdivided into noncontiguous fixed-length actual segments, with<br />

possibly a shorter last page). Code segments are always unpaged. To an unpaged virtual<br />

segment there corresponds exactly one actual segment; in this case the virtual-actual<br />

distinction is not significant for the segment, but remains so for the descriptors, VSD and<br />

ASD. There are four classes of VSDs:<br />

untouched A request-token for a segment (or sometimes for a reference or other<br />

object). This is the only form of VSD constructed by user programs.<br />

original The defining and owning token for a segment. Touched original VSDs<br />

are created only by the operating system.<br />

unindexed copy A reference to the segment. Copies are created by operators that fetch<br />

original DDs from memory. Copy CSDs do not occur in user programs.<br />

indexed copy A reference to a specific element of the segment. Indexed DDs are<br />

always copies; they are created by Index operators from unindexed<br />

(original or copy) DDs. No indexed CSD is defined.<br />

An untouched VSD could be called untouched original. It typically serves as a request for<br />

an original DD or CSD, but it is actually a general binding-request token and can occur<br />

wherever a DD or reference is expected. Any normal access to a token is intercepted so<br />

that the requested object can be created in place of the token.<br />

The other three classes of VSDs are touched; they contain fields to locate and<br />

characterize the data in the segment. The element_size field of a DD indicates whether<br />

the virtual data segment is to be treated as an array of single words, double word pairs,<br />

or 4- or 8-bit (hex or EBCDIC) characters. All touched VSDs contain an ASD_number. The<br />

adjectives original, copy, unindexed, and indexed, when applied to a DD, imply touched;<br />

indexed also implies copy.<br />

Generally, there is one original VSD for a segment. However, functional operator<br />

definition does not require precisely one original DD for each array.<br />

2–2 6878 7530–007


Process Model<br />

Arrays of 4-bit characters are called hex because four bits can encode one hexadecimal<br />

(base 16) digit. Arrays of 8-bit characters are called EBCDIC for Extended Binary Coded<br />

Decimal Interchange Code; the character encodings commonly used on ClearPath MCP<br />

systems. Certain operators associate particular hex or EBCDIC encodings with decimal<br />

digits or with + or - signs, but most character operators accommodate arbitrary 4- or 8-bit<br />

data.<br />

Procedures: Activation Records<br />

A procedure is a portion of a program, associating a group of parameters and<br />

declarations with a body of code. (This notion of procedure is consistent with the<br />

PROCEDURE or BLOCK of ALGOL, the PROCEDURE or FUNCTION of Pascal, and the<br />

SUBROUTINE or FUNCTION of FORTRAN.)<br />

An activation record (AR) can be considered the instantiation of a procedure; it is a group<br />

of consecutive words that provide space for the data and control objects occurring in the<br />

procedure. Each word (or double word item) corresponds to one object declared in or<br />

passed as a parameter to the procedure. Simple objects such as INTEGERs, REALs, or<br />

BOOLEANs occur as operands within the record, while more complex structures, such<br />

as ARRAYs are defined by descriptors in the record. Other word types occur as<br />

references. The declarations within a procedure may include other procedures, which are<br />

generally represented in the AR by Program Control Words (PCWs) defining their entry<br />

points.<br />

A program has a static hierarchical structure, in which each procedure occupies a fixed<br />

position. Objects declared within a procedure are considered local to it; they are<br />

instantiated as items in its AR. When procedure P declares procedure Q, Q is said to be<br />

nested within P. Conversely, P is said to contain Q, and items declared in P are<br />

considered global to Q. This characteristic of block-structured languages is modeled in<br />

the ClearPath MCP; the activation record of P is considered the immediately global<br />

activation record to that of Q. Procedure Q could, in turn, declare another procedure, R,<br />

and so on. Then Q is immediately global to R and P is more distantly global to R.<br />

Each visible object can be named by specifying the nesting depth of the declaring<br />

procedure and the relative position of the item in that procedure's activation record. Such<br />

names are called address couples and are the sole form of address appearing in the code<br />

of ClearPath MCP programs. An address couple is written (lambda,delta), where<br />

lambda the lexicographic level (nesting depth, usually abbreviated lex level)<br />

delta the position of the word in the activation record (displacement from the base of<br />

the AR).<br />

6878 7530–007 2–3


Process Model<br />

Processes: Stacks<br />

A process is an execution of a program; it associates the program code with the data<br />

space and processing record for that execution (and separate from all other executions).<br />

A new process involves the activation of a single procedure; in the course of its<br />

execution, that procedure can activate procedures, which can activate procedures, and<br />

so forth. Only the most recently activated procedure in the process executes code;<br />

when one procedure calls another, the caller is suspended until the called procedure<br />

exits. (Not all the procedures activated in a process are necessarily from the same<br />

program.)<br />

Unlike procedure activation, which is performed automatically by the Enter operator,<br />

process creation is performed by operating system software. A process is terminated<br />

(also by software) when the initial procedure exits or is aborted.<br />

A stack can be considered the instantiation of a process. The stack contains a historical<br />

record of all procedures that have been entered and not yet exited. It contains the<br />

activation records for those procedures. It also serves as an expression stack; most<br />

operators take their arguments from the top of the stack and leave their results there.<br />

For each procedure that has been entered in a process and not yet exited, there is one<br />

frame in the process stack. The stack frame includes the activation record followed by<br />

any items that have been pushed onto the expression stack and not yet consumed.<br />

The system can use many stacks, with a processor assigned to one stack at a time<br />

(multiprogramming). A system can have more than one processor; at any time, each<br />

processor is bound to a different stack (multiprocessing).<br />

A stack is a special case of actual segment. Stacks are referenced by stack_numbers,<br />

which are a subrange of the ASD_numbers. Stacks are identified as such in their defining<br />

ASDs.<br />

Programs: Code Segment Dictionaries<br />

Executable code is contained in segments defined by Code Segment Descriptors, which<br />

occur in special segments called Code Segment Dictionaries. A code segment dictionary<br />

is a special case of an activation record, global to the outer block AR. The code segment<br />

dictionary can be considered the instantiation of a program; its AR is global to an arbitrary<br />

number of processes executing the same program. In addition to a CSD for each code<br />

segment in the program, this AR contains the Program Control Word (PCW) defining the<br />

outer block entry point; it may also contain Data Descriptors defining read-only data<br />

segments. To execute a program, software creates a code segment dictionary<br />

associated with the program code file.<br />

2–4 6878 7530–007


Linkages and Addressing Environments<br />

Process Model<br />

Activation records are linked onto two lists—the historical chain and the environmental<br />

chain—which are at the base of each activation record.<br />

The historical chain is a chronologically ordered list that consists of History Links<br />

connecting each stack frame to that of its initiating procedure (immediately below it in<br />

the same stack). A processor register (F) holds a pointer to the head of this chain for the<br />

active stack. Each link of the historical chain is contained in the History Word (HISW).<br />

The environmental chain defines the current addressing environment of a process by<br />

linking the activation record of each procedure to that of its containing, or immediately<br />

global, procedure. Each link of the environmental chain is contained in the Environment<br />

Word (ENVW).<br />

A normal Environment Link has two elements, stack_number and displacement,<br />

specifying a stack and the word index within the stack segment to the base of an<br />

activation record. A pseudo Environment Link is also defined; it has two elements,<br />

ASD_number and displacement, specifying an arbitrary segment and a small index.<br />

An AR constructed automatically on a stack by procedure entry is linked into the<br />

environmental and historical chains. It contains a Return Control Word (RCW) that<br />

preserves state necessary to resume processing at the activation record designated by<br />

the History Link. Such an AR is called a normal activation record to distinguish it from a<br />

pseudo activation record, which is created in an arbitrary segment by primitive software.<br />

A pseudo AR is linked into the environmental chain, but never as the topmost entry. This<br />

AR is not linked into the historical chain and it has no RCW. A stack can contain an<br />

arbitrary number of normal ARs, but a pseudo AR typically encompasses all or most of<br />

an actual segment.<br />

The current addressing environment is the set of activation records addressed by the<br />

environmental chain whose head is the current topmost AR, the one for the procedure<br />

whose code stream is currently bound to the processor. The position of an AR in the<br />

environmental chain defines its lex level. The lex level of the topmost AR is defined to be<br />

LL; there are LL+1 ARs in the current environment. Lex level 0 defines the end of the<br />

chain and denotes the most global AR. The processor maintains the current value of LL<br />

in a register.<br />

A processor register (D[LL]) points to the base of the current topmost AR and, therefore,<br />

to the top of the environmental chain. There is another register pointing to the<br />

immediately global AR, and so forth to the end of the environmental chain. These<br />

registers are called display registers and are treated as a vector; the most global AR is<br />

referenced by D[0], the next by D[1], and so forth up to D[LL]. Display registers are used<br />

to evaluate address couples. The base of the activation record for level lambda is<br />

designated by D[lambda]. (In principle, address-couple evaluation can be performed by<br />

traversing the environmental chain when lambda is less than LL, but satisfactory<br />

performance requires the use of display registers.) The registers are maintained<br />

automatically by the processor, which traverses the new environmental chain at<br />

procedure entry/exit and process stack switch.<br />

6878 7530–007 2–5


Process Model<br />

A History Link always points to an HISW in the same stack; the historical chain is a linear<br />

structure that maps the sequence of procedure entries within a process. An ENVW<br />

Environmental Link may point at an ENVW in the same or another stack; the set of<br />

environmental chains forms a tree structure that maps the static block structure of a<br />

program. The historical and environmental chains are often called dynamic and static,<br />

respectively. Early versions of the system architecture used the term lexical for the<br />

environmental chain; the term lexicographic occurs in the literature of block structured<br />

programming languages, referring to the static structure of the program; hence, the<br />

phrase lexicographic level.<br />

<strong>Reference</strong>s<br />

<strong>Reference</strong>s to objects occur in several forms:<br />

1. An address couple in the code stream is consumed directly by an operator (such as<br />

Value Call, which fetches an operand). Address-couple evaluation depends upon the<br />

current addressing environment (context), because its lambda component specifies<br />

only a position on the current environmental chain.<br />

2. A Stuffed Indirect <strong>Reference</strong> Word (SIRW) is a context- independent reference<br />

formed by transforming an address couple with a Name Call operator, which<br />

replaces the lambda component of the address couple by an environment link to the<br />

activation record at lex level lambda in the current addressing environment.<br />

An SIRW is created from an address couple to designate an item in the current<br />

environment, but once formed it continues to designate that item when passed into<br />

other environments.<br />

3. An unindexed copy DD is a reference to a segment. Such copies are formed from<br />

original DDs by Load operators.<br />

4. An indexed copy DD is a reference to an element of a segment; it may also be used<br />

to designate the first element of a sequence. Indexed DDs are formed from<br />

unindexed DD by Index operators.<br />

5. A Program Control Word (PCW) constitutes a specialized reference to a code stream.<br />

PCWs define procedure entry points; they also designate destinations for jumps<br />

between segments. A PCW is generated by special Make PCW operators.<br />

A PCW also contains other information about the code, including the lex level at<br />

which an entered procedure will run.<br />

6. An Absolute Store <strong>Reference</strong> Word (ASRW) is a special reference used by a few<br />

operators to access memory by absolute address. ASRWs are not manipulated in<br />

user programs; they are mentioned here because they appear in the definitions of<br />

some partly restricted operators. That is, the operators occur in user programs and<br />

the operators can consume an ASRW, but ASRWs do not occur in user programs.<br />

2–6 6878 7530–007


Protection<br />

Process Model<br />

The term protection refers to mechanisms and techniques that control the access of<br />

executing programs to stored information; protection is one aspect of the much larger<br />

topic of security.<br />

The protection mechanisms in ClearPath MCP processors can be described as a<br />

modified capability architecture. A capability is defined as an unforgeable ticket that<br />

grants the possessing subject (process or procedure) the right to access a designated<br />

object (data) in specified ways (such as read, write). (The term modified denotes that<br />

there are restrictions on the access to and manipulation of the capabilities themselves.)<br />

The remainder of this section is a brief overview of the protection mechanisms.<br />

The fundamental protection policy is that a procedure can access only the objects in its<br />

extended addressing environment. The access modes of primary interest are read, write,<br />

and enter; additional accesses include create, destroy, and exit. A procedure creates<br />

objects by pushing words onto the stack, including operands that define simple objects<br />

and untouched DDs that define more complex ones. Exiting a procedure destroys all the<br />

objects declared in it; the RCW serves as an exit capability (usable once only). The<br />

environmental chain provides, via address couples, read and write capability to objects in<br />

the addressing environment. An SIRW or a DD provides read and usually write capability<br />

to the referent. A PCW serves as an enter capability.<br />

Protection is a responsibility shared by the processor (hardware and firmware) and the<br />

software. The responsible software includes the user language compilers, which are<br />

constructed to follow a number of conventions in all generated code. In particular, the<br />

unforgeability property of capabilities is enforced by the compilers, which do not emit<br />

sequences of code that could create or modify a capability contrary to the policy. The<br />

compilers are also "trusted" to generate only valid address couples.<br />

Accessing Segments<br />

Enforcement of segment boundaries is a key element of the protection mechanism.<br />

Data in segments (other than from ARs) is accessed via IndexedDDs; enforcement is<br />

based on controlling the generation and use of IndexedDD:<br />

1. IndexedDDs are formed by index operators, which apply an index value to a DD.<br />

Both unindexed and indexed DDs can be indexed; reindexing an IndexedDD<br />

algebraically adds the new index to the current index. The index operations require<br />

resulting index values to be not less than zero, and to be less than the segment<br />

length specified in the referenced ASD. All index bound enforcement is at word<br />

boundaries.<br />

Indexing a paged DD proceeds in two steps:<br />

a. The index is divided by the page length.<br />

b. The quotient is used to index the page table and fetch the unindexed page DD,<br />

which is then indexed by the remainder from the division.<br />

6878 7530–007 2–7


Process Model<br />

The upper bound on unpaged arrays is determined by the length of the segment; the<br />

upper bound on paged arrays is determined by the length of the page table, the fixed<br />

page length, and the length of the last page. Indexing a paged unindexed DD<br />

proceeds in two steps, as described previously; the quotient must be a valid index<br />

on the page table. Reindexing a paged indexed DD is more complicated, but the<br />

result is as though the sum of the current and new index values were applied to the<br />

unindexed DD.<br />

2. Load and store operators consume an IndexedDD to access the referenced word or<br />

double-word. Load and store operations require the word index in an IndexedDD to<br />

be less than the segment length specified in the referenced ASD.<br />

3. Array operators use an IndexedDD to access one or a sequence of elements of an<br />

array; they may modify the IndexedDD while traversing the array. Array operators are<br />

bounded by the length in the ASD.<br />

4. Certain operators make repeated read access to a membership or translate table,<br />

indexing an IndexedDD by a function of the character values in a sequence. Table<br />

access requires the word index in an IndexedDD to be less than the segment length<br />

specified in the referenced ASD.<br />

The boundaries of code segments and edit tables are enforced statically by the<br />

compilers.<br />

Access Control<br />

In their roles as capabilities, the descriptors, references, and other control structures<br />

offer access rights to the holder. Some of these rights can be controlled individually for<br />

each instance of the structure.<br />

An indexed or unindexed DD has a write-access right that can be disabled. Write access<br />

is required for any memory write (store) operation. A write-disabled DD is often called<br />

read only. The default state is write enabled.<br />

An IndexedDD has a reindex right that can be disabled. Reindex must be enabled for the<br />

IndexedDD to be used as an argument to an indexing, array, or set- element_size<br />

operator. The default state is reindex enabled.<br />

2–8 6878 7530–007


Addressing<br />

Process Model<br />

The only addresses that appear in a code stream are static address couples<br />

(lambda,delta). The maximum valid values of lambda and delta are respectively LL and<br />

the offset of the last item declared in the referenced activation record.<br />

Simple variables, references, and other one- and two-word objects reside in an activation<br />

record and can be addressed directly by an address couple. When the addressed object<br />

is a reference (SIRW or copy DD), it can be evaluated to provide access to its referent.<br />

Larger memory objects, such as arrays and multi-word structures, typically reside in<br />

segments outside the stack and are defined by original DDs within the stack or within<br />

other segments. An element of an array declared in a procedure can be addressed by<br />

providing an integer index value and the address couple of the descriptor. If that element<br />

is an indexable descriptor, it can be indexed, and so forth.<br />

Code is addressed by PCWs. In general, the entry point of a procedure is specified by a<br />

reference to its PCW and the activation record in which the PCW occurs becomes the<br />

immediate global addressing space for the new AR instantiating the procedure. Also, the<br />

PCW itself (rather than the reference) can be used to enter a procedure whose<br />

immediate global AR is within the current addressing environment.<br />

The term addressing environment refers to the set of activation records that constitute<br />

the current procedure and its globals. The items in that environment are directly visible<br />

via address couples. Other items, arrays, elements, and code are indirectly visible<br />

because references or original DDs for them are visible. These indirectly visible objects<br />

may themselves contain referenced or original DDs that render other objects indirectly<br />

visible, and so on. The union of the directly and indirectly visible objects constitute the<br />

extended addressing environment of the procedure.<br />

Procedure Entry/Exit<br />

Normal activation records are created on the top of the stack by a sequence of<br />

operations that effect procedure entry:<br />

1. A Mark Stack operation defines the base location for the beginning activation record,<br />

creating a new HISW on top of the stack and linking it at the head of the historical<br />

chain. An “inactive” ENVW, identical to the new HISW, is placed above the HISW.<br />

At this step, a history, but not an environment, link exists and the incipient AR is<br />

actually within the expression stack of the initiating process.<br />

2. A reference to the code for the procedure is placed on the stack.<br />

3. Any parameters for the procedure are placed on the stack.<br />

4. An Enter operation is performed. The new AR is now linked into the environmental<br />

chain; the addressing environment and code stream for the new procedure are<br />

established. The reference to the new procedure is replaced by a special structure<br />

called a Return Control Word (RCW), which designates the invoking code and<br />

preserves other states necessary to resume the invoking procedure when the<br />

invoked procedure is completed (exits).<br />

6878 7530–007 2–9


Process Model<br />

5. The new AR may now be extended as the prologue (stack-building) code in the new<br />

procedure pushes objects onto the stack. Such objects may include operands to<br />

define simple scalar objects, untouched descriptors to define additional segments or<br />

binding requests, PCWs to define nested procedures, and so forth. At first, these<br />

objects are in the expression stack; an explicit Push operator must be executed to<br />

make the new objects accessible via address couples. An Enter operation implicitly<br />

causes a push to display the parameter words already on the stack, which occupy<br />

the low order part of the new AR.<br />

In explicit procedure invocation, a program performs each of the previous steps by<br />

executing appropriate operators. In addition to explicit procedure entry, there are two<br />

mechanisms in which entry is implicit; in these cases, the relevant Steps 1 through 4<br />

occur automatically:<br />

• An interrupt is an entry (into an operating system procedure) that is performed<br />

automatically by the processor because an operator is unable to perform its function<br />

or because some condition requires software action.<br />

• An accidental entry occurs when a PCW is encountered during the evaluation of a<br />

reference chain. The designated procedure is invoked as a function with no<br />

parameters; it is expected to return either another reference or the target of the<br />

reference chain. This mechanism is provided to support the call-by-name parameter<br />

semantics of ALGOL-60. The invocation of an accidental entry procedure is often<br />

called a thunk.<br />

The topmost stack frame is deleted from the stack by an Exit operation; the historical<br />

chain is used to locate the prior entered AR and reinstate its stack frame and addressing<br />

environment, and the RCW is used to resume the code stream.<br />

Expression Stack and Stack Frames<br />

The current expression stack occurs at the current top of the process stack, immediately<br />

above the topmost activation record. A processor register (S) maintains a pointer to the<br />

top of the current stack. (The topmost several words of the stack may themselves be in<br />

registers; the remainder of the stack is in main memory.)<br />

If a procedure is invoked when the current expression stack is not empty, the expression<br />

values remain in the stack below the new AR. Upon procedure exit, the topmost<br />

expression stack is discarded along with the topmost AR, and the previous stack is<br />

reinstated.<br />

The term stack frame is applied to the combination of the activation record and the<br />

expression stack of a procedure. The distinction is that address couples and SIRWs can<br />

designate only items in the activation record. The boundary between the expression<br />

stack and the topmost activation record is determined by the length of the activation<br />

record. A Push operation enlarges the activation record to include the expression stack.<br />

The distinction between activation record and expression stack is maintained by<br />

convention. The processor enforces no distinction, but the results of addressing a word<br />

in the expression stack are undefined.<br />

2–10 6878 7530–007


Stack and Display Registers<br />

Process Model<br />

The processor maintains several registers that designate the current stack, historical<br />

chain, and addressing environment.<br />

• SNR contains the stack_number of the stack to which the processor is currently<br />

bound. This value serves as a unique process identifier throughout the life of the<br />

process; it is available to user programs for that purpose.<br />

• S designates the top of the expression stack.<br />

• F designates the topmost HISW, the head of the historical chain.<br />

• D[lambda] designates the base of the activation record at lex level lambda in the<br />

current addressing environment.<br />

• D[LL] designates the topmost entered ENVW (at the base of the topmost activation<br />

record), the head of the environmental chain.<br />

Some, but not all, of these registers are accessible directly by programs. When accessed<br />

by programs, S, F, and D[LL] are defined to contain displacements relative to the base of<br />

the stack designated by SNR. The obsolete register BOSR is defined as a constant zero,<br />

so that differences such as S-BOSR generate the intended value.<br />

Executable Code Streams<br />

Variable-length operator sequences are stored in arrays of program code words called<br />

code segments. Each program code word contains six 8-bit containers called syllables.<br />

The term code stream pointer is used to describe a reference to the entry point of an<br />

operator sequence in a code segment. A code stream pointer consists of a reference to<br />

the code segment and indexes to a word and syllable within the segment.<br />

The code segment reference is the ASD_number of the segment. The processor retains<br />

this number in a register, Program Segment Number (PSN).<br />

The entry point in the code segment is indicated by the Program Word Index (PWI),<br />

which is relative to the base of the code segment, and the Program Syllable Index (PSI)<br />

within that word. The processor maintains PWI and PSI in registers.<br />

Processors retain additional information about the code stream:<br />

• The LL register holds the lex level of the current procedure.<br />

• The CS Boolean indicates whether the processor is in normal state or control<br />

state. In control state, the processor defers most asynchronous interruptions of the<br />

code stream until a normal state is resumed. User programs almost always run in a<br />

normal state.<br />

6878 7530–007 2–11


Process Model<br />

General Boolean Accumulators<br />

Processor state includes several Boolean accumulators that are used by several operator<br />

groups. Their use and definition are discussed in Section 4 and are summarized in<br />

Appendix B.<br />

TFFF: True/false flip-flop.<br />

OFFF: Overflow flip-flop.<br />

EXTF: External sign flip-flop.<br />

FLTF: Float flip-flop.<br />

A variety of operators interact with TFFF, OFFF, and EXTF; the values of these registers<br />

are automatically saved and restored by procedure entry and exit. FLTF is used only<br />

within sequences of special edit operators. Its value is preserved as necessary when<br />

these sequences are interrupted and resumed.<br />

CxxD and SxxD operators require an immediately following RTFF. TFFF will be undefined<br />

after these sequences (CxxD RTFF and SxxD RTFF).<br />

ASD Memory <strong>Architecture</strong><br />

Each memory word is directly named by an absolute address, which is an integer in the<br />

range 0 to memory size–1. The memory size depends on the configuration of particular<br />

systems. The maximum memory size supported by each processor type is as follows:<br />

Processor Type Maximum Memory Size<br />

Libra 680/780/880 2**34 words (16 GW)<br />

Libra 4000 2**32 words (4 GW)<br />

Libra 4100/4200/6200 2**39 words (512 GW)<br />

System memory is subdivided into contiguous regions, called segments, which are<br />

defined by ASDs. Direct access to absolute addresses is limited to low-level system<br />

software; ordinary references to memory are accomplished indirectly, by citing a<br />

segment (ASD_number) and a segment-relative offset; the address is derived from the<br />

ASD for that segment. (Even references via address couples are ultimately defined by<br />

ASDs.)<br />

All the ASDs in the system are located in a structure called the ASD table. This table is at<br />

a fixed location, which starts at absolute address = 0.<br />

2–12 6878 7530–007


Section 3<br />

Data Structure and Text<br />

Most data types are defined in this section; others are defined later in the context of the<br />

operators involved. The definitions in this section apply to all <strong>Level</strong> <strong>Epsilon</strong> MCP<br />

systems.<br />

Word Format<br />

Words have 48 information bits plus 4-bit data extensions and four tag bits. The<br />

information bits are numbered from 47 to zero, from the high-order bit down to the loworder<br />

bit. Word formats are conventionally diagrammed with the bits shown in groups of<br />

four and the tag separated from the 48-bit body of the word.<br />

<br />

<br />

47 43 39 35 31 27 23 19 15 11 7 3 <br />

<br />

<br />

<br />

46 42 38 34 30 26 22 18 14 10 6 2 <br />

e t <br />

<br />

x a <br />

45 41 37 33 29 25 21 17 13 9 5 1 <br />

t g <br />

<br />

<br />

44 40 36 32 28 24 20 16 12 8 4 0 <br />

<br />

<br />

A field of a word is denoted [first:length], where<br />

first is the bit number of the high-order bit of the field (first less than or equal to<br />

47).<br />

length is the field length in bits (length less than or equal to 48).<br />

Fields are often given names, such as "offset" for "[12:13]." A field of an object or the<br />

class formed by applying the field specification to a class of objects is denoted by<br />

suffixing the field name or specification to the object or type name with an interposed<br />

dot, such as x.[46:1] or SIRW.offset.<br />

6878 7530–007 3–1


Data Structure and Text<br />

When necessary, fields are wrapped around from the lowest-order bit to the<br />

highest-order bit. If length is greater than first+1, then length minus (first+1) bits are<br />

concatenated starting from the highest-order bit (47). The following sequence illustrates<br />

the field [first:length] in the case where length is greater than first+1:<br />

47,46, ... , first , ... ,0,47,46, ... , last , ... ,1<br />

<br />

length <br />

Word types are distinguished by tag value and frequently by additional type bits in the<br />

word. Tag values are specified using hexadecimal notation.<br />

Throughout this document, word types are referred to by type name or acronym.<br />

Because the data type double precision consists of two words, the term item is used<br />

(instead of word) to refer to an entity whose type may be double precision.<br />

Data Words<br />

A Data Word is defined as a word that, when present in memory, can have its contents<br />

rewritten by a normal store (as opposed to overwrite) operation. (Words of all other<br />

types may be protected from normal stores.) Data Words serve primarily as computation<br />

arguments, rather than as reference arguments or control structures.<br />

Data Words include those with tags in {0, 2, 4, 6}.<br />

The term Data Word denotes a union of data types; these types are defined in the<br />

following paragraphs. Their definitions are the same for all ClearPath MCP systems.<br />

Operands (Single and Double Precision)<br />

The great majority of data items dealt with by programs are operands. There are two<br />

operand types:<br />

single precision a single word with a tag of 0<br />

double precision: a pair of words both with a tag of 2<br />

Throughout this document, the unqualified term operand is used solely to refer to the<br />

union single and double precision type.<br />

Neither operand type has a unique interpretation applied to it. Operators, according to<br />

their function, apply to different interpretations. For example, operands are interpreted as<br />

numeric values, bit vectors, and character sequences by arithmetic, word manipulation,<br />

and pointer operators, respectively. Numeric and Boolean operands are generated and<br />

interpreted by a wide variety of operators and are defined in this section. Section 3<br />

defines additional operand interpretations with the operator groups that apply them.<br />

3–2 6878 7530–007


Data Structure and Text<br />

The terms single and double precision convey the usual notion of alternate numerical<br />

representations with different precision and range, as defined in the following<br />

paragraphs. However, the same terms define data types regardless of the interpretation<br />

being applied.<br />

Real Numeric Operands<br />

Many operators interpret operands as numeric values. The structure of the numeric data<br />

is defined in this section; details of numeric interpretation are found in the operator<br />

descriptions under "Numeric Operand Interpretation" in Section 4.<br />

A single precision floating point operand is represented as a single precision operand<br />

with the following fields:<br />

[ext] Not used<br />

[47: 1] Not used<br />

mant_sign [46: 1] Mantissa sign (0=positive, 1=negative)<br />

exp_sign [45: 1] Exponent sign (0=positive, 1=negative)<br />

exponent [44: 6] The power of eight by which the mantissa is scaled<br />

mantissa [38:39] The integer magnitude of the number before scaling<br />

The mantissa field can be regarded equivalently as 39 binary or 13 octal digits; the latter<br />

view is suitable because floating point numbers are scaled by powers of eight.<br />

A single precision floating point operand with an exponent equal to zero is used as the<br />

canonical representation of a single precision integer; an operand in this form is called<br />

single_integer. The largest single_integer magnitude is 2**39-1 = 8*13-1.<br />

The form "k-bit integer" (where k is an integer in {1 to 39}) is used to specify an operator<br />

output value in which field [47:48-k] contains zero. The same term is used to specify an<br />

operator input value in which fields [46:1] and [44:45-k] contain zero or field [44:45]<br />

contains zero. (Bits 47 and 45 are insignificant in integer representations; bit 46 is<br />

insignificant if the value is zero.)<br />

A double precision floating point operand is represented as a double precision operand<br />

with the following fields:<br />

First word:<br />

[ext] Not used<br />

[47: 1] Not used<br />

mant_sign [46: 1] Mantissa sign (0=positive, 1=negative)<br />

exp_sign [45: 1] Exponent sign (0=positive, 1=negative)<br />

exponent [44: 6] The low order 6 bits of the exponent<br />

mantissa [38:39] The integral portion of the mantissa<br />

6878 7530–007 3–3


Data Structure and Text<br />

Second word:<br />

[ext] Not used<br />

hi_order_exp [47: 9] The high order 9 bits of the exponent<br />

mantissa [38:39] The fractional portion of the mantissa<br />

A double precision floating point operand with an exponent equal to 13 is used as a<br />

canonical representation of a double precision integer; an operand in this form is called a<br />

double_integer. (A double precision operand with exponent and mantissa zero is also a<br />

valid double_integer.) The largest double_integer magnitude is 2**78-1 = 8*26-1.<br />

Decimal Sequence Operands<br />

Some operators generate or consume operands interpreted as a sequence of decimal<br />

digits. Each digit is represented as a 4-bit binary integer in the range {0 to 9}. (Hex<br />

sequence representations of decimal data are often called Binary Coded Decimal, BCD.)<br />

A digit sequence is an unsigned sequence of decimal digits. Digit sequences generated<br />

by binary-to-decimal conversion operators contain only true digits; however, digit<br />

sequences that are inputs to pointer operators may include nondigits, which are hex<br />

characters in the range {hex "A" to hex "F"}. Up to 12 or 24 digits can be contained in a<br />

single or double precision operand, respectively; the second word of a double holds the<br />

low order digits. Depending on the operator, the digit sequence is left- or right-justified<br />

within the operand. The extension is not used.<br />

Boolean Operands<br />

Some operators generate and other operators consume operands interpreted as Boolean<br />

values. The Boolean values true and false are represented as binary 1 and 0,<br />

respectively. The terms True and False are used to specify Boolean values. In the<br />

specification of a stack output from an operator, True and False are defined as the 1-bit<br />

integer values 1 and 0, respectively. In the specification of a stack argument for an<br />

operator, True and False are defined as operands with bit [0:1] equal to 1 or 0,<br />

respectively; Boolean interpretation ignores field [47:47] of any operand, the extension,<br />

and the second word of a double precision operand.<br />

Boolean operands are generated by the relational operators, among others. Operands are<br />

interpreted as Boolean values by the branch operators and Assert operators. The logical<br />

operators do not interpret Boolean values; rather, they perform Boolean arithmetic on<br />

the argument bit vectors.<br />

3–4 6878 7530–007


Tag-4 Word and Tag-6 Word<br />

Data Structure and Text<br />

Tag-4 and tag-6 words are data words, but the only interpretation applied to them is as<br />

48-bit vectors by a class of computational operators. A zero word with a tag of 6 is<br />

conventionally used as an uninitialized single datum.<br />

These words cannot normally be fetched to the expression stack as operands and they<br />

are not valid arguments for arithmetic computational operators. However, they may be<br />

fetched with the LOAD operator and may be stored over by normal store operators.<br />

Program Code Words<br />

Variable length operator sequences are stored in arrays of program code words called<br />

code segments. Each program code word contains six 8- bit containers called syllables,<br />

numbered 0 to 5 from high order to low order. (The mapping of each operator into<br />

syllables is specified in Section 4.)<br />

s[i] = [47-(8*i): 8] Syllable i, for i = 0 to 5<br />

Program code words have tags of 3, except for special sequences called Edit Tables,<br />

which have tags of 0. The extension is not used.<br />

Actual Segment Descriptors (ASD)<br />

An ASD is an eight-word structure; the first three constituent words are called ASD1,<br />

ASD2, and ASD3.<br />

The ASD table is a two-dimensional array containing eight words per ASD: ASDi[j] is<br />

defined for j (ASD_number) in {0 to 2**27-1} and i in {1 to 8}. The table is stored in<br />

memory as a linearized array beginning at absolute address zero:<br />

ASDi[j] = Memory[4*j + i-1]<br />

ASD[0] is the first ASD entry in the table. It can be accessed with the RASD and WASD<br />

operators, but 0 is not a valid ASD_number for a reference. Processors are not required<br />

to detect the use of 0 as an ASD reference, so software should never create a valid<br />

ASD[0].<br />

ASD1 contains the absolute memory address of the first word of the actual segment (if<br />

the segment is present in memory) and several other bits of information concerning the<br />

status of the segment.<br />

ASD2 defines the length of the actual segment.<br />

ASD3 may contain a reference to the Virtual Segment Descriptor that defines the virtual<br />

segment corresponding to this actual segment. For a paged virtual segment, the ASD3<br />

for each page must be a reference to the page descriptor in the page table.<br />

The other ASD words have no defined function in the processor; they are reserved for<br />

software use.<br />

6878 7530–007 3–5


Data Structure and Text<br />

Actual Segment Descriptor, First Word (ASD1)<br />

Memory management of the actual segment uses two presence indicators and an<br />

address field. ASD1.present_to_proc must be 1 for any access to the contents of the<br />

segment by a data processor or any access by an I/O processor, except I/O data transfer.<br />

ASD1.present_for_IO must be 1 for any use of the segment as the source or destination<br />

for I/O data transfer. If ASD1.present_to_proc or ASD1.present_for_IO is 1, ASD.address<br />

is the absolute address of the first word of the segment; otherwise, the address field<br />

contains a software-encoded value.<br />

ASD1 (Tag = 8)<br />

[ext] Not used<br />

segment_type [47: 2] Segment’s memory type (see “Platform Memory”)<br />

present_to_proc [45: 1] Segment-is-present indicator for non-I/O access<br />

(0=absent, 1=present)<br />

Alias-protection [44: 1] Blocks cache based on ASD<br />

hlt [43: 1] Enables switch-dependent halt when executing code<br />

from this segment<br />

not_stack [42: 1] Stack indicator (0=stack, 1=not stack)<br />

present_for_IO [41: 1] Segment-is-present indicator for use as an I/O buffer<br />

(0=absent, 1=present)<br />

access_modify [40:1] Must be zero<br />

address [35:36] If present_to_proc and present_for_IO are both zero, the<br />

address field is interpreted by software; otherwise, it<br />

contains the base address of the actual segment<br />

Actual Segment Descriptor, Second Word (ASD2)<br />

An ASD2 specifies the length of the segment; the remainder of the word is reserved for<br />

software use. AS_length specifies the actual-segment length for all operations that<br />

access data in the segment. The deficit and nybbles fields are used (in addition to<br />

AS_length) by the GLEN operator to report the user-declared length of the segment.<br />

ASD2 (Tag = 8)<br />

[ext] Not used<br />

[47: 8] Reserved for coexistence<br />

nybbles [39: 4] 4-bit frames in addition to net words<br />

deficit [35:16] Words less than AS_length-derived length<br />

AS_length [19:20] Actual-segment length in words<br />

3–6 6878 7530–007


Absolute Store <strong>Reference</strong> Word (ASRW)<br />

Data Structure and Text<br />

An ASRW references an individual item in memory via an absolute address. ASRWs are<br />

recognized by a restricted set of operators: LODT, OVRD, OVRN, RDLK, and TWOD.<br />

ASRW (Tag = B)<br />

[ext] Not used<br />

[47: 8] Reserved for coexistence<br />

address [38:39] Absolute address<br />

Virtual Segment Descriptor (VSD)<br />

Virtual Segment Descriptor (VSD) refers to the union of word types that describe virtual<br />

segments. A VSD is called a DD or CSD when used to define a data segment or a<br />

program code segment, respectively, but there is not always a distinction in the form or<br />

structure of the descriptors.<br />

The following paragraphs describe the attributes of VSDs that are necessary for<br />

functional definition of the operators; not all of these attributes are subject to direct<br />

manipulation in user programs. Code in user programs manipulate only those fields that<br />

have uniform structure and interpretation across all ClearPath MCP systems.<br />

Untouched DD<br />

An untouched DD is encoded as a word with a tag equal to five and field [47:2] equal to<br />

zero. (All tag 5 words are untouched DDs.)<br />

By convention, the fields within [45:46] of an untouched DD correspond to those in a<br />

touched original, except that the ASD-reference field contains a software encoded value<br />

and the element_size is seven when the requested object is not an ordinary data<br />

segment (array). However, the contents of an untouched VSD are determined more by<br />

software convention than by operator functional definition.<br />

Unindexed (Original and Copy) DD<br />

Unindexed (original or copy) DD (Tag = C or E for unpaged or paged, respectively)<br />

ASD_ref ext [ext] ASD_number ms 4 bits (see below)<br />

copy [44: 1] Copy bit (0=original, 1=copy)<br />

read_only [43: 1] Read-only bit (0=read/write, 1=read-only)<br />

element_size [42: 3] DD: array element type (0=single precision,<br />

1=double precision, 2=hex, 4=EBCDIC; 3,5,6,7 are invalid)<br />

CSD: Reserved for software<br />

[39:20] Reserved for software<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

6878 7530–007 3–7


Data Structure and Text<br />

Note: For an unindexed paged DD, the ASD_number is that of the page table.<br />

(Unindexed DDs for the pages occur in the page table, but the user program has no<br />

direct access to them.)<br />

A touched CSD is identical to a read-only unpaged original DD, but the element_size is<br />

not significant to the processor. By convention, touched CSDs are originals; however,<br />

this rule is not enforced by the processor.<br />

The terms word descriptor and WordDD are used for descriptors whose element_size<br />

values are single or double (precision); the terms character descriptor and CharDD are<br />

used for descriptors whose element_size values are EBCDIC or hex. The terms<br />

SingleDD and DoubleDD are used for WordDDs with element_size single and double,<br />

respectively.<br />

The no_write (read_only) bit in a DD can be set to prevent use of the DD for write access<br />

to the data.<br />

The following fields are defined for use in user code files. User programs may set, but<br />

should never reset, the read_only bit.<br />

read_only [43: 1]<br />

element_size [42: 3]<br />

IndexedDD (Indexed Data Descriptor<br />

Indexed copy DDs are called IndexedDDs. )<br />

IndexedDD (Tag = D or F for unpaged or paged)<br />

ASD_ref ext [ext] ASD_number ms 4 bits (see below)<br />

reindex [44: 1] Controls indexing, Data Array, and set-element_size operators<br />

(0=disabled, 1=enabled)<br />

read_only [43: 1] Read-only bit (0=read/write, 1=read-only)<br />

element_size [42: 3] The type of array element (0=single precision, 1=double<br />

precision, 2=hex, 4=EBCDIC, and {3, 5, 6, 7} are invalid values)<br />

index [39:20] Used if element_size is single or double precision: the word<br />

index from the base of the array to the referenced item<br />

char_index [39: 4] Used if element_size is EBCDIC or hex: the index within the<br />

word of the referenced character<br />

word_index [35:16] Used if element_size is EBCDIC or hex: the index from the base<br />

of the array to the word containing the referenced character<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

3–8 6878 7530–007


Data Structure and Text<br />

The following fields are common to indexed and unindexed DDs and function identically:<br />

read_only, element_size, and ASD_ref.<br />

The reindex bit indicates whether the IndexedDD grants access to just the array element<br />

it references or to the entire segment. If reindex is disabled in an IndexedDD, the<br />

indexing operators cannot reindex it, the array operators cannot use it, and operators<br />

cannot change the element_size.<br />

An indexed word descriptor is called an IndexedWordDD or, more specifically, an<br />

IndexedSingleDD or IndexedDoubleDD. An indexed character descriptor is called an<br />

IndexedCharDD. These terms are sometimes abbreviated IWDD, I1DD, I2DD, and ICDD.<br />

The interpretation of the index to the referenced element depends on element_size. For<br />

IndexedWordDDs, the index field is the word index from the base of the array or page to<br />

the single precision word or to the first word of the double precision word pair. For<br />

IndexedCharDDs, the index field consists of two subfields: word_index, the index from<br />

the base of the array or page to the word containing the referenced character, and<br />

char_index, the character index within the word. Char_index must not exceed 5 and 11<br />

for EBCDIC and hex IndexedCharDDs, respectively. Char_index 0 designates the<br />

highest-order character in the word.<br />

The following fields are defined for use in user code files. User programs may set, but<br />

should never reset, the read_only bit.<br />

read_only [43: 1]<br />

element_size [42: 3]<br />

char_index [39: 4] Used if element_size is EBCDIC or hex<br />

Code Segment Descriptor (CSD)<br />

CSDs occur in untouched and touched original forms, which are analogous to untouched<br />

and original DDs.<br />

An untouched CSD is a word that occurs in a code segment dictionary with a tag of 3<br />

and field [47:2] equal to zero. This encoding is not necessarily unique, but other words so<br />

encoded must not appear in a code segment dictionary where they may be the target of<br />

the (sdi,sdll) address couple in a PCW skeleton.<br />

Touched CSDs are unpaged original DDs (defined previously) with write access disabled;<br />

the element_size field is reserved for software. Code and data segments are not<br />

interchangeable, however, because data-fetching operators cannot access code words<br />

and processors cannot execute data words.<br />

6878 7530–007 3–9


Data Structure and Text<br />

Virtual Segments<br />

An unpaged virtual segment is a single actual segment; it cannot exceed 2**20-1 words<br />

in length. An IndexedCharDD can designate only the first 2**16 words of an unpaged<br />

segment.<br />

A paged virtual segment is represented by several actual segments: a page table and<br />

one or more pages. The page table contains an untouched or original DD for each page.<br />

Any unindexed DD for the segment has a special tag designated "paged" and refers to<br />

the page table. Any indexed DD for the segment designates an element of a particular<br />

page. The page DDs (the original DDs in the page table) are not marked paged, but the<br />

IndexedDDs designating elements in pages have a special tag.<br />

All pages are 2**13 words long, except the last page in a virtual segment, which must<br />

be shorter. If a paged virtual segment has a length equal to an integer multiple of 2**13,<br />

the processor requires that the page table have an additional last page with length equal<br />

to zero.<br />

The ASD for each page contains a reference to the original DD for that page; this<br />

reference is an IndexedSingleDD whose ASD_ref designates the page table and whose<br />

index is the page index. This back link from page to page table is essential for automatic<br />

page switching operations.<br />

In summary, a paged virtual segment is a two-layer structure; the DD for the whole<br />

segment specifies the page table, which contains a DD for each page. An unused page<br />

has an untouched DD; for each touched page, the DD refers to the defining ASD.<br />

MaxLen defines the maximum length of a paged virtual segment. This integer value<br />

varies by each processor type as follows:<br />

Processor Type Maximum Paged Virtual Segment<br />

Length<br />

Libra 680/780/880 (2**13) * (2**20 - 1) - 1<br />

Libra 4000 (2**27) - 1<br />

Libra 4100 (2**32) - 1<br />

Libra 4200/6200 (2**13) * (2**20 - 1) - 1<br />

MaxInx defines the largest integer value allowed for character indexing and iteration<br />

counts associated with pointer operations. MaxInx is defined as MaxLen * 12.<br />

3–10 6878 7530–007


Virtual Index<br />

Data Structure and Text<br />

Any word or character in a virtual segment can be specified by an integer called its virtual<br />

index. The virtual index of the element is the zero-relative ordinal of that element when<br />

the entire segment is considered as an array of elements of that size. An equivalent<br />

operational definition of virtual index is as an integer that can generate an IndexedDD<br />

designating the element when the integer is applied by the Index operator to an<br />

unindexed DD that designates the virtual segment and has the appropriate element_size.<br />

This definition of virtual index can be extended to double precision elements only for<br />

elements with even word alignment within the segment. Because double precision<br />

elements can occur with odd alignment, it is more useful to define the virtual index of a<br />

double item as the virtual index of its first word.<br />

The virtual index of an IndexedDD is stored in as many as three components:<br />

1. The page index (pX), for a paged segment, designates the page; it is an index into<br />

the page table. The pX value is implicit, because the IndexedDD is a copy of<br />

page[pX] of the page table. The ASD referenced by the IndexedDD contains a<br />

reference to the page descriptor; the reference is an IndexedSingleDD with pX in its<br />

index field. For an unpaged segment, pX is defined to be zero.<br />

2. The word index (wX) designates the referenced word within the actual segment;<br />

wX is in the index field of an IndexedWordDD or in the word_index field of an<br />

IndexedCharDD.<br />

3. The character index (cX) designates the referenced character within the word;<br />

cX is in the char_index field of an IndexedCharDD.<br />

The virtual index (vX) for an IndexedDD is computed from these three values, according<br />

to the element_size of the IndexedDD:<br />

single or double: vX = pX*2**13 + wX<br />

4 bit: vX = (pX*2**13 + wX)*12 + cX<br />

8 bit: vX = (pX*2**13 + wX)*6 + cX<br />

6878 7530–007 3–11


Data Structure and Text<br />

<strong>Reference</strong>s<br />

Of the various reference types, unindexed and indexed DDs are virtual segment<br />

descriptors and are defined previously. This section defines address couples, SIRWs,<br />

PCW literals, and PCWs.<br />

Address Couples<br />

Fixed Fence Address Couples<br />

Address couples in several operators are encoded in 16 bits with a 4-bit lambda value in<br />

field [15:4] and a 12-bit delta value in field [11:12].<br />

Extended Address Couples<br />

Address couples in NMCn and VLCn operators have an implicit lambda equal to n (limited<br />

to 0, 1, 2, or 3), and a 16-bit delta value in the parameter.<br />

Variable Fence Address Couples<br />

Address couples in NAMC and VALC operators are encoded in 14 bits with a variable<br />

fence between lambda and delta. Taking advantage of the fact that lambda must be less<br />

than or equal to LL, the number of high-order bits interpreted as the lambda value varies<br />

with the value of LL at evaluation time. The remaining low-order bits are interpreted as<br />

the delta value. The following table gives explicit ranges:<br />

LL range bits left of fence lambda range delta range<br />

{0 to 3} 2 {0 to LL} {0 to 2**12-1}<br />

{4 to 7} 3 {0 to LL} {0 to 2**11- 1}<br />

{8 to 15} 4 {0 to LL} {0 to 2**10-1}<br />

The lambda value is the reverse of the bits to the left of the fence; the delta value is<br />

taken from the bits to the right of the fence. Following are examples of address couple<br />

interpretation. Each pair is the same address couple representation, but notice the effect<br />

of the dynamic fence indicated by the colon (:).<br />

1. a. at LL= 2, 10:000000010011 => (1,19)<br />

b. at LL=13, 1000:0000010011 => (1,19)<br />

2. a. at LL= 5, 101:00001000000 => (5,64)<br />

b. at LL= 3, 10:100001000000 => (1,2112)<br />

CSD Address Couples<br />

Address couples of Code Segment Descriptors occur in PCW skeletons. These use a<br />

fixed fence form with lambda in [13:1] (called sdll) and delta in [12:13] (sdi).<br />

3–12 6878 7530–007


Environment Links<br />

Data Structure and Text<br />

An Environment Link specifies an activation record by identifying the segment that<br />

contains it and the number of words from the base of the segment to the ENVW at the<br />

AR base. User programs do not manipulate Environment Links, but they are fundamental<br />

to an understanding of addressing.<br />

An Environment Link is a meta-field that is defined here as an object with several<br />

components, so that the entire Link can then be considered a single field in the words in<br />

which it occurs (SIRWs and entered ENVWs). An Environment Link has two possible<br />

formats:<br />

normal Environment Link<br />

stack_num ext [ext] The stack_number ms 4 bits (see below)<br />

pseudolink [47: 1] 0: denotes normal env_link<br />

stack_num [46:15] The stack_number (ls 15 bits) identifying the<br />

stack containing the referenced location<br />

stack_disp [31:16] The displacement from the base of the stack to<br />

the ENVW of the normal activation record<br />

pseudo Environment Link<br />

seg_num ext [ext] ASD_number ms 4 bits (see below)<br />

pseudolink [47: 1] 1: denotes pseudo env_link<br />

seg_num [46:23]<br />

[23:2]<br />

The ASD_number (ls 23 bits) identifying the<br />

segment containing the referenced location<br />

reserved<br />

seg_disp [21:6] The displacement from the base of the segment<br />

to the ENVW of the pseudo activation record<br />

Normal activation records are constructed automatically by procedure entry. Pseudo<br />

activation records are constructed only by privileged software, which also must forge<br />

pseudo links in SIRW references to PCWs placed within the record. Procedure entry via<br />

those references to those PCWs causes the pseudo AR to be linked into the<br />

environmental chain as the immediate global AR of the entered procedure; within the<br />

procedure (and any procedures local to it), SIRWs constructed to address couples within<br />

the pseudo AR will automatically have pseudo links.<br />

6878 7530–007 3–13


Data Structure and Text<br />

Stuffed Indirect <strong>Reference</strong> Word (SIRW)<br />

An SIRW is created by the NAMC, LNMC, and NMCn operators from an address couple<br />

to provide a context-independent reference to the same location.<br />

SIRW (Tag = 1)<br />

env_link<br />

[ext]<br />

[47:32]<br />

Designates activation record in which reference occurs<br />

offset [15:16] The offset from the base of the AR to the referenced location<br />

SIRW.offset corresponds to address couple delta.<br />

Together the env_link and offset fields address an item in an activation record. The item<br />

is located in the segment designated in env_link, indexed by the sum of the<br />

displacement in env_link plus the offset. Some operations, notably procedure entry,<br />

require both the displacement and offset, from which ordinary referencing uses the sum.<br />

Program Control Word (PCW)<br />

PCW (Tag = 7)<br />

ASD_ref ext [ext] ASD_number ms 4 bits (see below)<br />

[44: 3] Zero<br />

pwi [41:13] The PWI code stream pointer component<br />

psi [28: 3] The PSI code stream pointer component<br />

control_state [25: 1] CS Boolean (0=normal state, 1=control state)<br />

[24: 1] Must be zero<br />

lex_level [23: 4] The lex level at which the activation record runs<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

The PCW code stream pointer consists of the field pwi, psi, and ASD_ref. The lex_level<br />

field specifies the lex level of the activation record associated with the designated code.<br />

The control_state attribute specifies execution in normal and control state.<br />

3–14 6878 7530–007


Data Structure and Text<br />

User programs do not manipulate PCWs. However, they do provide the skeletons from<br />

which PCWs are constructed by the MPCW operator. The following is the structure of<br />

the PCW skeleton.<br />

[47:12] Zero<br />

skeleton_psi [35: 3] The PSI code stream pointer component<br />

skeleton_pwi [32:13] The PWI code stream pointer component<br />

skeleton_CS [19: 1] The initial value of the CS Boolean (0=normal state, 1=control<br />

state)<br />

[18: 1] Zero<br />

skeleton_LL [17: 4] The lex level for the procedure<br />

sdll [13: 1] The lambda component of an address couple designating CSD<br />

sdi [12:13] The delta component of an address couple designating CSD<br />

Stack Structure and Linkage<br />

The contents of a process stack include a top-of-stack control word at the base of the<br />

stack, followed by an arbitrary number of words used by software and then an arbitrary<br />

number of stack frames.<br />

There are three data types used for stack frame linkage: a History Word (HISW), an<br />

Environment Word (ENVW), and a Return Control Word (RCW) appear at the base of<br />

each stack frame for linkage.<br />

A Top of Stack Control Word (TSCW) is used to preserve processor state in an inactive<br />

stack (a stack to which no processor is bound).<br />

These structures are not unambiguously typed; their recognition depends in part upon<br />

the context in which they are accessed.<br />

With certain exceptions involving the RCW, user programs do not manipulate stack<br />

linkage words. Their attributes are defined in the following subsections for purposes of<br />

defining the operator function, and for completeness.<br />

6878 7530–007 3–15


Data Structure and Text<br />

Stack Frame Linkage<br />

There are three words (HISW, ENVW, and RCW) at the base of an entered normal<br />

activation record. The ENVW is at offset 0 and the RCW at offset 1. No HISW or RCW is<br />

used with a pseudo AR.<br />

The HISW is built by the Mark Stack operation:<br />

HISW (Tag=1)<br />

stack_num ext [ext] Stack_number ms 4 bits (see below)<br />

[47: 1] Zero<br />

stack_num [46:15] Stack number (ls 15 bits) containing the HISW<br />

history_disp [31:16] Displacement of prior HISW<br />

history_opt [15:1] 1:historical chain search not required<br />

Pop/action [14:7] Codes showing pop optimization data or action<br />

requirements<br />

disable_ext [7:1] 1:disable maskable externals when exit<br />

float_status [6:2] variant rs resumption status<br />

rs [4:1] restart indicator<br />

extf [3:1] EXTF (external sign)<br />

offf [2:1] OFFF (overflow)<br />

tfff [1:1] TFFF (true/false)<br />

block_exit [0:1] 1:Exit generates interrupt<br />

The block_exit bit indicates whether or not a service interrupt is to be generated when<br />

the activation record is deallocated. The enter operators always initialize this bit to 0<br />

(disarmed). It can be set to 1 by software, in which case it must be reset to 0 by<br />

software before an Exit operation can deallocate this AR.<br />

The entered ENVW and RCW are built by the Enter operation; they occur only in entered<br />

ARs:<br />

3–16 6878 7530–007


Entered ENVW (Tag = 3)<br />

env_link<br />

RCW (Tag = 7)<br />

[ext]<br />

[47:32]<br />

[15:16] Undefined<br />

Data Structure and Text<br />

Designates activation record in which reference occurs<br />

ASD_ref ext [ext] ASD_number ms 4 bits (see below)<br />

[44:3] Zero<br />

pwi [41:13] The PWI code stream pointer component<br />

psi [28:3] The PSI code stream pointer component<br />

control_state [25:1] CS Boolean (0=normal state, 1=control state)<br />

exit_opt [24:1] 0: no optimization information<br />

1: exit only updates D[new LL], except if new<br />

LL is greater than old LL, also updates down to<br />

D[old LL]<br />

lex_level [23:4] The lex level at which the activation record runs<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

The stack linkage retains state necessary to reestablish and resume the procedure that<br />

invoked the current procedure. The RCW preserves for exit the same components<br />

provided by the PCW for procedure entry, specifying the code stream pointer, lex level,<br />

control state, and privileges. The rs indicator indicates whether the first operator in the<br />

resumed code stream should execute in restart or initial mode. The general Boolean<br />

accumulators are also preserved.<br />

Top-of-Stack Linkage<br />

When a processor is bound to a stack, its processor number is stored as an integer in<br />

the base word of the stack. The stack is said to be active; the processor is said to be<br />

"running in" the stack. When the stack is inactive (has no processor bound to it), the base<br />

word contains a TSCW, which points to the topmost activation record in the stack.<br />

TSCW (Tag = 3)<br />

stack_num ext [ext] The stack_number ms 4 bits (see below)<br />

[47:1] Must be zero<br />

stack_num [46:15] The stack_number (ls 15 bits) identifying the stack<br />

containing the referenced location<br />

stack_disp [31:16] Displacement to topmost HISW<br />

offset [15:16] Offset of top of stack from topmost HISW<br />

For MVST, the topmost activation record of the stack being activated simply replaces the<br />

topmost activation record of the deactivated stack, for the same code stream that<br />

executed the MVST.<br />

6878 7530–007 3–17


Data Structure and Text<br />

For start-up (see “Startup Request”), the inactive stack has an extra activation record on<br />

an inactive stack, consisting of an HISW, an inactive ENVW, and an RCW. The<br />

HISW.history_link designates the topmost HISW on the stack when it was (and will<br />

become) active; the RCW defines the code stream associated with the active process.<br />

The TSCW designates this extra AR; its displacement points to the HISW and its offset<br />

is 2, designating the RCW.<br />

Protected Object Word (POW)<br />

Three forms of Protected Object Words (POWs) are defined:<br />

• A soft POWis reserved for software use.<br />

• A restart POW can be used as an extra argument for operators in restart mode.<br />

• A hard POW is recognized by the processor for containing TCU event tokens.<br />

In each case, the purpose of the data type is to provide unique representations of<br />

information that is protected from access by the normal fetch and store operators.<br />

Soft POW (Tag = A, [46: 1] = 0)<br />

[46: 1] 0: denotes software POW<br />

[45:47]<br />

[ext]<br />

Reserved for software<br />

Reserved for software<br />

Restart POW (Tag = A, [47: 4] = 5)<br />

[47: 4] Binary 0101: denotes restart POW<br />

[43:44]<br />

[ext]<br />

Reserved for hardware<br />

Reserved for hardware<br />

Hard POW (Tag = A, [47: 2] = 3)<br />

[47: 2] Binary 11: denotes hard POW<br />

[45: 2] Reserved for software<br />

[43: 4] Binary 0011: denotes event<br />

[39: 7] Reserved for software<br />

[32: 1] If 1, the IOP will not cause event<br />

[31:32] TCU event token<br />

[ext] Reserved for software<br />

3–18 6878 7530–007


Tag Values<br />

Data Structure and Text<br />

Throughout this document, tag values are specified in hexadecimal notation.<br />

In most operations, the application and recognition of tags is automatic. Only the<br />

Read-Tag and Set-Tag operators (RTAG and STAG) elicit evaluation or assignment of tag<br />

values in programs; these are used very sparingly in user programs.<br />

The following tag levels uniquely determine the data type. User programs can use STAG<br />

to construct words of these types, although many other operators generate, manipulate,<br />

and transform operands.<br />

Tag Type<br />

0 single precision operand<br />

2 double precision operand<br />

4 tag-4 word: non-operand bit vector<br />

6 tag-6 word: non-operand bit vector,<br />

uninitialized single datum<br />

The following tag values characterize, but do not necessarily uniquely determine, the<br />

type:<br />

Tag Type<br />

1 SIRW<br />

3 untouched CSD<br />

5 untouched DD<br />

7 PCW<br />

9 NIRW (Libra 4000/4100/4200/6200 systems)<br />

D,F IndexedDD<br />

User programs construct SIRWs, PCWs, and IndexedDDs using appropriate referencegeneration<br />

operators. They occasionally modify such words, but not their tag values.<br />

They construct untouched DDs using STAG. Compilers place images of untouched CSDs<br />

into user program code files; they are not constructed with STAG.<br />

User programs occasionally use RTAG to determine the types of words that are<br />

parameters to procedures; the following assumptions are valid:<br />

• Operands, tag-4, and tag-6 words have unique even tags<br />

• SIRWs have tag 1<br />

• IndexedDDs have odd tags other than 1<br />

6878 7530–007 3–19


Data Structure and Text<br />

For example, if the type of a formal parameter to a procedure is a discriminated union of<br />

{single operand, SIRW, IndexedDD}, the tag of the parameter word can be used to<br />

discriminate the actual parameter type. Within the specified union, an even tag denotes<br />

an operand and an odd tag denotes a reference with 1 marking an SIRW and any other<br />

valid odd value an IndexedDD.<br />

Data Structure Access<br />

All the data structures defined in this manual are involved automatically in the action of<br />

some operator. Data items can also be constructed or manipulated by software using<br />

relatively primitive operators, such as fetch, bit-field operations, and store. For most data<br />

types, primitive access is restricted to MCP code at a low level of abstraction; only a few<br />

types are subject to primitive access by code in user programs. The following paragraphs<br />

outline the primitive operations that user programs can apply to data of various types.<br />

This text is by no means a rigorous specification of such code.<br />

Only operands are subject to unrestricted manipulation. The use of tag-4 and tag-6 words<br />

is governed by convention between the compilers and the MCP.<br />

Construction of descriptors is limited to untouched DDs in which field [47:2] contains<br />

zero and [45:46] contains an encoding according to compiler/MCP convention.<br />

Manipulation of DDs is restricted to copy descriptors, which are fetched with the LOAD<br />

and indexing operators. Copy DDs may be stored, provided that a copy must not<br />

continue to exist after the segment to which it refers is gone. Copy descriptors can be<br />

stored by ordinary programs only into normal activation records, where they may readily<br />

be found if necessary. Modification of copy descriptors by primitive means is permitted;<br />

however, it is restricted to altering the element_size field, altering the char_index field,<br />

and setting the read_only bit.<br />

On Libra 4000/4100/4200/6200 systems, Name Call operators construct NIRWs. On<br />

other Libra systems, Name Call operators construct SIRWs. SIRWs may be fetched with<br />

LOAD; they may be stored by user program code, provided that a stored reference does<br />

not outlive the referent. Modification of SIRWs by primitive means is permitted and is<br />

restricted to (under special circumstances) altering the offset field.<br />

Operators are provided to modify element size in copy DDs and the access rights in copy<br />

DDs. These operators should be used in preference to primitive operations.<br />

PCWs are built on the stack by Make PCW operators. They can be fetched only with<br />

Load Transparent and can be stored only into the appropriate activation record.<br />

Primitive code in user programs should not access any other data structures. Stack<br />

linkage words and code segment descriptors need not be accessed directly. ASDs and<br />

ASRWs do not occur within the addressing environment of user programs.<br />

3–20 6878 7530–007


Section 4<br />

Interrupts<br />

This section generally applies to all ClearPath MCP systems, but many details are<br />

specific to just the <strong>Epsilon</strong> systems.<br />

Interrupt Mechanism<br />

Superhalt<br />

An interrupt is an automatic invocation of a procedure; the mechanism is defined as the<br />

common action aINTE. (A related mechanism, called accidental entry, is defined in<br />

Section 5 of this manual as common action aACCE.) Exit from the interrupt procedure,<br />

when practical, resumes execution of the interrupted code stream.<br />

Operator-dependent interrupts (ODIs) are invoked directly by the current operator to<br />

request an MCP service required by the operator or to report a programming or operator<br />

fault. Spontaneous interrupts (SIs) generally cannot be associated with a particular<br />

operator; some involve execution of the code stream and some do not.<br />

When an operator may report several interrupts, there is generally no requirement that<br />

one interrupt take precedence other than that imposed by the function of the operator.<br />

When processing actions are functionally sequential, interrupts generated by an earlier<br />

action take precedence; otherwise, interrupts generated by any part of the operator may<br />

be reported. (For example, if some item B is meaningful only when item A is interpreted<br />

in a particular way, an error in that interpretation of A must take precedence over an error<br />

detected in B.) If a conditional action of the operator is not performed, interrupts that<br />

might have been generated by it are not required. (For example, if the interpretation of A<br />

is such that B is not significant, then any errors that might have been detected in B need<br />

not be reported.)<br />

A superhalt condition occurs when the processor cannot process an interrupt condition.<br />

In such cases, the processor halts in a state from which normal continuation is not<br />

possible. The following conditions cause a processor to superhalt:<br />

• When an interrupt loop is detected and the Interrupt_Count register reaches the<br />

maximum value.<br />

Upon interrupt entry, the register increments by one and can only be reset by the<br />

restricted operator ZIC (Zero Interrupt_Count).<br />

• When a fatal initialization error occurs.<br />

• When the restricted operator MVST (Move Stack) encounters an interrupt condition<br />

such that a processor cannot recover to a valid stack environment.<br />

6878 7530–007 4–1


Interrupts<br />

• When a processor moves to a stack that has an invalid ASD1 or ASD2 entry.<br />

• When a processor moves to a stack that has an invalid or inconsistent TSCW<br />

For example, S is less than F.<br />

• When a fatal error occurs while a message is queued up or removed from an<br />

operational module (Libra 4000 only).<br />

Interrupt <strong>Reference</strong>s<br />

An interrupt reports the occurrence of some set of circumstances called the interrupt<br />

condition. Each distinct interrupt condition generates a different interrupt reference,<br />

which can invoke a unique procedure for that condition. An interrupt reference is an<br />

SIRW designating a fixed location within either (1) a dedicated stack called the interrupt<br />

vector or (2) adjoining locations in the D[0] activation record. The referent is called the<br />

interrupt slot. The unqualified word "interrupt" is often used to refer to the interrupt slot,<br />

the reference, or the interrupt condition that generates that reference. The interrupt<br />

reference is the head of the reference chain for an interrupt procedure; the interrupt slot<br />

can contain another SIRW or the PCW for the procedure.<br />

Most interrupt conditions that use the interrupt vector are assigned a single slot; these<br />

are called Condition-Vectored Interrupts (CVIs). Several conditions are assigned a<br />

separate slot for each operator that can generate the interrupt; these are called Operator-<br />

Vectored Interrupts (OVIs). The interrupt vector contains two activation records: one for<br />

CVIs and one for OVIs. Not all the slots are assigned in either AR.<br />

The interrupt conditions that use the D[0] activation record are called Maskable External<br />

Interrupts (MEIs). Their interrupt slots must contain the PCW for the procedure.<br />

Vector Interrupt Formats<br />

Two interrupt formats, or calling sequences, are used by the interrupt vector cases:<br />

Programmed Operator Interrupt (POI) and Restartable Operator Interrupt (ROI). Each<br />

format is named for a particular application to which it is particularly suited, although<br />

neither is restricted to a single application.<br />

POI<br />

POI is an interrupt format that facilitates operator emulation. The arguments to the<br />

operator are provided as parameters to the interrupt procedure, so they are readily<br />

accessed by the procedure and are automatically discarded by procedure exit.<br />

Operator emulation can be required because a defined operator is not implemented or<br />

because normal domain or range of operation is exceeded (such as, arithmetic<br />

underflow). In emulation cases the interrupt procedure is expected to return any required<br />

results of the operation; the code stream resumes with the next operator.<br />

Some spontaneous interrupts use the degenerate form of POI format with no parameter.<br />

4–2 6878 7530–007


ROI<br />

Interrupts<br />

ROI is an interrupt format suited to reporting service exceptions so that the operator can<br />

be repeated, for example in restart mode. Input arguments to the interrupted operator<br />

are pushed onto the stack below the interrupt AR; the interrupt procedure is provided<br />

two parameters: P1 and P2. The parameters are both single words. P1 sometimes<br />

contains diagnostic data; if not defined, it is zero. P2 typically designates to software the<br />

object that is erroneous or in need of service.<br />

Code Stream Designation and Resumption<br />

The interrupt entry generates an RCW that designates the resumption point in the code<br />

stream.<br />

Often, the RCW designates the operator whose execution generated the interrupt. The<br />

VARI syllable is designated in the interrupt RCW for a variant operator. Similarly, the<br />

enter-edit operator is designated when an edit operator is interrupted; for table edit, an<br />

updated table pointer designates the edit operator. (An initial table pointer is an<br />

IndexedDD; in the restart mode of TEED or TEEU, the updated table pointer is an<br />

IndexedDD.)<br />

Resumption of the code stream is a key concern in interrupt definition; important<br />

resumption issues include:<br />

1. If the code stream can be resumed<br />

2. If so, the action required by the interrupt procedure<br />

3. The operator that is designated by the interrupt RCW<br />

4. If that operator is to be executed in initial or restart mode<br />

If the code stream can be resumed from the interrupt procedure, the required exit<br />

operator is specified; otherwise, the code stream is said to be defunct and must be<br />

aborted. The following is an explanation of this notation:<br />

Abort Resumption is impossible and undefined. (It may be possible to resume the<br />

program at some other point in the code after appropriate adjustment of the<br />

process stack.)<br />

EXIT The interrupt procedure must exit, not return.<br />

RETN The interrupt procedure must return the appropriate result value for the<br />

emulated operator.<br />

RTN2 The interrupt procedure must return two appropriate result values for the<br />

emulated operator.<br />

REXI The interrupt procedure must fetch the P1 parameter to the top of the stack<br />

and execute the REXI operator.<br />

For resumable ODIs, the RCW may designate the operator that generated the interrupt,<br />

the next operator in the code stream, or the successor operator (not necessarily in<br />

sequence); these resumptions are called Repeat, Next, and Continue, respectively.<br />

Resumable SIs are considered to occur between operators in the code stream; the RCW<br />

designates the next operator to be executed and the resumption is called Continue.<br />

6878 7530–007 4–3


Interrupts<br />

Although "resumption" is a misnomer for defunct code streams, the term is used with<br />

the following notation:<br />

Abort-Lost: The RCW is undefined<br />

Abort-Here: The RCW designates the interrupted operator<br />

Abort-Next: The RCW designates the next operator<br />

Interrupt Parameters<br />

For ODIs in POI format, the interrupt parameters are the arguments to the interrupted<br />

operator. Each argument occupies two words on the stack; if the argument type is not<br />

double-precision, the second word is zero.<br />

For interrupts in ROI format, the second parameter, P2, varies according to the specific<br />

interrupt type; it is often used to designate the object of concern or other information<br />

about the circumstances of the interrupt. P2 is specified for each interrupt case that uses<br />

the ROI format.<br />

For several interrupts, P2 is specified to be a "proper reference" (either an SIRW or an<br />

IndexedDD) to the object of concern. The P2 parameter is a copy of the reference the<br />

processor was evaluating when an exception was detected; if that reference is an<br />

address couple (in an operator parameter or PCW skeleton), it is stuffed to yield an<br />

SIRW.<br />

The value of P2 or of any POI parameter may be used in several ways:<br />

• It is used by operating system software in performing some service invoked by the<br />

interrupt. Such use can occur for interrupts that have parameter values specified and<br />

have resumptions other than Abort. (Such interrupts are flagged "S" or "s".)<br />

• It is used by operating system or diagnostic software in analyzing software and<br />

hardware failures for reporting, logging, or recovery. This use is characteristic of<br />

alarm interrupts. It sometimes occurs with enforcement interrupts; for example,<br />

some software distinguishes an uninitialized datum from other unacceptable items in<br />

an Invalid Target.<br />

• It is available (typically in diagnostic dumps) for users who are troubleshooting a<br />

failure, although it is not analyzed programmatically. This use characterizes all<br />

interrupts that can report significant parameter values and are not instances of the<br />

first two cases.<br />

• In addition, for Invalid Code Word, Invalid Target, and Missing PCW, P1 is the<br />

offending target, except that tag = 2 is changed to tag = 0.<br />

Interrupt parameters are never unrelated to the circumstances of the interrupt. P2 is<br />

never an original DD or a POW.<br />

4–4 6878 7530–007


Restart Configuration<br />

Libra 6xx and 7xx systems use restart mode in two types of situations:<br />

Interrupts<br />

• Accidental entry in Value Call and almost all interrupts in Value Call: the extra state is<br />

the current reference.<br />

• Most interrupts during all data array operators, except for short-source and unpack<br />

operators (which are repeated from the beginning when interrupted at a page<br />

boundary): the extra state defines the processing already accomplished and is in a<br />

restart POW. Note that an unpack operator may create restart mode, but does not<br />

use it.<br />

The extra state is left immediately below the interrupt AR and rs is set; the operator in<br />

restart mode consumes the extra argument.<br />

Also, when rs is true, certain operators have additional extra arguments in order to<br />

simplify their implementation:<br />

• SRCH has a length equal to one greater than the result of GINX on the domain<br />

argument.<br />

• EXPU has a dummy source argument.<br />

• Pointer scan operators have a dummy destination argument.<br />

• Vector operators with 4 or 5 arguments have dummy arguments to match the scalar,<br />

stride_A, stride_B, length, vector_A, and vector_B pattern.<br />

Operator Subdivision<br />

Libra 6xx and 7xx systems are unable to complete the longest feasible Data Array<br />

operations within a single Loop Timer interval. Therefore, it provides for the long Data<br />

Array operators to be divisible. If some stimulus (such as an MEI) is pending, the<br />

operator is interrupted, the stimulus serviced, and the operator resumed. Data Array<br />

operator subdivisions are the only instances in which some stimulus service occurs<br />

within an operator. Masked stimuli remain pending if the processor is in control state;<br />

control-state software must avoid excessively long array operations.<br />

The word Data Array operators (vector, word transfer, and search operators) are divisible<br />

between iterations.<br />

The character Data Array operators (not including short source, unpack, and skip<br />

operators) are divisible upon completion of each destination word (source1 for character<br />

sequence operators and source for scan operators).<br />

6878 7530–007 4–5


Interrupts<br />

Interrupt Definition<br />

Interrupts are defined in seven categories, which are presented in this section under<br />

separate headings for convenience rather than as correspondence to any grouping of<br />

interrupts slots or formats. The following are the types of interrupt definitions:<br />

• Arithmetic<br />

• Service<br />

• Enforcement<br />

• Alarm<br />

• Asynchronous<br />

• External<br />

• Maskable External<br />

Within this document, information on interrupt conditions is presented in specific<br />

notation as described here.<br />

Key information about each interrupt condition is summarized in a line containing six<br />

items in three groups, as follows:<br />

OVI:SUBT POI(x,y) Next RETN(big(x-y)) ODI E<br />

CVI ROI Repeat REXI(P1) ODI S<br />

CVI POI( ) Continue EXIT SI Se<br />

The condition group (CVI or OVI) and format (ROI or POI) are specified at the left. For<br />

OVIs, which are vectored by opcode, the operators are identified. For POIs, the<br />

parameters are indicated, often as dummy identifiers that are clear from the operator<br />

definition; an ellipsis indicates generically that the arguments to the interrupted operator<br />

are provided. Empty parentheses indicate the degenerate POI format in which there are<br />

no interrupt parameters.<br />

The resumption situation is specified in the middle of the line, using the notation defined<br />

previously. Return values are indicated for resumptions involving return. The notation is<br />

local to each interrupt definition and often involves the POI parameters.<br />

At the right end, the interrupt is informally classified as operator dependent or<br />

spontaneous (ODI or SI) and as service or error.<br />

Interrupts are categorized as service requests or error reports, with the following<br />

notation:<br />

S: Service<br />

Se: Service, sometimes treated as error<br />

SE: Service by definition although likely to be Error<br />

E: Error<br />

Es: Error although capable of being interpreted as Service<br />

ES: Error by definition although often used as Service<br />

4–6 6878 7530–007


Arithmetic Interrupts<br />

Interrupts<br />

Section 5 of this manual defines the arithmetic operations and includes five exception<br />

conditions:<br />

• Divide by Zero<br />

• Exponent Overflow<br />

• Exponent Underflow<br />

• Precision Loss<br />

• Integer Overflow<br />

In the vectored interrupt mechanism, each exception generates one of only three<br />

generic interrupts, each an OVI. In some cases the interrupt procedure must examine<br />

the operator arguments in order to establish which exception to report, if any. When the<br />

code stream is to be resumed, the interrupt procedure must return the appropriate<br />

operator result.<br />

The processor is permitted to generate an arithmetic interrupt in certain situations for<br />

which the operation, as defined in Section 5, is not exceptional. These interrupts are<br />

called spurious. The interrupt procedure must emulate the operator and produce a proper<br />

result.<br />

A spurious arithmetic interrupt is deemed a service interrupt; the interrupt procedure<br />

emulates the operator and resumes the code stream without reporting any exception to<br />

the rest of the software. Otherwise, an arithmetic interrupt is deemed an error report.<br />

The interrupt procedure determines the nature of the exception, if necessary, and takes<br />

appropriate software action for that exception. If the code stream is to be resumed, the<br />

procedure supplies the appropriate exception result for the operator.<br />

Throughout this section, the word type refers to single- or double-precision operands.<br />

Each arithmetic interrupt procedure must implement the type rules defined in Section 5<br />

for the interrupted operator.<br />

Arithmetic Overflow<br />

Arithmetic Overflow interrupts are generated by arithmetic operators when the result<br />

exponent is too large to represent and by the divide operators when the divisor is zero.<br />

This interrupt reports the Exponent Overflow and Divide by Zero exceptions.<br />

OVI:ADD POI(x,y) Next RETN(big(x+y)) ODI E<br />

OVI:SUBT POI(x,y) Next RETN(big(x-y)) ODI E<br />

OVI:MULT POI(x,y) Next RETN(big(x*y)) ODI E<br />

OVI:MULX POI(x,y) Next RETN(bigdp(x*y)) ODI E<br />

OVI:DIVD POI(x,y) Next RETN(zero(x,y) or big(x/y)) ODI E<br />

OVI:IDIV POI(x,y) Next RETN(zero(x,y)) ODI E<br />

OVI:RDIV POI(x,y) Next RETN(zero(x,y)) ODI E<br />

OVI:SNGL POI(x) Next RETN(bigsp(x)) ODI E<br />

OVI:SNGT POI(x) Next RETN(bigsp(x)) ODI E<br />

6878 7530–007 4–7


Interrupts<br />

The interrupt procedures for the divide operators report Divide by Zero when the second<br />

parameter (y) is zero. The code stream can be resumed by returning zero of the<br />

appropriate type, as follows:<br />

zero(x,y) z AND y AND 0<br />

In all other cases of Arithmetic Overflow interrupt, the interrupt procedures report<br />

Exponent Underflow. For operators that produce real values, the code stream can be<br />

resumed by returning the largest representable magnitude of the appropriate type and<br />

sign:<br />

big(x+y), big(x-y) biggest value with type x OR y and sign of x<br />

big(x*y), big(x/y) biggest value with type x OR y and sign of x*y<br />

bigdp(x*y) biggest dp value with sign of x*y<br />

bigsp(x) biggest sp value with sign of x<br />

The "biggest value" is a single- or double-precision operand with all bits in the exponent<br />

and mantissa fields set to one and the exponent sign set to zero.<br />

Arithmetic Underflow<br />

Arithmetic Underflow interrupts are generated by arithmetic operators when the result<br />

exponent is too small to represent. This interrupt reports the Exponent Underflow and<br />

Precision Loss exceptions. It may also report spurious conditions for several operators.<br />

The interrupt is generated when the final result of a computation has an exponent value<br />

that is negative and too large in magnitude to be contained in the exponent field.<br />

OVI:MULT POI(x,y) Next RETN(R(x*y) or zero(x,y)) ODI ES<br />

OVI:MULX POI(x,y) Next RETN(RD(x*y)) or zerodp) ODI ES<br />

OVI:DIVD POI(x,y) Next RETN(R(x/y) or zero(x,y)) ODI ES<br />

OVI:RDIV POI(x,y) Next RETN(x MOD y) ODI S<br />

OVI:SNGL POI(x) Next RETN(zerosp) ODI E<br />

OVI:SNGT POI(x) Next RETN(zerosp) ODI E<br />

OVI:NORM POI(x) Next RETN(zero(x)) ODI E<br />

For RDIV, the interrupt is always spurious; the procedure must emulate the operation<br />

and return a representation, in the proper type, of the defined result.<br />

The interrupt procedures for the other dyadic operators must emulate the operation and<br />

determine which of the following three actions to take:<br />

1. If the result magnitude is less than half the smallest representable value, the<br />

procedure must report Exponent Underflow. The code stream can be resumed by<br />

returning zero of the proper type, such as:<br />

zero(x,y) x AND y AND 0<br />

zerodp dp zero<br />

4–8 6878 7530–007


Interrupts<br />

2. If the result can be represented in nonzero unnormalized form, but is too small to<br />

normalize, and has nonzero low-order bits that must be discarded because of the<br />

inability to normalize (R* < > R), the procedure must report Precision Loss. The code<br />

stream can be resumed by returning the nearest representation (in proper type).<br />

3. If neither of the two previous situations holds true, the interrupt is spurious; the<br />

result can be represented in nonzero unnormalized form without loss of precision<br />

(R* = R). The procedure must resume the code stream by returning a<br />

representation, in the proper type, of the defined result; no exception is reported to<br />

the rest of the software.<br />

For NORM, SNGL, and SNGT, normalization is required and therefore, the interrupt is<br />

never spurious. The interrupt procedures must report Exponent Underflow. The code<br />

stream can be resumed by returning a zero of the proper type:<br />

zero(x) zero of same type as x, for example x AND 0<br />

zerosp sp zero<br />

Integer Overflow<br />

An Integer Overflow interrupt is generated for the Integer Overflow exception.<br />

OVI:NTGR,NTIA POI(x) Next RETN(maxsp(x)) ODI E<br />

OVI:NTGD,NTTD POI(x) Next RETN(maxdp(x)) ODI E<br />

OVI:IDIV POI(x,y) Next RETN(max(x/y)) ODI E<br />

OVI:RDIV POI(x,y) Next RETN(zero(x,y)) ODI E<br />

OVI:BCD POI(x) Next RETN(nines(param)) ODI E<br />

OVI:DBCD POI(x,n) Next RETN(nines(n)) ODI E<br />

All interrupt procedures for these interrupts report Integer Overflow. The code stream<br />

may be resumed by returning the appropriate values that are defined as follows:<br />

max(x/y) biggest integer with type x OR y and sign of x*y<br />

maxdp(x) biggest dp integer, (8**26)-1, with sign of x<br />

maxsp(x) biggest sp integer, (8**13)-1, with sign of x<br />

nines 4"999999999999"<br />

nines(n) IF n


Interrupts<br />

Service Interrupts<br />

The interrupts defined in this section usually constitute requests for an MCP service that<br />

is an extension of the hardware operators. In some situations, especially limiting cases,<br />

no service can be provided and the interrupt must be treated as an error.<br />

Absent Segment<br />

An Absent Segment interrupt is generated by operators requiring access to a segment<br />

that is not present in memory. The interrupt is generated when access is attempted via a<br />

touched DD or a PCW or RCW or environment_link whose ASD_ref field designates an<br />

ASD with ASD1.present_to_proc equal to zero.<br />

Two Absent Segment conditions are defined, one for code and one for data. Absent edit<br />

tables are reported as absent data.<br />

Absent Code Segment<br />

CVI ROI Continue EXIT ODI S<br />

The interrupt is generated when access is attempted via a PCW or RCW whose ASD_ref<br />

field designates an ASD with ASD1.present_to_proc = zero. P2 is identical to the<br />

interrupt RCW, which references the absent segment.<br />

The interrupt RCW contains the code stream pointer whose attempted distribution<br />

encountered the absent segment; after the code segment has been made present and<br />

the ASD has been changed, an exit from the interrupt procedure will complete the enter,<br />

exit, or dynamic branch into the intended code segment. Note that HISW.rs is set in the<br />

interrupt RCW if an exit to restart mode was interrupted; this is an example of the<br />

preservation of restart mode.<br />

Absent Data Segment<br />

CVI ROI Repeat REXI(P1) ODI Se<br />

P2 must be an indexed DD or an SIRW that referenced the absent segment for those<br />

cases requiring service. When ENVW evaluation detects an absent segment, P2 is an<br />

equivalent SIRW. When edit table entry detects an absent segment, P2 is an IndexedDD<br />

designating the edit table; the interrupt RCW designates the TEED or TEEU operator.<br />

The service requested by an Absent Segment interrupt is for the software to make the<br />

absent segment present, after which the code stream can be resumed. It is the<br />

responsibility of software to ensure that all required segments are present for progress<br />

to be made. For example, various pointer operators require some or all of source,<br />

destination, and table (edit, translation, or membership) segments. Another example is<br />

that a short-source or unpack operator requires both pages be present if the operation<br />

crosses a page boundary, since Libra 6xx and 7xx systems repeat such operators from<br />

the beginning. Any required data segments and the code segment must be resident<br />

simultaneously for the operator to execute to completion.<br />

4–10 6878 7530–007


Block Exit<br />

CVI ROI Repeat EXIT ODI S<br />

Interrupts<br />

Exit operators generate a Block Exit interrupt when an attempt is made to deallocate an<br />

activation record that has HISW.block_exit equal to one. P2 is zero.<br />

Missing PCW<br />

CVI ROI Repeat EXIT ODI SE<br />

A missing PCW interrupt is generated by the Enter operation when the reference chain<br />

does not yield a PCW. P2 is an SIRW to the word that is not a valid SIRW or PCW. If the<br />

word at F+2 is not an SIRW or PCW, the Missing PCW interrupt is generated and P2 is<br />

an SIRW designating that word; in this case, SIRW.stack_disp designates the HISW at F.<br />

If the offending word is a binding request token (such as, untouched DD), the operating<br />

system can perform the service of replacing that token by an appropriate reference. In<br />

other circumstances, the interrupt is reporting an error associated with the entry<br />

reference chain.<br />

For the Libra 680 and 690 systems, P1 is the offending target, except that if its tag=2, it<br />

is changed to tag=0.<br />

Stack Overflow<br />

CVI POI( ) Continue EXIT SI Se<br />

Stack Overflow indicates that a push onto the expression stack has caused the size of<br />

the stack to exceed its limit. The interrupt is a request to the MCP to extend the stack<br />

segment. The interrupt is classed as Spontaneous because it is generated when the<br />

object is pushed into memory, not necessarily when it is placed into registers at the<br />

virtual top of stack. As an SI, Stack Overflow is said to occur between operators. The<br />

stack and code stream pointer are left in a configuration consistent with resuming the<br />

code stream with an enlarged stack segment.<br />

Stack Overflow interrupt is disabled by its generation or by the successful initiation of a<br />

Move-Stack operation; it is enabled by execution of SPRR for "register" 36 or by<br />

successful completion of a Move-Stack operation. The interrupt is not masked by the CS<br />

Boolean.<br />

While Stack Overflow is disabled, bounds checking on the current stack is disabled.<br />

Touch<br />

A Touch interrupt is used by operators to involve the MCP in the allocation or linkage of<br />

resources represented by untouched descriptors. The MCP service requested is to<br />

replace the untouched VSD with the appropriate item, which is typically an original VSD<br />

or a reference.<br />

6878 7530–007 4–11


Interrupts<br />

The P2 parameter is a proper reference to the untouched VSD.<br />

Three Touch conditions are defined: Touch <strong>Reference</strong>, Touch Load, and Touch CSD.<br />

Touch <strong>Reference</strong><br />

CVI ROI Repeat REXI(P1) ODI S<br />

A Touch <strong>Reference</strong> interrupt is generated when an untouched DD is encountered as a<br />

reference target by any operator (except ENTR and EVAL) that evaluates reference<br />

chains. (ENTR generates Missing PCW interrupt; EVAL treats the untouched DD as a<br />

valid target.)<br />

Touch Load<br />

CVI ROI Repeat REXI(P1) ODI S<br />

The Touch Load interrupt is generated when an untouched DD is encountered in a fetch<br />

attempt by LOAD or the final load step of NXLN.<br />

Touch CSD<br />

CVI ROI Repeat EXIT ODI S<br />

The Touch CSD interrupt is generated when an untouched Code Segment Descriptor is<br />

encountered by one of the make PCW operators.<br />

If the initial reference is the PCW skeleton; P2 is an SIRW generated by considering the<br />

sdll and sdi fields as the lambda and delta components of the unstuffed address couple.<br />

The Touch <strong>Reference</strong> interrupt can occur at a page boundary in a data array operator, as<br />

a descriptor is reindexed for the next iteration. In addition to the P2 parameter<br />

designating the untouched DD, the operator must preserve a consistent set of<br />

arguments below the interrupt AR. Depending on the situation, the following techniques<br />

are used:<br />

1. The pointer skips, though defined as array operators, are effectively indexing<br />

operators.<br />

2. The short-source and unpack operators are repeated from the beginning.<br />

3. Restart mode is invoked in all other cases, causing the descriptors to be reindexed at<br />

the beginning of the next iteration.<br />

Unimplemented Operator<br />

OVI:... POI(...) Next EXIT/RETN/RTN2 ODI S<br />

The Unimplemented Operator interrupt is generated whenever a primary or variant<br />

operator is encountered for which an operator is defined in this document, but not<br />

implemented (at least in part) in the processor.<br />

4–12 6878 7530–007


The following actions are required to use operator emulation:<br />

• The appropriate number of stack arguments must be present as interrupt<br />

parameters.<br />

Interrupts<br />

• The interrupt RCW must be generated to point at the first syllable past the operator<br />

(including any code parameters).<br />

• An interrupt procedure must have been provided in OVI slot 3 for the operator; the<br />

procedure can be tailored for that one operator. The procedure receives the operator<br />

arguments as parameters in POI format. Any required code parameters must be<br />

fetched by the procedure from the code segment. The procedure must emulate the<br />

operation and then exit, returning the specified operator results, if any.<br />

Vector Arithmetic Exception<br />

OVI POI(POW) Repeat RETN(POW) ODI S<br />

OVI POI(scalar, POW) Repeat RTN2(scalar, POW) ODI S<br />

This interrupt is reported by vector operators when an arithmetic fault occurs during the<br />

execution of the operator. It is also used to report spurious interrupt conditions that<br />

occur in the equivalent scalar operators.<br />

Vector operators that do not include a scalar stack item pass one parameter to the<br />

interrupt procedure in POI format. This parameter has a POW tag and contains the<br />

iteration count for the operator in bits 31:32. Vector operators that do include a scalar<br />

stack item pass two parameters in POI format. The first is the scalar argument (single or<br />

double precision) and the second is the POW. Non-scalar cases and SUM and SUMA set<br />

bit 40 in the POW to indicate that RS state consists only of the normal arguments plus<br />

the POW, and excludes the extra “dummy” arguments included by users of RS state for<br />

these operators.<br />

If the interrupted code stream is to be resumed, system software needs to obtain the<br />

data items, perform the appropriate arithmetic operations on them, update the result<br />

location, increment the iteration count by one, and return the scalar (if any) and iteration<br />

count arguments. The resumption condition is Repeat- Return2 or Repeat-Return,<br />

depending on the presence or absence of a scalar stack item.<br />

The arithmetic exception causes the appropriate arithmetic operator to generate an<br />

arithmetic OVI. That procedure decides whether to report an error and whether to return<br />

an emulation result to the vector arithmetic interrupt procedure.<br />

Note: Libra 4000 and 4100 systems do not support Vector Arithmetic Exception<br />

interrupts.<br />

6878 7530–007 4–13


Interrupts<br />

Enforcement Interrupts<br />

The interrupts in this group are generated primarily to enforce the preconditions and<br />

invariants defined for proper operator function. (In some cases, the MCP may take<br />

corrective measures or otherwise remove the error situation and resume the code<br />

stream, in which case the interrupt was effectively a request for service. Such action is<br />

possible only with non-Abort resumption situations.)<br />

There are some differences among <strong>Level</strong> Delta and <strong>Epsilon</strong> systems regarding the<br />

extent of enforcement; details regarding interrupt format vary widely. <strong>Level</strong> <strong>Epsilon</strong><br />

processors respond as described in the following paragraphs.<br />

Bounds Error<br />

A Bounds Error is generated for any of the following reasons:<br />

• The index argument to an indexing or OCRX operator cannot be integerized. P2 is<br />

zero.<br />

• The index argument to an OCRX operator is less than one or exceeds the ICW_limit<br />

value in the index control word. P2 is zero.<br />

• An attempt is made to index an unindexed DD or reindex or update an IndexedDD so<br />

that the new virtual index is less than zero or exceeds the length of the virtual<br />

segment. P2 is the out-of-bounds IndexedDD, with an unsigned index.<br />

• The word index of a DD exceeds field capacity: 2**20-1 for a WordDD, 2**16-1 for a<br />

CharDD, or 2**13-1 for an edit table designator. P2 is that IndexedDD with a<br />

truncated index, unless the element index magnitude exceeds 2**32- 1, in which<br />

case P2 is zero.<br />

• An attempt is made to access, or use INDX to reference, an item via an IndexedDD<br />

whose word index is greater than or equal to the word length of the actual segment<br />

designated by its ASD_ref. For an IndexedDoubleDD evaluated by NXLV, LOAD,<br />

STOx, or Value Call, both referent words must be in-bounds. P2 is the out-of-bounds<br />

IndexedDD.<br />

Accesses to source and destination sequences in pointer operators are subject to<br />

this check, except for the cases defined to generate Destination and Source<br />

Boundary interrupts.<br />

• The offset into an actual segment exceeds ASD2.AS_length-1, for:<br />

− Accesses via SIRWs, entered ENVWs, or TSCWs: P2 is the reference in SIRW<br />

format.<br />

− Accesses to code (first detected by bad “code word” tag), whether sequential,<br />

as static or dynamic branch destinations, or via procedure entry/return: P2 is an<br />

unpaged IndexedDD that references the out-of-bounds code word.<br />

− Accesses relative to register values (such as F, D[LL]). However, pushing a word<br />

onto the current stack beyond its end constitutes a Stack Overflow condition;<br />

the store must be performed and Bounds Error interrupt cannot be generated.<br />

P2 is an SIRW to the current stack whose stack_disp field equals the register<br />

value.<br />

4–14 6878 7530–007


Interrupts<br />

When Stack Overflow checking is disabled, no Bounds Error interrupt is generated for<br />

any access to the stack segment. Software must not use a DD to access the stack<br />

beyond its defined AS_length.<br />

Resumption is defined for the indexing and OCRX operators.<br />

For all cases of indexing operators and OCRX:<br />

CVI ROI Repeat EXIT ODI Es<br />

In all other cases, the code stream need not be resumable:<br />

CVI ROI Abort-Here ODI E<br />

Destination Boundary<br />

CVI ROI Repeat REXI(P1) ODI ES<br />

A Destination Boundary interrupt is generated by pointer operators (other than TWOD)<br />

that attempt to transfer data to the first element beyond the end of the destination<br />

virtual segment.<br />

P2 is the destination descriptor updated to the last+1 element of the segment.<br />

This interrupt ordinarily reports an error; however, there are two possible services that<br />

software can perform:<br />

• It can lengthen the destination segment.<br />

• It can terminate the operation, discarding the rest of the intended transfer.<br />

Software may extend the destination segment in one of several ways:<br />

• An unpaged segment can be extended by providing a larger actual segment<br />

associated with the same ASD.<br />

• A paged segment with a short last page can be extended by providing a larger actual<br />

segment associated with the same last-page ASD.<br />

• A paged segment with a long last page can be extended by providing a larger page<br />

table associated with the same ASD.<br />

• An unpaged segment can be converted to a paged segment. The ASD associated<br />

with the original segment can be used either as the new page table or as a page; an<br />

additional ASD is needed for the other.<br />

In the first three cases, the code stream can be resumed without any modification of the<br />

stack arguments. The fourth situation requires that all touched DDs referencing the<br />

destination segment (including the destination argument on the stack below the interrupt<br />

AR) be modified to designate the new segment; the tags must be changed and the<br />

ASD_ref and index fields may require change.<br />

6878 7530–007 4–15


Interrupts<br />

Unconditional transfer operators (TUND and TUNU, TRNS, TWSD and TWSU) may be<br />

terminated by setting the length argument (on the stack below the interrupt AR) to zero<br />

prior to resuming the code stream. The resumed operator will terminate. These<br />

operators always place their arguments on the stack in their original relative positions;<br />

the length is the topmost operand below the interrupt AR. Note that there is a restart<br />

POW above the arguments.<br />

False Assertion<br />

OVI:ASRT,AVER POI(b) Next EXIT ODI ES<br />

The False Assertion interrupt is generated by the ASRT and AVER operators when the<br />

stack argument is False.<br />

The interrupt is an error indication on the part of the program invoking ASRT or AVER,<br />

but it is also a service request for message generation or other software- defined error<br />

handling. The Boolean argument is passed as the interrupt procedure parameter. The<br />

code parameter to the ASRT operator can be fetched from the code segment; the<br />

interrupt RCW points at the syllable following the parameter.<br />

Invalid Access<br />

CVI ROI Abort-Here ODI E<br />

An Invalid Access interrupt is generated when an operator attempts to write to memory<br />

via a DD with write access disabled. If the DD is a stack argument, P2 is zero; otherwise,<br />

P2 is the SIRW that referenced the DD.<br />

Pointer operators that "require a destination" may generate the interrupt when the<br />

destination argument is read-only, whether or not a write is attempted.<br />

Invalid Argument or Parameter<br />

CVI ROI Abort-Here ODI E<br />

This interrupt is a notice that a stack argument or code parameter for an operator does<br />

not meet the type and value-range constraints that are preconditions for the operator.<br />

Most of the preconditions cited in the operator definitions in this manual are enforced by<br />

checks that generate this interrupt when not satisfied. The bulk of the checks are on<br />

stack arguments, so the interrupt is often referred to as Invalid Argument. P2 is the<br />

offending argument if it is a bad type (tag=2 changed to tag=0); P2 is zero for all other<br />

cases.<br />

Invalid argument or parameter tests fall into the following categories:<br />

• Type checks: Data types are defined by tags and, in some cases, additional<br />

discriminator bits within the word. Some data types are defined partly by context, so<br />

a tag check provides a partial verification. An Uninitialized Argument interrupt is<br />

generated instead of Invalid Argument whenever the offending argument has a tag<br />

of 6 or 4.<br />

4–16 6878 7530–007


Interrupts<br />

• Reindex checks:Indexing, Data Array, and set-element_size operators require<br />

indexed-descriptor arguments to have reindex enabled; the reindex-enable bit may<br />

be considered part of the data-type definition for acceptable arguments.<br />

• Argument value checks: An integer operand or a field in a word of some other<br />

type may be constrained to a particular range or subset of values.<br />

• Code parameter value checks: A code parameter may be constrained to a<br />

particular range or subset of values.<br />

• Consistency checks: some operators place type or value restrictions on one<br />

argument, depending on some characteristic or another. Examples include<br />

element_size matching in pointer operators and type consistency between store<br />

objects and targets.<br />

• Integer magnitude checks: Non-Integer Argument exception arises when any<br />

operator except NTGR invokes the RaI (algebraic round to integer) function and the<br />

result is TooBig. If the argument to be integerized is used as an Index, the exception<br />

is reported as a Bounds Error; otherwise, it is reported as an Invalid Argument. (Note<br />

that often an argument range is limited to a subset of the integers; in such cases,<br />

the more limiting check is specified. The TooBig result from the RaI function is<br />

regarded as greater than any represent able value, even when the argument of RaI is<br />

negative.)<br />

Invalid Code Word<br />

An Invalid Code Word interrupt indicates that a word accessed from the current code<br />

segment is not a Program Code Word. It is generated in table edit mode if the tag of the<br />

word is not zero and in all other modes of the tag is not three.<br />

The interrupt is classified as an SI because it is not associated with an identifiable<br />

operator. However, it is not at all independent of the code stream.<br />

• Primary or Variant:<br />

CVI ROI Abort-Here SI E<br />

If the processor is parsing code other than in edit mode, the interrupt RCW designates<br />

the first syllable of the operator that contains a syllable in the invalid word. If a VARI<br />

prefix has been encountered, that syllable is designated. (If a branch, enter, or exit<br />

destination begins in the bad word, the RCW designates that destination.)<br />

• Edit:<br />

CVI ROI Abort-Here SI E<br />

When the processor is parsing code in edit mode, the interrupt RCW designates the<br />

enter-edit operator; the arguments to that operator are below the interrupt AR. For table<br />

edit, an updated table pointer designates the first syllable of the operator that contains a<br />

syllable in the invalid word.<br />

For all cases, P2 is an unpaged IndexedDD that references the offending code word, and<br />

P1 is the offending target word, except that if that word had tag=2, it is changed to<br />

tag=0.<br />

6878 7530–007 4–17


Interrupts<br />

Invalid Operator<br />

CVI POI( ) Repeat EXIT ODI Es<br />

An Invalid Operator interrupt is unconditionally generated by execution of NVLD (Invalid<br />

Operator). No other operator generates this interrupt.<br />

Invalid Target<br />

CVI ROI Repeat REXI(P1) ODI Es<br />

An Invalid Target interrupt indicates that evaluation of a reference produced an<br />

unexpected result. It is generated by operators (other than Enter) that evaluate<br />

references and reference chains if evaluation of an address couple parameter, SIRW, or<br />

IndexedWordDD produces an item that is neither a valid reference in the chain nor a<br />

valid target item that terminates the chain. The definitions of valid reference chains and<br />

valid target items vary according to the function of the operator.<br />

The interrupt is generated by vector and pointer operators that encounter unacceptable<br />

words in a vector, (source or destination) sequence, or (membership or translate) table.<br />

The P2 parameter is a proper reference to the offending target word. P1 is optionally the<br />

offending target word, except when the word has tag=2, it is changed to tag=0.<br />

Invalid Target can be considered a generic condition for the discovery of an unexpected<br />

word during reference evaluation. In many special cases, some other interrupt is<br />

generated instead. In particular, the Enter operators generate Missing PCW interrupts<br />

and some other operators generate a Touch interrupt if the target is an untouched DD.<br />

Source Boundary<br />

CVI ROI Repeat REXI(P1) ODI Es<br />

A Source Boundary interrupt is generated by TRNS, TUND, TUNU, TWSD, and TWSU<br />

operators that attempt to transfer data from the first element beyond the end of the<br />

source virtual segment. Other pointer operators that transfer characters from a source<br />

segment to a destination also generate this interrupt under the same circumstances.<br />

P2 is the source descriptor updated to the last+1 element of the segment.<br />

A Source Boundary interrupt usually reports an error, although under some<br />

circumstances the software may perform a service by supplying the rest of the missing<br />

source or terminating the transfer.<br />

4–18 6878 7530–007


Interrupts<br />

To cause the operation to continue with an operand source, the software must replace<br />

the source pointer argument on the stack below the interrupt AR by an operand. (It must<br />

also set P1.[38:1]:=1 prior to returning P1 with REXI, for those ClearPath MCP systems<br />

that interpret REXI as RETN.) For unconditional-transfer operators (TUND and TUNU,<br />

TRNS, TWSD and TWSU), the source-pointer argument is immediately below the length<br />

argument, which is the topmost operand below the interrupt AR. Note that there is a<br />

restart POW above the arguments.<br />

The operation may be terminated as described under "Destination Boundary" earlier in<br />

this section.<br />

Stack Underflow<br />

CVI POI( ) Abort-Here SI E<br />

Stack Underflow indicates that an operator attempted to pop an argument from an<br />

empty expression stack. The expression stack is the set of locations whose addresses<br />

are in the range {MAX(F+1,D[LL]+2) to S}. A Stack Underflow interrupt is generated<br />

when, in order to provide an argument to an operator, it is necessary to pop a word from<br />

the stack, but S is less than the lower bound.<br />

This interrupt is classified as an SI (even though it always results from a specific operator<br />

attempting to consume an argument from an empty expression stack), because no<br />

parameters are passed.<br />

Structure Error<br />

CVI ROI Abort-Here or Abort-Next ODI E<br />

A Structure Error interrupt is generated when the processor discovers an inconsistency<br />

in one or more of the critical data structures that the processor requires to execute<br />

operators: a stack, the ASD table, a page table, or the Scratch Pad. The interrupt usually<br />

indicates a serious failure of hardware or system software. Circumstances that result in<br />

interrupt generation are listed separately for each of the four types of structures, which<br />

are the following:<br />

• Stack Structure Errors<br />

• ASD Structure Errors<br />

• Page Structure Errors<br />

• Scratch Pad Errors (Libra 6xx and 7xx systems)<br />

Stack Structure Errors<br />

The following notation is used:<br />

Mem[a] = contents of memory word at address a<br />

Stk[d] = contents of current stack at displacement d<br />

HistLink = displacement computed from a history link<br />

EnvLink = address computed from an environment link<br />

.ASD_num = .stack_num or .seg_num for normal or pseudo link<br />

6878 7530–007 4–19


Interrupts<br />

The Enter, Exit, and aEVLK operations generate Structure Error interrupts under any of<br />

the following conditions:<br />

aEVLK: Mem[EnvLink] not entered ENVW<br />

Exit: Stk[D[LL]+1] not RCW<br />

Stk[F] not HISW<br />

Stk[HistLink+1] not {inactive ENVW, entered ENVW}<br />

Checking stack linkage words (HISW,ENVW, and RCW) only occurs whenever the word<br />

is accessed. Operators that update display registers may traverse part, but not<br />

necessarily all, of the environmental chain for the new environment. If the word is not<br />

the correct type, P2 is nearly always an SIRW that references it.<br />

ASD Structure Errors<br />

An ASD structure error is detected in the course of evaluating an ASD_number, which<br />

may be derived in any of several ways:<br />

1. Accessing data via a descriptor: the ASD_number is from the ASD_ref field of the<br />

DD.<br />

2. Accessing code via a PCW or RCW: the ASD_number is from the ASD_ref field of<br />

the control word.<br />

3. Evaluating an Environment Link: the ASD_number is from the env_link field of an<br />

SIRW or ENVW.<br />

4. Accessing the current stack: the ASD_number is derived from the SNR register.<br />

5. Accessing the current code segment: the ASD_number is in the PSN register.<br />

In all of these contexts, the following violations generate Structure Error interrupts:<br />

ASD1[ASD_number].tag < > 8: P2 is the absolute address of ASD1.<br />

ASD2[ASD_number].tag < > 8: P2 is the absolute address of ASD2.<br />

ASD1[ASD_number].address MOD 2**36 + offset >= 2**36: P2 is the reference<br />

whose evaluation caused the overflow.<br />

Page Structure Errors<br />

Violations of the invariants of paged array structure generate Structure Error interrupts:<br />

• ASD3 designated by indexed paged DD not unpaged IndexedDD: P2 is the absolute<br />

address of ASD3.<br />

• page-table word accessed by indexing unindexed paged DD or by reindexing ASD3<br />

not {unpaged unindexed DD, untouched DD}: P2 is an unpaged IndexedDD that<br />

references the page-table word.<br />

4–20 6878 7530–007


Scratch Pad Errors (Libra 6xx and 7xx Systems)<br />

A Scratch Pad Structure Error is reported when any of the following is detected:<br />

1. D[0] + 16 is not a DD (to Scratch Pad).<br />

2. Scratch Pad ASD has an error (structure error or MDE).<br />

3. Scratch Pad target word has an error (invalid tag or MDE).<br />

For all cases, P2 = 0 and P1 = 1.<br />

Undefined Operator<br />

Interrupts<br />

An Undefined Operator interrupt is generated for the attempted execution of an operator<br />

whose encoding is not valid in the context.<br />

Primary and variant encodings are expected in the normal succession of operators in the<br />

code stream, whether accessed sequentially or subsequent to branch or subroutine<br />

operators. Edit encodings are expected in the code stream following an enter single-edit<br />

operator or in a table designated by an enter table-edit operator. The ENDE, ENDF, and<br />

INSC operators are undefined following EXPU, EXSD, or EXSU; edit operators requiring a<br />

source are undefined following EXPU.<br />

Ordinarily, the resumption is Repeat EXIT (although useful resumption of the code<br />

stream is unlikely):<br />

CVI POI( ) Repeat EXIT ODI E<br />

If an edit operator was expected, the resumption is Abort-Here. The RCW points to the<br />

enter-edit operator and, for table edit, the table pointer is updated to point to the<br />

offending code syllable:<br />

CVI POI( ) Abort-Here ODI E<br />

Uninitialized Argument<br />

CVI ROI Abort-Here ODI E<br />

This interrupt is a special case of Invalid Argument; it is generated when an argument<br />

has a tag of 4 or 6 and fails to meet the type criteria for that operator. P2 is the offending<br />

argument.<br />

Systems that pass an argument with a tag of 4 or 6 as an interrupt parameter can report<br />

this condition as Invalid Argument.<br />

6878 7530–007 4–21


Interrupts<br />

Alarm Interrupts (Libra 6xx and 7xx Systems)<br />

Alarm interrupts are triggered by hardware fault detection. The interrupt RCW typically<br />

points to the operator sequence that was executing when the fault was detected;<br />

resumption is often not possible.<br />

Emulation Consistency Error<br />

CVI ROI Abort-Here SI E<br />

This interrupt indicates that the processor detected a consistency error in its emulation<br />

code, not correctable by reloading the same level of emulation code.<br />

Emulation Error<br />

This interrupt indicates that the processor detected an error in its emulation code (e.g.<br />

tag not equal to 3, memory data error). Software should correct the emulation segment.<br />

Two Emulation Error conditions are defined, one for situations in which resumption is<br />

possible, and one for which it is not:<br />

Emulation Error - Here<br />

CVI ROI Repeat EXIT SI E<br />

Emulation Error - Lost<br />

CVI ROI Abort-Lost SI E<br />

If P2 is an integer, it is the absolute address of the emulation code word detected with a<br />

memory data error. If P2 is an IndexedDD, it references the emulation code word<br />

detected with some other error (probably tag).<br />

External Memory Write Error<br />

CVI POI( ) Abort-Lost SI E<br />

This interrupt indicates that the platform issued a Hard Fail response on a prior WEMW<br />

by the processor.<br />

Hardware Error<br />

This interrupt indicates that the processor detected an error in its own operation.<br />

Two Hardware Error conditions are defined, one for situations in which resumption is<br />

possible and one for which it is not:<br />

Hardware Error - Here<br />

CVI ROI Repeat EXIT SI E<br />

4–22 6878 7530–007


Hardware Error - Lost<br />

CVI ROI Abort-Lost SI E<br />

Interrupts<br />

The P2 parameter for both repeat and abort hardware errors is formatted as follows:<br />

47:17 Zero<br />

30:3 Interrupt Count<br />

27:2 Stack Bounds Status<br />

25:3 Deferred Action Decompose<br />

22:3 Deferred Action Single Op<br />

19:4 Phase Count<br />

15:1 Zero<br />

14:3 Pass Count<br />

11:5 Zero<br />

06:7 Hardware Error Code<br />

Defined Hardware Error Codes<br />

Asynchronous Hardware Errors:<br />

11 MU MRT Job RF1<br />

12 MU MRT Job RF2<br />

13 MU Tag Double Hit RF1<br />

14 MU Tag Double Hit RF2<br />

15 MU Tag Ram Parity RF1<br />

16 MU Tag Ram Parity RF2<br />

17 MU MODS Queue Parity RF1<br />

18 MU MODS Queue Parity RF2<br />

19 MU AAT Compare<br />

1A MU SAL Address Parity<br />

1B MU Busy Table Parity<br />

EU Hardware Errors:<br />

40 Op queue parity<br />

41 Control store parity<br />

44 EBI parity<br />

45 EDA residue<br />

46 EDB parity<br />

47 EDB residue<br />

48 FA input parity<br />

49 FA input residue<br />

4A FA barrel parity<br />

4B FA shift residue<br />

4C EWD parity<br />

4D EWD residue<br />

6878 7530–007 4–23


Interrupts<br />

Other Synchronous Hardware Errors:<br />

50 WU HE: Address residue error (SAL)<br />

53 ACU Consistency error<br />

58 ACU HE: ASDAM write<br />

59 ACU HE: ASDAM multiple hit<br />

5A ACU HE: ASDAM read parity<br />

5B ACU HE: ASDAM page index parity<br />

5C MU HE: address residue<br />

DCU Hardware Errors:<br />

60 Micro-op Queue parity<br />

61 DLM Control Store parity<br />

62 Type parity<br />

63 “Y” MISC. parity / Input parity<br />

64 “DOD” VWI residue<br />

65 “DOD” ASD residue<br />

66 “X” MISC. parity / Divide residue<br />

67 “Z” MISC. parity<br />

68 “Z” VWI residue<br />

69 “Z” ASD residue<br />

6A DCU prefetch queue parity<br />

6E Micro-op Queue parity (op)<br />

CU Hardware Errors:<br />

70 Return Stack Consistency<br />

71 TOS Consistency<br />

72 Cache Read parity<br />

73 Control Store parity<br />

74 AT Misc parity<br />

75 Cache Misc errors<br />

76 Scanner Misc parity<br />

77 Parser Misc parity<br />

78 ACAM double hit<br />

79 TOS Misc parity<br />

7F Recovery Misc errors<br />

Invalid Address<br />

This interrupt indicates an attempt to address a word of memory that does not exist on<br />

the system. P2 is the reference which produced the invalid address.<br />

Two Invalid Address conditions are defined, one for situations in which the attempted<br />

access can be associated with a specific operator and one for which it cannot.<br />

Invalid Address - Here<br />

CVI ROI Abort-Here SI E<br />

4–24 6878 7530–007


Invalid Address - Lost<br />

CVI ROI Abort-Lost SI E<br />

Loop Timer<br />

Interrupts<br />

This interrupt indicates an effectively infinite loop by an operator. It is triggered by<br />

expiration of a timer whose interval is sufficient for valid execution of any indivisible<br />

sequence of operators or one division of a divisible iterative operator.<br />

A Loop Timer interrupt indicates a processor fault, except that a program can induce the<br />

interrupt by attempting to evaluate an SIRW chain that loops or to traverse a historical<br />

chain (exit) that loops.<br />

The following operations are not subject to Loop Timer interrupt:<br />

HALT (when the Halt Boolean is true)<br />

STOP<br />

Idle state (waiting for external)<br />

WIPS TOD sync (waiting for IMS)<br />

Two Loop Timer conditions are defined, one for situations in which resumption is<br />

possible and one for which it is not:<br />

Loop Timer - Here<br />

CVI ROI Repeat EXIT SI E<br />

Loop Timer - Lost<br />

CVI ROI Abort-Lost SI E<br />

For both situations, P2 is formatted identically to P2 for Hardware Error, except that<br />

P2 06:7 will be equal to 54.<br />

Memory Data Error<br />

This interrupt reports an attempt to read from memory a word that has an uncorrectable<br />

memory error. (No error may be reported regarding the prior contents of a memory word<br />

being overwritten by OVRD/OVRN or TWOD.) Single-bit read data errors are corrected by<br />

hardware and will not be reported by an interrupt.<br />

Two Memory Data Error conditions are defined, one for situations in which resumption is<br />

possible and one for which it is not:<br />

Memory Data Error - Here<br />

CVI ROI Repeat EXIT SI E<br />

Memory Data Error - Lost<br />

CVI ROI Abort-Lost SI E<br />

6878 7530–007 4–25


Interrupts<br />

P2 contains the absolute address in field [35:36]; field [46:11] is zero. Bit 47 true<br />

indicates the address is to I/O space.<br />

For only Memory Data Error-Lost, P1 may be non-zero, indicating a specific failure unique<br />

to REMW accessing external memory:<br />

P1 = 1 – cause was Bus MDE<br />

P1 = 2 – cause was Hard Fail response from platform<br />

SLC Interface Error<br />

This interrupt indicates that the processor detected an error with the Second <strong>Level</strong><br />

Cache interface.<br />

Two SLC Interface Error conditions are defined, one for situations in which resumption is<br />

possible and one for which it is not:<br />

SLC Interface Error - Here<br />

CVI ROI Repeat EXIT SI E<br />

SLC Interface Error - Lost<br />

CVI ROI Abort-Lost SI E<br />

For both situations, P2 is formatted identically to P2 for Hardware Error, except that<br />

P2 06:7 will be one of the following:<br />

1C SLC Protocol<br />

1D SLC Ctrl parity<br />

1E SLC Purge parity<br />

55 MU memory jobs busy<br />

56 CU memory jobs busy<br />

57 MU and CU memory jobs busy<br />

Asynchronous Interrupts<br />

Asynchronous interrupts are independent of the code stream and usually occur due to<br />

the expiration of a timed interval. Software must periodically set an Interval Timer and a<br />

Run Timer, and recognize the corresponding asynchronous interrupt that occurs when<br />

either timer expires.<br />

Interval Timer<br />

Note: Libra 4000 systems do not support this interrupt.<br />

CVI POI( ) Continue EXIT SI S<br />

There is one Interval Timer per processor whose value indicates the amount of time a<br />

processor can execute without reporting an interrupt. An expired Interval Timer signals<br />

software to initiate a move stack operation. This interrupt is masked by control state. No<br />

parameters are passed to this interrupt.<br />

4–26 6878 7530–007


Interrupts<br />

An Interval Timer is set by the Set Interval Timer (SINT) operator. If the Interval Timer<br />

decrements to zero, or is explicitly set to zero, an Interval Timer interrupt is reported to<br />

software.<br />

Any asynchronous or external interrupt causes the Interval Timer for the processor<br />

reporting the interrupt to be disarmed.<br />

Run Timer<br />

CVI POI( ) Continue EXIT SI S<br />

There is one Run Timer per processor. Each Run Timer value indicates the amount of<br />

time a processor can execute before software sets the value again. An expired Run<br />

Timer usually indicates a software error, typically excessive time spent in control state.<br />

This interrupt is not masked by control state. No parameters are passed to this interrupt.<br />

Note: Libra 4000 systems do not support this interrupt.<br />

The Running Indicator (RUNI) operator arms the Run Timer to 30 seconds. If the time<br />

value elapses before the next RUNI invocation, a Run Timer interrupt is reported to<br />

software.<br />

The Run Timer stops decrementing when a processor is halted and resumes<br />

decrementing if that processor is continued.<br />

If a Non-maskable Interrupt condition is detected at the same time, the Run Timer takes<br />

precedence over NMI. In this case, the Run Timer CVI is reported and the Non-maskable<br />

CVI is dropped. A Maskable IPI is also dropped if one is pending at this time (the<br />

corresponding IRR bit is reset).<br />

External Interrupts<br />

External interrupts are generated to report occurrences outside a processor, such as<br />

communication from another component of the system.<br />

Note: The only external interrupts handled by the CPM in the Libra 4000 systems are<br />

those that other operational modules use to get the attention of the CPM. These are<br />

handled internally by the CPM and the system software is never invoked to handle an<br />

external interrupt.<br />

Non-maskable Interrupt<br />

CVI ROI Continue EXIT SI S<br />

The Non-maskable Interrupt is used to interrupt a processor out of control state,<br />

presumably because it failed to respond to a Maskable Interrupt. A running processor<br />

that fails to respond to a Maskable External Interrupt is normally looping in control state.<br />

In response to a Non-maskable Interrupt request, a processor reports this interrupt to<br />

software. P2 is the proc ID of the processor that issued the NMI, which used the APIC<br />

vector field to hold that ID.<br />

6878 7530–007 4–27


Interrupts<br />

If a Run Timer interrupt condition is pending, but NMI occurred just ahead of the Run<br />

Timer, NMI takes precedence over the Run Timer. In this case, the Non-maskable CVI is<br />

reported and the Run Timer CVI is dropped. A Maskable IPI is also dropped if one is<br />

pending at this time (the corresponding IRR bit is reset).<br />

Maskable External Interrupts<br />

A Maskable External Interrupt (MEI) applies to Libra 6xx and 7xx systems only. It refers<br />

to the interrupt reported by an IP that has a corresponding interrupt request in the<br />

Interrupt Request Register (IRR) of its Local APIC. A MEI is a type of External Interrupt,<br />

which differs from a CVI or OVI condition because procedure entry does not occur<br />

through a reference in the E-mode Interrupt Vector (via ASD 3) and the Interrupt Count<br />

does not increment. A MEI is also unique in passing exactly one word as an interrupt<br />

parameter.<br />

Note: The only external interrupts handled by the CPM in the Libra 4000 systems are<br />

those that other operational modules use to get the attention of the CPM. These are<br />

handled internally by the CPM and the system software is never invoked to handle an<br />

external interrupt.<br />

Three MEI classes are defined, based on the defined interrupt requests in the IRR:<br />

I/O Interrupt (IRR bits 16-215)<br />

MIP Interrupt (IRR bit 216)<br />

Maskable IPI (IRR bit 217)<br />

Note that the Local APIC of an idle or halted IP still accepts interrupt requests. These<br />

interrupts remain pending in the IRR until the IP is started or continued, and either<br />

transitions to normal state or executes a PAUS or IDLE. If an idle or halted IP is removed<br />

from the partition, pending interrupts in its IRR are lost.<br />

Entry Points<br />

For each MEI class, software defines a corresponding entry point in the D[0] stack. Each<br />

entry point is a PCW to an interrupt procedure declared at a fixed D[0] offset.<br />

MEI Class D[0] Offset<br />

I/O Interrupt 4’E’<br />

MIP Interrupt 4’C’<br />

Maskable IPI 4’F’<br />

To report a MEI, the IP maps a given interrupt request number to a MEI class and<br />

directly enters a procedure whose PCW resides at the D[0] offset reserved for that<br />

interrupt class. The interrupt request number is pushed as an integer parameter to the<br />

target procedure.<br />

When reporting a MEI to software, the IP resets the IRR bit that corresponds to the<br />

interrupt request.<br />

4–28 6878 7530–007


Interrupts<br />

If the IRR indicates other interrupts are pending, software may process them via the<br />

External Branch (EXTB) operator, but only from the target procedure for a MEI. Thus,<br />

EXTB allows software to process multiple interrupt requests during a single MEI.<br />

The IP will generate a Missing PCW interrupt if the D[0] offset for a given entry point<br />

does not contain a PCW.<br />

I/O Interrupt<br />

When an I/O interrupt is reported to software, the interrupt vector parameter to the<br />

target procedure identifies the PCI slot that generated the interrupt.<br />

MIP Interrupt<br />

The MIP to host interrupt informs software that Server Control wants to communicate<br />

information via the partition mailbox.<br />

Maskable IPI<br />

The Maskable IPI allows a processor to interrupt another processor in the same MCP<br />

partition. Global MCP state determines what action is taken by the destination IP (i.e.<br />

answer a dialing processor, become a dump follower, change stack).<br />

Interrupt Vector<br />

An interrupt is generated by invoking the aINTE action with an interrupt reference (SIRW)<br />

constructed by the processor. The components of the SIRW are:<br />

stack_num = 3<br />

stack_disp = 1 for CVI, 50 for OVI<br />

pseudolink = 0<br />

offset = value defined for particular interrupt<br />

Each CVI has a single fixed offset.<br />

Each OVI has a different offset for each operator:<br />

primary: opcode*4 - 511 + OVI_number<br />

variant: opcode*4 + 513 + OVI_number<br />

An OVI_number is assigned generically for each OVI condition:<br />

0: False Assertion<br />

0: Arithmetic Overflow<br />

1: Arithmetic Underflow<br />

2: Integer Overflow<br />

2: Vector Arithmetic Exception<br />

3: Unimplemented Operator<br />

6878 7530–007 4–29


Interrupts<br />

The following lists define the offsets for all interrupts except Unimplemented Operator,<br />

which is always OVI slot 3 for the operator to be trapped. Offset values are shown in<br />

decimal and (hex). Unnamed offsets are unused.<br />

CVIs: stack_disp =1<br />

1 (001) Touch CSD<br />

2 (002) Missing PCW<br />

3 (003) Absent Data Segment<br />

4 (004) Absent Code Segment<br />

5 (005) Touch <strong>Reference</strong><br />

6 (006) Touch Load<br />

7 (007)<br />

8 (008) Destination Boundary<br />

9 (009) Source Boundary<br />

10 (00A)<br />

11 (00B) Block Exit<br />

12 (00C)<br />

13 (00D)<br />

14 (00E) Invalid Target<br />

15 (00F) Invalid Address - Here<br />

16 (010) Memory Data Error - Lost<br />

17 (011) Invalid Argument or Parameter<br />

18 (012) Bounds Error<br />

19 (013)<br />

20 (014) Structure Error<br />

21 (015) Invalid Operator<br />

22 (016) Invalid Access<br />

23 (017) Undefined Operator<br />

24 (018) Uninitialized Argument<br />

25 (019) External Memory Write Error<br />

26 (01A)<br />

27 (01B) Non-maskable External<br />

28 (01C) Emulation Error - Here<br />

29 (01D) Emulation Error - Lost<br />

30 (01E) Memory Data Error - Here<br />

31 (01F) SLC Interface Error - Here<br />

32 (020) Invalid Address - Lost<br />

33 (021) Stack Overflow<br />

34 (022) Stack Underflow<br />

35 (023) Invalid Code Word<br />

36 (024) Loop Timer - Lost<br />

37 (025) Hardware Error - Lost<br />

38 (026)<br />

39 (027) SLC Interface Error - Lost<br />

40 (028) Running Timeout<br />

41 (029) Loop Timer - Here<br />

42 (02A) Hardware Error - Here<br />

43 (02B)<br />

4–30 6878 7530–007


44 (02C) Interval Timer<br />

45 (02D) Emulation Consistency Error<br />

46 (02E)<br />

47 (02F)<br />

48 (030)<br />

OVIs: stack_disp = 50 (0032)<br />

1 (001) ADD Arithmetic Overflow<br />

5 (005) SUBT Arithmetic Overflow<br />

9 (009) MULT Arithmetic Overflow<br />

10 (00A) Arithmetic Underflow<br />

13 (00D) DIVD Arithmetic Overflow<br />

14 (00E) Arithmetic Underflow<br />

17 (011) IDIV Arithmetic Overflow<br />

19 (013) Integer Overflow<br />

21 (015) RDIV Arithmetic Overflow<br />

22 (016) Arithmetic Underflow<br />

23 (017) Integer Overflow<br />

27 (01B) NTIA Integer Overflow<br />

31 (01F) NTGR Integer Overflow<br />

61 (03D) MULX Arithmetic Overflow<br />

62 (03E) Arithmetic Underflow<br />

305 (131) SNGT Arithmetic Overflow<br />

306 (132) Arithmetic Underflow<br />

309 (135) SNGL Arithmetic Overflow<br />

310 (136) Arithmetic Underflow<br />

991 (3DF) BCD Integer Overflow<br />

1023 (3FF) DBCD Integer Overflow<br />

1025 (401) ASRT False Assertion<br />

1051 (41B) NTTD Integer Overflow<br />

1055 (41F) NTGD Integer Overflow<br />

1082 (43A) NORM Arithmetic Overflow<br />

1085 (43D) AVER False Assertion<br />

1291 (50B) SUM Vector Arithmetic Exception<br />

1295 (50F) SUMA Vector Arithmetic Exception<br />

1299 (513) DOT Vector Arithmetic Exception<br />

1303 (517) DOTX Vector Arithmetic Exception<br />

1307 (51B) SEQ Vector Arithmetic Exception<br />

1311 (51F) POLY Vector Arithmetic Exception<br />

1423 (58F) CPVS Vector Arithmetic Exception<br />

1431 (597) VPV Vector Arithmetic Exception<br />

1435 (59B) VMV Vector Arithmetic Exception<br />

1439 (59F) VMVN Vector Arithmetic Exception<br />

1443 (5A3) VTV Vector Arithmetic Exception<br />

1447 (5A7) VOV Vector Arithmetic Exception<br />

1451 (5AB) VUV Vector Arithmetic Exception<br />

1455 (5AF) VPS Vector Arithmetic Exception<br />

1459 (5B3) VTS Vector Arithmetic Exception<br />

Interrupts<br />

6878 7530–007 4–31


Interrupts<br />

1463 (5B7) VPVS Vector Arithmetic Exception<br />

1467 (5BB) VSPV Vector Arithmetic Exception<br />

4–32 6878 7530–007


Section 5<br />

Operator Set<br />

This section applies to all <strong>Level</strong> <strong>Epsilon</strong> systems. Most operators are available in all<br />

ClearPath MCP systems; see Appendix A to identify those operators introduced in <strong>Level</strong><br />

<strong>Epsilon</strong> systems.<br />

General Information<br />

Operators and Code Streams<br />

An operator is composed of an op code and up to four parameters. Op codes are<br />

typically one syllable and parameters, if any, are in the syllables following the op code.<br />

Op code and parameter mapping into syllables varies; operator formats are explicitly<br />

specified in this section and in Appendix A. (The term parameter is used in operator<br />

descriptions to describe items from the code stream; the term argument is used for<br />

items from the stack.)<br />

A code stream is considered to be a sequence of syllables fetched without regard to<br />

word boundaries, except for the special case of LT48 and MPCW operators.<br />

In diagrams specifying op code and parameter interpretation, the operator name is used<br />

to represent its op code value. (Op code values are specified in Appendixes A and C.)<br />

Vertical bars (|) denote syllable boundaries and dotted vertical lines (:) denote parameter<br />

boundaries not corresponding to syllable boundaries.<br />

The following diagram shows a three-syllable operator, including two single-syllable<br />

parameters.<br />

<br />

Operator op <br />

P1 P2 <br />

format: name <br />

<br />

The next diagram shows a three-syllable operator, two syllables of which is a single<br />

parameter:<br />

<br />

Operator op <br />

P1 <br />

format: name <br />

<br />

6878 7530–007 5–1


Operator Set<br />

The final diagram shows a three-syllable operator including two parameters that are<br />

mapped into two syllables. P1 is 3 bits and P2 is 13 bits.<br />

<br />

Operator op : <br />

P1 : P2 <br />

format: name : <br />

<br />

:<br />

3 : 13<br />

Primary, Variant, and Edit Operators<br />

Depending on context, there may be several interpretations of an op code syllable:<br />

• Primary op codes are represented in a single syllable.<br />

• Variant op codes are represented by two syllables of which the first is the primary<br />

operator VARI.<br />

• Edit op codes are found in special tables (specified as an argument to an Enter Table<br />

Edit operator, TEED or TEEU) or in the code stream immediately following an Enter<br />

Single Edit operator (EXSD, EXSU, or EXPU).<br />

Common Actions<br />

The concept of a common action is used in this document for a function that is common<br />

to several operators. Common actions are defined to effect economy by reducing<br />

repetition, to improve precision, and to provide a convenient reference for citation.<br />

Common actions are given three- and four- letter names like operators with a prefix of a,<br />

as in aACCE. It should be emphasized that a common action specification is a rhetorical<br />

device used to specify operators; it does not define an operator.<br />

Order of Execution<br />

Operators from the code stream are executed in sequence until the code stream is<br />

redirected by a branch, enter, or exit operation. The processor can perform individual<br />

operations in parallel and execute operators out of order, as long as the effective order of<br />

the program is preserved. For example, any value fetched or consumed by an operator<br />

must be the value stored or produced by the closest predecessor operator affecting that<br />

memory or stack location. These store-before-read and produce-before-consume<br />

restrictions apply within the code stream on a single processor, not necessarily between<br />

code streams on separate processors. Two processors cannot share the same stack at<br />

the same time; therefore, produce-consume relationships cannot apply. To enforce a<br />

store-read sequence between processors, the processes must explicitly use<br />

synchronizing operations.<br />

There are exceptions to the store-read sequence requirement when the words being<br />

read can have been captured by the processor as hidden optimization state; see<br />

"Program Restrictions Due to Hidden State" at the end of this section.<br />

5–2 6878 7530–007


Interrupts and Resumption<br />

Operator Set<br />

When an operator cannot be performed or completed according to the definition of its<br />

normal operation, an interrupt is generated, the operator is aborted, and a procedure of<br />

the operating system is entered. The interrupt procedure is provided enough information<br />

to determine the circumstances and take the appropriate action.<br />

Operator interrupts can generally be characterized as error reports or service requests,<br />

although the distinction is blurred. Errors can sometimes be corrected or used to induce<br />

special actions and services can be limited or denied.<br />

Service requests are implicit in most operations that can encounter these situations; only<br />

occasionally are they explicitly pointed out in this document.<br />

When a service request is honored (for example, a segment is made present in memory<br />

upon demand) or an error is accommodated, the code stream is resumed as the interrupt<br />

procedure is exited. Depending upon the circumstances, the interrupted operator is<br />

repeated or its successor proceeds. If the service cannot be performed or the error is<br />

unrecoverable, the interrupted code stream cannot be resumed. These resumption<br />

characteristics vary with interrupt type and circumstances.<br />

For more information on interrupts, see Section 4.<br />

Preconditions and Invariants<br />

Restart Mode<br />

Throughout this manual, restrictions are defined on structures, argument types, values,<br />

and so forth. These statements typically include words such as must, required, cannot,<br />

or valid; they define the preconditions and invariants for the correct functioning of the<br />

operators.<br />

In many cases, the processor detects violations of these restrictions and generates<br />

interrupts when violations occur. Some constraints are not enforced. Not all the checks<br />

applicable to the operator are mentioned in every operator description; many are<br />

described generally for a class of operator.<br />

When an interrupted code stream is resumed by repeating the interrupted operator,<br />

most operators can begin again to perform their normal function. Such operators are said<br />

to resume in initial mode. Sometimes, however, the resuming operator may not be able<br />

to start over from the beginning; for example, it might expect a different stack<br />

configuration or make different assumptions about some system state. For these<br />

operators, a restart mode is defined.<br />

The fact that an operator resumes in restart mode provides one bit of information; when<br />

more is required, the interrupt mechanism leaves a word on the stack for the restarted<br />

operator to consume as an extra argument.<br />

Restart mode occurs through accidental entry, as well as interrupts.<br />

6878 7530–007 5–3


Operator Set<br />

Restart mode is indicated by the rs bit in the stack lineage above an activation record;<br />

the bit is set as the procedure is entered by the interrupt mechanism or by accidental<br />

entry. The setting of the bit in these cases is determined by the operator and<br />

circumstances of the interruption. For explicit programmatic procedure entry, the bit is<br />

always reset. When an exit operator finds the bit set, the next operator executed is<br />

begun in restart mode.<br />

In general, the information implied by the use of restart mode must be preserved until<br />

the operator is completed. Once an operator has been resumed in restart mode, any<br />

subsequent interruption and resumption of the same operation must use restart mode.<br />

For details regarding the use of restart mode, see "Restart Configuration" in Section 4.<br />

Operator Applicability<br />

Most of the operators defined in this manual are generally applicable; compilers may use<br />

them in programs written by and for end users. Some operators are restricted to special<br />

uses or are being phased out; several classes of operators are indicated in this manual:<br />

1. Unrestricted: these operators are available for general use in user and system<br />

code files. Those operators that are new in <strong>Level</strong> <strong>Epsilon</strong> can be used only in code<br />

files to be run on such systems; most unrestricted operators may be used in<br />

"universal" code files or those that run in all supported systems.<br />

2. Obsolete: these operators have been unrestricted, but they are no longer<br />

necessary and should not be used.<br />

3. Partially restricted: these operators have some application in user programs only<br />

in special situations. The partial restriction applies because the operators are<br />

dangerous if abused, but there is no cost-effective alternative to their use in some<br />

user-program constructs.<br />

In addition to the partially restricted operators that are explicitly identified, there are<br />

restrictions on the application of other classes of operators that are not individually<br />

noted:<br />

• Logical, bit-field, and similar operators must be applied with care to data types<br />

other than operands.<br />

• Operators containing address couples must be used to reference only data<br />

within the program domain and of the appropriate type. (Delta values must be<br />

within the range of the activation record; Lambda must be in {1 to LL} in user<br />

programs, although it is software convention, rather than the architecture, that<br />

places user code segment dictionaries at lex level 1 rather than 0.)<br />

• Any operator that can consume an arbitrary top-of-stack input must be used only<br />

against items in the expression stack and never to consume an original DD or<br />

stack-linkage word.<br />

All partial restrictions are enforced by the compilers according to convention.<br />

4. Restricted: these operators do not appear in user programs; they are dangerous<br />

and their use is restricted to low-level code in the operating system. (See<br />

Appendix E.)<br />

5–4 6878 7530–007


Operator Set<br />

Some operators, not otherwise restricted, are obsolete either because they have been<br />

superseded by more suitable operators or because they are deemed not to be costeffective.<br />

Obsolete operators should not be used by compilers; there are better<br />

constructs on all supported systems.<br />

Obsolete and restricted are noted in the individual operator specifications and are flagged<br />

in Appendix C.<br />

Expression Stack Control<br />

Most operators require items from the top of the expression stack and/or leave their<br />

results on top of the stack. Stack items required by operators are called arguments. They<br />

are normally consumed; that is, they are used and deleted from the stack. For<br />

consistency and brevity, this manual always defines arguments as deleted; any<br />

argument not consumed is defined as becoming an output.<br />

Only the double precision operand (tag-2 pair) is treated in the expression stack as a<br />

single two-word item. All other data types are treated as single word items when<br />

encountered as arguments and are pushed or popped as single words.<br />

Processors can capture up to seven expression-stack items internally; the remainder is in<br />

memory in the current stack. The S register designates the topmost word in the memory<br />

stack; the processor automatically moves data between memory and the registers as<br />

necessary. The value of S is independent of any argument registers; that is, the register<br />

contents must be actually pushed into memory in computing S.<br />

Items in registers are not addressable with address couples; a PUSH or enter operation<br />

is required to move the expression stack into the activation record.<br />

The point at which Stack Overflow occurs is dependent upon the number of expressionstack<br />

registers and how they are used; the interrupt need not occur on the operator<br />

whose output moved virtual S beyond the stack. It is appropriate to consider this<br />

interrupt an asynchronous service exception.<br />

Top-of-Stack Push Operations<br />

Operators that produce top-of-stack results must push them, in order, onto the<br />

expression stack. Such a push operation only writes the memory stack if there is not<br />

enough room in the processor's TOS registers. If the topmost word of the stack is<br />

reached in a push operation, a Stack Overflow interrupt is generated. The interrupt does<br />

not occur between the two words of a double precision item. If it occurs after the<br />

implicit Mark Stack through the Enter operation of an interrupt generation or accidental<br />

entry, the entry’s incipient activation record is below the stack overflow frame, and the<br />

exit from that frame is forced to resume the entry by a HISW action status.<br />

In processor state, a double precision operand is treated as a 96-bit operand with a single<br />

tag equal to two. When a tag-2 item is pushed onto the stack, the high order and low<br />

order words are written in that order, both with tags of two.<br />

6878 7530–007 5–5


Operator Set<br />

Top-of-Stack Pop Operations<br />

Any operator that requires a stack argument must pop it from the expression stack. Such<br />

a pop operation only reads the memory stack if there are not enough items in the<br />

processor's TOS registers. If the word at the top of the memory stack has tag equal to<br />

two, the word below is also popped. The top and next words are taken as the second<br />

and first words of a double precision operand. (Note that because argument items may<br />

be either single or double words, multiple arguments must be accessed by popping<br />

them in order, from the topmost down.)<br />

Operands, references, and other unprotected items that have been explicitly pushed into<br />

the addressing environment can be consumed as arguments, in which case, they<br />

automatically migrate back into the expression stack. Protected items such as original<br />

DDs, POWs, and stack linkage words do not migrate in this way, however PCWs do so<br />

that they can be deleted.<br />

Stack Underflow is detected if a pop operation attempts to consume the stack linkage.<br />

Ideally, the lowest address that can be popped should be MAX(F+1,D[LL]+2) to protect<br />

both entered and incipient ARs. However, most Libra systems enforce only one of the<br />

checks, comparing S to F.<br />

Stack-State Transformation<br />

Stack state includes the top-of-stack items and the stack-addressing registers. Most<br />

operators take arguments from and place results on the stack without affecting any<br />

register except S.<br />

Top-of-stack transformations are shown by diagrams that display inputs and outputs in<br />

order from top downward:<br />

Input items Output items<br />

(arguments) (results)<br />

The effects of the transformation is that all the inputs are consumed and all the outputs<br />

are created. "Null ==>" and "==> Null" indicate that the operator has no inputs or outputs,<br />

respectively. There is an implicit variant. The item that was on the stack below the<br />

lowest input (if any) remains on the stack below the lowest output (if any), unaffected by<br />

the top-of-stack transformation of the operator. The input items are shown for the initial<br />

mode of the operator; some operators have additional stack input arguments in restart<br />

mode.<br />

Initial stack items are designated Id: type(interpretation), where Id and interpretation are<br />

optional. Type may be a data type, as defined in Section 2 or a list of such types; any<br />

indicates no type restriction. An Id, if included, is a distinguishing name indicating how<br />

the item is to be used and/or establishing a reference for the final stack state. The<br />

generic names TOS and TOS2 represent the top-of-stack and second-from-top items.<br />

Interpretation is shown if the operator applies one of several possible interpretations of<br />

the type.<br />

5–6 6878 7530–007


Operator Set<br />

Final stack items are designated similarly. An Id or Id' indicates that the result is the<br />

named argument in identical or modified form, respectively; the modified argument has<br />

the same type unless another type is shown.<br />

A simple description of inputs into outputs is inadequate for operators that modify stack<br />

linkages and registers. Schematic stack-state transformation diagrams illustrate these<br />

operations.<br />

Expression Stack Treatment of Word Extension<br />

General Use<br />

The following states the general nonreference treatment of extensions for top-of-stack<br />

arguments and results, including targets of evaluation. The behavior of many specific<br />

operators or operator groups is defined later in this section.<br />

Generally, a single word top-of-stack argument with a nonzero extension, but not used<br />

as a reference, treats it as a 4-bit entity somewhat like a second tag, except that it has<br />

no type implications.<br />

1. Result extension: If an operator selects the argument's tag as the result tag, it also<br />

selects the argument's extension. If an operator selects an argument or target as the<br />

result, or only modifies the tag of an argument (for example, STAG) or target (for<br />

example, aFOP), it generally preserves the extension. The definitions of SASF, SASP,<br />

SSTN, and SEXT requires each to change the extension. In general, all other cases<br />

zero the result extension.<br />

2. Result value: If an operator includes the argument's tag as part of function's bit<br />

vector (e.g. SAME), it includes the argument's extension also. The definitions of<br />

GASF, GASP, GSTN, and GEXT requires each to use the extension. In general, all<br />

other cases ignore the argument's extension in generating the non-extension part of<br />

the result .<br />

Double precision top-of-stack arguments follow the above guidelines for the most<br />

significant word. The extension of the least significant word should never be used.<br />

Descriptor Interpretation<br />

Most of the data and all the code in ClearPath MCP systems reside in memory<br />

segments described by VSDs. The address of a particular memory word is computed by<br />

adding an index to the base address of an actual segment. For data, the index and the<br />

reference to the base of the actual segment are combined into a single item, an<br />

IndexedDD.<br />

The word referenced by an IndexedDD is located by adding the word index and the base<br />

address of the actual segment. The word index in an IndexedDD must be verified against<br />

the length field in the designated ASD.<br />

For the referenced word to be accessed, the segment must be present. The presence<br />

indication is in the ASD. Any attempt to access data in a nonpresent segment results in<br />

an Absent Segment exception.<br />

6878 7530–007 5–7


Operator Set<br />

Code is normally referenced via a PCW. (For edit-mode code executed as a result of an<br />

enter-table-edit operator, the reference is an IndexedDD.) The Make PCW operation<br />

replaces the address couple in the PCW skeleton with an ASD_number, so the PCW is a<br />

complete reference, analogous to the IndexedDD. Any attempt to enter or branch to a<br />

non-present code segment results in an Absent Segment exception.<br />

Computational Operators<br />

Operators in this group are loosely termed computational operators because they take<br />

arguments directly from the stack and leave some form of result on top of the stack.<br />

Computational operators will not evaluate references; their arguments must be items on<br />

the stack initially. Required parametric values may be static code parameters or dynamic<br />

stack arguments.<br />

Numeric Operand Interpretation<br />

Operators in this group act on single or double precision operands interpreted as integers<br />

or floating-point numbers.<br />

The extension and the leftmost bit of an operand play no role in numerical computation.<br />

With certain exceptions defined for NTGR, numerical computation and type transfers<br />

leave bit 47 in an undefined state.<br />

Representable Values<br />

Consider the set V of all representable values. V is a subset of the rational numbers. An<br />

element of V can be represented by a 3-tuple (mi, mf, e), where:<br />

mi is the integer part of the mantissa<br />

mf is the fractional part of the mantissa<br />

e is the exponent<br />

The symbols +, -, *, / are used to denote the usual arithmetic operations on rationals and<br />

the symbol ** denotes exponentiation.<br />

Let p = maximum number of octal digits in mi;<br />

d = maximum number of octal digits in mf;<br />

q = maximum number of octal digits for the exponent;<br />

m = mi + mf * 8**(-d)<br />

The set M of representable mantissas is<br />

M = { m : 0


Operator Set<br />

For p=13, d=0, q=2, e=0: V=I, the set of representable single<br />

precision integers.<br />

p=13, d=0, q=2: V=S, the set of representable single<br />

precision floating-point values.<br />

p=13, d=13, q=5, e=13: V=Id, the set of representable double<br />

precision integers.<br />

p=13, d=13, q=5: V=D, the set of representable double<br />

precision floating-point values.<br />

A representation is defined to be normalized if |mi| >= 8**(p-1) or if mi = mf = e = 0.<br />

That is, a normalized representation is either zero in all components, or is non-zero in the<br />

high-order octade of the mantissa. The set Vn of normalized values is thus defined as a<br />

subset of V:<br />

Vn = { v : v in V and ( 8**(p-1)


Operator Set<br />

The notion of digit significance can be quantified in terms of the value of a "1" in the<br />

lowest-order digit of the mantissa. The unit value for any representation v = m * 8**e in<br />

V is u(v) = 8**(e-d). A rounding function must choose a value of v that is not more than<br />

u(v)/2 different from the value of k. A truncation function must choose a value of v such<br />

that |v|


Rounding Function R<br />

Operator Set<br />

A rounding function R is defined below; R selects the element of V' that is closest to the<br />

desired value. If two elements of V' are equally close to the desired value, the element<br />

larger in absolute value is chosen.<br />

The rounding function partitions the real line into intervals and maps each interval onto a<br />

representative element of that interval.<br />

Example:<br />

Consider<br />

v = m * 8**e in V’ (with (mi,mf,e) in normal form); let c = 1/2 * 8**(- d).<br />

Then the intervals and their representative values are defined so that v is the<br />

representative value for all x > 0 in the interval<br />

0 < lb(v) 1 - 8**q}<br />

<br />

<br />

and ub(v) = (m+c) * 8**e.<br />

v is the representative value for all x < 0 in the interval<br />

-ub(-v) < x


Operator Set<br />

R: K V union { TooSmall, TooBig }<br />

let alpha = c * 8**(1 - 8**q)<br />

omega = (8**p - c) * 8**(8**q - 1)<br />

<br />

TooBig omega


Magnitude Round-to-Integer Function Ri<br />

Operator Set<br />

In order to integerize a value by rounding the absolute value, a special rounding function<br />

is necessary. This function, Ri, is analogous to R, but integer elements of V are chosen<br />

instead of elements of V'.<br />

Ri: K V union { TooBig } such that<br />

for every k in K, with integer v<br />

and omega = 8**(d+p) - 1/2,<br />

<br />

TooBig omega


Operator Set<br />

Algebraic Round-to-Integer Function Rai<br />

A second special rounding function, Rai, is defined to round an algebraic (signed) value to<br />

an integer. This function is the same as Ri, except that if two integers are equally close<br />

to the desired value, the algebraically larger integer is chosen.<br />

Rai: K V union { TooBig }<br />

for every k in K, with integer v<br />

and omega = 8**(d+p) - 1/2<br />

<br />

TooBig omega


Truncation Function T<br />

Operator Set<br />

The truncation function T chooses the value in V' with the largest absolute value not<br />

greater than the absolute value of the desired value k. T partitions the real line into a<br />

different set of intervals from those of R.<br />

Consider v = m * 8**e in V' (with (mi, mf, e) in normal form). Then the intervals and their<br />

representative values are defined such that:<br />

v is the representative value for all x > 0 in the interval<br />

0 < v


Operator Set<br />

Magnitude Truncate-to-Integer Function Ti<br />

In order to integerize a value by truncation, a special integer truncation function is<br />

necessary. This function, Ti, is analogous to T, but integer elements of V are chosen<br />

instead of elements of V'.<br />

Ti: K V union { TooBig } such that<br />

for every k in K with integer v<br />

and omega = 8**(p+d):<br />

<br />

TooBig omega


Normalization Function N<br />

Operator Set<br />

A normalization function, N, is needed to put results in normalized form. Because Vn is a<br />

subset of V' and every element of V has a unique representation in V', every<br />

normalizable element of V has a unique normalized representation in Vn.<br />

N: V Vn union { TooSmall } such that<br />

for alpha = 8**(p-1) * 8**(1 - 8**q) = 8**(p - 8**q),<br />

<br />

v (normalized) alpha


Operator Set<br />

Approximation Functions<br />

For arithmetic operations, a class of rounding functions R has been defined to map the<br />

set of arithmetic results, K, into the set<br />

V union {TooBig, TooSmall}<br />

The definition of R does not depend on the fact that K is a set of rational numbers; the<br />

same function R can be applied to map the set K* onto the result set, where<br />

K* = { k : k = f(x) or k = f(x,y), x,y in V<br />

and in the domain of f }<br />

and f is a computable function of one or two variables.<br />

As shown, R(f) could be used to define the correct value of the function. However, it<br />

may be impractical to evaluate mathematical functions with sufficient precision and<br />

accuracy to make such a definition useful. Instead, approximations are computed; rather<br />

than defining one correct result, the set of results that are sufficiently close to the<br />

correct one are defined.<br />

Informally, the set of approximate values Aj(x) to the true value x includes those values<br />

that differ from x by no more than j times the value of the low-order bit, if the mantissa is<br />

a normal representation of x.<br />

The set Aj(x) contains at most 2j+1 values near x. There is a nearest number, which is an<br />

element of Aj(x), defined by the Rounding function R(x). The other elements are the<br />

subset of v in V such that R(x + h*u(v')) = v, where v' is the representation of v in normal<br />

form, u is the unit function, and h is a nonzero integer in the range {-j to j}. It is possible<br />

for Aj(x) to contain only TooBig or TooSmall or to contain one of those values and up to 2j<br />

representable values.<br />

The processor will choose an element of Aj(x) as its representation of x. Any element is<br />

acceptable. If TooBig or TooSmall is chosen, an Exponent Overflow or Exponent<br />

Underflow exception is generated, respectively.<br />

Aj is a set-generating function based on the class of rounding functions R. The sets of<br />

single and double precision approximations ASj(x) and ADj(x) are defined by the specific<br />

rounding functions RS and RD, respectively.<br />

Note: AS0(x) = {RS(x)} and AD0(x) = {RD(x)}<br />

If f(v) equals zero for some representable value v in V, then Aj(f(v)) equals zero. For<br />

example, square root must return zero for the argument 0.<br />

5–18 6878 7530–007


Numeric-Interpretation Operators<br />

Operator Set<br />

The operators in the following groups interpret operands numerically as a primary part of<br />

their function; numeric interpretation also occurs as some part of the function of<br />

operators in other groups.<br />

For dyadic operators, the second from top of stack operand is denoted x and the top<br />

operand y. Unless a diagram is included in the operator definition, dyadic operators effect<br />

the following transition. Note that real interpretation includes integers as a subset.<br />

<br />

<br />

y: opnd(real) <br />

Top-of-stack <br />

<br />

transformation: <br />

x: opnd(real) opnd(real) <br />

<br />

<br />

For monadic operators, the top of stack operand is denoted x.<br />

<br />

Top-of-stack <br />

x: opnd(real) opnd(real) <br />

transformation: <br />

<br />

Arithmetic Operators<br />

Arithmetic operators are dyadic, except for NORM, which is monadic.<br />

Dyadic operators generate a single precision result if both operands are single precision<br />

and a double precision result if either or both operands are double precision. Where<br />

required, single precision is extended to double precision prior to the operation by<br />

appending a second word of all zeros; note that the numeric value of the operand is not<br />

changed.<br />

Let AxB signify the Cartesian product of two sets A and B. The definition for the<br />

following arithmetic operators deals only with the domains SxS and DxD. Since S is a<br />

subset of D, the domains SxD and DxS are considered special cases of DxD.<br />

The ranges of the operators are subsets of V, depending upon the values of p, d, and q<br />

and upon the rounding or truncation function invoked by the particular operator. If the<br />

result is TooSmall or TooBig, an interrupt appropriate to the operation is generated.<br />

6878 7530–007 5–19


Operator Set<br />

ADD <br />

ADD requires two operands on top of the stack. The numeric values of the two operands<br />

are algebraically added and rounded, and the result is left on top of the stack.<br />

or<br />

ADD: S x S S union { TooBig }<br />

such that x ADD y = RS(x+y) for x,y in S<br />

D x D D union { TooBig }<br />

such that x ADD y = RD(x+y) for x,y in D but<br />

not x,y in S.<br />

For x,y in S or D, 0 < |x ADD y| < alpha cannot occur, so Exponent Underflow is never<br />

generated by ADD. If both x and y are single_integers and the absolute value of the sum<br />

is less than 8**13, then the result is a single_integer.<br />

SUBT <br />

SUBT requires two operands on top of the stack. The numeric value of the top item is<br />

algebraically subtracted from the numeric value of the second item and rounded and the<br />

result is left on top of the stack.<br />

or<br />

SUBT: S x S S union { TooBig }<br />

such that x SUBT y = RS(x-y) for x,y in S,<br />

D x D D union { TooBig }<br />

such that x SUBT y = RD(x-y) for x,y in D but<br />

not x,y in S.<br />

For x,y in S or D, 0 < |x SUBT y| < alpha cannot occur, so Exponent Underflow is never<br />

generated by SUBT. If both x and y are single_integers and the absolute value of the<br />

difference is less than 8**13, then the result is a single_integer.<br />

MULT <br />

MULT requires two operands on top of the stack. The numeric values of the two<br />

operands are algebraically multiplied and rounded and the result is left on top of the<br />

stack.<br />

or<br />

MULT: S x S S union { TooSmall, TooBig }<br />

such that x MULT y = RS(x*y) for x,y in S,<br />

D x D D union { TooSmall, TooBig }<br />

such that x MULT y = RD(x*y) for x,y in D<br />

but not x,y in S<br />

If both x and y are single_integers and the absolute value of the product is less than<br />

8**13, then the result is a single_integer.<br />

5–20 6878 7530–007


MULX <br />

Operator Set<br />

MULX requires two operands on top of the stack. Any single precision operand is<br />

extended to double precision before the numeric values are algebraically multiplied and<br />

rounded. The double precision result is left on top of the stack.<br />

<br />

<br />

y: opnd(real) <br />

Top-of-stack <br />

<br />

transformation: <br />

x: opnd(real) dp(real) <br />

<br />

<br />

MULX over SxS is equivalent to a combination of XTND over S and MULT over DxD.<br />

MULX over DxD is equivalent to MULT over DxD.<br />

DIVD <br />

DIVD requires two operands on top of the stack. The numeric value of the second item<br />

is algebraically divided by the numeric value of the top item and rounded, and the result<br />

is left on top of the stack. If the divisor (top of stack operand) equals zero, a Divide by<br />

Zero exception is generated; if the code stream is resumed, the result of the operator is<br />

a zero of appropriate type (single or double precision).<br />

or<br />

DIVD: S x S S union { TooSmall, TooBig }<br />

such that x DIVD y = RS(x/y) for y < > 0<br />

and x,y in S,<br />

IDIV <br />

D x D D union { TooSmall, TooBig }<br />

such that x DIVD y = RD(x/y) for<br />

y < > 0 and x,y in D but not x,y in S.<br />

IDIV requires two operands on top of the stack. The numeric value of the second item is<br />

algebraically divided by the numeric value of the top item. The fractional part of the<br />

floating point quotient is discarded and the integer part is left on top of the stack in<br />

canonical integer representation.<br />

<br />

<br />

y: opnd(real) <br />

Top-of-stack <br />

<br />

transformation: <br />

x: opnd(real) opnd(integer) <br />

<br />

<br />

6878 7530–007 5–21


Operator Set<br />

If the divisor (top of stack operand) equals zero, a Divide by Zero exception is generated;<br />

if the code stream is resumed, the result of the operator is a zero of the appropriate type<br />

(single or double precision).<br />

or<br />

IDIV: S x S I union { TooBig }<br />

such that x IDIV y = TI(x/y) for y < > 0<br />

and x,y in S,<br />

D x D Id union { TooBig }<br />

such that x IDIV y = TId(x/y)<br />

for y < > 0 and x,y in D but not x,y in S.<br />

If an Integer Overflow exception occurs and the code stream is resumed, the result of<br />

the operator is an integer representation of appropriate type (single or double precision)<br />

and the value is the maximum integer of appropriate type and sign.<br />

RDIV <br />

RDIV requires two operands on top of the stack. The numeric value of the second item is<br />

divided by the numeric value of the top item. The integer quotient with remainder is<br />

generated and only the remainder is left on top of the stack. The sign of the result is the<br />

same as the sign of the second item (the dividend).<br />

If the divisor (top of stack operand) equals zero, a Divide by Zero exception is generated;<br />

if the code stream is resumed, the result of the operator is a zero of the appropriate type<br />

(single or double precision).<br />

or<br />

RDIV: S x S S union { TooBig }<br />

such that x RDIV y = x - (TI(x/y) * y)<br />

for y < > 0 and x,y in S,<br />

D x D D union { TooBig }<br />

such that x RDIV y = x - (TId(x/y) * y)<br />

for y < > 0 and x,y in D but not x,y in S.<br />

If both x and y are single_integers, then the result is a single_integer.<br />

If an Integer Overflow exception occurs and the code stream is resumed, the result of<br />

the operator is of appropriate type (single or double precision) and the value is zero.<br />

NORM <br />

NORM requires an operand on the top of the stack. If the operand is single precision, it<br />

is converted to normalized single precision representation. If the operand is double<br />

precision, it is converted to normalized double precision representation.<br />

or<br />

NORM: S S union { TooSmall }<br />

such that NORM x = NS(x) for x in S,<br />

D D union { TooSmall }<br />

such that NORM x = ND(x) for x in D.<br />

5–22 6878 7530–007


AMIN and AMAX <br />

Operator Set<br />

AMIN and AMAX require two operands on top of the stack. The numeric values of the<br />

two operands are compared and the arithmetically lesser (or greater) of the two operand<br />

values is left as the result on top of the stack. If one of the input operands is single<br />

precision and the other input operand is double precision, the single precision operand is<br />

extended before the comparison and a double precision result is generated. If both of<br />

the inputs are single_integers, then so is the result.<br />

AMIN: S x S S (x,y in S) or<br />

D x D D (x,y in D but not x,y in S) such that<br />

<br />

x if x = y <br />

<br />

AMAX: S x S S (x,y in S) or<br />

D x D D (x,y in D but not x,y in S) such that<br />

<br />

y if x = y <br />

<br />

Numeric Relational Operators<br />

These six dyadic operators algebraically compare two real arguments to generate a<br />

Boolean result:<br />

EQUL <br />

NEQL <br />

LESS <br />

LSEQ <br />

GRTR <br />

GREQ <br />

<br />

Top-of-stack y: opnd(real) <br />

<br />

transformation: x: opnd(real) sp(Boolean) <br />

<br />

The operators are defined for x,y in S union D. The result is True or False, expressing the<br />

truth of the proposition x : y, where : represents the relation expressed in the operator<br />

name.<br />

6878 7530–007 5–23


Operator Set<br />

Range Test Operator<br />

Range Test computes the result of a double arithmetic inequality, L


Operator Set<br />

If RaI(x) equals TooBig, an Integer Overflow exception occurs. If the code stream is<br />

resumed, the result of the operator is a single_integer and the value is 8**13-1 with<br />

appropriate sign.<br />

If the argument is a nonzero single_integer, the result is the unmodified argument,<br />

therefore, bits [47:3] are preserved. For any other argument value, none of those three<br />

bits is set in the result if the corresponding bit is zero in the argument.<br />

NTIA <br />

NTIA requires an operand on top of the stack. The operand is converted to single_integer<br />

representation and the result is left on top of the stack. The top-of-stack transformation<br />

is the same as for NTGR.<br />

or<br />

NTIA: S I union { TooBig }<br />

D I union { TooBig }<br />

such that NTIA x = TI(x) for x in S or D<br />

If an Integer Overflow exception occurs and the code stream is resumed, the result of<br />

the operator is a single_integer and the value is 8**13-1 with the appropriate sign.<br />

SNGL <br />

SNGL requires an operand on top of the stack. The operand is converted to normalized<br />

single precision representation and is left on top of the stack.<br />

<br />

Top-of-stack <br />

x: opnd(real) sp(real) <br />

transformation: <br />

<br />

SNGL: S Sn union { TooSmall }<br />

such that SNGL x = NS(x) for x in S,<br />

or<br />

D Sn union { TooSmall, TooBig }<br />

such that SNGL x = NS(RS(ND(x))) for x in D.<br />

SNGT <br />

SNGT requires an operand or copy WordDD on top of stack. An IndexedDD must have<br />

reindex enabled.<br />

If the argument is an operand, it is converted to normalized single precision<br />

representation and left on top of the stack. The top-of-stack transformation is the same<br />

as for SNGL.<br />

or<br />

SNGT: S Sn union { TooSmall }<br />

such that SNGT x = NS(x) for x in S,<br />

D Sn union { TooSmall, TooBig }<br />

such that SNGT x = NS(TS(ND(x))) for x in D.<br />

6878 7530–007 5–25


Operator Set<br />

If the argument is SingleDD, it is left on the stack unchanged. If the argument is a<br />

DoubleDD, it is left on the stack as a SingleDD and the element_size is set to single<br />

precision.<br />

<br />

Top-of-stack <br />

TOS: WordDD TOS’: SingleDD <br />

transformation: <br />

<br />

SNGT applied to a WordDD is equivalent to SESW applied to the same argument; this<br />

use of SNGT is obsolete.<br />

NTGD <br />

NTGD requires an operand on top of the stack. The operand is converted with rounding<br />

to double_integer representation and the result is left on the top of the stack.<br />

<br />

Top-of-stack <br />

x: opnd(real) dp(integer) <br />

transformation: <br />

<br />

NTGD: S Id union { TooBig }<br />

such that NTGD x = RId(XTND(x)) for x in S,<br />

or<br />

D Id union { TooBig }<br />

such that NTGD x = RId(x) for x in D.<br />

If the Integer Overflow exception occurs and code stream is resumed, the result of the<br />

operator is a double_integer and the value is 8**26-1 with appropriate sign.<br />

NTTD <br />

NTTD requires an operand on top of stack. The operand is converted with truncation to<br />

double_integer representation and the result is left on top of the stack. The top-of-stack<br />

transformation is the same as for NTGD.<br />

or<br />

NTTD: S Id union { TooBig }<br />

such that NTTD x = TId(XTND(x)) for x in S,<br />

D Id union { TooBig }<br />

such that NTTD x = TId(x) for x in D.<br />

If the Integer Overflow exception occurs and code stream is resumed, the result of the<br />

operator is a double_integer; the value is 8**26-1 with appropriate sign.<br />

5–26 6878 7530–007


Binary-to-Decimal Conversion<br />

Operator Set<br />

The binary-to-decimal conversion operators are variations of the scale right final<br />

operators; the result is a decimal digit sequence representing the remainder of the<br />

division by a power of ten. There are two operators: a static form (BCD) with the number<br />

of digits specified as a code parameter and a dynamic form (DBCD) with the number of<br />

digits supplied as a stack argument.<br />

The number to be converted is a stack argument that must be an operand; if necessary,<br />

that argument is integerized with the RId function. This integerized argument is referred<br />

to in the next examples as B (the binary integer). If Integer Overflow exception occurs<br />

because RId equals TooBig and then the code stream is resumed, the result of the<br />

operation is single or double precision according to the value of N (as specified in the<br />

next paragraph) and the value is all nines.<br />

|B| mod 10**N is converted to a sequence of N digits (each in the range {hex 0 to hex<br />

9}), where N is provided as a code parameter or a stack argument. N must be in the<br />

range {0 to 24}. The result is left-justified in an operand, which is single precision if N is<br />

12 or less and double precision if N is in the range {13 to 24}. The contents of the<br />

operand beyond the N-digit sequence are undefined.<br />

EXTF is set to: false (positive) if B >= 0,<br />

true (negative) if B < 0 and |B| mod 10**N > 0,<br />

undefined state if B < 0 and |B| mod 10**N = 0.<br />

OFFF is set to: true (overflow) if |B| >= 10**N,<br />

unchanged if |B| < 10**N.<br />

BCD <br />

The B operand is the only stack argument; N is a code parameter:<br />

<br />

Operator <br />

BCD N <br />

format: <br />

<br />

<br />

Top-of-stack <br />

B: opnd(real) opnd(BCD) <br />

transformation: <br />

<br />

DBCD <br />

Two operand stack arguments are required:<br />

<br />

<br />

N: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

B: opnd(real) opnd(BCD) <br />

<br />

<br />

6878 7530–007 5–27


Operator Set<br />

The topmost argument is integerized with the RaI rounding function, if necessary, to<br />

produce N. The second argument provides B.<br />

Mathematical Function Operator<br />

RSQR <br />

RSQR produces single precision approximations if the input is single and produces<br />

double precision approximations if the input is double.<br />

The argument must be an operand that is greater than or equal to zero.<br />

RSQR: { s : s in S and s >= 0 } S<br />

such that RSQR x in AS1(square root(x))<br />

or<br />

{ d : d in D and d >= 0 } D<br />

such that RSQR x in AD1(square root(x))<br />

The result of RSQR is greater than or equal to zero.<br />

Integer Representation Conversion Operators<br />

The two operators in this group perform conversions between signed-magnitude and 32bit<br />

two’s complement representations of single precision integers over a limited range of<br />

values. The range of result values (interpreted in the respective result representation) for<br />

both operators is:<br />

-(2**31) to 2**31-1<br />

Both the input stack argument and the result are single precision integers:<br />

<br />

Top-of-stack <br />

x: sp(integer) sp integer <br />

transformation: <br />

<br />

The canonical representation for a 32-bit two’s complement integer is a single precision<br />

operand with the high order 16 bits ([47:16]) set to zero. Bit 31 is treated as the sign. If<br />

that bit is false (zero), the remaining 31 bits directly represent the value as a positive<br />

integer. If bit 31 is true (one), the value is a negative integer whose magnitude is<br />

obtained by subtracting the value from 2**32.<br />

The argument for either operator must be a single precision integer operand in<br />

single_integer representation; no integerization will be performed. For input argument<br />

values within the valid range of results, the result value will remain the same, converted<br />

to the other representation. For both operators, bits [47:1] and [45:14] of the result will<br />

be zero.<br />

5–28 6878 7530–007


CVS2 <br />

Operator Set<br />

The input argument is a signed single precision E-Mode integer operand. Bits [38:7] of<br />

the input are ignored and have no effect on the result.<br />

If the input is positive or the low order 32 bits of the argument are zero, the result is the<br />

low order 32 bits of the argument. Note that the two’s complement interpretation of the<br />

result will be negative if the result, taken as a 32 bit binary number, is greater than<br />

2**31-1.<br />

If the input argument is negative (any magnitude with low order 32 bits of zero is treated<br />

as positive, regardless of sign), the result is the 32-bit integer calculated by subtracting<br />

the low order 32 bits of the argument magnitude from 2**32. Note that the two’s<br />

complement interpretation of the result will be positive if the result, taken as a 32 bit<br />

binary number, is less than 2**31<br />

Bit 46 of the result will be zero.<br />

CV2S <br />

The input argument is a single precision E-Mode 32-bit integer.<br />

If the input value (as truncated) is positive (bit 31 false), the result is the positive E-Mode<br />

integer with that value, which will be less than 2**31.<br />

If the input value is negative (bit 31 true), the result is a negative E-Mode integer with<br />

the magnitude calculated by subtracting the input value from 2**32.<br />

Bit Vector Interpretation<br />

This group of operators provides various functions. Those operators that act on stack<br />

items either interpret the items as bit vectors or deal with the word as whole. In general,<br />

there are few restrictions on the type of stack items that are acted upon.<br />

Logical Operators<br />

Logical operators require one or two top-of-stack items. Either item may be of any type.<br />

The items are interpreted as 48-bit vectors, unless one or both are double precision<br />

items. In that case, they are interpreted as 96-bit vectors and if only one of the two<br />

items is double precision, the other is extended with 48 zero bits (whether that item is<br />

an operand or not).<br />

The logical operation is applied in parallel to each bit of the vectors and the result is left<br />

on top of the stack. For the monadic LNOT operator, the tag and extension of the result<br />

is the same as the tag and extension of the top of stack item. For the dyadic logical<br />

operators, the result is double precision if either argument is double precision;<br />

otherwise, the tag and extension of the result is the tag and extension of the second<br />

from top item.<br />

6878 7530–007 5–29


Operator Set<br />

The four logical operations are illustrated here in binary notation:<br />

NOT 01 = 10<br />

0011 AND 0101 = 0001<br />

0011 OR 0101 = 0111<br />

0011 EQV 0101 = 1001<br />

The dyadic logical operators effect the following transition:<br />

<br />

<br />

any(bit-vector) <br />

Top-of-stack <br />

<br />

transformation: <br />

any(bit-vector) any(bit-vector) <br />

<br />

<br />

LAND <br />

LAND requires two top-of-stack items. The logical AND of the two bit vectors is left on<br />

top of the stack.<br />

LOR <br />

LOR requires two top-of-stack items. The logical OR of the two bit vectors is left on top<br />

of the stack.<br />

LEQV <br />

LEQV requires two top-of-stack items. The logical EQV (equivalence) of the two bit<br />

vectors is left on top of the stack.<br />

LNOT <br />

LNOT requires a single top-of-stack item. All bits of the vector are complemented and its<br />

tag remains unchanged.<br />

<br />

Top-of-stack <br />

item: any(bit-vector) item’ <br />

transformation: <br />

<br />

Logical Relational Operator<br />

SAME <br />

SAME requires two top-of-stack items. The items are interpreted as 56- bit vectors<br />

(including tag and extension bits). If all corresponding bits of the two vectors have the<br />

same value, a True result is left on top of the stack; otherwise, a False result is left. If<br />

both items are double precision, the bit vector interpretation includes the second words.<br />

Note that if only one item is double precision, the result is necessarily false.<br />

5–30 6878 7530–007


any(bit-vector) <br />

Top-of-stack <br />

<br />

transformation: <br />

any(bit-vector) sp(Boolean) <br />

<br />

<br />

Literal Operators<br />

Literal operators place a single precision constant on top of the stack:<br />

<br />

Top-of-stack <br />

Null sp <br />

transformation: <br />

<br />

ZERO <br />

Operator Set<br />

ZERO leaves on top of the stack a single precision word with all bits initialized to zero.<br />

ONE <br />

ONE leaves on top of the stack a 1-bit integer equal to one.<br />

LT8 <br />

LT8 leaves on top of the stack an 8-bit integer that is a copy of its one-syllable<br />

parameter.<br />

<br />

Operator <br />

LT8 Constant <br />

format: <br />

<br />

LT16 <br />

LT16 leaves on top of the stack a 16-bit integer that is a copy of its two-syllable<br />

parameter.<br />

<br />

Operator <br />

LT16 Constant <br />

format: <br />

<br />

LT48 <br />

LT48 leaves on top of the stack a single precision operand that is a copy of its six-syllable<br />

parameter. The parameter is taken from the first code word following the LT48 op code.<br />

6878 7530–007 5–31


Operator Set<br />

Padding syllables, if any, from the op code to the end of the word containing the op code<br />

are ignored.<br />

<br />

Operator ignored <br />

LT48 Constant <br />

format: if any <br />

<br />

word aligned <br />

Bit Vector Type Transfer Operators<br />

Operators in this group perform the following operations on the top-of-stack items.<br />

STAG Set the tag to an arbitrary value from the top of stack.<br />

XTND Append a low-order word of zeros, if necessary, to form a double precision<br />

operand, or set the element_size of a wordDD to double precision.<br />

JOIN Join two operands to form one double precision operand.<br />

SPLT Split an operand into two single precision operands.<br />

STAG <br />

STAG requires a tag value and an object item on top of the stack and leaves as its result<br />

an item whose tag is the tag value and whose 48 bits and 4-bit extension are copied<br />

from the object item.<br />

<br />

<br />

tag: sp opnd <br />

Top-of-stack <br />

<br />

transformation: <br />

object: any object’ <br />

<br />

<br />

The topmost argument must be a single precision operand. The tag value is extracted<br />

from field [3:4]; the remainder of the operand is ignored.<br />

The tag value must not be 2.<br />

The STAG operator is partially restricted; in user code, the only valid tag values are 4, 5,<br />

and 6.<br />

XTND <br />

XTND requires an operand or a copy WordDD on top of the stack. An IndexedDD must<br />

have reindex enabled.<br />

If the argument is a double precision operand, it is left on the stack unchanged. If it is<br />

single precision operand, it is converted to double precision representation by appending<br />

a second word whose fields are initialized to zero; the double precision result is left on<br />

the stack. Note that its numeric value is not changed.<br />

5–32 6878 7530–007


Top-of-stack <br />

TOS: opnd TOS’: dp <br />

transformation: <br />

<br />

Operator Set<br />

If the argument is a DoubleDD, it is left on the stack unchanged. If the argument is a<br />

SingleDD, it is left on the stack as a DoubleDD and its element_size is set to double<br />

precision.<br />

<br />

Top-of-stack <br />

TOS: WordDD TOS’: DoubleDD <br />

transformation: <br />

<br />

XTND applied to a WordDD is equivalent to SEDW applied to the same argument; this<br />

use of XTND is obsolete.<br />

JOIN <br />

JOIN requires two operands on top of the stack. A double precision item is constructed<br />

from the two operands and the result is left on top of the stack.<br />

The first and second words of the double precision result are taken from the first words<br />

of the second and top operands, respectively. The following possibilities arise from<br />

combinations of single and double precision operands:<br />

<br />

<br />

1) sp(w1) 3) dp(w1,w2) <br />

<br />

<br />

<br />

sp(w2) dp(w2,w1) sp(w3) dp(w3,w1) <br />

<br />

<br />

<br />

<br />

2) sp(w1) 4) dp(w1,w2) <br />

<br />

<br />

<br />

dp(w2,w3) dp(w2,w1) dp(w3,w4) dp(w3,w1) <br />

<br />

<br />

6878 7530–007 5–33


Operator Set<br />

SPLT <br />

SPLT requires an operand on top of the stack. Two single precision items are<br />

constructed from the operand and left on top of the stack.<br />

If the operand is single precision, it is left on the stack and a single precision zero is<br />

pushed on the stack above it. If the operand is double precision, its two words are<br />

converted to two single precision items. The first word is pushed on the stack first and<br />

the second word is left on the top of the stack.<br />

<br />

<br />

1) sp(0) 2) sp(w2) <br />

<br />

<br />

<br />

sp(w1) sp(w1) dp(w1,w2) sp(w1) <br />

<br />

<br />

Evaluate Word Structure Operators<br />

All operators in this group ignore the argument’s extension.<br />

RTAG <br />

RTAG requires one item on top of the stack; its result is a single_integer whose value is<br />

the tag of the item.<br />

<br />

Top-of-stack <br />

any sp(integer) <br />

transformation: <br />

<br />

CBON <br />

CBON requires an operand on top of the stack. The number of bits in the operand that<br />

have the value one are counted. If the operand is double precision, all 96 bits are<br />

examined. CBON leaves on top of the stack a 7-bit integer whose value is the ones<br />

count.<br />

<br />

Top-of-stack <br />

opnd(bit-vector) sp(integer) <br />

transformation: <br />

<br />

5–34 6878 7530–007


LOG2 <br />

Operator Set<br />

LOG2 requires one item on top of the stack and leaves in its place a 6- bit integer that<br />

indicates the leading bit in the item having the value one. If all bits in the item are zero,<br />

LOG2 leaves an integer zero; otherwise, the integer value is the bit number plus one of<br />

the highest-order one bit. Only the first word of a double precision item is examined.<br />

<br />

Top-of-stack <br />

any(bit-vector) sp(integer) <br />

transformation: <br />

<br />

Word Manipulation Operators<br />

Word manipulation operators provide the capability to alter any partial field (excluding tag<br />

and extension) of a word in the stack called the destination; in some cases this is based<br />

on a field of another word in the stack called the source. The source can be an argument<br />

or an implicit bit value; the destination can be an argument or an implicit word of zeros.<br />

The altered destination item is left on the top of the stack. The following operations are<br />

provided:<br />

BSET, DBST Set a single destination bit<br />

BRST, DBRS Reset a single destination bit<br />

ISOL, DISO Create a destination whose low-order field is set from a field of the<br />

source<br />

INSR, DINS Set a field of the destination from the low-order field of the source<br />

FLTR, DFTR Set a field of the destination from a field of the source<br />

CHSN Complement the sign bit (bit 46) of the destination<br />

Source items may be of any type. Destination type is restricted only for CHSN, which<br />

requires an operand.<br />

If the source is a double precision item, the field is taken from its first word and the<br />

second word is discarded. If the destination is a double precision item, the bit or field<br />

altered is in its first word and the second word is retained unchanged in the double<br />

precision result. The following terms are used for bit/field specifications:<br />

Db The destination bit to be set or reset or be the high-order bit of the<br />

destination field<br />

Sb The high-order bit of the source field<br />

Len The length of both the source and destination fields<br />

There are static and dynamic operators corresponding to several of the operations. The<br />

static operators take Db, Sb, and Len specifications, as required, from the code<br />

parameters; the dynamic operators take them from stack arguments.<br />

Dynamic Db, Sb, and Len arguments must be operands; they are integerized with<br />

rounding (RaI function) if necessary. All Db and Sb values must be in the range {0 to 47}<br />

and Len values must be in {0 to 48}.<br />

6878 7530–007 5–35


Operator Set<br />

The effect of word manipulation operators are shown as an assignment to a field of the<br />

destination word. The remainder of the destination word is not changed. Note that Len<br />

equals zero is a valid specification of a null field; in this case, the destination is not to be<br />

altered.<br />

BSET <br />

BRST <br />

BSET sets a single destination bit: destination.[Db:1] := 1.<br />

BRST resets a single destination bit: destination.[Db:1] := 0.<br />

The destination is the only required top of stack item and Db is specified by a parameter.<br />

<br />

Operator BSET <br />

Db <br />

format: BRST <br />

<br />

<br />

Top-of-stack <br />

dest: any(bit-vector) dest’ <br />

transformation: <br />

<br />

DBST <br />

DBRS <br />

DBST sets a single destination bit: destination.[Db:1] := 1.<br />

DBRS resets a single destination bit: destination.[Db:1] := 0.<br />

The required initial stack state includes Db.<br />

<br />

<br />

Db: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

dest: any(bit-vector) dest’ <br />

<br />

<br />

5–36 6878 7530–007


ISOL <br />

Operator Set<br />

ISOL creates a single precision destination word initialized to zero and then sets its loworder<br />

field from a field of the source: destination := 0; destination.[Len-1:Len] :=<br />

source.[Sb:Len]. The source is an argument; Sb and Len are specified by parameters:<br />

<br />

Operator <br />

ISOL Sb Len <br />

format: <br />

<br />

<br />

Top-of-stack <br />

source: any(bit-vector) sp <br />

transformation: <br />

<br />

DISO <br />

DISO creates a single precision destination word initialized to zero and then sets its<br />

low-order field from a field of the source: destination := 0; destination.[Len-1:Len] :=<br />

source.[Sb:Len]. Sb and Len are arguments above the source.<br />

<br />

<br />

Len: opnd(integer) <br />

<br />

<br />

<br />

Sb: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

source: any(bit-vector) sp <br />

<br />

<br />

INSR <br />

INSR sets a field of the destination from the low-order field of the source:<br />

destination.[Db:Len] := source.[Len-1:Len]. The destination and source are arguments;<br />

Db and Len are specified by parameters:<br />

<br />

Operator <br />

INSR Db Len <br />

format: <br />

<br />

<br />

<br />

source: any(bit-vector) <br />

Top-of-stack <br />

<br />

transformation: <br />

dest: any(bit-vector) dest’ <br />

<br />

<br />

6878 7530–007 5–37


Operator Set<br />

DINS <br />

DINS sets a field of the destination from the low-order field of the source:<br />

destination.[Db:Len] := source.[Len-1:Len]. Db and Len are arguments between the<br />

destination and source; note that the source is topmost:<br />

<br />

<br />

source: any(bit-vector) <br />

<br />

<br />

<br />

Len: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

Db: opnd(integer) <br />

<br />

<br />

<br />

dest: any(bit-vector) dest’ <br />

<br />

<br />

FLTR <br />

FLTR sets a field of the destination from a field of the source: destination.[Db:Len] :=<br />

source.[Sb:Len]. The destination and source are arguments; Db, Sb, and Len are<br />

specified by parameters:<br />

<br />

Operator <br />

FLTR Db Sb Len <br />

format: <br />

<br />

<br />

<br />

source: any(bit-vector) <br />

Top-of-stack <br />

<br />

transformation: <br />

dest: any(bit-vector) dest’ <br />

<br />

<br />

FLTR is obsolete, superseded by ISOL INSR.<br />

5–38 6878 7530–007


DFTR <br />

Operator Set<br />

DFTR sets a field of the destination from a field of the source: destination.[Db:Len] :=<br />

source.[Sb:Len]. Db, Sb, and Len are arguments above the destination and source:<br />

<br />

<br />

Len: opnd(integer) <br />

<br />

<br />

<br />

Sb: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

Db: opnd(integer) <br />

<br />

<br />

<br />

source: any(bit-vector) <br />

<br />

<br />

<br />

dest: any(bit-vector) dest’ <br />

<br />

<br />

CHSN <br />

The CHSN operator requires an operand on top of the stack. CHSN complements a<br />

single destination bit: destination.[46:1] := NOT destination.[46:1].<br />

<br />

Top-of-stack <br />

TOS: opnd TOS’ <br />

transformation: <br />

<br />

Linear Index-Function Operator<br />

OCRX <br />

OCRX computes a linear integer function of an integer index, with bounds checking. The<br />

function is defined as:<br />

RelativeIndex (offset, width, index) = offset + (index-1)*width;<br />

where index must be in the range {1 to limit}.<br />

OCRX leaves on top of the stack the result of the RelativeIndex function applied to<br />

values derived from two arguments:<br />

6878 7530–007 5–39


Operator Set<br />

<br />

<br />

sp(ICW) <br />

Top-of-stack <br />

<br />

transformation: <br />

index: opnd(integer) sp(integer) <br />

<br />

<br />

The Index Control word (ICW) must be a single precision operand. It contains three<br />

fields:<br />

ICW_width [47:16] = the width coefficient<br />

ICW_limit [31:16] = the upper bound for the index<br />

ICW_offset [15:16] = the offset coefficient<br />

The index argument must be an operand; it is integerized with rounding (RaI function) if<br />

necessary.<br />

If the index is not in the range {1 to ICW_limit}, an interrupt is generated. Otherwise,<br />

ORCX leaves on top of the stack a single_integer whose value is RelativeIndex<br />

(ICW_offset, ICW_width, index).<br />

OCRX is obsolete, superseded by the obvious sequence of arithmetic operators and<br />

ASRT or AVER.<br />

5–40 6878 7530–007


<strong>Reference</strong> Generation and Evaluation Operators<br />

Operator Set<br />

The common feature of this operator group is the generation and evaluation of<br />

references and chains of reference. The group consists of reference generation<br />

operators (generators) and operators that evaluate references in order to read a target<br />

item onto the stack (read evaluators) or store an item from the stack into a target<br />

location (store evaluators).<br />

Basic evaluation of a reference consists of calculating the absolute address to which it<br />

refers. Read evaluation consists of fetching the contents of the referenced location;<br />

store evaluation consists of writing the contents of that location.<br />

Double Precision<br />

<strong>Reference</strong>s to double precision operands refer to the first word. The need for a second<br />

word may be indicated by the tag of the first word or by the reference<br />

(IndexedDoubleDD). The second word is the virtual successor of the first; it may be in<br />

the next higher memory location or the two words may be the last word of one page and<br />

the first word of the next page in the same virtual segment. Such separation can occur<br />

only when access is via an IndexedDoubleDD with an odd index value.<br />

Stack <strong>Reference</strong>s<br />

A stack is designated by its stack_number. Each stack is an actual segment whose<br />

ASD_number is its stack_number.<br />

Environment Link Evaluation<br />

The basic evaluation of an environment link consists of computing the absolute address<br />

of the base of the referenced AR by adding the displacement to the base address of the<br />

referenced stack or non-stack segment.<br />

Environment links occur in SIRWs and ENVWs. Those in SIRWs are evaluated as the<br />

SIRW is evaluated. Those in ENVWs are evaluated when the environmental chain is<br />

traversed to update display registers.<br />

Evaluation of <strong>Reference</strong>s<br />

Read and store evaluators share the general capability to process a reference or chain of<br />

references in order to locate some target item. Initial references may be address couple<br />

parameters, SIRWs, IndexedDDs, sometimes ASRWs, and (for LODT) integers.<br />

<strong>Reference</strong> chains may contain SIRWs, IndexedDDs, and PCWs.<br />

Definition of valid target items and allowable reference chains depends on the function<br />

of the particular operator; evaluation of each element of a reference chain and of IRW<br />

chains is common to the operator group. The following paragraphs define evaluation of<br />

each reference form, IRW chain evaluation, and the notation used for each operator to<br />

specify allowable reference chains and valid target items.<br />

6878 7530–007 5–41


Operator Set<br />

Address Couple Evaluation<br />

Address couples occur in operator parameters in either fixed or variable fence forms. A<br />

name-call operator uses its address-couple parameter to construct an SIRW on the stack.<br />

Other operators use their address-couple parameter as their own initial reference.<br />

Basic evaluation of an address couple (lambda,delta) consists of calculating the address<br />

of the referenced word, by adding delta to the base address of the activation record<br />

whose lex level is specified by lambda. For lambda equal to LL, the base address is in<br />

D[LL]; for lambda less than LL, the activation record is located LL minus lambda steps<br />

down the environmental chain (its base address is captured in D[lambda]).<br />

In a valid address couple, lambda is less than or equal to LL and delta is less than the<br />

width of the referenced AR. For the topmost AR, the upper boundary includes only items<br />

that have been explicitly pushed, not items in the expression stack. The restrictions of<br />

this paragraph are incumbent upon the compilers for all ClearPath MCP.<br />

SIRW Evaluation<br />

Basic evaluation of an SIRW consists of calculating the address of the referenced word;<br />

SIRW.offset is added to the address derived from the Environment Link. (The ENTR<br />

operator uses the Environment Link address, as well as the sum.)<br />

No validity check is required on the magnitude of the offset value or the environment-link<br />

displacement value during SIRW evaluation. SIRWs are created from the address couple<br />

whose lambda is verified at that time. (If software constructs or modifies an SIRW, it is<br />

trusted to do so correctly.)<br />

IndexedDD Evaluation<br />

Basic evaluation of a data descriptor as a reference is possible only for an IndexedDD<br />

referring to a present segment. IndexedCharDDs are treated as IndexedSingleDDs, with<br />

any char_index value ignored. The evaluation consists of calculating the address of the<br />

referenced word.<br />

Access checking is performed upon evaluation of IndexedDDs. A store is aborted if write<br />

is disabled via the DD.<br />

In cases where the target of an IndexedDD is an operand, the element type of the<br />

operand is determined by the element_size field of the IndexedDD. The element_size<br />

value of single (including characters) or double precision overrides the tag of the target<br />

operand. All operators that evaluate IndexedDDs obey this convention except the Load<br />

Transparent, overwrite, and transfer words operators.<br />

An IndexedDD may be used to reference words of any type appropriate to the<br />

referencing operator. The exception is LOAD, which uses an IndexedDoubleDD only to<br />

reference an operand.<br />

5–42 6878 7530–007


PCW Evaluation<br />

Operator Set<br />

In the context of reference chain evaluation, evaluation of a PCW consists of an<br />

accidental procedure entry. The PCW is assumed to point to a function with no<br />

parameters, whose returned value is either the target of the chain or another valid<br />

reference. The net result of the accidental entry is that the place of the PCW in the<br />

reference chain is taken by the item returned by the function.<br />

The accidental entry is accomplished by the aACCE action. The function must terminate<br />

with a RETN (return) operator, leaving an item on top of the stack.<br />

<strong>Reference</strong> Chains<br />

Operators that evaluate reference chains start from an initial reference and apply<br />

successive reference read evaluation, according to a set of chaining rules until a target<br />

item is produced. For each of these operators, the set of initial references and targets is<br />

specified using the following notation:<br />

::= {set of reference items}<br />

::= {set of target items}<br />

Chaining rules are specified by indicating the valid evaluation results for each reference<br />

form that may be part of the chain. The form of such specification is:<br />

reference evaluation results<br />

where the arrow indicates read evaluation of the reference as defined in the preceding<br />

paragraphs. Evaluation results can include a reference, which is subsequently evaluated,<br />

or a target.<br />

Chaining rule notation is illustrated in this example:<br />

::= {SIRW, IndexedDD}<br />

::= {operand}<br />

SIRW SIRW<br />

IndexedDD<br />

PCW<br />

<br />

IndexedDD <br />

PCW SIRW<br />

IndexedDD<br />

The term IRW denotes a reference in {address couple, SIRW}. The term IRW chain<br />

denotes a reference chain whose initial reference is an address-couple parameter or<br />

SIRW and that otherwise contains only SIRWs; an SIRW chain contains only SIRWs,<br />

including the initial reference.<br />

6878 7530–007 5–43


Operator Set<br />

Evaluation of the chain continues until a target is encountered or an interrupt occurs.<br />

• Touch <strong>Reference</strong> (or Touch Load or Missing PCW) interrupt is generated if the target<br />

of any reference is an untouched DD. Upon resumption after the interrupt, evaluation<br />

continues; the incorrect object has presumably been replaced by another reference<br />

or a target.<br />

• Absent Segment interrupt is generated if a reference designates a nonpresent<br />

segment; evaluation continues when the code stream is resumed with the segment<br />

present.<br />

• If an item is encountered that is not a valid result and not one of the service requests<br />

previously noted, an error interrupt is generated.<br />

A reference chain must not loop, because the operator cannot complete. (The processor<br />

generates a Loop Timer alarm interrupt whenever an operator does not complete in a<br />

reasonable time.)<br />

<strong>Reference</strong> Generation Operators<br />

NAMC <br />

On Libra 6xx and 7xx systems, the NAMC operator transforms an address couple in the<br />

code stream into an SIRW. NAMC is a two-syllable operator with a special structure, a 2bit<br />

op code and a 14-bit variable-fence address couple:<br />

<br />

Operator : <br />

NAMC : address couple <br />

format: : <br />

<br />

:<br />

2 : 14<br />

The SIRW is constructed to point to the word in the stack referenced by the address<br />

couple (lambda,delta). The offset field is set from delta. The env_link field is set to<br />

designate the normal or pseudo activation record at lex level lambda in the current<br />

addressing environment. Since the display registers are maintained as (ASD_number,<br />

displacement) couples, the Environment Link value is in D[lambda].<br />

<br />

Top-of-stack <br />

Null SIRW <br />

transformation: <br />

<br />

5–44 6878 7530–007


LNMC <br />

Operator Set<br />

LNMC is equivalent to NAMC, except that its parameter is a fixed-fence rather than a<br />

variable-fence address couple. LNMC is a four-syllable operator whose appearance in the<br />

code stream is:<br />

<br />

Operator : <br />

LNMC lam: delta <br />

format: : <br />

<br />

:<br />

4: 12<br />

NMC0 <br />

NMC1 <br />

NMC2 <br />

NMC3 <br />

NMC0, NMC1, NMC2, and NMC3 are equivalent to NAMC, except that lambda is<br />

specified directly by the operator code itself. They are three syllable operators whose<br />

appearance in the code stream is:<br />

<br />

Operator <br />

NMCx delta <br />

format: <br />

<br />

The delta portion of the address couple appears as a two-syllable parameter to the<br />

operator.<br />

STFF <br />

STFF performs no action on <strong>Epsilon</strong> systems.<br />

aAPIX <br />

This common action is defined as a procedure with two formal parameters, a descriptor<br />

DD, and an index value vI (a number of elements of the same size defined by the DD<br />

element_size). The action is to index DD by vI. The clients of aAPIX and their invocations<br />

are as follows:<br />

• The indexing operators pass DDs, both indexed and unindexed, paged and unpaged.<br />

• All array operators reindex indexed DDs via aAPIX.<br />

The aAPIX action constructs an IndexedDD whose virtual index is<br />

vX = vD + vI*df<br />

6878 7530–007 5–45


Operator Set<br />

where<br />

vX is the new virtual index.<br />

vD is the virtual index of the DD (0 for unindexed DD).<br />

vI is the argument to aAPIX.<br />

df is 2 if DD is double precision and 1 otherwise.<br />

For application to a DD, the vX must be represented in up to three components: page<br />

index (pX), word index (wX), and character index (cX); these components are defined as<br />

follows:<br />

unpaged (pX not relevant):<br />

single or double: wX = vX<br />

hex: cX = vX MOD 12; wX = vX DIV 12<br />

EBCDIC: cX = vX MOD 6; wX = vX DIV 6<br />

paged: (p represents 2**13)<br />

single or double: wX = vX MOD p; pX = vX DIV p<br />

hex: cX = vX MOD 12; wX = vX DIV 12 MOD p; pX = vX DIV 12 DIV p<br />

EBCDIC: cX = vX MOD 6; wX = vX DIV 6 MOD p; pX = vX DIV 6 DIV p<br />

When pX = n > 0, wX = 0, and (if applicable) cX = 0, the same element possibly could be<br />

designated with pX = n-1 and wX = 2**13. A descriptor could designate the last+1<br />

element of a page instead of the first element of the successor page. This alternative<br />

representation is not generated by <strong>Epsilon</strong> processors.<br />

The quotient pX is used to index the page table. For indexing a paged unindexed DD, the<br />

DD itself provides the reference to the page table. For reindexing an indexed DD that<br />

designates a page, a reference to the page table is extracted from the ASD designated<br />

by the DD. Each page ASD contains a reference to the original SingleDD for that page;<br />

this reference is an indexed copy of the page- table DD.<br />

The new virtual index must be representable in an IndexedDD if the aAPIX client uses or<br />

returns the result; it is not necessary if the indexing operation is performed in a nonupdate<br />

Data Array operator in anticipation of an iteration that never occurs. The<br />

representable values have:<br />

vX >= 0<br />

pX < Pages (for paged DDs)<br />

wX < field limit<br />

where Pages = page-table length<br />

and field limit = 2**20 for WordDDs, 2**16 for CharDDs.<br />

Pages is defined as ASD.AS_length in the ASD for the page table.<br />

5–46 6878 7530–007


Operator Set<br />

Valid representations have wX less than or equal length in words of the designated<br />

actual segment. Equality is expressly permitted; update pointer operators can generate<br />

an IndexedDD to the first element beyond the array. However, INDX treats the equality<br />

as as an error.<br />

If the data segment is unpaged, an IndexedDD is constructed by making a proper copy<br />

of the DD, marking it indexed, and inserting the index. For a WordDD, an<br />

IndexedWordDD is constructed by setting the index field to wX with the field- width limit<br />

at 2**20-1. For a CharDD, an IndexedCharDD is constructed by setting the word_index<br />

field to wX and the char_index field to cX with the field-width limit on wX at 2**16-1.<br />

If the data segment is paged, an IndexedDD is constructed by making a proper copy of<br />

the page descriptor, which is located by indexing the page table by pX. The element_size<br />

field is copied from the indicated DD. An IndexedWordDD is constructed with wX in the<br />

index field or an IndexedCharDD is constructed by setting word_index to wX and<br />

char_index to cX; field overflow cannot occur.<br />

INDX <br />

INDX applies an integer index to a DD and leaves on top of the stack an IndexedDD<br />

pointing to the specified element. If the DD is a WordDD, the result is an<br />

IndexedWordDD and if it is a CharDD, the result is an IndexedCharDD. A copy DD may<br />

be on the stack initially; an original or copy DD may be addressed by an SIRW chain.<br />

::= {unindexed copy DD,<br />

IndexedDD,<br />

initial reference}<br />

::= SIRW<br />

::= {unindexed DD,<br />

IndexedDD }<br />

SIRW SIRW<br />

<br />

INDX requires the Descriptor Indication and an operand index value on top of the stack in<br />

either order.<br />

6878 7530–007 5–47


Operator Set<br />

<br />

<br />

Desc-Ind: SIRW, DD <br />

Top-of-stack <br />

<br />

transformation: <br />

index: opnd(integer) IndexedDD <br />

<br />

<br />

or<br />

<br />

<br />

index: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

Desc-Ind: SIRW, DD IndexedDD <br />

<br />

<br />

The index value must be an operand. The Descriptor Indication must be an SIRW or a<br />

copy WordDD or Char DD. In describing the indexing operation, the unqualified term DD<br />

is applied to the indicated descriptor, the one to which the index will be applied. If the<br />

Descriptor Indication is a data descriptor, it is the DD; if the Descriptor Indication is an<br />

SIRW, the DD is the target of the SIRW chain.<br />

The index value is integerized with rounding (RaI function) if necessary; its magnitude<br />

must not exceed MaxInx. The resulting value is called I within this description.<br />

The DD may be unindexed or indexed; an indexed DD must have reindex enabled. The<br />

new virtual index is the sum of the current virtual index of DD (which is 0 if DD is<br />

unindexed) plus I; the sum must be in the range {0 to N-1}, where N is the number of<br />

elements in the virtual segment referenced by DD. (This constraint can be taken as a<br />

summary of the detailed constraints defined in aAPIX.)<br />

The index value, I, is applied to the descriptor DD using the common action aAPIX; INDX<br />

aborts if the indexing operation does not produce a valid descriptor.<br />

There are two access rights in an IndexedDD: write enable and reindex enable. The<br />

indexing operation determines the access rights as follows:<br />

write Copied from indicated DD<br />

reindex Enabled<br />

The following service interrupts, which overlap those for reference chain evaluation, may<br />

be generated by INDX if the DD is exceptional:<br />

Absent Segment page table is absent<br />

DD designates an absent segment<br />

Touch <strong>Reference</strong> is untouched DD<br />

page DD is untouched DD<br />

5–48 6878 7530–007


MPCW <br />

Operator Set<br />

MPCW is a literal operator that constructs a PCW at the top of the stack from a sixsyllable<br />

parameter in the code stream. The parameter is taken from the first code word<br />

following the MPCW op code. Padding syllables, if any, from the op code to the end of<br />

the word containing the op code are ignored.<br />

<br />

<br />

Operator ignored <br />

MPCW PCW skeleton <br />

format: if any <br />

<br />

<br />

word aligned <br />

<br />

Top-of-stack <br />

Null PCW <br />

transformation: <br />

<br />

The valid ranges for PCW-skeleton values in user programs are:<br />

skeleton_psi: 0 to 5<br />

skeleton_pwi: 0 to length-1 of the code segment<br />

skeleton_CS: 0<br />

skeleton_LL: sdll+1 to LL+1<br />

sdll: 0 or 1<br />

sdi: 1 to length-1 of activation record at level sdll<br />

The fields skeleton_psi, skeleton_pwi, skeleton_CS, and skeleton_LL are copied,<br />

respectively, from the skeleton into corresponding fields psi, pwi, CS, and lex_level of<br />

the PCW. The address couple (sdi,sdll) is evaluated to fetch a CSD; the ASD_ref field of<br />

the CSD is copied into the PCW. All other PCW fields are set to zero. The PCW tag is set<br />

to 7. A Touch CSD service interrupt is generated if the CSD is untouched.<br />

MPWx <br />

These two operators create a PCW from a reference to a Code Segment Descriptor and<br />

a code index.<br />

MPWL <br />

MPWP <br />

<br />

<br />

Desc-Ind: SIRW, IDD <br />

Top-of-stack <br />

<br />

transformation: <br />

index: SP(integer) PCW <br />

<br />

<br />

6878 7530–007 5–49


Operator Set<br />

The descriptor indication must be an SIRW or an IndexedDD pointing directly to a Code<br />

Segment Descriptor. The char_index in an IndexedCharDD will be ignored. The integer<br />

code index must be a 16-bit integer whose most significant 13 bits become pwi, while<br />

the least significant 3 bits (value less than 6) become psi.<br />

The operators use the index to produce a PCW from the Code Segment Descriptor. The<br />

ASD_ref is set from the CSD. The pwi and psi is formed from the code index argument.<br />

Lex_level is determined by the operator: MPWL sets lex_level to LL, MPWP sets<br />

lex_level to LL+l. The control_state value is set to zero.<br />

<strong>Reference</strong> Modification Operators<br />

SEsz <br />

These four operators set the element size of a copy DD:<br />

SESW <br />

<br />

Top-of-stack <br />

TOS: DD TOS’: SingleDD <br />

transformation: <br />

<br />

SEDW <br />

<br />

Top-of-stack <br />

TOS: DD TOS’: DoubleDD <br />

transformation: <br />

<br />

SE4C <br />

<br />

Top-of-stack <br />

TOS: DD TOS’: hex CharDD <br />

transformation: <br />

<br />

SE8C <br />

<br />

Top-of-stack <br />

TOS: DD TOS’: EBCDIC CharDD <br />

transformation: <br />

<br />

The argument must be an indexed or unindexed copy WordDD or CharDD; an<br />

IndexedDD must have reindex enabled. The result is the same DD with its element size<br />

set to a value implied by the operator name: single, double, hex, or EBCDIC for SESW,<br />

SEDW, SE4C, or SE8C, respectively. The index field of the DD is not modified.<br />

5–50 6878 7530–007


Operator Set<br />

If the argument is an IndexedWordDD, SE4C and SE8C require that the index value be<br />

less than 2**16. If the argument is an IndexedCharDD, SESW and SEDW ignore the<br />

char_index value, setting that field to zero in the result, while SE4C and SE8C leave it<br />

unmodified. It is an error for SE4C or SE8C to be applied to an IndexedCharDD with a<br />

different element size and a non-zero char_index.<br />

NOWR <br />

The NOWR operator disables the write access right in references. The operator requires<br />

one argument, which must be a copy DD. The result is the argument with write access<br />

disabled.<br />

<br />

Top-of-stack <br />

TOS: DD TOS’ <br />

transformation: <br />

<br />

NORX <br />

The NORX operator disables reindexing in indexed DDs. The operator requires one<br />

argument, which must be an indexed DD. The result is the argument with reindex<br />

disabled.<br />

<br />

Top-of-stack <br />

TOS: IndexedDD TOS’ <br />

transformation: <br />

<br />

Descriptor Attribute Extraction Operators<br />

The descriptor attribute extraction operators are provided to extract the value of certain<br />

attributes of DDs. In each case, a copy DD is consumed as the argument and a<br />

single_integer is left as the result.<br />

GLEN <br />

The argument must be a copy WordDD or CharDD; the result is the declared length of<br />

the designated segment, reported in the element_size of the DD.<br />

<br />

Top-of-stack <br />

copy DD sp(integer) <br />

transformation: <br />

<br />

The declared length is computed from three values in the ASD referenced by the DD:<br />

W = AS_length: words in the designated actual segment<br />

D = deficit: words not counted in the declared length<br />

N = nybbles: 4-bit characters reported in the declared length<br />

6878 7530–007 5–51


Operator Set<br />

Define S = W for unpaged DDs and S = W * 2**13 for paged DDs. Then the declared<br />

length L is defined for each element size as:<br />

single: L = S-D<br />

double: L = (S-D) DIV 2<br />

EBCDIC: L = (S-D)*6 + N DIV 2<br />

hex: L = (S-D)*12 + N<br />

GINX <br />

The GINX operator requires a copy WordDD or CharDD as its argument. For an<br />

indexedDD, the result is the virtual index of the DD; for an unindexed DD, the result is<br />

zero. Note that for an IndexedDoubleDD, the virtual index is in single words.<br />

<br />

Top-of-stack <br />

copy DD sp(integer) <br />

transformation: <br />

<br />

GESZ <br />

The GESZ operator requires a copy DD as its argument. The result is the element_size<br />

encoding of the DD, as a 3-bit integer; the result is 0, 1, 2, or 4 for a SingleDD,<br />

DoubleDD, hex CharDD, or EBCDIC CharDD, respectively and it is in {3, 5, 6, 7} if the DD<br />

had one of those invalid encodings. (GESZ is functionally equivalent to ISOL 42:3 on a<br />

copy DD.)<br />

<br />

Top-of-stack <br />

copy DD sp(integer) <br />

transformation: <br />

<br />

Read Evaluation Operators<br />

aFOP <br />

The common action aFOP is defined to fetch a single or double precision operand via an<br />

IRW an IndexedWordDD, or an IndexedCharDD (which is treated like an<br />

IndexedSingleDD, with any char_index ignored). The action can be described as a<br />

procedure with one formal parameter, the reference to be evaluated, and four possible<br />

results:<br />

• An operand value<br />

• A non-operand value (via an IRW, or via IndexedSingleDD or IndexedCharDD for<br />

LOAD)<br />

• A service interrupt<br />

• An error interrupt<br />

5–52 6878 7530–007


Operator Set<br />

For most clients, aFOP generates an error interrupt if the referenced word does not have<br />

a tag in {0,2}. The exceptions are value-call and LOAD, for which a non-operand may be a<br />

chained reference or a target, respectively. If the reference is an address couple or<br />

SIRW, or the reference is an IndexedSingleDD or IndexedCharDD and the client is<br />

LOAD, the non-operand value is returned to the client operator.<br />

If the reference is an IRW and the referenced word has a tag of 0 or the reference is an<br />

IndexedSingleDD or IndexedCharDD and the referenced word has a tag in {0,2}, the<br />

referenced word is fetched and the tag set to zero (if necessary) to form an operand<br />

value. The extension is not modified.<br />

If the reference is an IRW and the fetched word has a tag of 2, its successor word (at<br />

the next higher memory address) is fetched. That word must have a tag in {0, 2}; the<br />

referenced word and its successor are joined as the first and second words of a double<br />

precision operand (with tag 2) to form an operand value.<br />

If the reference is an IndexedDoubleDD, the referenced word and its successor are<br />

fetched; each must have a tag in {0,2}. The two words are joined as the first and second<br />

words of a double precision operand (with tag 2) to form an operand value. A split across<br />

a page boundary can occur if an IndexedDoubleDD is so constructed that its index refers<br />

to the last word of a page.<br />

VALC <br />

The VALC operator evaluates a reference chain whose beginning is an address-couple<br />

parameter; the target must be an operand, which is left on top of the stack. VALC is a<br />

two-syllable operator with a special structure, a 2-bit op code and a 14-bit variable-fence<br />

address couple:<br />

<br />

Operator : <br />

VALC : address couple <br />

format: : <br />

<br />

2 : 14<br />

<br />

Top-of-stack <br />

Null opnd <br />

transformation: <br />

<br />

6878 7530–007 5–53


Operator Set<br />

<strong>Reference</strong> chain evaluation performed by VALC is:<br />

::= {address couple}<br />

::= {operand}<br />

address couple SIRW<br />

IndexedDD<br />

PCW<br />

<br />

SIRW SIRW<br />

IndexedDD<br />

PCW<br />

<br />

IndexedDD <br />

PCW SIRW<br />

IndexedDD<br />

<br />

<strong>Reference</strong> evaluation is performed by invocation of the common action aFOP. An<br />

operand value is left on the stack as the result of VALC and any non- operand value is<br />

examined as an element of the reference chain. If a PCW must be evaluated, accidental<br />

entry is performed by invoking the common action aACCE. Return from the function<br />

causes VALC to be resumed in restart mode; the operator ignores its code parameter<br />

and consumes a stack argument as the target of the PCW.<br />

LVLC <br />

LVLC is equivalent to VALC, except the parameter is a fixed-fence rather than a variablefence<br />

address couple. LVLC is a four-syllable operator whose appearance in the code<br />

stream is as follows:<br />

<br />

Operator : <br />

LVLC lam : delta <br />

format: : <br />

<br />

:<br />

4 : 12<br />

VLC0 <br />

VLC1 <br />

VLC2 <br />

VLC3 <br />

VLC0, VLC1, VLC2, and VLC3 are equivalent to VALC, except that lambda is specified<br />

directly by the operator code itself. They are three syllable operators whose appearance<br />

in the code stream is:<br />

<br />

Operator <br />

VLCx delta <br />

format: <br />

<br />

5–54 6878 7530–007


The delta portion of the address couple appears as a 2 syllable parameter to the<br />

operator.<br />

NXLV <br />

Operator Set<br />

NXLV performs an INDX (index) operation to produce an IndexedDD and then evaluates<br />

the IndexedDD to fetch an operand. The required initial stack state is the same as that<br />

for INDX.<br />

<br />

<br />

Desc-Ind: SIRW, DD <br />

Top-of-stack <br />

<br />

transformation: <br />

index: opnd(integer) opnd <br />

<br />

<br />

or<br />

<br />

<br />

index: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

Desc-Ind: SIRW, DD opnd <br />

<br />

<br />

::= {copy unindexed DD,<br />

IndexedDD,<br />

initial reference}<br />

::= SIRW<br />

::= {unindexed DD,<br />

IndexedDD }<br />

SIRW SIRW<br />

<br />

If theDD is successfully indexed, the ultimate target is fetched by read evaluation of the<br />

IndexedDD:<br />

IndexedDD operand<br />

The IndexedDD is evaluated by invoking the common action aFOP; an operand value is<br />

left on the stack as the result of NXLV.<br />

6878 7530–007 5–55


Operator Set<br />

NXLN <br />

NXLN performs an INDX (index) operation to produce an IndexedDD and then evaluates<br />

the IndexedDD to fetch an unindexed DD; a copy of that DD is left on top of the stack.<br />

The required initial stack state is the same as that for INDX.<br />

<br />

<br />

Desc-Ind: SIRW, DD <br />

Top-of-stack <br />

<br />

transformation: <br />

index: opnd(integer) unindexed copy DD <br />

<br />

<br />

or<br />

<br />

<br />

index: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

Desc-Ind: SIRW, DD unindexed copy DD <br />

<br />

<br />

::= {unindexed copy DD,<br />

IndexedDD,<br />

initial reference}<br />

::= SIRW<br />

::= {unindexed DD,<br />

IndexedDD }<br />

SIRW SIRW<br />

<br />

If the DD is successfully indexed, the ultimate target is fetched by read evaluation of the<br />

IndexedDD, treating the IndexedDD as a SingleDD (char_index is ignored for an<br />

IndexedCharDD):<br />

IndexedDD unindexed DD<br />

The target is fetched as a copy and left on the top of the stack. A service interrupt<br />

(Touch Load) is generated if the target of the IndexedDD is untouched.<br />

5–56 6878 7530–007


EVAL <br />

Operator Set<br />

The purpose of EVAL is to evaluate a reference chain in order to locate some target and<br />

then leave on top of the stack the reference whose evaluation produced the target.<br />

<br />

Top-of-stack <br />

ref: SIRW, IDD SIRW, IDD <br />

transformation: <br />

<br />

<strong>Reference</strong> chain evaluation performed by EVAL is:<br />

::= {SIRW, IndexedDD}<br />

::= not {SIRW, IndexedDD, PCW}<br />

SIRW SIRW<br />

IndexedDD<br />

PCW<br />

<br />

IndexedDD * no evaluation -- see below *<br />

PCW SIRW<br />

IndexedDD<br />

If a target is located, the reference whose evaluation produced the target is left on top of<br />

the stack as the result. If an IndexedDD is encountered, it is left as the result without<br />

being evaluated. In effect, an IndexedDD is treated as if it had been evaluated and a<br />

target had been the result.<br />

If a PCW must be evaluated, accidental entry is performed by invoking the common<br />

action aACCE. EVAL deletes the Initial <strong>Reference</strong> and then invokes aACCE, so that the<br />

result of the accidental-entry procedure becomes the new Initial <strong>Reference</strong>.<br />

Almost every data type is specified as either a valid reference or a target for EVAL. A<br />

stack-linkage word is not a proper target, but the processor cannot enforce this rule.<br />

6878 7530–007 5–57


Operator Set<br />

LOAD <br />

LOAD performs a single evaluation of the Initial <strong>Reference</strong> and if the result is a target, it<br />

is left on top of the stack.<br />

<br />

Top-of-stack <br />

ref: SIRW, IDD SIRW, copy DD, Data Word <br />

transformation: <br />

<br />

::= {SIRW, IndexedWordDD,IndexCharDD}<br />

::= {operand, tag-4 word, tag-6 word,<br />

SIRW, any data descriptor}<br />

SIRW <br />

IndexedSingleDD <br />

IndexedCharDD <br />

IndexedDoubleDD operand (target)<br />

<strong>Reference</strong> evaluation is performed by invocation of the common action aFOP. An<br />

operand value or other valid target is left on the stack as the result of LOAD. If the target<br />

is an original DD, it is fetched as a proper copy. A service interrupt (Touch Load) is<br />

generated if the target is an untouched DD.<br />

LODT <br />

LODT performs a single evaluation of the Initial <strong>Reference</strong> and leaves the result on top of<br />

the stack with no restriction placed on the type of the result:<br />

<br />

Top-of-stack <br />

ref: SIRW, IDD, ASRW, integer address any <br />

transformation: <br />

<br />

::= {SIRW, IndexedDD,<br />

integer address (restricted),<br />

ASRW (restricted) }<br />

::= {any word}<br />

SIRW <br />

IndexedDD <br />

ASRW <br />

Integer <br />

The applicability of the LODT in user programs is partially restricted; the reference<br />

argument is never an operand or ASRW and the target is never a touched original DD.<br />

5–58 6878 7530–007


Operator Set<br />

If the Initial <strong>Reference</strong> is an SIRW, IndexedDD, or ASRW, it is evaluated normally; a<br />

single-word fetch is performed regardless of the element_size of an IndexedDD (an<br />

IndexedCharDD's char_index is ignored). An integer Initial <strong>Reference</strong> is interpreted as an<br />

absolute address from which the target is fetched.<br />

The addressed target word is left on top of the stack. If its tag is 2, the second word of<br />

the item left on top of the stack is zero. (Apart from the handling of tag=2, the LODT<br />

operator does not examine or alter the target word in any way.)<br />

Normal Store Operators<br />

aSOP <br />

The common action aSOP is defined to store a single or double precision operand value<br />

via an IRW, an IndexedWordDD, or an IndexedCharDD (which is treated like an<br />

IndexedSingleDD, with any char_index ignored). The action can be described as a<br />

procedure with two formal parameters, the reference to be evaluated and the object<br />

stored. An IndexedDD must be write-enabled.<br />

The type of store object must match that of the target location; one of the following<br />

statements must be true:<br />

The operand is single precision and:<br />

the final reference is an IndexedSingleDD or IndexedCharDD<br />

the final reference is an IRW and the target is in {single datum}.<br />

The operand is double precision and:<br />

the final reference is an IndexedDoubleDD or<br />

the final reference is an IRW and the target is in {double datum}.<br />

The set (single datum) is defined as the type union:<br />

{tag-0 word (single precision operand),<br />

tag-4 word,<br />

tag-6 word (uninitialized single datum) }.<br />

The set {double datum} is defined as the type union:<br />

{tag-2 word (double precision operand) }.<br />

If the operand is single precision, it is stored at the target location.<br />

If the operand is double precision, the first word is stored at the target location and the<br />

second at the successor of the target. The successor word must contain a Data Word. A<br />

split across a page boundary occurs if the final reference is an IndexedDoubleDD so<br />

constructed that its index refers to the last word of a page.<br />

Single precision operands are always stored with tag = 0 and both halves of a double<br />

precision operand are stored with tag = 2. Note that the target type can be changed by a<br />

normal store operation; an uninitialized datum can be changed to an operand and a single<br />

or double precision operand can be changed to the other if store is via an IndexedDD.<br />

6878 7530–007 5–59


Operator Set<br />

If an error interrupt is generated while the second half of a double precision value is<br />

being stored, the first half of the item has not been stored.<br />

STOD <br />

STON <br />

Normal store operators evaluate a reference chain in order to store an operand from the<br />

stack (the store object) into a target location. <strong>Reference</strong> chain evaluation performed by<br />

store operators is:<br />

::= {SIRW, IndexedDD}<br />

::= Data Word<br />

SIRW SIRW<br />

IndexedDD<br />

PCW<br />

<br />

IndexedDD <br />

PCW SIRW<br />

IndexedDD<br />

For STOD and STON, the Initial <strong>Reference</strong> and the operand are required on top of the<br />

stack, in either order. (For best performance, address couple cases should emit NAMC<br />

STO-.) STOD deletes both the Initial <strong>Reference</strong> and the operand from the stack:<br />

<br />

<br />

ref: SIRW, IDD <br />

Top-of-stack <br />

<br />

transformation: <br />

object: operand Null<br />

<br />

<br />

or<br />

<br />

<br />

object: operand <br />

Top-of-stack <br />

<br />

transformation: <br />

ref: SIRW, IDD Null<br />

<br />

<br />

5–60 6878 7530–007


Operator Set<br />

STON deletes the Initial <strong>Reference</strong> but leaves the operand unchanged on top of the<br />

stack:<br />

<br />

<br />

ref: SIRW, IDD <br />

Top-of-stack <br />

<br />

transformation: <br />

object: operand object <br />

<br />

<br />

or<br />

<br />

<br />

object: operand <br />

Top-of-stack <br />

<br />

transformation: <br />

ref: SIRW, IDD object <br />

<br />

<br />

The operator performs read evaluation of the reference chain followed by store<br />

evaluation of the final reference to the target. If a PCW must be evaluated, accidental<br />

entry is performed by invoking the common action aACCE, so that the result of the<br />

accidental entry procedure becomes a new Initial <strong>Reference</strong>.<br />

The operand is stored at the final target location by invocation of the aSOP common<br />

action.<br />

Overwrite Operators<br />

Overwrite operators perform a single evaluation of the Initial <strong>Reference</strong> and store some<br />

item from the stack (the store object) into the resultant target location. The arrow<br />

indicates store evaluation for these operators, although under some circumstances, the<br />

processor may also read the target contents.<br />

::= {SIRW, IndexedDD,<br />

ASRW (restricted) }<br />

::= any item<br />

SIRW <br />

IndexedDD <br />

ASRW <br />

The topmost stack item must be an Initial <strong>Reference</strong>; the second stack item is the Store<br />

object. The store object may be of any type.<br />

A write evaluation of the initial reference is performed; write access is required.<br />

6878 7530–007 5–61


Operator Set<br />

The applicability of overwrite operators in user programs is partially restricted; the ASRW<br />

form of reference is not used, the store object is typically a reference, operand, or tag-4<br />

or tag-6 word and the store target is not an original descriptor, stack-linkage word, and so<br />

forth. Software requires that references generally not be stored in segments or<br />

activation records with longer lifetime than the referent.<br />

All IndexedDDs are treated as SingleDDs (char_index is ignored for an IndexedCharDD).<br />

Overwrite operators store single words; OVRD and OVRN are oblivious to double<br />

precision. If the store object is double precision, only the first word is stored, with its tag<br />

of two. If the reference addresses a tag-2 word, only that word is overwritten; its<br />

successor word is unchanged. Note that each case can produce an unpaired double<br />

precision word in memory.<br />

OVRD <br />

An overwrite operation is performed. Both the Initial <strong>Reference</strong> and the store object are<br />

deleted from the stack.<br />

<br />

<br />

ref: SIRW, IDD, ASRW <br />

Top-of-stack <br />

<br />

transformation: <br />

object: any Null<br />

<br />

<br />

OVRN <br />

An overwrite operation is performed. The store object is left unchanged on top of the<br />

stack and the Initial <strong>Reference</strong> is deleted.<br />

<br />

<br />

ref: SIRW, IDD, ASRW <br />

Top-of-stack <br />

<br />

transformation: <br />

object: any object <br />

<br />

<br />

RDLK <br />

RDLK is identical to OVRD, except that the word previously occupying the target location<br />

is left as the stack result. A tag of 2 in the result is set to 0. Only the single target word<br />

will be fetched.<br />

5–62 6878 7530–007


Operator Set<br />

<br />

<br />

ref: SIRW, IDD, ASRW <br />

Top-of-stack <br />

<br />

transformation: <br />

object: any target: word <br />

<br />

<br />

RDLK is a synchronization primitive. The following requirements must be met by all<br />

operating systems and by any other processing elements (such as I/O or<br />

communications processors) that share the system memory and use the RDLK<br />

convention for synchronization:<br />

1. RDLK reads the former contents and writes the new contents of the referenced<br />

word as an indivisible operation; no other processor can access the referenced word<br />

between the read and write steps of a RDLK operator.<br />

2. Store operations for each processor effectively occur in order. That is, if a code<br />

stream on one processor initiates stores into location A and then into location B, any<br />

processor that finds the new value at B (with RDLK) and subsequently examines A<br />

must find the new value at A.<br />

3. No data-fetch memory operation that follows the RDLK in the dynamic code stream<br />

of a processor may take place until after the RDLK operation.<br />

Statements 2 and 3 restrict the ability of a system to reorder the manipulation of<br />

independent pieces of the system, such as the contents of different memory locations.<br />

Character <strong>Reference</strong> Evaluation Operators<br />

The character reference evaluation operators evaluate descriptor references to a single<br />

character target. They differ from “word” reference evaluation operators both in<br />

addressing only a single character, and in accepting only IndexedDDs, not IRWs, as final<br />

references. They differ from data array operators because they process only a single<br />

character, and (unlike single character edit inserts) because their argument order and<br />

operator context have none of the unique features of pointer or edit operators.<br />

All of these operators accept an IndexedDD reference. The character size is determined<br />

by the element_size of the reference, with a WordDD (SingleDD or DoubleDD) being<br />

treated as 8-bit with a char_index equal to zero. The target character must be contained<br />

in a word with operand tag. The object input to the store operators, and the result of the<br />

load operators, is a character of appropriate size right justified in a single precision<br />

operand.<br />

LODC <br />

LODC extracts the character referenced by an IndexedDD argument, leaving the<br />

character right-justified with zero fill in a single precision operand on top of the stack.<br />

<br />

Top-of-stack <br />

ref: IDD sp(char) <br />

transformation: <br />

<br />

6878 7530–007 5–63


Operator Set<br />

STCD <br />

STCN <br />

For STCD and STCN, the reference and the operand are required on top of the stack, in<br />

either order. STCD deletes both the reference and the operand from the stack:<br />

<br />

<br />

object: sp(char) <br />

Top-of-stack <br />

<br />

transformation: <br />

ref: IDD Null<br />

<br />

<br />

<br />

<br />

ref: IDD <br />

or <br />

<br />

<br />

object: sp(char) Null<br />

<br />

<br />

STCN deletes the reference but leaves the operand unchanged on top of the stack:<br />

<br />

<br />

object: sp(char) <br />

Top-of-stack <br />

<br />

transformation: <br />

ref: IDD object <br />

<br />

<br />

<br />

<br />

ref: IDD <br />

or <br />

<br />

<br />

object: sp(char) object <br />

<br />

<br />

STCx stores into the character location referenced by the IndexedDD argument,<br />

selecting the corresponding character in the right-justified position of the single precision<br />

operand argument. The tag of the destination word will be persevered. STCD will delete<br />

both arguments from the stack, while STCN will delete the IndexedDD but will leave the<br />

operand unchanged in TOS.<br />

5–64 6878 7530–007


Processor State Operators<br />

Operator Set<br />

This section describes operators that interact with processor state, primarily the state of<br />

the currently executing code stream and the state of the stack in which the processor is<br />

running.<br />

Code Stream Pointer Distribution<br />

The processor code stream pointer is initialized by the distribution of PCW or RCW code<br />

stream pointer components.<br />

1. The PSN (Program Segment Number) is set from the ASD_number field in the PCW<br />

or RCW.<br />

2. The PWI and PSI are set from the corresponding fields in the PCW or RCW. PWI<br />

must be in the range {0 to L-1}, where L is the length of the code segment; PSI must<br />

be in the range {0 to 5}.<br />

Branching Operators<br />

Branching operators provide for altering the processor's code stream pointer component.<br />

They may change the point of execution in the current code segment or establish a new<br />

code segment with an initial point of execution.<br />

Branches may be conditional or unconditional. Conditional branches alter the code<br />

stream pointer or continue sequential execution depending upon the Boolean<br />

interpretation of a stack argument.<br />

Branching operators are classified as static or dynamic branches and are discussed in the<br />

following paragraphs.<br />

Static Branches<br />

Static branches always point within the current code segment. That point is indicated by<br />

a two-syllable parameter:<br />

<br />

Operator op_ : <br />

BRxx : op_pwi <br />

format: psi : <br />

<br />

:<br />

3 : 13<br />

The high-order three bits of the parameter are interpreted as the new PSI value and the<br />

low-order 13 bits as the new PWI value. The maximum valid op_pwi is one less than the<br />

length of the current code segment; the maximum valid op_psi is five.<br />

6878 7530–007 5–65


Operator Set<br />

BRUN <br />

Processor registers PSI and PWI are set from the parameter and the processor is<br />

conditioned to execute next the operator at that point in the current code segment.<br />

BRTR <br />

BRFL <br />

The top-of-stack argument must be an operand; it is interpreted as a Boolean value. If<br />

BRTR finds it to be True or BRFL finds it to be False, processor registers PSI and PWI<br />

are set from the parameter and the processor is conditioned to execute next the<br />

operator at that point in the current code segment. Otherwise, sequential execution<br />

continues.<br />

Top-of-stack <br />

<br />

transformation opnd(Boolean) Null<br />

<br />

<br />

Dynamic Branches<br />

Dynamic branches take their code stream pointer values from a branch destination item<br />

on top of the stack. They may branch to a computed point within the current code<br />

segment or to a point in an arbitrary code segment.<br />

::= {operand, PCW, initial reference}<br />

::= {SIRW}<br />

::= PCW<br />

SIRW <br />

Branching within the current code segment is indicated if the branch destination item is<br />

an operand. It is integerized with rounding (RAI function), if required, to produce a 14-bit<br />

integer, which is interpreted as the code segment index in units of half-words (three<br />

syllables):<br />

dyn_pwi [13:13] New PWI value<br />

dyn_half_word [ 0: 1] The new PSI value is dyn_half_word * 3<br />

The largest valid dyn_pwi is one less than the length if the current code segment.<br />

Branching to a point in an arbitrary code segment is indicated if the branch destination<br />

item is a PCW or an SIRW to a PCW. PCW.lex_level must match the current value of LL.<br />

The PCW code stream pointer is distributed as specified under "Code Stream Pointer<br />

Distribution" in this section.<br />

5–66 6878 7530–007


DBUN <br />

A branch destination argument is required on top of the stack.<br />

Top-of-stack <br />

<br />

transformation: dest: opnd(integer), PCW, SIRW Null<br />

<br />

<br />

DBTR <br />

DBFL <br />

Operator Set<br />

The branch destination argument is required on top of the stack. The argument second<br />

from top-of-stack must be an operand; it is interpreted as a Boolean value. If DBTR finds<br />

it to be True or DBFL finds it to be False, a branch is executed using the top of the stack<br />

branch destination item exactly as in DBUN. Otherwise, sequential execution continues.<br />

<br />

Top-of-stack <br />

dest: opnd(integer), PCW, SIRW <br />

transformation: <br />

<br />

<br />

opnd(Boolean) Null<br />

<br />

<br />

Stack Frame Operators<br />

Operators in this group provide for procedure entry and exit and the creation and<br />

destruction of stack frames.<br />

Procedure Entry Operators<br />

The sequence of operations in normal procedure invocation has already been outlined:<br />

1. Perform a Mark Stack operation.<br />

2. Place a reference to the code onto the stack.<br />

3. Place any parameters onto the stack.<br />

4. Perform an Enter operation.<br />

5. Place objects onto the stack to extend the new AR.<br />

MKST <br />

Mark Stack operators mark the stack for the beginning of a new stack frame by creating<br />

at the top of the expression stack an incipient activation record linked into the historical<br />

chain.<br />

MKST builds a HISW, ENVW pair on top of the stack. The HISW is linked at the head of<br />

the historical chain and records the values of the Boolean accumulators; the ENVW is<br />

inactive and is a copy of the HISW.<br />

6878 7530–007 5–67


Operator Set<br />

<br />

<br />

inactive ENVW <br />

Top-of-stack <br />

Null <br />

transformation: <br />

HISW F<br />

<br />

<br />

The displacement between the new ENVW location and the base of the current stack<br />

must be in the range {1 to 2**16-1}.<br />

F is set to point at the new HISW on the stack.<br />

MKSN <br />

This operator is functionally equivalent to the MKST operator and is subject to the<br />

following rules:<br />

1. The immediate next operator in the code stream must be one of the name call<br />

operators: NAMC, LNMC, NMC0, NMC1, NMC2, or NMC3.<br />

2. The address couple in the name call operator must be the initial reference for the<br />

corresponding ENTR.<br />

3. With two exceptions, the addressing environment, reference chain, and code<br />

segment addressing must remain the same when the corresponding ENTR is<br />

executed as when the MKSN was executed. Code Segment Addressing refers to<br />

the components of the PCW and ASD that are used to address the code segment;<br />

the term also includes the status (untouched, absent, present) of the segment. The<br />

exceptions are:<br />

• The reference chain does not yield a PCW. As a result of the ensuing interrupt,<br />

the reference chain, PCW, and code-segment addressing are subject to<br />

modification.<br />

• Another mark-stack operation occurs, either explicitly or via an interrupt. In this<br />

case, code segment status (untouched, absent, or present at a specific address)<br />

is subject to change, but the addressing environment, reference chain, and PCW<br />

must not change.<br />

4. Between the execution of the MKSN and the subsequent execution of the<br />

corresponding ENTR, the stack linkage remains valid and inactive, however, the<br />

contents of the ENVW and the entire SIRW/PCW location are undefined.<br />

MKSN is obsolete, superceded by MKST.<br />

IMKS <br />

IMKS creates an incipient activation record exactly as does MKST (mark stack), except<br />

that the new HISW, ENVW pair is inserted beneath the two top of stack items. There<br />

must be at least two items in the expression stack at the start of an IMKS operation.<br />

5–68 6878 7530–007


Operator Set<br />

<br />

<br />

TOS <br />

<br />

<br />

<br />

TOS: any TOS2 <br />

Top-of-stack <br />

<br />

transformation: <br />

TOS2: any Inactive ENVW <br />

<br />

<br />

<br />

HISW F<br />

<br />

<br />

ENTR <br />

The initial stack state for ENTR assumes prior execution of a Mark Stack operator and<br />

placement of a procedure reference onto the stack. S–1 > F > D[LL]+1 must be true, an<br />

HISW and an inactive ENVW are required at the F and F+1 stack locations, and an Initial<br />

<strong>Reference</strong> is required at the F+2 stack location.<br />

<br />

: : : :<br />

Stack-state : optional : : optional :<br />

: : : :<br />

transformation: : parameters : : parameters :<br />

: : : :<br />

<br />

<br />

SIRW, PCW RCW <br />

<br />

<br />

<br />

inactive ENVW entered ENVW D[LL]<br />

<br />

<br />

<br />

F HISW HISW F<br />

<br />

<br />

::= {SIRW,<br />

}<br />

::= {PCW}<br />

SIRW SIRW<br />

<br />

ENTR consists of the following functional tasks:<br />

1. Activate the ENVW, inserting it at the head of the appropriate environmental chain:<br />

a. ENTR forms an Environmental Link to address the base of the global AR; this<br />

Environmental Link is inserted into the ENVW to complete the environmental<br />

chain that defines the addressing environment of the new procedure.<br />

6878 7530–007 5–69


Operator Set<br />

b. The global AR is identified by the form of the procedure reference. If the PCW is<br />

the initial reference or if the PCW is directly referenced by the address couple in<br />

a name call operator immediately following the most recent MKST or MKSN, the<br />

global AR is the one at lex level L = PCW.lex_level-1 in the initial addressing<br />

environment. In these cases, an Environment Link to the global AR is<br />

constructed by implicit invocation of the name call operator with the address<br />

couple (L,0). Otherwise, the final reference to the PCW is an SIRW, whose<br />

Environment Link points directly to the global AR.<br />

c. The word at the base of the global AR must be an entered ENVW. If the PCW is<br />

the initial reference, the PCW.lex_level must be in the range {1 to LL+1}.<br />

2. Preserve the code stream pointer and related state in an RCW:<br />

a. When entry occurs from a code segment, whether by explicit invocation of<br />

ENTR or by accidental entry or interrupt, the operation builds an RCW containing<br />

the processor code stream pointer and the values of LL and the CS (control<br />

state) Boolean. For explicit ENTR, the RCW code stream pointer designates the<br />

syllable following ENTR. For accidental entry (ENTR invoked by aACCE), the<br />

code stream pointer designates the operator invoking aACCE. For interrupt<br />

entry, the code stream pointer is determined by the specific interrupt situation.<br />

b. The RCW is stored in place of the Initial <strong>Reference</strong>.<br />

3. Initialize processor state for the new procedure:<br />

LL is set from PCW.lex_level and D[LL] is set from F+1 to address the base of the<br />

activation record. The processor CS Boolean is set from PCW.control_state.<br />

Display registers are updated to reflect the new addressing environment. If the new<br />

PCW reference was the address couple in a name call operator immediately<br />

following the most recent MKST or MKSN, or the Initial <strong>Reference</strong> was a PCW, no<br />

update is necessary, since the global AR of the new activation record is already in<br />

the addressing environment. Otherwise, display update begins at D[LL–1], the new<br />

global AR.<br />

The expression stack is appended to the new activation record, making any<br />

procedure parameters accessible.<br />

The processor code stream pointer state is initialized from the PCW.<br />

aACCE <br />

The common action aACCE is invoked by some reference-chain evaluation operators to<br />

evaluate a PCW. The action is automatic invocation of the parameterless procedure<br />

(function) defined by the PCW; it is defined as three steps:<br />

1. Invoke MKST.<br />

2. Place the reference to the PCW onto the stack.<br />

3. Invoke ENTR.<br />

The accidental entry and subsequent return leave the processor executing the operator<br />

that initiated the accidental entry. (Unlike explicit ENTR, which builds an RCW<br />

referencing the successor operator, aACCE points the RCW at the invoking operator.)<br />

The invoking operator provides the value for rs. In particular, value-call operators set rs to<br />

1 to cause reentry in restart state.<br />

5–70 6878 7530–007


Procedure Exit Operators<br />

Operator Set<br />

There are three operators for deleting a stack frame and reinstating the prior topmost<br />

stack frame and its code stream.<br />

EXIT terminates a subroutine and leaves no result<br />

RETN terminates a function and leaves the top of stack item as<br />

a result<br />

RTN2 terminates a procedure that leaves two top-of-stack<br />

results<br />

These operators perform the Exit operation, which deletes the topmost stack frame from<br />

the stack and restores processor state for the prior topmost stack frame. The base<br />

location of the topmost activation record is addressed by D[LL] and the prior topmost AR<br />

is located as the first entered AR below D[LL].<br />

F must be equal to D[LL]-1 at the beginning of an Exit operation; the topmost activation<br />

record must be entered, not incipient. The HISW addressed by F is also deleted.<br />

If the stack linkage of the topmost activation record has the block_exit bit set, the Exit<br />

operation is not performed; a Block Exit service interrupt is generated instead.<br />

The topmost stack frame is deleted from the stack by setting the top of stack pointer at<br />

the first word below the stack linkage. At the start of the operation, S > D[LL] must be<br />

true (not counting any return arguments). The F register is set to point at the first HISW<br />

on the historical chain headed by the activation record being exited. LL is set from the<br />

value saved in the RCW. D[LL] is reset to address the base of the prior topmost<br />

activation record. If the new F designates an incipient AR, the historical chain is<br />

traversed until an entered AR is found. The CS (control state) Boolean and the Boolean<br />

accumulators are restored by distributing values saved in the stack linkage of the original<br />

stack frame. Display registers are updated to reflect the new addressing environment;<br />

the environmental chain is traversed beginning at D[LL].<br />

The processor code stream pointer is initialized from the RCW. If rs is set, the processor<br />

is conditioned to execute in restart mode the operator addressed by the new codes<br />

stream pointer.<br />

EXIT <br />

The EXIT operator performs an Exit operation for a procedure that returns no value on<br />

the stack.<br />

<br />

Stack-state : :<br />

: topmost :<br />

transformation: : :<br />

: stack frame :<br />

<br />

D[LL] linkage Null<br />

F <br />

<br />

6878 7530–007 5–71


Operator Set<br />

RETN <br />

RETN performs an Exit operation for a procedure that returns a result on the stack. It<br />

retains the initial top-of-stack item and pushes it back onto the expression stack after the<br />

topmost stack frame is deleted.<br />

<br />

<br />

TOS: any <br />

<br />

<br />

Stack-state : :<br />

: topmost :<br />

transformation: : :<br />

: stack frame : <br />

<br />

D[LL] linkage TOS <br />

F <br />

<br />

RETN requires an item from the expression stack. In user programs, the item should be<br />

an operand or a reference to some object that is global to the procedure being exited.<br />

Trusted software must prevent the return of a copy DD referencing a segment being<br />

deallocated by the exiting of this block.<br />

RTN2 <br />

RTN2 performs an Exit operation for a procedure that returns two results on the stack.<br />

The topmost two items in the topmost stack frame are placed in the same order at the<br />

top of the resumed stack frame. RTN2 requires two items from the expression stack.<br />

<br />

<br />

TOS: any <br />

<br />

<br />

<br />

TOS2: any <br />

<br />

<br />

Stack-state : : <br />

: topmost : TOS <br />

transformation: : : <br />

: stack frame : <br />

<br />

D[LL] linkage TOS2 <br />

F <br />

<br />

5–72 6878 7530–007


Assertion Operators<br />

Operator Set<br />

The assertion operators, ASRT and AVER, require and consume one operand on the<br />

stack. The argument is interpreted as a Boolean value. If it is False, a False Assertion<br />

interrupt is generated; the argument value is available to software for analysis. If the<br />

code stream is resumed by exiting from the interrupt procedure, the argument is gone<br />

from the stack and the subsequent operator is invoked.<br />

Top-of-stack <br />

<br />

transformation: opnd(Boolean) Null<br />

<br />

<br />

ASRT <br />

The ASRT operator performs an assertion operation. It has a one-syllable code<br />

parameter, which is available to software if a False Assertion interrupt is generated.<br />

<br />

Operator <br />

ASRT code <br />

format: <br />

<br />

AVER <br />

The AVER operator performs an assertion operation; it has no code stream parameter.<br />

(The verb aver is defined in Webster's New Collegiate Dictionary as "to verify or prove to<br />

be true..., to declare positively"; it is not an acronym or abbreviation.)<br />

Top-Of-Stack Operators<br />

These operators delete, duplicate, or reorder top-of-stack items. There is no restriction<br />

on the type of stack item that will be acted upon, however, as operator arguments, the<br />

items must be in the expression stack to avoid Stack Underflow interrupts. Note that an<br />

item may comprise either one or two words.<br />

DLET <br />

DLET requires one item on top of the stack and deletes it from the stack.<br />

Top-of-stack <br />

<br />

transformation: any Null<br />

<br />

<br />

6878 7530–007 5–73


Operator Set<br />

EXCH <br />

EXCH requires two items on top of the stack and interchanges their order in the stack.<br />

<br />

<br />

item1: any item2 <br />

Top-of-stack <br />

<br />

transformation: <br />

item2: any item1 <br />

<br />

<br />

DUPL <br />

DUPL requires one item on top of the stack, creates an exact duplicate of it, and leaves<br />

both items on top of the stack.<br />

<br />

<br />

item1 <br />

<br />

<br />

Top-of-stack <br />

item1: any item1 <br />

transformation: <br />

<br />

RSUP <br />

RSUP requires three top of stack items. The third from top item is rotated up to become<br />

the top of stack item.<br />

<br />

<br />

item1: any item3 <br />

<br />

<br />

Top-of-stack <br />

item2: any item1 <br />

transformation: <br />

<br />

<br />

item3: any item2 <br />

<br />

<br />

5–74 6878 7530–007


RSDN <br />

Operator Set<br />

RSDN requires three top of stack items. The top item is rotated down to become the<br />

third from top of stack item.<br />

<br />

<br />

item1: any item2 <br />

<br />

<br />

Top-of-stack <br />

item2: any item3 <br />

transformation: <br />

<br />

<br />

item3: any item1 <br />

<br />

<br />

Processor-State Manipulation Operators<br />

Operators in this group directly affect various elements of processor state, often reading<br />

state to the top of stack or setting state from the top of stack.<br />

DEXI <br />

DEXI conditions the processor to ignore all external interrupts and sets the processor CS<br />

Boolean to one (control state). The stack is unaffected.<br />

DEXI is partially restricted; DEXI and EEXI may be safely used only around short<br />

segments of code that must be executed atomically and are of short duration.<br />

EEXI <br />

EEXI conditions the processor to respond to external interrupts and resets the processor<br />

CS Boolean to 0 (normal state). If any external interrupt is pending when EEXI is<br />

executed (in control state), the interrupt occurs immediately following the EEXI operator,<br />

even if the immediate successor operator is DEXI.<br />

EEXI is partially restricted; it is used only as a companion to DEXI.<br />

ROFF <br />

ROFF leaves on top of the stack the Boolean value of OFFF (overflow flip-flop) and then<br />

unconditionally resets OFFF to false.<br />

<br />

Top-of-stack <br />

Null sp(Boolean) <br />

transformation: <br />

<br />

RTFF <br />

RTFF leaves on top of the stack the value of TFFF as a Boolean operand, True or False.<br />

The top of stack transformation is the same as for ROFF.<br />

6878 7530–007 5–75


Operator Set<br />

SXSN <br />

SXSN requires an operand on top of the stack. SXSN sets EXTF (EXTernal sign flip-flop)<br />

to the value of bit 46 of the top of stack item. The operand is left unchanged on the<br />

stack.<br />

<br />

Top-of-stack <br />

TOS: operand TOS <br />

transformation: <br />

<br />

RTOD <br />

RTOD leaves on top of the stack a 36-bit integer containing the value of the real time of<br />

day clock. The range of values is {0 to 2**36-1} in units of 2.4 microseconds, but is<br />

subject to change in later ClearPath MCP systems.<br />

<br />

Top-of-stack <br />

Null sp(integer) <br />

transformation: <br />

<br />

RSNR <br />

RSNR leaves on top of the stack a single_integer containing the SNR value.<br />

<br />

Top-of-stack <br />

Null sp(integer) <br />

transformation: <br />

<br />

5–76 6878 7530–007


Data Array Operators<br />

Operator Set<br />

Operators in this group perform functions on arrays specified by data descriptor stack<br />

arguments. The functions applied generally consist of sequential processing of one or<br />

more arrays of word or character elements. Termination occurs when an element length<br />

has been exhausted or when some condition is satisfied.<br />

Data in one of the argument arrays may be modified, the arrays may be processed in<br />

order to produce a result, or both actions may occur. Results are indicated by items left<br />

on top of the stack or by the setting of one or more processor Boolean accumulators.<br />

Array operators typically accept IndexedDDs as arguments. For an operator to access the<br />

data, the actual segment must be present.<br />

Paged Array Operations<br />

In general, arrays may be paged segments. The exception is that edit tables must be<br />

unpaged. (I/O subsystems, which are not specified here, typically require unpaged<br />

buffers.)<br />

A service interrupt (Touch <strong>Reference</strong> or Absent Data) occurs when an attempted page<br />

switch encounters an untouched or absent page. (Error interrupts can also occur at a<br />

page boundary if the ASD or page table structure is incorrect.) A characteristic of the<br />

Data Array operators is that a service interrupt can occur in mid-operation; such an<br />

occurrence is generically called a page boundary interrupt, a term that also includes<br />

Source and Destination Boundary interrupts. After the service has been performed<br />

(necessary segments are present), the operation is resumed. In general, the processor<br />

takes up where it stopped, although some operators can be simply repeated from the<br />

beginning.<br />

Except for the cases previously noted, Data Array operators automatically attempt to<br />

switch to the next page when an actual segment is exhausted.<br />

It is convenient to formalize all adjustment of descriptor index values as using aAPIX to<br />

apply a suitable increment; the common action switches pages as needed.<br />

6878 7530–007 5–77


Operator Set<br />

Searching Operators<br />

There are two searching operators: SRCH (masked search for equal) and BMS (bounded<br />

masked search for equal). Each search an array backwards for the first word that is<br />

bitwise equal to a target value after both the word and target value have been masked.<br />

SRCH <br />

SRCH scans an array called the domain, which is a virtual segment. The array is searched<br />

from an indexed starting point back towards the base for a word that matches a target<br />

value in selected bits. Any or all of the 56 bits (word, extension, and tag) may be<br />

matched. The result is a single_integer that is the virtual index of the matching word or -<br />

1 if the search fails.<br />

SRCH requires three arguments on top of the stack: the search domain, the mask, and<br />

the target value.<br />

<br />

<br />

domain: IndexedSingleDD <br />

<br />

<br />

Top-of-stack <br />

mask: any(bit-vector) <br />

transformation: <br />

<br />

<br />

targ: any(bit-vector) sp(integer) <br />

<br />

<br />

The domain argument must be an IndexedSingleDD; reindex must be enabled.<br />

Both the mask and target value are bit vectors of length 56. The target value is logically<br />

ANDed with the mask before it is used for comparison. The second word of any double<br />

precision target value or mask is ignored.<br />

The word referenced by the IndexedSingleDD is logically ANDed with the mask and<br />

compared to the (masked) target value. If a matching word is found, its index (relative to<br />

the virtual segment) is left on the stack as the SRCH result. If there is no match and the<br />

index is nonzero, the index is decremented by one and the search continues. If there is<br />

no match and the index is zero, the segment is exhausted and the failure result is<br />

returned.<br />

5–78 6878 7530–007


BMS <br />

Operator Set<br />

BMS is a variation of SRCH, with an additional argument that provides an upper bound<br />

on the length (number of words) of the search. The length argument appears topmost on<br />

the stack:<br />

<br />

<br />

length: opnd(integer) <br />

<br />

<br />

Top-of-stack <br />

domain: IndexedSingleDD <br />

transformation: <br />

<br />

<br />

mask: any(bit-vector) <br />

<br />

<br />

<br />

targ: any(bit-vector) sp(integer) <br />

<br />

<br />

The length must be an operand. It is integerized with the RaI function, if necessary; its<br />

integer magnitude must not exceed MaxLen.<br />

The domain, mask, and target arguments; the failure value; and the search algorithm are<br />

as defined for SRCH with the exception of the following:<br />

• The operator terminates and returns the failure result if the length is zero or negative<br />

at the beginning of any iteration (including the first)<br />

• The length is decremented after each word is examined<br />

• It is an error if the virtual segment is exhausted before the length is decremented to<br />

zero<br />

6878 7530–007 5–79


Operator Set<br />

Pointer Operators<br />

Pointer operators handle sequences of word or character elements in data arrays. There<br />

are pointer operators for scanning, transferring, comparing, and editing the element<br />

sequences in various methods. Some pointer operators handle only a source or a<br />

destination sequence, both a source and a destination sequence, or two source<br />

sequences. Sequential processing terminates when a length (element count) is<br />

exhausted. Other pointer operators, called enter-edit operators, serve to invoke one or<br />

more instances of another class of pointer operators, called edit-mode operators.<br />

Typical pointer operators require initial stack arguments that specify the length, the<br />

source element sequence, and the destination element sequence. A source or<br />

destination descriptor defines the first element of the target sequence; such a descriptor<br />

is generally called a pointer. More formally, pointer (in the context of data descriptors) is<br />

defined as the type union IndexedCharDD or IndexedWordDD. A source element<br />

sequence can be contained in an operand or designated pointer; a destination sequence<br />

is always designated by a pointer.<br />

Some operators (pack, input convert, string isolate) read a source and generate a result<br />

operand on the stack. These stack results are not defined to be destinations.<br />

The char_index of an IndexedCharDD must not exceed five or eleven for EBCDIC or hex,<br />

respectively.<br />

Element_size Conventions<br />

The element size for the source and/or destination sequence can be specified by the<br />

element_size in the IndexedCharDDs, inferred by default, or fixed by the operator. Only<br />

the translate operator can manipulate source and destination sequences of different<br />

element sizes. The word-transfer operators always operate on single words, however,<br />

they can accept indexed descriptors of any valid element_size. The unpack operators<br />

require a source operand and handle it as hex.<br />

All pointer operators, except for word-transfer, deal with either 4 or 8-bit characters. The<br />

following element_size adjustments are made (but the operand source of an unpack<br />

operator is always 4-bit):<br />

• If there are both source and destination arguments (or two source arguments), and<br />

only one is an IndexedCharDD, the element_size of the IndexedCharDD is applied to<br />

the other argument.<br />

• If there is no IndexedCharDD argument, then any source or destination is assumed<br />

to be EBCDIC.<br />

• When a character element_size is applied to a source or destination word descriptor,<br />

that argument effectively becomes an IndexedCharDD; the index must not exceed<br />

2**16-1.<br />

5–80 6878 7530–007


Operator Set<br />

For word-transfer operators, the element_size specified in the source and destination<br />

descriptors is unaltered and the operation handles single words. If an IndexedCharDD is<br />

used as source or destination and the char_index is nonzero, the descriptor is adjusted<br />

by setting char_index to zero and incrementing word_index; the resulting word index<br />

must not exceed 2**16-1.<br />

For all pointer operators except word-transfer and translate, if the source and destination<br />

arguments are both IndexedCharDDs, the element_size values must be equal.<br />

Segment Boundary<br />

The term segment boundary refers to the edges of a virtual segment. A segment<br />

boundary is detected when a pointer operator attempts to access an array element<br />

outside the source or destination virtual segment. This detection causes the processor to<br />

generate an error or service interrupt.<br />

Segment boundaries are determined from information in the ASDs (and in the page table<br />

for paged segments). A non-Data Word within the segment is reported separately via an<br />

error interrupt.<br />

A segment boundary is not detected after the length has been exhausted, by comparedelete<br />

operators after a mismatch has been detected, or by scan or conditional transfer<br />

operators after a source character has failed to satisfy the condition.<br />

Length Argument<br />

When a pointer operator is invoked in initial mode, the comments in the subsequent<br />

paragraph apply. If a pointer operator is resumed in restart mode, the length argument<br />

must be updated by the interrupted operator. (In some restart situations, a length of zero<br />

is significant.)<br />

The length argument must be an operand. It is integerized with rounding (RaI function) if<br />

required; the integer magnitude must not exceed MaxInx.<br />

A negative length value is equivalent to zero. If length is less than or equal to zero, all<br />

pointer operators terminate without accessing any source element or transferring any<br />

destination element, no segment boundary is detected, and no service interrupts are<br />

generated. (The enter-single-edit operators do not terminate for zero-length input; rather,<br />

any edit operators that require a length do so.)<br />

Source Argument<br />

The source argument must be an operand or a DD (indexed or unindexed) of any valid<br />

element_size.<br />

A source IndexedDD must have reindex enabled in all cases. All the elements accessed<br />

in the source sequence must be in operands.<br />

All pointer operators reject an attempt to access a source element outside the source<br />

segment. For certain of these operators that unconditionally transfer data to a<br />

destination, the interrupt is a Source Boundary service request when the attempted<br />

access is to fetch the first element beyond the source virtual segment.<br />

6878 7530–007 5–81


Operator Set<br />

A source operand sequence begins with the high order character of the operand; it is<br />

interpreted according to element_size conventions defined above as EBCDIC sequence<br />

of 6 (or 12) characters or a hex sequence of 12 (or 24) characters, for a single (or double)<br />

precision operand, respectively. The operand is concatenated with itself as required to<br />

form a sequence of indefinite length.<br />

Short Source Operators<br />

The string-isolate, pack, and input-convert operators are special in that the source<br />

sequence is short (never more than 25 characters) and the result is left on the stack as<br />

an operand rather than be moved to a destination sequence. Some of these operators<br />

interpret one character or one zone field as a sign.<br />

If a short-source operator is interrupted and the code sequence is subsequently<br />

resumed, the operator is repeated from the beginning.<br />

Destination Argument<br />

The destination argument must be a DD (indexed or unindexed) of any valid<br />

element_size; a destination IndexedDD must have reindexed enabled.<br />

Any word modified in the destination sequence of a character transfer operator must<br />

contain an operand; any destination word written by a word transfer operator must<br />

contain a Data Word. Character transfer operators preserve the tag and extension of the<br />

destination word; word transfer operators copy the tag and extension of the source word<br />

into the destination word.<br />

An operator is said to require a destination if a destination stack argument is specified,<br />

except for the Enter Single Edit operators. These operators require a destination if the<br />

subsequent edit operator conditionally or unconditionally transfers data. All operators that<br />

require a destination require a write enabled destination pointer.<br />

All pointer operators reject an attempt to access a destination element outside the<br />

destination sequence. If the attempt is to store into the first element beyond the<br />

destination segment, the interrupt is a Destination Boundary service request.<br />

Source1 and Source2 Arguments<br />

The compare operators process two sources, rather than a source and a destination.<br />

Source2 is a source defined previously. Source1 takes the place of a destination; it must<br />

be a DD (not an operand). Both source IndexedDD cases require that reindex be enabled.<br />

Overlapping Source and Destination<br />

A source and destination are said to overlap if both arguments are DDs into the same<br />

segment and the displacement (index difference) between them is less than the<br />

effective length (number of elements transferred).<br />

The effect of an overlapped unconditional word or character transfer depends upon the<br />

direction and magnitude of the displacement. In the following, D represents the<br />

displacement expressed as destination element index minus the corresponding source<br />

element index. L represents the transfer length.<br />

5–82 6878 7530–007


Operator Set<br />

D


Operator Set<br />

A source or destination descriptor is updated as an indexed descriptor that references<br />

the next source or destination element that would have been processed. The updated<br />

descriptor reflects any adjustments made according to the element_size conventions<br />

previously defined. Word-transfer operators may adjust the char_index and word_index<br />

values; all other operators change any IndexedWordDD into an IndexedCharDD. These<br />

adjustments occur even when length less than or equal zero, but they are undefined for<br />

the special case of RSTF introduced by EXPU or EXSU.<br />

An updated descriptor from a forward-acting operator can designate the first element<br />

beyond the segment.<br />

The field-width limits in a descriptor are 2**16-1 for the word_index field in an<br />

IndexCharDD and 2**20-1 for the index field in an IndexedWordDD. If the word index<br />

value to be updated into a descriptor exceeds the limit, an error interrupt is generated.<br />

The interrupt is reported at any point in the processing sequence where the word index<br />

exceeds the limit.<br />

Most pointer operators can be interrupted (for example, at a page boundary) in such a<br />

way that the operation can be resumed where it stopped. Both update and delete<br />

operators are subject to such interruption; the stack arguments are configured for<br />

resuming the operator in initial (for short-source operators) or restart (for all other pointer<br />

operators) mode. In restart mode, the original arguments are left on the stack with a<br />

progress count included in the restart information.<br />

Unconditional Character-Transfer Operators<br />

Unconditional character transfer operators transfer hex or EBCDIC characters from the<br />

source to the destination. The number of characters transferred is specified by the<br />

length. TFFF is left in an undefined state.<br />

TUND <br />

<br />

<br />

len: opnd(integer) <br />

<br />

Top-of-stack <br />

<br />

transformation source: pntr, opnd <br />

<br />

for TUND: <br />

<br />

dest: pntr Null<br />

<br />

<br />

5–84 6878 7530–007


TUNU <br />

<br />

<br />

len: opnd(integer) <br />

<br />

Top-of-stack <br />

<br />

transformation source: pntr, opnd source’ <br />

<br />

for TUNU: <br />

<br />

dest: pntr dest’ <br />

<br />

<br />

Character Relational Operators<br />

Operator Set<br />

Character relational operators sequentially apply a relational comparison of each source<br />

character to a delimiter character supplied by a stack argument until the length is<br />

exhausted or a relation fails. For the scan and transfer operators, TFFF indicates the<br />

cause of termination: it is reset to 0 if a relation fails and set to 1 if the length is<br />

exhausted (all source characters satisfy the relation or the initial length is less than or<br />

equal to zero). For the string copy operator, TFFF is left undefined.<br />

The delimiter argument must be a single precision operand; it is interpreted as a single<br />

right-justified character (EBCDIC or hex according to the effective element size of the<br />

source); all bits in the delimiter word except those in the delimiter character are ignored.<br />

The binary value of each source character is compared to the binary value of the<br />

delimiter character. The operator names specify the relation of the source character to<br />

delimiter that must hold for the operation to continue. For example, the SLSU operator<br />

scans across source characters less than the delimiter.<br />

6878 7530–007 5–85


Operator Set<br />

Scan Operators<br />

Character relational scan operators sequentially compare each source character to the<br />

delimiter character as defined previously. In <strong>Level</strong> Delta and <strong>Epsilon</strong>, SxxD is required to<br />

be immediately followed by RTFF, and TFFF is left in an undefined state.<br />

SEQD (scan while equal delete)<br />

SNED (scan while not equal delete)<br />

SGTD (scan while greater delete)<br />

SGED (scan while greater or equal delete)<br />

SLED (scan while less or equal delete)<br />

SLSD (scan while less delete)<br />

<br />

<br />

delim: sp(char) <br />

<br />

Top-of-stack <br />

<br />

transformation len: opnd(integer) <br />

<br />

for SEQD, etc.: <br />

<br />

source: pntr, opnd Null<br />

<br />

<br />

SEQU (scan while equal update)<br />

SNEU (scan while not equal update)<br />

SGTU (scan while greater update)<br />

SGEU (scan while greater or equal update)<br />

SLEU (scan while less or equal update)<br />

SLSU (scan while less update)<br />

<br />

<br />

delim: sp(char) <br />

<br />

Top-of-stack <br />

<br />

transformation len: opnd(integer) len’ <br />

<br />

for SEQU, etc.: <br />

<br />

source: pntr, opnd source’ <br />

<br />

<br />

5–86 6878 7530–007


Transfer Operators<br />

Operator Set<br />

Character relational transfer operators sequentially compare each source character to the<br />

delimiter character as defined previously. Each source character that satisfies the relation<br />

is transferred to the destination sequence.<br />

TEQD (transfer while equal delete)<br />

TNED (transfer while not equal delete)<br />

TLED (transfer while less or equal delete)<br />

TLSD (transfer while less delete)<br />

TGTD (transfer while greater delete)<br />

TGED (transfer while greater or equal delete)<br />

<br />

<br />

delim: sp(char) <br />

<br />

Top-of-stack <br />

<br />

transformation len: opnd(integer) <br />

<br />

for TEQD, etc.: <br />

<br />

source: pntr, opnd <br />

<br />

<br />

<br />

dest: pntr Null<br />

<br />

<br />

TEQU (transfer while equal update)<br />

TNEU (transfer while not equal update)<br />

TGTU (transfer while greater update)<br />

TGEU (transfer while greater or equal update)<br />

TLEU (transfer while less or equal update)<br />

TLSU (transfer while less update)<br />

<br />

<br />

delim: sp(char) <br />

<br />

Top-of-stack <br />

<br />

transformation len: opnd(integer) len’ <br />

<br />

for TEQU, etc.: <br />

<br />

source: pntr, opnd source’ <br />

<br />

<br />

<br />

dest: pntr dest’ <br />

<br />

<br />

6878 7530–007 5–87


Operator Set<br />

SCPY <br />

The string copy operator is identical to TNED, with three exceptions:<br />

• A source character which is equal to the delimiter will be transferred, even though it<br />

terminates the operator.<br />

• The number of characters transferred which are unequal to the delimiter will be left<br />

as a result in TOS.<br />

• TFFF will be left undefined.<br />

<br />

<br />

delim: sp(char) <br />

<br />

<br />

<br />

len: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

source: pntr, opnd <br />

<br />

<br />

<br />

dest: pntr xfer count <br />

<br />

<br />

Character-Sequence Compare Operators<br />

Character sequence compare operators apply a relational comparison of the source1<br />

sequence to the source2 sequence. The operator name specifies the relation being<br />

tested. These operators are required to be followed by RTFF, and TFFF is left in an<br />

undefined store.<br />

The binary values of each corresponding source1 and source2 character are compared.<br />

The two sequences are equal if, and only if, each source1 character is equal to the<br />

corresponding source2 character for the specified length or the initial length is zero.<br />

Source1 is strictly less (greater) than source2 if, and only if, for the first (left-most) pair of<br />

unequal characters, the source1 character is strictly less (greater) than the source2<br />

character.<br />

5–88 6878 7530–007


The following operators terminate when the actual relation is determined.<br />

CEQD (compare characters equal delete)<br />

CNED (compare characters not equal delete)<br />

CGTD (compare characters greater delete)<br />

CGED (compare characters greater or equal delete)<br />

CLED (compare characters less or equal delete)<br />

CLSD (compare characters less delete)<br />

<br />

<br />

len: opnd(integer) <br />

<br />

Top-of-stack <br />

<br />

transformation source2: pntr, opnd <br />

<br />

for CEQD, etc.: <br />

Null<br />

source1: pntr <br />

<br />

<br />

Operator Set<br />

The character sequence compare operators are obsolete, superceded by CREL ZERO<br />

Numeric Relational sequence..<br />

Character Sequence Relation Operators<br />

These operators are similar to the character sequence compare operators, except that<br />

they determine the exact relation between the two character sequences and report the<br />

result on the top of stack, rather than in TFFF, which is left undefined.<br />

<br />

<br />

len: opnd(integer) <br />

<br />

<br />

Top-of-stack <br />

source2: pntr, opnd <br />

transformation: <br />

<br />

<br />

source1: pntr result <br />

<br />

<br />

The result defines the relation between the two sequences as follows:<br />

source1 < source2: –1<br />

source1 = source2: +0<br />

source1 > source2: +1<br />

CREL <br />

CREL determines the relation between two character sequences, for the entire length<br />

indicated by the length argument. It terminates as soon as the relation is determined by<br />

unequal characters.<br />

6878 7530–007 5–89


Operator Set<br />

SCMP <br />

SCMP performs the same comparison as CREL, but terminates early if a null (zero)<br />

character is encountered in either sequence, reporting the relation determined up to that<br />

point. If a null character is encountered simultaneously in both strings, the result of equal<br />

is returned; otherwise, the string containing the first null character is reported as less.<br />

Character sequence relationals supplant old comparisons<br />

The character sequence relation operators avoid the need to issue two character<br />

sequence compare operators to determine the precise relation between two sequences,<br />

as the result can be duplicated on the stack and various relations tested:<br />

source1 = source2: not BOOLEAN(result)<br />

source1 source2: BOOLEAN(result)<br />

source1 < source2: result < 0, or BOOLEAN( result . [46:1] )<br />

source1 source2: result > 0<br />

source >= source2: result geq 0, or not BOOLEAN (result . [46:1])<br />

SCMP may take the place of at least two pointer operators (a scan update followed by at<br />

least one compare) when the length of one or both sequences is unknown (is delimited<br />

by a null character). Note, however, that CREL will typically perform better than SCMP<br />

where applicable; including the case where only one length is known, but that string is<br />

also known not to contain a null character.<br />

Character Set Membership Operators<br />

Character set membership operators test source characters for membership in a<br />

character set supplied by a stack argument. The relations applied are inclusion and<br />

exclusion. Source characters are sequentially tested until the relation fails or the length is<br />

exhausted. TFFF indicates the cause of termination: It is reset to 0 if a relation fails and<br />

set to 1 if the length is exhausted (all source characters satisfy the membership criterion<br />

or the initial length is less than or equal to zero).<br />

The character set argument must be an IndexedSingleDD, which designates the first<br />

word of the character set. Reindex must be enabled in this descriptor. Every word<br />

accessed in the set must be an operand. Every word accessed in the set must lie within<br />

the designated virtual segment.<br />

The character set is interpreted as a bit vector indexed by the source character. If the<br />

selected bit is 1, the character is included in the set; otherwise, it is excluded from the<br />

set. The bit is located by the following expression, where Set represents the character<br />

set argument and SetSeg the segment designated by that argument:<br />

SetSeg[Set.index+WordIndex(c)].[BitIndex(c):1]<br />

5–90 6878 7530–007


Operator Set<br />

WordIndex and BitIndex are computed from the binary representation of the source<br />

character (c) as follows:<br />

EBCDIC WordIndex = value of three high-order bits<br />

BitIndex = 31 - (value of five low-order bits)<br />

hex WordIndex = 0<br />

BitIndex = 31 - (4-bit value)<br />

In the following operator names, the relation "while source included in set" is called while<br />

true and "while excluded from set" is called while false.<br />

Scan Operators<br />

Character set membership scan operators apply the sequential membership test of each<br />

source character to the character set as defined previously.<br />

SWFD <br />

SWTD <br />

<br />

<br />

set: I1DD <br />

<br />

Top-of-stack <br />

<br />

transformation len: opnd(integer) <br />

<br />

for SWFD & SWTD: <br />

<br />

source: pntr, opnd Null<br />

<br />

<br />

SWFU <br />

SWTU <br />

<br />

<br />

set: I1DD <br />

<br />

Top-of-stack <br />

<br />

transformation len: opnd(integer) len’ <br />

<br />

for SWFU & SWTU: <br />

<br />

source: pntr, opnd source’ <br />

<br />

<br />

6878 7530–007 5–91


Operator Set<br />

Transfer Operators<br />

Character set membership transfer operators apply the sequential membership test of<br />

each source character to the character set as defined previously. Each source character<br />

that satisfies the membership criterion is transferred to the destination sequence.<br />

TWFD <br />

TWTD <br />

<br />

<br />

set: I1DD <br />

<br />

Top-of-stack <br />

<br />

transformation len: opnd(integer) <br />

<br />

for TWFD & TWTD: <br />

<br />

source: pntr, opnd <br />

<br />

<br />

<br />

dest: pntr Null<br />

<br />

<br />

TWFU <br />

TWTU <br />

<br />

<br />

set: I1DD <br />

<br />

Top-of-stack <br />

<br />

transformation len: opnd(integer) len’ <br />

<br />

for TWFU & TWTU: <br />

<br />

source: pntr, opnd source’ <br />

<br />

<br />

<br />

dest: pntr dest’ <br />

<br />

<br />

5–92 6878 7530–007


Character Translate Operator<br />

Operator Set<br />

TRNS sequentially accesses characters from the source sequence, maps each character<br />

into a specified character set, and stores the translated character into the destination<br />

sequence. The character set mapping is indicated by a translate table argument.<br />

TRNS <br />

<br />

<br />

trtab: I1DD <br />

<br />

<br />

<br />

len: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

source: pntr, opnd source’ <br />

<br />

<br />

<br />

dest: pntr dest’ <br />

<br />

<br />

The translate table must be an IndexedSingleDD, which designates the first word of the<br />

translate table. Reindex must be enabled in this descriptor. Every word accessed on the<br />

table must be an operand. Every word accessed in the table must lie within the<br />

designated virtual segment.<br />

The translate table is interpreted as an array of words, each containing four right-justified<br />

8-bit characters; it is indexed by the source character. The selected 8-bit character is<br />

stored into an EBCDIC destination or the four low- order bits of the character are stored<br />

into a hex destination. The character is located by the following expression, where Table<br />

represents the translate table argument and TableSeg represents the segment<br />

designated by that argument.<br />

TableSeg[Table.index+WordIndex(c)].[FieldIndex(c):8]<br />

WordIndex and FieldIndex are computed from the binary representation of the source<br />

character (c) as follows:<br />

EBCDIC WordIndex = value of six high-order bits<br />

FieldIndex = 31 - 8*(value of two low-order bits)<br />

hex WordIndex = value of two high-order bits<br />

FieldIndex = 31 - 8*(value of two low order bits)<br />

TRNS leaves the updated source on top of the stack and the updated destination second<br />

from top of the stack.<br />

6878 7530–007 5–93


Operator Set<br />

Character Sequence Extraction Operator<br />

SISO extracts a character sequence from the source, creates an operand containing the<br />

extracted sequence right-justified with leading zero-fill if required, and leaves the<br />

operand on top of the stack. The length specifies the number of characters in the<br />

extracted sequence.<br />

SISO <br />

<br />

<br />

len: opnd(integer) <br />

Top-of-stack <br />

<br />

transformation: <br />

source: pntr, opnd opnd(char sequence) <br />

<br />

<br />

The result is a single or double precision-operand depending on the length and the<br />

source character type. If the source is EBCDIC, the result is single for length less than or<br />

equal to six and double for {7 to 12}. If the source is hex, the result is single for length<br />

less than or equal to twelve and double for {13 to 24}. The length must not exceed 12 or<br />

24 for EBCDIC and hex source, respectively.<br />

Decimal Character Sequence Operators<br />

Decimal character sequence operators interpret hex or EBCDIC sequences as digit<br />

sequences and provide conversion functions among various numeric representations.<br />

For definitions of digit sequences and decimal sequence operands, see "Decimal<br />

Sequence Operands" in Section 3.<br />

The hex representation of a digit sequence is as a hex sequence of the corresponding<br />

digit values. The EBCDIC representation of a digit sequence is an EBCDIC sequence in<br />

which the numeric field (low-order four bits) of each character contains a digit value. The<br />

high-order four bits are called the zone field; zone fields are significant in some<br />

operators, but they do not form part of the digit sequence.<br />

A signed decimal integer is represented as a digit sequence and a sign value. Hex "D"<br />

represents a negative sign; any other 4-bit value represents a positive sign. The sign may<br />

be placed at either the left (high-order) or right (low- order) end of the sequence. A<br />

signed sequence of n digits is represented in hex as a sequence of n+1 characters; the<br />

sign is the leftmost or rightmost character. A signed n-digit sequence is represented in<br />

EBCDIC as a sequence of n characters; the sign occupies the zone field of the leftmost<br />

or rightmost character. (Operand digit sequences are always unsigned; EXTF can be<br />

used to hold the sign.)<br />

5–94 6878 7530–007


Operator Set<br />

There are three groups of decimal character sequence pointer operators. The pack<br />

operators transform a hex or EBCDIC source sequence into a right-justified operand digit<br />

sequence. The unpack operators transform a left-justified operand digit sequence into a<br />

hex or EBCDIC destination sequence. The input-convert operators are similar to pack,<br />

but the integer value of the source sequence is transformed to binary representation.<br />

ICVD handles a hex source sequence as either unsigned or left-signed, depending upon<br />

the value of the first character. A nondigit value is considered as a sign; a digit value is a<br />

digit. The sign is not counted in the length.<br />

Pack Operators<br />

Pack operators perform a conversion from the source EBCDIC or hex digit sequence to a<br />

decimal operand containing the corresponding digit sequence right- justified with leading<br />

zero-fill. The operand is left as a result on the stack. Nondigits in a hex source sequence<br />

(other than a sign character) or in the numeric field of an EBCDIC source sequence are<br />

transferred unmodified to the operand digit sequence.<br />

The result is a single precision operand if length less than or equal to twelve and double<br />

precision for {13 to 24}. The length must not exceed 24.<br />

PKUD <br />

PKLD <br />

PKRD <br />

<br />

<br />

Top-of-stack len: opnd(integer) <br />

<br />

transformation <br />

<br />

for PKxD & PACD: source: pntr, opnd opnd(digit sequence) <br />

<br />

<br />

PKUD leaves EXTF and TFFF in undefined states. All other pack operators set both EXTF<br />

and TFFF: true = negative sign and non-zero digit sequence, and false = otherwise. If the<br />

length argument is less than or equal zero, EXTF and TFFF are set false.<br />

If the length is greater than zero, the source is hex, and there is a sign, the number of<br />

characters read from the hex sequence is one greater than the length value. A sign is<br />

always present for PKLD and PKRD and never present for PKUD. If the length is less<br />

than or equal to zero, no source characters are read and the digit-sequence result is zero.<br />

6878 7530–007 5–95


Operator Set<br />

The following are the sign locations for these operators:<br />

Unpack Operators<br />

PKUD: none<br />

PKLD, EBCDIC: zone of leftmost character<br />

PKLD, hex: leftmost character<br />

PKRD, EBCDIC: zone of rightmost character<br />

PKRD, hex: rightmost character<br />

Unpack operators interpret the source operand as a left-justified digit sequence and store<br />

the corresponding hex or EBCDIC digit sequence into the destination. Nondigits in the<br />

operand digit sequence are transferred unmodified to the hex characters or the numeric<br />

field of the EBCDIC characters in the destination sequence.<br />

<br />

<br />

len: opnd(integer) <br />

<br />

<br />

Top-of-stack <br />

source: opnd(digit sequence) <br />

transformation <br />

<br />

for UPxD & USND: <br />

dest: pntr Null<br />

<br />

<br />

<br />

<br />

len: opnd(integer) <br />

<br />

Top-of-stack <br />

<br />

transformation source: opnd(digit sequence) source’ <br />

<br />

for UPxU & USNU: <br />

<br />

dest: pntr dest’ <br />

<br />

<br />

The element_size convention for unpack is that the source operand is unconditionally<br />

handled as hex. If the destination is a WordDD, it is changed to an EBCDIC CharDD. The<br />

source must be an operand. The length must not exceed 24.<br />

5–96 6878 7530–007


Unpack-Unsigned Operators<br />

Operator Set<br />

Unpack-unsigned operators store the destination digit sequence without a sign. For an<br />

EBCDIC destination, the zone field of each character is set to hex "F". For a hex<br />

destination, the digit sequence is stored with no sign character.<br />

UPUD <br />

UPUU <br />

Unpack-Signed Operators<br />

Unpack signed operators store the destination digit sequence with a sign; the sign is<br />

determined by EXTF (external sign flip-flop), where true equals negative and false equals<br />

positive. The operator mnemonics and names are listed as follows with the location of<br />

the sign for hex and EBCDIC sequences:<br />

Hex EBCDIC<br />

UPLD (unpack left-signed delete) left left zone<br />

UPLU (unpack left-signed update) left left zone<br />

UPRD (unpack right-signed delete) right right zone<br />

UPRU (unpack right-signed update) right right zone<br />

USND (unpack signed delete) left right zone<br />

USNU (unpack signed update) left right zone<br />

Hex "C" and Hex "D" are used as the positive and negative sign characters, respectively.<br />

For an EBCDIC destination, the sign is inserted into the zone field of the rightmost or<br />

leftmost character, depending on the operator, and all other zone fields are set to hex "F".<br />

For a hex destination and length greater than zero, the sign is inserted as the leftmost or<br />

rightmost character, depending on the operator; length+1 hex characters are transmitted<br />

to the destination sequence. If the length is less than or equal to zero, no characters are<br />

transmitted to the destination sequence.<br />

Unpack operators can be considered short destination operators, analogous to shortsource<br />

operators. If interrupted at a page boundary, the operator is repeated from the<br />

beginning after both pages are present. (Although restart mode may be used for<br />

convenience, it is discarded to force repetition from the beginning.)<br />

USND and USNU are obsolete, superseded by UPLD/UPRD and UPLU/UPRU.<br />

6878 7530–007 5–97


Operator Set<br />

Input Convert Operators<br />

Input convert operators perform a conversion from the source EBCDIC or hex digit<br />

sequence to a numeric operand containing the signed integer value of the corresponding<br />

digit sequence. The operand is left as a result on the stack. TFFF and EXTF are left in<br />

undefined states.<br />

The length must not exceed 23. If the length is less than 12, a single_integer is<br />

produced. If the length exceeds 11, a double_integer is produced. If the length exceeds<br />

11, but the result absolute value is less than 8**13, some other ClearPath MCP systems<br />

represent the value as a single_integer or an extended single_integer.<br />

ICUD <br />

ICLD <br />

ICRD <br />

ICVD <br />

<br />

<br />

Top-of-stack len: opnd(integer) <br />

<br />

transformation <br />

<br />

for ICxD & ICVD: source: pntr, opnd opnd(integer) <br />

<br />

<br />

ICVD is deprecated, generally, superseded by ICUD, ICLD, and ICRD; except for certain<br />

“undefined” situations in COBOL and ALGOL.<br />

If the length is greater than zero, the source is hex, and there is a sign, the number of<br />

characters read from a hex sequence is one greater than the length value. A sign is<br />

always present for ICLD and ICRD and never present for ICUD; a sign is present for ICVx<br />

when the leftmost hex character is a nondigit. If the length is less than or equal to zero,<br />

no source characters are read and the binary integer result is positive zero.<br />

The sign locations for these operators are the same as for the corresponding pack<br />

operators:<br />

ICUD: none<br />

ICLD, EBCDIC: zone of leftmost character<br />

ICLD, hex: leftmost character<br />

ICRD, EBCDIC: zone of rightmost character<br />

ICRD, hex: rightmost character<br />

ICVD, EBCDIC: zone of rightmost character<br />

ICVD, hex: leftmost character if nondigit, else none<br />

5–98 6878 7530–007


Operator Set<br />

If the source digit sequence contains a nondigit, the result value is undefined, except<br />

that a sequence of all hex "F" characters is equivalent to a sequence of nines. (Note that<br />

"digit sequence" does not include the zone fields of an EBCDIC source or a sign character<br />

in a hex source.)<br />

Word Transfer Operators<br />

Word transfer operators transfer word elements from the source to the destination. The<br />

number of words is specified by the length. The tag of each source word is copied to the<br />

corresponding destination word.<br />

A source operand is interpreted as a word or pair of words concatenated with itself<br />

indefinitely.<br />

Source and destination IndexedCharDDs, if not already word-aligned, are advanced to<br />

the next word boundary.<br />

TWSD <br />

<br />

<br />

len: opnd(integer) <br />

<br />

<br />

Top-of-stack <br />

source: pntr, opnd <br />

transformation <br />

<br />

for TWSD: <br />

dest: pntr Null<br />

<br />

<br />

TWSU <br />

<br />

<br />

len: opnd(integer) <br />

<br />

Top-of-stack <br />

<br />

transformation source: pntr, opnd source’ <br />

<br />

for TWSU: <br />

<br />

dest: pntr dest’ <br />

<br />

<br />

6878 7530–007 5–99


Operator Set<br />

Edit Operators<br />

Edit mode operators can be considered sub-operators invoked by a special class of<br />

pointer operators, the enter-edit operators. Most edit operators process source and/or<br />

destination characters sequentially until a length is exhausted.<br />

Enter Edit Operators<br />

There are two modes in which edit operators are executed; each is initiated by an enter<br />

edit operator. The enter edit operator provides the destination and (except for EXPU)<br />

source. It may specify update, which causes an updated source (if any) and destination<br />

argument to be left on top of the stack at termination of edit mode.<br />

• Table edit mode<br />

A sequence of edit operators is executed until terminated by ENDE (end edit). Each<br />

acts on the source and destination supplied by the table enter edit operator; length is<br />

a parameter for each edit operator requiring it. If update is specified, the updated<br />

source and destination are left on the stack by ENDE.<br />

Each edit operator that uses the source/destination updates it internally at<br />

termination so that a group of edit operators may sequentially process<br />

source/destination characters. Character-skip operators may advance or back up the<br />

source/destination to alter the normal sequential processing.<br />

• Single edit mode<br />

A single edit operator acts on the source and destination supplied by the enter single<br />

edit operator. Length is also supplied as a stack argument at entry, whether or not it<br />

is required by the edit operator. If update is specified, the updated source and<br />

destination are left on the stack at termination of the edit operator.<br />

The enter-edit operators validate argument types and perform any needed element_size<br />

adjustment, as defined previously for other pointer operators.<br />

With the exception of EXPU, all enter-edit operators set FLTF = 0 when executed in<br />

initial mode. When restarted, these operators preserve the FLTF value.<br />

Enter-Table-Edit Operators<br />

Enter table edit operators supply the source and destination sequences and a reference<br />

to the sequence, or table, of edit operators to be executed. Each edit operator acts on<br />

the source and/or destination supplied at entry; length is a parameter for each edit<br />

operator requiring it.<br />

5–100 6878 7530–007


Operator Set<br />

The edit table must be an unpaged IndexedDD, which is interpreted as usual, except that<br />

the element_size field is ignored and the index field is subdivided as follows:<br />

[39: 1] Must be zero<br />

esi [38: 3] Edit table syllable index of the first edit operator;<br />

must be in {0 to 5}<br />

[35: 3] Must be zero<br />

ewi [32:13] Edit table word index of the word containing the first<br />

edit operator<br />

(The set of valid edit-table descriptors includes IndexedSingleDDs and EBCDIC<br />

IndexedCharDDs that have index or word_index values less than 2**13.)<br />

The edit table descriptor must be reindex enabled.<br />

Edit operators (and their parameters) are fetched from the edit table, starting from the<br />

esi syllable of the ewi word, until completion of an ENDE (end edit) operator. The normal<br />

code stream is then resumed with the operator following the enter table edit operator.<br />

Each edit table word that is fetched must have a tag = 0. The table cannot extend<br />

beyond word index 2**13-1.<br />

When a table edit sequence is interrupted and resumed, the processor uses restart<br />

mode with an additional stack argument to provide a progress count. The updated table<br />

argument points to the edit operator that generated the interrupt.<br />

TEED <br />

<br />

<br />

edtab: unpaged indexedDD <br />

<br />

<br />

Top-of-stack <br />

source: pntr, opnd <br />

transformation <br />

<br />

for TEED: <br />

dest: pntr Null<br />

<br />

<br />

6878 7530–007 5–101


Operator Set<br />

TEEU<br />

<br />

<br />

edtab: unpaged indexedDD <br />

<br />

Top-of-stack <br />

<br />

transformation source: pntr, opnd source’ <br />

<br />

for TEEU: <br />

<br />

dest: pntr dest’ <br />

<br />

<br />

<br />

Enter-Single-Edit Operators<br />

Enter single edit operators supply the destination sequence, occasionally the source<br />

sequence, and the length for the edit operator that follows it in the code stream. Each<br />

argument must be on the stack and must meet type restrictions, although it may not be<br />

required by the edit operator.<br />

All edit operators requiring length terminate without transferring any characters if the<br />

length is zero.<br />

The enter-single-edit operators cannot introduce the edit operators that insert a character<br />

conditionally based on FLTF; the excluded operators are INSC and ENDF. The EXSD and<br />

EXSU operators can introduce the move operators that sense and set FLTF (MFLT and<br />

MINS), although FLTF is unconditionally reset at the beginning of the operator and<br />

discarded at the end.<br />

EXSD<br />

<br />

<br />

len: opnd(integer) <br />

<br />

<br />

Top-of-stack <br />

source: pntr, opnd <br />

transformation <br />

<br />

for EXSD: <br />

dest: pntr Null<br />

<br />

<br />

<br />

5–102 6878 7530–007


EXSU<br />

Operator Set<br />

<br />

<br />

len: opnd(integer) <br />

<br />

Top-of-stack <br />

<br />

transformation source: pntr, opnd source’ <br />

<br />

for EXSU: <br />

<br />

dest: pntr dest’ <br />

<br />

<br />

<br />

EXPU<br />

<br />

<br />

Top-of-stack len: opnd(integer) <br />

<br />

transformation <br />

<br />

for EXPU: dest: pntr dest’ <br />

<br />

<br />

No source is provided for EXPU; the subsequent edit operator must not require a source.<br />

(The excluded edit operators are MCHR, MVNU, MINS, MFLT, SFSC, and SRSC.)<br />

<br />

The element_size convention applied for EXPU is that a WordDD destination pointer is<br />

changed to an EBCDIC CharDD.<br />

No delete form of single pointer enter edit operator is provided.<br />

Edit Mode Operators<br />

The following paragraphs define the operators that are executed in edit mode (under the<br />

control of an enter-edit operator).<br />

Each edit operator is permitted to update its arguments and enforce all the checking<br />

associated with pointer update. In particular, any error due to an unrepresentable<br />

updated pointer can be trapped, even if the resulting pointer would have been deleted<br />

without further use.<br />

6878 7530–007 5–103


Operator Set<br />

Character Skip Operators<br />

Skip Forward<br />

Skip Reverse<br />

Character skip operators advance or reverse the source or destination sequence. Length<br />

indicates the number of characters to be skipped.<br />

Length is a parameter for table edit mode only:<br />

<br />

<br />

Operator Skip Skip <br />

Len <br />

formats: op op <br />

<br />

<br />

(Table Edit) (Single Edit)<br />

A skip operation on a pointer alters the pointer so that it designates a different element<br />

in the same sequence; the length value designates the extent of the change and the<br />

operator (forward or reverse) its direction. This operation occurs by reindexing the<br />

pointer.<br />

The skip operators use aAPIX. The operations must abort when the resulting virtual index<br />

cannot be represented in an indexed DD; some other ClearPath MCP systems also<br />

cause them to abort if the resulting pointer designates an element beyond last+1.<br />

SFSC <br />

SFDC <br />

Character skip forward operators advance the source or destination sequence. A source<br />

operand is circularly rotated left by length characters. A CharDD is incremented by length<br />

characters.<br />

The maximum length value that can be applied to a pointer is one that causes the pointer<br />

to designate the first element beyond the virtual segment. However, software cannot<br />

count on an error exception for all larger length values.<br />

The SFSC operator cannot be introduced by EXPU.<br />

SRSC <br />

SRDC <br />

Character skip reverse operators back up the source or destination sequence. A source<br />

operand is circularly rotated right by length characters. A CharDD is decremented by<br />

length characters.<br />

The maximum length value that can be applied to a pointer is one that causes the pointer<br />

to designate the first element of the virtual segment.<br />

The SRSC operator cannot be introduced by EXPU.<br />

5–104 6878 7530–007


Character Insert Operators<br />

Operator Set<br />

Character insert operators store a character or a sequence of characters into the<br />

destination sequence, in some cases conditionally based on the value of FLTF (float<br />

flip-flop) and EXTF (external sign flip-flop). Each character is a parameter, except for a<br />

fixed sign character.<br />

Several insert operators do not allow a hex destination. Those that do store only the<br />

numeric field of a parameter character.<br />

INSU <br />

INSU stores a sequence composed of length repetitions of the parameter character<br />

(Char) into the destination.<br />

Length is a parameter for table edit mode only:<br />

<br />

Operator <br />

<br />

format: INSU Len Char INSU Char <br />

<br />

<br />

(Table Edit) (Single Edit)<br />

INSC <br />

INSC stores a sequence composed of length repetitions of a selected parameter<br />

character into the destination. If FLTF equals zero, ZeroChar is selected; if FLTF equals<br />

one, NonZeroChar is selected.<br />

<br />

<br />

Operator Zero Non0 <br />

<br />

format: INSC Len Char Char <br />

<br />

<br />

The INSC operator is defined only for table edit.<br />

INOP <br />

INOP stores hex"D" into the zone field of the destination character if EXTF=1; the<br />

destination character is not altered if EXTF equals zero. Note that in either case the<br />

destination IndexedCharDD is advanced one character. The destination element_size<br />

must not be hex.<br />

6878 7530–007 5–105


Operator Set<br />

INSG <br />

INSG stores MinusChar into the destination if EXTF equals one and stores PlusChar if<br />

EXTF equals zero. The destination element_size must not be hex. MinusChar and<br />

Pluschar are parameters:<br />

<br />

<br />

Operator Minus Plus <br />

<br />

format: INSG Char Char <br />

<br />

<br />

ENDF <br />

If FLTF equals zero, ENDF stores a selected parameter character into the destination;<br />

MinusChar is selected if EXTF equals one, and PlusChar is selected if EXTF equals zero.<br />

If FLTF equals one, no character is stored and the destination IndexedCharDD is not<br />

advanced. FLTF is unconditionally reset to zero.<br />

MinusChar and PlusChar are parameters:<br />

<br />

<br />

Operator Minus Plus <br />

<br />

format: ENDF Char Char <br />

<br />

<br />

The ENDF operator is defined only for table edit.<br />

Character Move Operators<br />

Character Move operators transfer characters from source to destination with editing.<br />

Some move operators conditionally store into the destination a sequence of repeated<br />

parameter characters based on the value of FLTF (float flip-flop), the source character,<br />

and EXTF (external sign flip-flop).<br />

Move operators cannot be introduced by EXPU.<br />

If the destination element_size is hex, only the numeric field of a parameter character is<br />

stored.<br />

MCHR <br />

MCHR transfers length characters from the source to the destination. Length is a<br />

parameter for table edit mode only:<br />

<br />

Operator <br />

MCHR Len MCHR <br />

format: <br />

<br />

(Table Edit) (Single Edit)<br />

5–106 6878 7530–007


MVNU <br />

Operator Set<br />

For an EBCDIC source and destination, MVNU transfers length numeric fields from the<br />

source to the destination, setting each zone field to hex"F". For a hex source and<br />

destination, MVNU transfers length hex characters (in this case MVNU is identical to<br />

MCHR).<br />

Length is a parameter for table edit mode only:<br />

<br />

Operator <br />

MVNU Len MVNU <br />

format: <br />

<br />

(Table Edit) (Single Edit)<br />

MINS <br />

MINS performs a leading zero suppression function from the source to the destination<br />

for length source characters. In the following definition, the source numeric field is the<br />

numeric field of an EBCDIC character or the entire hex character.<br />

Length is a parameter for table edit mode only:<br />

<br />

<br />

Operator Zero Zero <br />

<br />

format: MINS Len Char MINS Char <br />

<br />

<br />

(Table Edit) (Single Edit)<br />

While FLTF equals zero and the value of the source numeric field is zero, the ZeroChar<br />

parameter is transferred to the destination. If the value of the source numeric field is<br />

nonzero, FLTF is set to one, and the source numeric field is transferred as described in<br />

the next paragraph.<br />

When FLTF equals one, the source numeric field is transferred to the destination and the<br />

zone field of an EBCDIC destination character is set to hex"F".<br />

MFLT <br />

MFLT performs a signed leading zero suppression function from the source to the<br />

destination for length source characters. MFLT is functionally equivalent to MINS (move<br />

with insert) except for conditional insertion of a sign character into the destination<br />

sequence.<br />

Length is a parameter for table edit mode only:<br />

<br />

Operator <br />

Zero Minus Plus <br />

format <br />

MFLT Len Char Char Char <br />

(Table Edit): <br />

<br />

6878 7530–007 5–107


Operator Set<br />

<br />

Operator <br />

Zero Minus Plus <br />

format <br />

MFLT Char Char Char <br />

(Single Edit): <br />

<br />

While FLTF equals zero and the value of the source numeric field is zero, the ZeroChar<br />

parameter is transferred to the destination.<br />

If FLTF equals zero and the value of the source numeric field is nonzero, the PlusChar (if<br />

EXTF equals zero) or the MinusChar (if EXTF equals one) is inserted in the destination<br />

sequence, FLTF is set to one, and the source numeric field is transferred as defined for<br />

MINS.<br />

When FLTF equals one, the source numeric field is transferred to the destination, as in<br />

MINS.<br />

Note that the number of characters stored into the destination sequence may be<br />

length+1. Length characters are stored only if FLTF is initially zero and (for length<br />

characters) all source numeric fields are zero, or if FLTF is initially one.<br />

Miscellaneous Edit Operators<br />

RSTF <br />

RSTF unconditionally resets FLTF (float flip-flop) to zero.<br />

ENDE <br />

ENDE terminates table edit mode. The top-of-stack transformation for the TEED or TEEU<br />

operation is completed.<br />

ENDE is defined only for table edit.<br />

Pointer Index Restrictions<br />

The following information summarizes restrictions that have already been stated or that<br />

follow from the stated restrictions.<br />

The 16-bit word_index field in IndexedCharDDs restricts their use to the first 65535<br />

(2**16-1) words of an actual segment. Operators that generate updated pointers cannot<br />

update the word index to 65536. For example, TRNS or TUNU cannot access the last<br />

character of the word at 65535; TWSU cannot access that word at all when the pointer is<br />

an IndexedCharDD. The delete form of non-edit operators can access all of that word,<br />

because update does not occur. Software must assume that edit operators have the<br />

same restrictions as other character update operators, because they may unconditionally<br />

update.<br />

A sequence accessed with an IndexedCharDD cannot extend into or beyond the word<br />

with index 65536 (2**16).<br />

5–108 6878 7530–007


Operator Set<br />

With an IndexedWordDD, TWSD and TWSU can access through the word with index<br />

equals 2**20-1 or 2**20-2, respectively.<br />

Vector Operators<br />

A number of operators are provided to perform calculations that are typical of numerical<br />

(scientific and engineering) computation.<br />

Vectors and Scalars<br />

Each vector operator performs an iterative (or sometimes, in principle, parallel)<br />

computation on a set of elements of one or two virtual segments. Such a set of<br />

elements is called a vector; it is defined by an IndexedWordDD and a set of index values<br />

that are applied to it. In most cases the index values are an arithmetic sequence<br />

j, j + k, j + 2*k, ...<br />

in which j is the initial index value (supplied via the IndexedWordDD) and k is an integer<br />

constant called the stride. (Two operators allow the set of index values to be provided<br />

explicitly in a third vector.)<br />

Some of the vector computations involve numeric values (operands) that are not in<br />

vectors; these are called scalars.<br />

Vector Arguments<br />

The vectors are named A, B, and (for index sets) I. When no index set is involved, vector<br />

A is specified by a pair of arguments called vector_A and stride_A. Vector_A is always an<br />

IndexedWordDD and stride_A is an integer. Vector_B is similarly specified by vector_B<br />

and stride_B, but in some cases vector_B can be an operand (in which case stride_B is<br />

not significant but must satisfy type and range restrictions). In two operators, a vector_I<br />

argument occurs instead of stride_A or stride_B; vector_I has an implicit stride of +1.<br />

Any IndexedWordDD vector argument must have reindex enabled. The vector_A<br />

argument must be write-enabled for those operators that store into vector A.<br />

The notation "B may be scalar" or "B must be vector" is used as shorthand for "vector_B<br />

must be an IndexedWordDD or operand" or "vector_B must be an IndexedWordDD",<br />

respectively.<br />

A[x] denotes the element designated when the initial vector_A argument is reindexed by<br />

x. Lowercase i denotes an iteration index; A(i) denotes the ith element of vector A,<br />

counting from 1: A(i) = A[(i-1)*stride_A] normally; and A(i) = A[I(i)] denotes that an index<br />

set is used. The same notation is used for B, but when vector_B is an operand, B(i) =<br />

vector_B for all i.<br />

6878 7530–007 5–109


Operator Set<br />

Vector Length<br />

All vector operators accept an argument named length, which specifies the vector length<br />

(iteration count). The length argument must be a single_integer; it must not exceed<br />

MaxLen in magnitude. If length is zero or negative, no iterations are performed;<br />

operators that return results return the corresponding input arguments.<br />

Strides<br />

Stride arguments must be single_integers that may be positive or negative but must not<br />

exceed MaxLen in magnitude. Strides are repeatedly applied as index values to the<br />

IndexedWordDDs, using common action aAPIX. Note that if stride is +1 and the vector<br />

argument is an IndexedDoubleDD, successive vector elements differ by two in the word<br />

index.<br />

The initial vector descriptor index, the stride, and the length must be such that every<br />

access to a vector element falls within the designated virtual segment; an error is<br />

reported only if an out-of-bounds access is attempted. Furthermore, the product of<br />

stride*(length-1) must not exceed MaxLen for stride_A or stride_B, even when vector_B<br />

is an operand.<br />

Vector Access<br />

Vector elements are fetched and stored using the common actions aFOP and aSOP,<br />

respectively, with the current vector descriptor. The common action aAPIX is used to<br />

apply the stride or index-set value to each vector descriptor at each iteration of the<br />

operator.<br />

Vector Arithmetic<br />

The arithmetic performed by vector operators is as defined for the operators ADD,<br />

SUBT, MULT, MULX, and DIVD. Arithmetic exceptions occur as defined for those<br />

operators. (No vector operators generate Integer Overflow exceptions.)<br />

Most vector operators can perform single and double precision computations, depending<br />

on the types of the arguments. Normal precision rules are applied to individual arithmetic<br />

operations. The result of addition, subtraction, multiplication, or division is double<br />

precision if either or both inputs are double; the result is single if both inputs are single.<br />

However, those operators that perform multiple arithmetic operations (multiply and add)<br />

in the same iteration are so specified that both operations are in the same precision.<br />

The term width is defined as the number of words occupied by each vector element or<br />

scalar. The terms wA and wB denote widths of A and B. It is always required that the<br />

values to be accumulated or stored be of the same width as the accumulator or vector;<br />

no implicit type coercion is performed.<br />

5–110 6878 7530–007


Vector Assignment Operators<br />

Operator Set<br />

These operators generate an output vector A by computing each element independently;<br />

the only vector elements that contribute to the new value of A(i) are A(i) or B(i) or both.<br />

Vector_A must be write enabled.<br />

Most operator definitions use succinct notation, in which operations on the vector name<br />

stand for operations on all the individual elements.<br />

For example:<br />

A := A * B<br />

means<br />

for i in {1 to length} do A(i) := A(i) * B(i)<br />

The specific type requirements [scalar or vector; width] are indicated for each operator<br />

between brackets at the right of the function definitions.<br />

Dyadic Vector Operators<br />

These operators act on two vectors. The first five copy a function of B into A; the rest<br />

replace A by a function of A and B.<br />

<br />

<br />

stride_B <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_B <br />

<br />

<br />

<br />

vector_A Null<br />

<br />

<br />

CPV <br />

A := B [B may be scalar; wB = wA]<br />

CPVN <br />

A := - B [B may be scalar; wB = wA]<br />

6878 7530–007 5–111


Operator Set<br />

CPVA <br />

A := abs(B) [B may be scalar; wB = wA]<br />

CPVS <br />

A := single (B) [B must be vector; wA = 1]<br />

Each element of B is converted to single precision, as defined for the SNGL operator.<br />

CPVD <br />

A := double (B) [B must be vector; wA = 2]<br />

Each element of B is converted to double precision, as defined for the XTND operator.<br />

VPV <br />

A := A + B [B may be scalar; wB


S <br />

<br />

<br />

<br />

stride_B <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_B <br />

<br />

<br />

<br />

vector_A Null<br />

<br />

<br />

VPS <br />

A := B + S [B must be vector; wB


Operator Set<br />

The operation is undefined if I overlaps A.<br />

SCAT <br />

for i in {1 to length} do A[I(i)] := B(i) [B may be scalar; wB = wA]<br />

<br />

<br />

stride_B <br />

<br />

<br />

<br />

vector_I <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_B <br />

<br />

<br />

<br />

vector_A Null<br />

<br />

<br />

GATH <br />

for i in {1 to length} do A(i) := B[I(i)] [B must be vector; wB = wA]<br />

<br />

<br />

vector_I <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_B <br />

<br />

<br />

<br />

vector_A Null<br />

<br />

<br />

5–114 6878 7530–007


Reduction Operators<br />

Linear Sum<br />

These operators read one or two vectors and produce a scalar result. The vector<br />

arguments must be IndexedWordDDs; they need not be write enabled.<br />

These operators sum the elements in a single vector.<br />

<br />

<br />

sum <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_A sum’ <br />

<br />

<br />

Operator Set<br />

The sum argument must be an operand with width greater than or equal to wA; the<br />

arithmetic is performed in double precision if sum is double.<br />

Quadratic Sum<br />

SUM <br />

for i = 1 to length do sum := sum + A(i)<br />

SUMA <br />

for i = 1 to length do sum := sum + abs(A(i))<br />

These operators compute the inner product of two vectors:<br />

for i = 1 to length do sum := sum + A(i) * B(i).<br />

6878 7530–007 5–115


Operator Set<br />

<br />

<br />

sum <br />

<br />

<br />

<br />

stride_B <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_B <br />

<br />

<br />

<br />

vector_A sum’ <br />

<br />

<br />

B must be a vector.<br />

DOT <br />

The sum argument must be a single precision operand; vector_A and vector_B must be<br />

IndexedSingleDDs. Multiplication and addition are performed in single precision.<br />

DOTX <br />

The sum argument must be a double precision operand. Vector_A and vector_B must be<br />

IndexedWordDDs; wA and wB are independent. All arithmetic is double precision;<br />

multiplication is performed as in the MULX operator.<br />

Recurrence Operators<br />

Each of these operators iteratively computes a scalar function in which, at each iteration,<br />

the previous scalar value enters into the computation. The first operator iteratively<br />

assigns values to the elements of vector A; the others return the final scalar value.<br />

SEQ <br />

for i = 1 to length do A(i) := Z := Z + B(i);<br />

5–116 6878 7530–007


Z <br />

<br />

<br />

<br />

stride_B <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_B <br />

<br />

<br />

<br />

vector_A Null<br />

<br />

<br />

Operator Set<br />

B may be a scalar or vector; wB must be less than or equal wA. Z must be an operand<br />

with width equal wA. Vector_A must be write enabled.<br />

POLY <br />

for i = 1 to length do Z := A(i) + B(i) * Z<br />

<br />

<br />

Z <br />

<br />

<br />

<br />

stride_B <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_B <br />

<br />

<br />

<br />

vector_A Z’ <br />

<br />

<br />

6878 7530–007 5–117


Operator Set<br />

B may be a scalar or vector; wB and wA are independent. Z must be an operand with<br />

width greater than or equal to max(wA,wB); the computation is performed and the result<br />

returned with the width of Z.<br />

CHEK <br />

for i = 1 to length do hash := (hash EQV A(i)).[46:48]<br />

<br />

<br />

hash <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_A hash’ <br />

<br />

<br />

Vector_A must be an IndexedSingleDD; hash must be a single precision operand. Each<br />

iteration consists of a one-bit left circular shift of the bit- vector logical equivalence of the<br />

accumulator and the next vector element.<br />

SUMW <br />

for 1 = 1 to length do sum := sum WORDADD A(i)<br />

<br />

<br />

sum <br />

<br />

<br />

<br />

stride_A <br />

<br />

<br />

Top-of-stack <br />

length <br />

transformation: <br />

<br />

<br />

vector_A sum’ <br />

<br />

<br />

Vector_A must be an IndexSingleDD; sum must be a double-precision operand. The<br />

operation is undefined if the initial value in sum is not such that:<br />

sum.[95:48] + length < 2**48<br />

5–118 6878 7530–007


Operator Set<br />

The purpose of the SUMW operator is to provide a means to checksum the vector input<br />

by adding all its 48-bit integer elements, including the addition overflow, into a 48-bit<br />

checksum result. Implementations are not required to produce that single precision<br />

result; therefore, the double precision result need not conform to a specific algorithm.<br />

However, reduction to a single precision result by performing 48-bit integer addition on<br />

SUMW's result's two words, adding the overflow, if any, to the single precision result,<br />

must produce the proper checksum value.<br />

The implementation of WORDADD is:<br />

Search Operators<br />

sum.[95:48] := (sum.[95:48] + sum.[47:48]) + overflow<br />

sum.[95:48] := (sum.[95:48] + A(i)) + overflow<br />

sum.[47:48] := 0<br />

These operators find the virtual index of an extremum (maximum, minimum, or<br />

maximum absolute value) in a vector.<br />

<br />

<br />

V <br />

<br />

<br />

<br />

X <br />

<br />

<br />

Top-of-stack <br />

stride_A <br />

transformation: <br />

<br />

<br />

length V’ <br />

<br />

<br />

<br />

vector_A X’ <br />

<br />

<br />

X must be a single precision operand. V must be an operand with width equal to wA.<br />

The operators iteratively compare the vector elements with V; whenever an element of<br />

A is more extreme than V, it replaces V and its virtual index replaces X. The final values<br />

of V and X are left as the results of the operator.<br />

If the same extreme value occurs more than once in A, the first one encountered is<br />

reported. If no element in A is more extreme than V, the original arguments V and X are<br />

unchanged; this is the only case in which the value of argument X is significant.<br />

Note that the index returned (when changed by the operator) is a virtual index into the<br />

segment. Thus, if the target array is contained within a larger virtual segment (such as a<br />

FORTRAN common block), the offset of the array into the segment must be subtracted<br />

from the operator result to derive an array- relative index. Furthermore, the virtual index<br />

is defined in words, whether vector_A is an IndexedSingleDD or IndexedDoubleDD.<br />

6878 7530–007 5–119


Operator Set<br />

The function VirtualIndex(A(i)) in the following operator definitions is the index (into the<br />

virtual segment containing A) of the item examined in the ith iteration of the operator. It<br />

is equivalent to the virtual index that would be reported by the GINX operator applied to<br />

an IndexedWordDD created by applying the INDX operator to descriptor vector_A with<br />

index (i-1)*stride_A.<br />

FMX <br />

for i = 1 to length do<br />

if A(i) > V then V,X := A(i),VirtualIndex(A(i))<br />

FMN <br />

for i = 1 to length do<br />

if A(i) < V then V,X := A(i),VirtualIndex(A(i))<br />

FMXA <br />

for i = 1 to length do<br />

if abs(A(i)) > V then V,X := abs(A(i)),VirtualIndex(A(i))<br />

5–120 6878 7530–007


Miscellaneous Operators<br />

NOOP <br />

No action is performed.<br />

PUSH <br />

Operator Set<br />

PUSH adds the contents of the expression stack to the topmost activation record,<br />

leaving a null expression stack. The operation is invalid when a procedure entry code<br />

sequence is being executed (there is an incipient AR at the top of the stack).<br />

<br />

<br />

expression <br />

Stack-state <br />

stack <br />

transformation: activation <br />

<br />

record <br />

activation <br />

<br />

D[LL] record D[LL]<br />

<br />

<br />

NVLD <br />

An Invalid Operator interrupt is unconditionally generated.<br />

VARI <br />

The VARI operator may be considered a primary operator that causes the next code<br />

syllable to be interpreted as a variant operator. The two operator syllables are tightly<br />

bound, in that no Asynchronous or External interrupt can occur between the VARI and<br />

the introduced operator and any RCW that designates a variant operator must point to<br />

the VARI.<br />

6878 7530–007 5–121


Operator Set<br />

Program Restrictions Due to Hidden State<br />

In addition to visible state, which is accessible directly via various operators, a processor<br />

maintains other state to facilitate efficient execution. For the most part, such state is<br />

beyond the scope of the functional specification. However, some restrictions on<br />

software are necessary to ensure that the processor captured state is consistent with<br />

the visible state, particularly memory contents.<br />

For example, a program cannot use a table edit sequence to alter the edit table in use for<br />

that operation. It is likewise undefined for a translate or set membership operator to<br />

modify as a destination the table it is using. (However, any store to the table performed<br />

by the same process prior to the translate or set membership operator must be<br />

effective.)<br />

The processor is permitted to capture for each current address couple the contents of<br />

the word designated for the address couple. If the address designates a reference, the<br />

processor may capture the contents of the word designated by the reference chain.<br />

The association remains valid until the addressing environment is changed so as to<br />

redefine the address couple, unless a synchronizing operator (RDLK) is executed or the<br />

word is explicitly written via the address couple, an SIRW, or an IndexedDD. (The<br />

processor is not required to recognize writing via an ASRW.) In addition to single word<br />

values, the processor can capture a double precision operand:<br />

• When an address couple directly designates a double precision operand, the<br />

processor can associate the double operand value with the address couple. The<br />

processor is not required to recognize modification of the second word; thus the<br />

following sequence is not permitted:<br />

VALC lambda, delta<br />

DUPL<br />

NAMC lambda, delta+1<br />

STOD<br />

VALC lambda, delta (produces undefined result)<br />

For more information on program restrictions for restricted operators see Section 6.<br />

5–122 6878 7530–007


Section 6<br />

Restricted Operators<br />

The system features and operators described in this section are required by MCP, but<br />

they are not available to normal user programs.<br />

Restricted General Operators<br />

The operators in this group have all been used in earlier systems. In general, they deal<br />

with requirements common to all ClearPath MCP systems and their successors,<br />

although in some cases the solutions have required different operators between groups<br />

of systems.<br />

Restricted <strong>Reference</strong> Operators<br />

These operators are used in all systems controlled by the MCP to access the contents of<br />

memory in restricted ways.<br />

RASD <br />

The restricted operator RASD reads one word of the ASD table. RASD accepts a 27-bit<br />

integer argument as an ASD_number and a 3-bit integer argument as a word specifier.<br />

The word accessed is ASDi[ASD_number], where i-1 is the word specifier.<br />

RASD performs a load-transparent operation, returning the contents of the designated<br />

ASD-table word.<br />

<br />

<br />

Top-of-stack specifier: sp(integer) <br />

<br />

transformation: <br />

<br />

ASD_num: sp(integer) any <br />

<br />

<br />

6878 7530–007 6–1


Restricted Operators<br />

TWOD <br />

The restricted operator TWOD copies source words into a destination sequence without<br />

regard to tags. TWOD requires three arguments: a length, source, and destination.<br />

<br />

<br />

len: opnd(integer) <br />

<br />

<br />

Top-of-stack <br />

source: pntr, ASRW, opnd <br />

transformation: <br />

<br />

<br />

dest: pntr, ASRW Null<br />

<br />

<br />

The length must be an integer greater than or equal to zero, or the operation is<br />

undefined. If the length is zero, no transfer occurs.<br />

The source must be an operand, an IndexedWordDD, an IndexedCharDD with<br />

char_index equal to zero, or an ASRW. The sequence defined by an operand is the<br />

source argument concatenated with itself indefinitely; if the source is a double precision<br />

operand and the second word is not identical to the first, the result is undefined. The<br />

destination must be an IndexedWordDD, an IndexedCharDD with char_index equal to<br />

zero, or an ASRW. A source or destination IndexedDD or ASRW defines a sequence<br />

consisting of the designated word and its physical successors (the words with the next<br />

higher memory addresses). The TWOD operand is undefined if the source or destination<br />

argument is an IndexedDD and the sequence is not entirely within the designated actual<br />

segment; the following inequality must hold:<br />

IndexedDD.index + length


Restricted Operators<br />

WASD overwrites a store object of any type into the designated ASD-table word.<br />

<br />

<br />

specifier: sp(integer) <br />

<br />

<br />

Top-of-stack <br />

ASD_num: sp(integer) <br />

transformation: <br />

<br />

<br />

store object: any Null<br />

<br />

<br />

Program Restrictions Due to Hidden State<br />

The concept of hidden state and some of the restrictions imposed on software are<br />

introduced in Section 5. Additional restrictions that are imposed on system programming<br />

are defined here.<br />

The WASD operator is the only defined mechanism for changing the ASD table. A<br />

processor may capture the state of an ASD and hold it until that processor performs a<br />

WASD on that ASD or a move-stack operation.<br />

In general, software must ensure that no processor could be accessing a segment<br />

before changing its ASD, except:<br />

• An ASD marked absent can be changed to one marked present providing that the<br />

last or only WASD performed to that ASD is the one that changes<br />

ASD1.present_to_proc from 0 to 1. (Note that ASD1.address can be changed in the<br />

same WASD.)<br />

• ASD1.present_to_proc can be changed from 1 to 0 provided that the actual segment<br />

is not a page table and remains present at the same address; the software must take<br />

into account the fact that other processors may not be affected by the change until<br />

they perform a move-stack. (This action is permitted to allow software to determine<br />

experimentally whether a segment is in frequent use.) Note that this provisional<br />

resetting of present_to_proc does not establish the ASD as "absent" in the sense of<br />

the previous list entry; ASD1.present_to_proc can later be changed from 0 back to 1<br />

without synchronization, but ASD1.address must remain unchanged.<br />

• The processor can increase ASD2.AS_length for the current stack.<br />

A processor can capture state from a page descriptor and its ASD between the time a<br />

copy of the descriptor is brought to the expression stack and the completion of an<br />

operation that consumes the descriptor. Software cannot safely change a page<br />

descriptor from touched to untouched or alter the ASD3 for that page if any process is<br />

accessing that page.<br />

6878 7530–007 6–3


Restricted Operators<br />

Branch, enter, exit, and move-stack operators are the only mechanisms for altering the<br />

sequential execution of the code stream. The result is undefined if the program changes<br />

a code segment ASD (other than the experimental change of present_to_proc from 1 to<br />

0 as above) or the contents of the code segment while any processor is executing code<br />

from the referenced segment. (The processor is free to capture the code-segment base<br />

address and limit, one or more words of code, and so forth.)<br />

The effect is undefined of changing the environmental linkage for any activation record<br />

currently in the addressing environment of a processor.<br />

The result is undefined of any fetch or store operation in the current stack (whether via<br />

address couple, SIRW, DD, or absolute address) above the current upper bound for stack<br />

addressing. That bound is moved upward to the S setting by an explicit PUSH or the<br />

implicit push of an enter operator; it is moved downward by an exit operator or by a<br />

DLET operator that moves S below the most recent PUSH setting.<br />

Restricted Processor State Operators<br />

These operators are used in prior ClearPath MCP systems and their successors to<br />

access or modify processor state. All but CHES and IPST are used in all ClearPath MCP<br />

systems.<br />

CHES (Libra 6xx and 7xx Systems)<br />

CHES uses its PCW argument to change the executing processor's active emulation<br />

code segment.<br />

<br />

Top-of-stack <br />

segment-id: PCW Null<br />

transformation: <br />

<br />

The PCW must reference a present segment whose base address equals zero mod<br />

2**13, and whose length is not less than 2**13.<br />

HALT <br />

The restricted operator HALT is a conditional form of STOP. If the processor Halt<br />

Boolean is false, HALT is equivalent to NOOP. If the Halt Boolean is true, HALT is<br />

equivalent to STOP.<br />

IPST<br />

IPST returns a 32-bit integer whose bits indicate whether the corresponding processors<br />

are either halted, initial idle, or not in the partition. The implementation of IPST depends<br />

on a minimum gap of six milliseconds between executions of IPST from all processors in<br />

the same partition.<br />

<br />

Top-of-stack <br />

Null 32-bit integer <br />

transformation: <br />

<br />

6–4 6878 7530–007


REXI <br />

The restricted operator REXI is a synonym for EXIT.<br />

RPRR <br />

Restricted Operators<br />

The restricted operator RPRR requires one 6-bit integer stack argument, which is<br />

interpreted as a processor register identification (register Id). The result left on top of the<br />

stack is the value of the specified register. This result value is a k-bit integer, where k is<br />

the width of the target register.<br />

<br />

Top-of-stack <br />

reg-id: sp(integer) sp(integer) <br />

transformation: <br />

<br />

Readable processor registers are associated with register ids that are a subset of<br />

integers in the range {0 to 63}; the valid subset, along with the register width, is shown<br />

in the following table:<br />

Register ID Register name Width<br />

LL D[LL] 16<br />

37 BOSR 0<br />

38 F 16<br />

52 S 16<br />

D[LL] (whose id is LL, the current lex level), F, and S report displacements relative to the<br />

base of the current stack; BOSR reports 0. The value reported for the S register is the<br />

displacement of the top-of-stack word after the RPRR argument has been consumed.<br />

SPRR <br />

The restricted operator SPRR assigns a value to a register; it requires two stack<br />

arguments. The second argument must be a 6-bit integer whose value is a valid register<br />

id. The top argument is the register value; it must be a k-bit integer, where k is the width<br />

of the destination register.<br />

<br />

<br />

Top-of-stack reg-val: sp(integer) <br />

<br />

<br />

<br />

transformation: reg-id: sp(integer) Null<br />

<br />

<br />

6878 7530–007 6–5


Restricted Operators<br />

The contents of the specified register are set to the register value, except when the<br />

register id is 36 or 42, for which special action is defined later in this description. The<br />

only defined actual registers are F (id=38) and S (id=52).<br />

Register id value 36 designates LOSR. SPRR performs a special operation for register id<br />

36: the register value argument is disregarded (but it nevertheless must be a 16-bit<br />

integer), and the Stack Overflow detection mechanism is enabled.<br />

On Libra 6xx and 7xx systems, register id 42 causes the processor to purge its ASD<br />

cache. The register value is not significant, but must be a 16-bit integer.<br />

The following table specifies the decimal register id encodings, register names, validity<br />

for RPRR and SPRR, and register widths (in bits). All register id values not listed are<br />

invalid.<br />

Register ID Register name RPRR SPRR Width<br />

LL D[LL] yes invalid 16<br />

36 (LOSR) invalid special<br />

37 (BOSR) yes invalid 0<br />

38 F yes yes 16<br />

42 (Purge ASD) invalid special<br />

52 S yes yes 16<br />

If the register id designates S, the new register value remains in S at the completion of<br />

the SPRR operator (the arguments to SPRR are consumed before the register<br />

assignment is made).<br />

The invariant S >= F must be preserved in any assignment of a value to S or F.<br />

STOP <br />

The restricted operator STOP causes the processor execution to halt in an orderly way<br />

so that execution can be resumed by an external action. The stack state is unaffected.<br />

6–6 6878 7530–007


WATI <br />

Restricted Operators<br />

The restricted operator WATI leaves on top of the stack a double precision operand<br />

containing the proc state, except for the proc_id.<br />

<br />

Top-of-stack <br />

Null dp <br />

transformation: <br />

<br />

WATI result:<br />

First Word Description<br />

tag Tag = 2<br />

[47:4] Page Length Indicator (=5)<br />

[43:28] Reserved<br />

[15:4] E-mode <strong>Level</strong> (5=<strong>Epsilon</strong>)<br />

[11:4] Features (varies by processor type)<br />

[7:8] Type<br />

37=Libra 4000<br />

43=Libra 680/780/880<br />

44=Libra 4100<br />

45=Libra 4200/6200<br />

Second Word Description<br />

tag Tag = 2<br />

[47:12] Emulation code compile Year<br />

[35:06] Emulation code compile Month<br />

[29:06] Emulation code compile Day<br />

[23:08] Emulation code version Mark<br />

[15:16] Emulation code version Cycle<br />

WHOI <br />

The restricted operator WHOI leaves on top of the stack a single_integer containing the<br />

processor identification number, proc_id.<br />

<br />

Top-of-stack <br />

Null sp(integer) <br />

transformation: <br />

<br />

ZIC <br />

The restricted operator ZIC sets the Interrupt_Count to zero. The stack is unaffected.<br />

6878 7530–007 6–7


Restricted Operators<br />

Restricted Task Control Operators<br />

The operators in this group are used by the MCP to implement task management. All<br />

<strong>Level</strong> <strong>Epsilon</strong> systems, except Libra 4000, support these operators. Libra 4000 systems<br />

have a Task Control Unit (TCU). The TCU communicates with the processor via system<br />

messages that provide similar functionality.<br />

MVST <br />

MVST changes the processor’s site of activity by deactivating the current stack and<br />

activating a destination stack. The current code segment and LL are not changed. It is<br />

assumed that the top activation record, for both the stack being deactivated and the<br />

stack being reactivated, is entered.<br />

MVST accepts a 19-bit integer in TOS as the destination stack number. MVST produces<br />

no result.<br />

1. Deactivate the current stack:<br />

The current value of the processor’s Micro Timer register is saved in TOS. That<br />

register, and any other valid top of stack register (originally below the stack number<br />

argument), is pushed onto the current stack, causing a Stack Overflow interrupt if<br />

appropriate.<br />

A TSCW designating the top activation record is placed in word 0 of the stack. The<br />

TSCW offset designates the topmost word in that activation, relative to the topmost<br />

HISW.<br />

2. Establish the destination stack:<br />

The ASDAM (ASD Associative Memory) and ACAM (Address Couple Associative<br />

Memory) are both purged. Any exception to the requirements of establishing the<br />

destination stack causes a superhalt condition.<br />

SNR is set from the destination stack number, which is also used as an ASD<br />

number. The word fetched from ASD1[stack number] must be an ASD1 with<br />

present_to_proc = 1. The length field in ASD2 defines the length of the stack for<br />

purposes of Stack Overflow detection. The base word of the stack must be a TSCW,<br />

which designates the activation record at the top of the stack. The contents of the<br />

TSCW are distributed to F and S. D[LL] is set to F+1. The general boolean<br />

accumulators are set to zero.<br />

The proc id (WHOI) value is stored at the base word of the destination stack. For<br />

Libra 680/780/880 systems, the top stack word is deleted, and its value is loaded<br />

into the Micro Timer register, which immediately resumes counting.<br />

3. Update the display registers and resume code processing:<br />

Any interrupts during the display update are treated normally. In particular, segments<br />

referenced by environment links are permitted to be absent. Code processing<br />

resumes at the operator following the MVST operator.<br />

<br />

Top-of-stack <br />

19-bit integer Null<br />

transformation: <br />

<br />

6–8 6878 7530–007


IDLE <br />

Restricted Operators<br />

The restricted operator IDLE loops internally until an Asynchronous or External interrupt<br />

stimulus is present. At that time, it invokes the interrupt procedure and terminates. The<br />

CS Boolean is not examined or altered. The interrupt RCW designates the operator<br />

following the IDLE. There is no net effect on the stack state from IDLE, the interrupt,<br />

and resumption of the code stream.<br />

PAUS <br />

The restricted operator PAUS loops internally until an Asynchronous or External interrupt<br />

stimulus is present, at which time the operator terminates normally. The stack is<br />

unaffected.<br />

The PAUS and IDLE operators differ in that the IDLE operator causes the interrupt to<br />

occur, regardless of control state. The interrupt occurs immediately after a PAUS if the<br />

CS Boolean if false or the interrupt is not masked by the CS Boolean; otherwise, the<br />

interrupt remains pending.<br />

RIPS <br />

The restricted operator RIPS returns the value of specific processor state. RIPS requires<br />

one single precision integer state identifier argument. RIPS produces a word result.<br />

For Libra 680 and 690, the only valid state identifier equals 7, which specifies the interval<br />

timer granularity as a fraction of 512 microseconds.<br />

<br />

Top-of-stack <br />

state identifier: sp(integer) word <br />

transformation: <br />

<br />

RUNI <br />

RUNI sets the Run Timer of the executing processor to 30 seconds. RUNI accepts no<br />

arguments and produces no result. Software is required to reset the Run Timer before it<br />

decrements to zero; otherwise, a Run Timer interrupt is generated.<br />

SINT <br />

SINT arms and sets the Interval Timer for the executing IP. SINT accepts a positive sp<br />

operand less than 2**11 in TOS (timer value) and produces no result. The time interval is<br />

the product of the timer value multiplied by 512 microseconds. The timer’s granularity is<br />

reported by the RIPS operator. When an Interval Timer expires, the IP generates an<br />

Interval Timer interrupt.<br />

<br />

Top-of-stack <br />

sp operand Null<br />

transformation: <br />

<br />

6878 7530–007 6–9


Restricted Operators<br />

Restricted Time of Day Operators<br />

Real Time of Day:<br />

1. The RTOD value supports a software algorithm to determine time in the normal<br />

sense.<br />

2. It must be loaded at least once a day by the WTOD operator.<br />

3. Its value is available to all current ClearPath MCP systems via the RTOD operator.<br />

Machine Time of Day:<br />

1. The MTOD value supports a software algorithm to determine time since the last<br />

halt-load.<br />

2. It must be cleared at least once a day by the RCMT operator.<br />

3. Its value is available only to a subset of ClearPath MCP systems.<br />

RCMT <br />

RDMT <br />

The restricted operators RCMT and RDMT leave on top of the stack a 36-bit integer<br />

containing the value of the machine time of day clock. The range of values is<br />

{0 to 2**36-1} in units of 2.4 microseconds.<br />

Following the above, RCMT clears the machine time of day clock.<br />

<br />

Top-of-stack <br />

Null sp(integer) <br />

transformation: <br />

<br />

RTOD (see Section 5)<br />

WTOD <br />

The restricted operator WTOD sets the real time of day clock from an operand on top of<br />

the stack. The argument must be a 36-bit integer.<br />

<br />

Top-of-stack <br />

time: sp(integer) Null<br />

transformation: <br />

<br />

6–10 6878 7530–007


Restricted Platform Operators<br />

Restricted Operators<br />

The restricted platform operators apply to Libra 6xx and 7xx systems only. The operators<br />

in this group deal with requirements that are unique to functioning on an Intel compatible<br />

platform.<br />

Restricted Memory Access Functions<br />

This subsection defines the various types of logical memory and describes how the Emode<br />

environment accesses each type.<br />

Platform Memory<br />

Coherent memory refers to any logical memory space that is mapped to MSU physical<br />

memory. Prior to the CMP platform, this was the only type of logical memory.<br />

E-mode memory refers to two coherent memory regions used exclusively as the E-mode<br />

address space. The region containing address 0 is known as low E-mode memory. The<br />

second region is known as high E-mode memory. These regions can be disjoint in terms<br />

of logical addresses. Each word is treated as a 56-bit word; the extra 8-bits supplied by<br />

the platform are ignored.<br />

Byte memory refers to a coherent memory region whose address range is typically<br />

above high E-mode memory. Each 64-bit word is generally viewed as two 32-bit<br />

elements.<br />

Non-coherent byte memory refers to two memory regions that are outside of coherent<br />

memory space, typically PCI local memory mapped to a logical address range that does<br />

not overlap with any coherent memory range. The region containing the lower address<br />

range is known as low NCB memory. The region containing the higher address range is<br />

known as high NCB memory. Each 64-bit word is generally viewed as two 32-bit<br />

elements.<br />

Non-coherent I/O space refers to an address space within PCI local memory that is<br />

completely separate from the set of addresses used by the other memory areas. PCI<br />

devices often use this I/O space to provide host access to 32-bit hardware registers.<br />

External memory refers to any memory region outside the E-mode address space that is<br />

accessed as 32-bit data. External memory includes byte memory, non-coherent byte<br />

memory, and non-coherent I/O space. The IP accesses external memory via 32-bit<br />

system operators that are defined in the following paragraphs.<br />

6878 7530–007 6–11


Restricted Operators<br />

ASD Segment Types<br />

The Segment Type field in ASD1 ([47:2]) is used to identify the type of memory being<br />

referenced. On previous systems, when software allocates an ASD, it unconditionally<br />

sets the segment type to 1, which indicates the address in ASD1 references E-mode<br />

memory. To distinguish the new logical memory types, two additional segment types are<br />

defined.<br />

External Memory Access<br />

Segment Type Definition<br />

0 Unused<br />

1 Byte or E-mode Memory<br />

2 Non-coherent Byte Memory<br />

3 Non-coherent I/O Space<br />

External memory is viewed as 32-bit elements accessed through a word reference<br />

operation. The ASD segment type of a source descriptor (for a read) or destination<br />

descriptor (for a write) determines the type of external memory to access.<br />

The word reference operation reads or writes a 32-bit element. The read operation reads<br />

a 32-bit element from an external memory address aligned on a 4-byte boundary and<br />

returns a 32-bit integer result to the top of stack. There may be state changes associated<br />

with reading non-coherent memory. The write operation writes a 32-bit element to an<br />

external memory address aligned on a 4-byte boundary.<br />

Depending on whether a read or write operation is performed, the system operators that<br />

access external memory require a source or destination index, based on a 32-bit element<br />

size. An index with an even value refers to the lower 4 bytes of a 64-bit word. An index<br />

with an odd value refers to the upper 4 bytes of a 64-bit word.<br />

When writing to external memory, software may optionally provide a Byte Disable mask<br />

in [47:4] of each data word to control which of the 4 bytes is written. The transfer and<br />

word reference operations both support the Byte Disable mask. The following table<br />

defines the corresponding data byte for each bit in the Byte Disable mask.<br />

Byte Disable Mask Data Byte<br />

[47:1] [31:8]<br />

[46:1] [23:8]<br />

[45:1] [15:8]<br />

[44:1] [07:8]<br />

The word address range for non-coherent I/O space is 8K words (0 to 1FFF). This allows<br />

access to 16K 32-bit elements. Software typically accesses this data via a word<br />

reference operation rather than a transfer operation, but this is not enforced.<br />

6–12 6878 7530–007


Restricted Operators<br />

When software allocates a descriptor to external memory, software must restrict its use<br />

to the 32-bit operations defined for external memory. External memory descriptors must<br />

be unindexed and single precision. The descriptor’s ASD must specify an address and<br />

length in terms of 64-bit words.<br />

Partitioning of Logical Memory<br />

The following diagram illustrates how IP range registers are used to partition logical<br />

memory.<br />

High NCB Memory Limit →<br />

High NCB Memory Base →<br />

Byte Memory Limit →<br />

Byte Memory Base →<br />

High E-Mode Memory Limit →<br />

High E-Mode Memory Base →<br />

Low NCB Memory Limit →<br />

Low NCB Memory Base →<br />

Low E-Mode Memory Limit →<br />

Low E-Mode Memory Base (0) →<br />

Logical<br />

Memory Area<br />

Non-coherent<br />

Byte Memory<br />

Byte<br />

Memory<br />

High E-Mode<br />

Memory<br />

Non-coherent<br />

Byte Memory<br />

Low E-mode<br />

Memory<br />

ASD<br />

Seg<br />

Type<br />

Memory<br />

Region<br />

Type<br />

Operator<br />

Class<br />

Coherent<br />

Non-coherent I/O space (segment type 3) is omitted from the diagram to emphasize the<br />

unique set of logical addresses among the other memory types.<br />

6878 7530–007 6–13<br />

2<br />

1<br />

2<br />

1<br />

PCI Hole<br />

(Upper)<br />

Exclusive<br />

(Upper)<br />

PCI Hole<br />

(Lower)<br />

Exclusive<br />

(Lower)<br />

32-Bit No<br />

32-Bit Yes<br />

E-Mode Yes<br />

32-Bit No<br />

E-Mode<br />

Yes


Restricted Operators<br />

Invalid Address Detection<br />

Initialization and software maintain several pairs of 20-bit range registers to facilitate<br />

invalid address detection. The value of each base and limit pair is configuration<br />

dependent.<br />

Each register value represents a word address within a 36-bit limit. Thus, range registers<br />

are compared to [35:20] of a given 36-bit logical word address. A register width of 20 bits<br />

implies a minimum increment of 64K words for each logical memory type, except noncoherent<br />

I/O space.<br />

For standard E-mode operators accessing data through a normal ASD (segment type =<br />

1), the address must be within either the Low E-mode Memory range or the High Emode<br />

Memory range.<br />

For 32-bit access operators accessing data through a normal ASD (segment type = 1),<br />

the address must be within the Byte Memory range.<br />

For 32-bit access operators accessing data through a non-coherent byte ASD (segment<br />

type = 2), the address must be within either the Low NCB Memory range or the High<br />

NCB Memory range.<br />

For 32-bit access operators accessing data through a non-coherent I/O space ASD<br />

(segment type = 3), the address must be less than 8K.<br />

In addition, an Invalid Address interrupt is reported when standard E-mode operators<br />

attempt to access data through ASD segment types 2 and 3 (non-coherent memory), and<br />

when any operator attempts to access data through ASD segment type 0.<br />

When the IP reports an Invalid Address interrupt, the P2 parameter is a proper reference<br />

(ASRW, SIRW, or IDD) to the address in question. The P2 reference, ASD segment type,<br />

and range register values, determine the type of memory operation that caused the<br />

interrupt.<br />

Restricted Memory Access Operators<br />

REMW (Libra 6xx and 7xx Systems)<br />

REMW accepts an unindexed copy descriptor in TOS2 (source descriptor referencing<br />

coherent or non-coherent byte memory) and an integer in TOS (source index based on a<br />

32-bit element size). REMW returns the referenced 32-bit element as an integer result.<br />

<br />

<br />

Top-of-stack Source index <br />

<br />

transformation: <br />

<br />

Source UDD 32-bit integer <br />

<br />

<br />

6–14 6878 7530–007


Restricted Operators<br />

WEMW (Libra 6xx and 7xx Systems)<br />

WEMW transfers 1, 2 or 4 bytes of a 32-bit element from an E-mode memory word to<br />

an external memory word. WEMW accepts an unindexed copy descriptor in TOS3<br />

(destination descriptor referencing coherent or non-coherent byte memory), an integer in<br />

TOS2 (destination index based on a 32-bit element size), and a 48-bit operand in TOS<br />

(byte disable mask in [47:4] and 4 bytes of data in [31:32]). WEMW produces no result.<br />

<br />

<br />

Data operand <br />

<br />

<br />

Top-of-stack <br />

Destination index <br />

transformation: <br />

<br />

<br />

Destination UDD Null<br />

<br />

<br />

Restricted System Interrupt Functions<br />

The interrupt structure of the CMP platform is based on the INTEL Streamlined<br />

Advanced Programmable Interrupt Controller (SAPIC) architecture. Any reference to<br />

APIC in this document implies SAPIC.<br />

APIC Description<br />

There are two forms of APIC units: Local and I/O. There is one Local APIC per processor<br />

and one I/O APIC for each grouping of PCI agents. Each Local APIC is able to send<br />

interrupts, accept interrupts, and distribute interrupts to a processor. Each I/O APIC is<br />

able to process interrupt requests from a PCI agent and route the interrupt requests to a<br />

Local APIC.<br />

There are three interrupt command types defined for an MCP partition. An Inter-<br />

Processor Interrupt (IPI) refers to a processor-to-processor interrupt request. An I/O<br />

interrupt refers to an I/O APIC to processor interrupt request. An External Task Priority<br />

(XTP) request enables a processor to change its XTP register in the platform. XTP values<br />

are used by the platform to select the destination of a redirectable I/O interrupt.<br />

Most IPI and I/O interrupt requests generate an interrupt to software. An XTP request<br />

does not.<br />

Interrupt Vectors<br />

IPI and I/O interrupt requests specify an interrupt vector (not to be confused with the Emode<br />

Interrupt Vector at ASD3), a decimal integer between 0 and 255. Each interrupt<br />

vector represents an interrupt source or action. The higher the vector, the higher the<br />

interrupt priority. Each IPI and I/O interrupt request received by a particular processor<br />

causes it to set the corresponding bit in its Interrupt Request Register (IRR). See<br />

“Maskable External Interrupts” above for assignments.<br />

6878 7530–007 6–15


Restricted Operators<br />

Interrupt Routing<br />

IPI and I/O interrupt requests specify an IP destination and a delivery mode that<br />

determines how the interrupt is routed.<br />

An interrupt request with a fixed delivery mode is routed to the processor specified in<br />

the destination field. The destination field, or DEST ID, identifies the IP. IPI and I/O<br />

interrupt requests will normally specify fixed delivery mode.<br />

An interrupt request with a redirectable delivery mode is routed to the processor having<br />

the lowest XTP value. XTP values range from 0 to 4’F’.<br />

An IPI that specifies a start up delivery mode is valid only for an IP in an Initial Idle or<br />

Recovery Idle state.<br />

An IPI that specifies a non-maskable delivery mode is reported to software regardless of<br />

control state.<br />

Local APIC Registers<br />

Each Local APIC contains several registers that are used to manage and process<br />

interrupts. This section describes the registers that can be accessed by software via the<br />

Read Register (RREG) and Write Register (WREG) operators.<br />

Interrupt Request Register (IRR) [read only, 256 bits]<br />

255 15<br />

Interrupt Request Bits Not Used<br />

The IRR contains active interrupt requests that have been accepted by the Local APIC.<br />

An active interrupt is represented by bit n being set, where n is a vector between 16 and<br />

255. Interrupt request bits 0 through 15 are reserved. An interrupt to system software<br />

occurs when one or more request bits are set. If more than one interrupt is active at the<br />

same time, the most significant bit is reported first. The processor resets an IRR bit<br />

when it reports the corresponding interrupt to software. The IRR is implemented as<br />

eight 32-bit registers, IRR0 through IRR7. Interrupt request bit n is located in IRR (n DIV<br />

32), at bit position (n MOD 32).<br />

Interrupt Mask Register (IMR) [write only, 256 bits]<br />

255 15<br />

Interrupt Mask Bits Not Used<br />

The IMR is used to mask interrupts normally reported by the IRR. Each IMR bit<br />

corresponds to an IRR bit. A value of 0 enables an interrupt, and a value of 1 disables an<br />

interrupt. The Local APIC does not set an IRR bit if the corresponding bit is set in the<br />

IMR, and setting an IMR bit resets the corresponding IRR bit. The IMR is implemented<br />

as eight 32-bit registers: IMR0 through IMR7. Interrupt mask bit n is located in IMR (n<br />

DIV 32), at bit position (n MOD 32). All interrupt request bits are disabled during a start<br />

sequence.<br />

6–16 6878 7530–007


Local ID Register (LID) [read only, 16 bits]<br />

15 7<br />

Dest ID EID<br />

Restricted Operators<br />

The LID determines whether the Local APIC will accept an interrupt request. A Local<br />

APIC accepts an interrupt if the specified destination matches the destination in the LID.<br />

Software has no direct use for this register.<br />

Interrupt Command Register (ICR) [write only, 32 bits]<br />

31 29 23 15 07<br />

1’01’ Mode Flags Vector Dest ID EID<br />

1’11’ 0 XTP<br />

The ICR is used to send either an IPI or XTP request. The type field in [31:2] is set to 1<br />

for an IPI and 3 for an XTP request. Writing the ICR generates a bus transaction that is<br />

recognized by the platform. Fields within the ICR are defined as follows:<br />

IPI Mode Flag Format<br />

[29:1] = Destination Mode<br />

0 = Physical<br />

1 = Logical<br />

[28:3] = Delivery Mode<br />

0 = Fixed<br />

4 = NMI<br />

6 = Start up<br />

[25:1] = Trigger Mode (=0)<br />

0 = Edge (no EOI expected)<br />

[24:1] = Not used (=0)<br />

Destination ID (Dest ID)<br />

[15:4] = Cell<br />

[11:1] = 0<br />

[10:2] = ASIC socket<br />

[08:1] = Core within socket<br />

Inter-Processor Interrupts<br />

A processor can interrupt another processor by sending it an Inter-Processor Interrupt<br />

(IPI). Software initiates an IPI request by directing a processor to write the Interrupt<br />

Command Register (ICR), which in turn generates a platform transaction. A processor<br />

writes the ICR by executing a Write APIC Register (WREG) operator.<br />

The Local APIC recognizes three IPI requests:<br />

• Maskable Interrupt<br />

• Non-maskable Interrupt<br />

• Startup<br />

6878 7530–007 6–17


Restricted Operators<br />

Maskable Interrupt requests are implemented via high priority interrupt vectors in the<br />

IRR. Non-maskable Interrupt and Startup requests are implemented via high priority<br />

delivery modes that override other pending interrupts. The following table summarizes<br />

the delivery and response for each IPI request:<br />

IPI Request Delivery Destination Response<br />

Maskable Interrupt High priority vector MEI<br />

Non-maskable Interrupt IPI delivery mode ROI<br />

Startup IPI delivery mode Moved to spec’d stack<br />

Maskable Interrupt Request<br />

The Maskable Interrupt request is used to interrupt a processor in the partition, typically<br />

for a higher priority stack or function. In response to this request, the destination IP<br />

reports a Maskable MEI to software. This interrupt is masked by control state.<br />

To issue this request, the following values are set in the ICR:<br />

• Message Type = 1 (IPI)<br />

• Delivery Mode = 0 (fixed)<br />

• Trigger Mode = 0 (edge)<br />

• Vector = 4’D9’ (maskable interrupt)<br />

• Destination = <br />

Non-maskable Interrupt Request<br />

The Non-maskable Interrupt request is used to interrupt a processor out of control state,<br />

presumably because it failed to respond to a Maskable Interrupt. In response to this<br />

request, a processor reports a Non-maskable Interrupt to software.<br />

To issue this request, the following values are set in the ICR:<br />

• Message Type = 1 (IPI)<br />

• Delivery Mode = 4 (NMI)<br />

• Trigger Mode = 0 (edge)<br />

• Vector = <br />

• Destination = <br />

Startup Request<br />

The Startup request moves a processor from an initial idle state to a specified stack. It is<br />

intended for primitive software environments and IP reconfiguration. Prior to sending the<br />

request, software must prepare the stack with proper stack linkage and any required<br />

activation records. The destination IP interprets the 8-bit vector in the ICR as a stack<br />

number. Therefore, the Startup request is valid for stacks 1 to 255. No interrupt is<br />

reported to software.<br />

6–18 6878 7530–007


Restricted Operators<br />

Both Server Control and software can transition a processor to an initial idle state. A<br />

processor in this state only responds to a Startup IPI.<br />

In response to a Startup IPI or Start request from Server Control, the destination<br />

processor performs the “establish destination stack” part of a MVST operator, except<br />

that there is no word to load into the Micro Timer. F must point to the topmost HISW<br />

and S must point to the topmost RCW. The IP requires an initial LL of 1 in the topmost<br />

RCW. Then the processor exits as defined by that RCW and HISW.<br />

To issue this request, the following values are set in the ICR:<br />

• Message Type = 1 (IPI)<br />

• Delivery Mode = 6 (start up)<br />

• Trigger Mode = 0 (edge)<br />

• Vector = <br />

• Destination = <br />

Restricted System Interrupt Operators<br />

EXTB (Libra 6xx and 7xx Systems)<br />

EXTB cuts the stack back to D[LL]+1, pushes onto the stack an integer equal to the most<br />

significant interrupt request in the IRR, and dynamically branches to an MEI procedure<br />

whose PCW resides at a fixed D[0] offset known to the processor.<br />

EXTB accepts no arguments and produces no result. The IRR bit corresponding to the<br />

interrupt request is reset.<br />

EXTB executes at the same stack history and lexical level that results from a MEI.<br />

Software must maintain control state upon branching to the target procedure, as the IP<br />

requires that EEXI never follow EXTB in the code stream.<br />

RIRR <br />

RIRR returns an 8-bit integer between 0 and 255 that corresponds to the most significant<br />

bit set in the Interrupt Request Register (IRR). RIRR accepts no arguments. If no bits are<br />

set in the IRR, RIRR returns -1.<br />

<br />

Top-of-stack <br />

Null integer <br />

transformation: <br />

<br />

6878 7530–007 6–19


Restricted Operators<br />

RREG (Libra 6xx and 7xx Systems)<br />

RREG reads a specified Local APIC register and returns a 32-bit integer result. RREG<br />

accepts an 8-bit integer argument in TOS (register ID).<br />

<br />

Top-of-stack <br />

Register ID 32-bit integer <br />

transformation: <br />

<br />

WREG (Libra 6xx and 7xx Systems)<br />

WREG writes a specified Local APIC register. WREG accepts an 8-bit integer argument<br />

in TOS (register ID) and a 32-bit integer argument in TOS2 (register data). WREG<br />

produces no result.<br />

<br />

<br />

Top-of-stack Register ID <br />

<br />

<br />

<br />

transformation: Register data Null<br />

<br />

<br />

Both the IRR and IMR are implemented as eight 32-bit registers. Note that the IRR is<br />

read-only. Software cannot use WREG to write the IRR.<br />

Register names and their IDs appear below. RREG and WREG produce unknown results<br />

if their register ID argument is not in the table.<br />

Register Name Register ID Read/Write<br />

Interrupt Request Register 0 4’00’ R<br />

Interrupt Request Register 1 4’01’ R<br />

Interrupt Request Register 2 4’02’ R<br />

Interrupt Request Register 3 4’03’ R<br />

Interrupt Request Register 4 4’04’ R<br />

Interrupt Request Register 5 4’05’ R<br />

Interrupt Request Register 6 4’06’ R<br />

Interrupt Request Register 7 4’07’ R<br />

Interrupt Mask Register 0 4’08’ W<br />

Interrupt Mask Register 1 4’09’ W<br />

Interrupt Mask Register 2 4’0A’ W<br />

Interrupt Mask Register 3 4’0B’ W<br />

Interrupt Mask Register 4 4’0C’ W<br />

6–20 6878 7530–007


Register Name Register ID Read/Write<br />

Interrupt Mask Register 5 4’0D’ W<br />

Interrupt Mask Register 6 4’0E’ W<br />

Interrupt Mask Register 7 4’0F’ W<br />

Interrupt Command Register 4’10’ W<br />

Local ID Register 4’11’ R<br />

Restricted Operators<br />

Restricted Time of Day Functions (Libra 6xx and 7xx Systems)<br />

Each processor has a TOD counter to support Real Time of Day (RTOD) and Machine<br />

Time of Day (MTOD). TOD counters increment at a rate that is a function of the system<br />

bus clock.<br />

Time of day counters are synchronized, which allows each processor to access its own<br />

counter. At any point in time, each processor will generate the same RTOD result and<br />

the same MTOD result. Synchronization of the counters is driven by software.<br />

Two scratch pad locations are used to implement time of day. One is an RTOD base<br />

value and the other is an MTOD base value. All processors in a system share these two<br />

base values.<br />

Real Time of Day<br />

To initialize RTOD during a start sequence, Server Control clears the RTOD counter in<br />

the BSP (Boot Strap Processor) and writes the partition time to a reserved memory<br />

location. Software initializes the RTOD base by executing WIPS with a state identifier<br />

equal to Set RTOD Base and a state value equal to the time base provided by Server<br />

Control, converted to 2.4 microsecond units. This case of WIPS sets the RTOD base to<br />

an equivalent value based on the interval of the system clock. Since this interval can<br />

vary, Server Control does not set the RTOD base directly.<br />

To calculate an RTOD value, the processor adds its TOD counter to the RTOD base and<br />

converts the result to an equivalent value based on a clock with a 2.4-microsecond<br />

interval. The RTOD operator returns this value as a 36-bit integer. Software cannot<br />

execute the RTOD operator until the RTOD base has been set via WIPS.<br />

The Write Time of Day (WTOD) operator effectively sets the RTOD base to the new time<br />

of day value minus the TOD counter of the executing processor. Software continues to<br />

provide the WTOD argument in 2.4-microsecond units. In a multiprocessor configuration,<br />

other processors cannot execute RTOD while the master processor executes WTOD.<br />

WTOD does not generate an Unimplemented Operator interrupt as it did on some<br />

previous platforms.<br />

The RTOD counter continues to increment when an IP halts.<br />

6878 7530–007 6–21


Restricted Operators<br />

Machine Time of Day<br />

To initialize MTOD during a start sequence, Server Control sets the MTOD base to zero<br />

and clears the TOD counter in the BSP.<br />

To calculate an MTOD value, the processor adds its TOD counter to the MTOD base and<br />

converts the result to an equivalent value based on a clock with a 2.4 microsecond<br />

interval. The Read MTOD (RDMT) operator returns this value as a 36-bit integer.<br />

Software maintains a machine running time value that is the sum of MTOD and a global<br />

memory cell, MTIMEBASE. To prevent overflow of the 36-bit MTOD result, software<br />

periodically adds MTOD to MTIMEBASE and clears the MTOD result via the Read and<br />

Clear MTOD (RCMT) operator. RCMT returns a 36-bit MTOD result, like RDMT, but it<br />

also sets the MTOD base to zero minus the TOD counter, which effectively clears the<br />

MTOD result.<br />

Since Server Control is not involved in a programmatic load (PHL or CM), software must<br />

execute RCMT during system initialization in order to clear the machine running time<br />

(MTIMEBASE + MTOD). In this case, the RCMT result is discarded.<br />

Synchronization<br />

Software initiates synchronization of the TOD counters during initialization and during IP<br />

reconfiguration. During initialization, synchronization is required only for an Server Control<br />

Start; it is not required for a programmatic start (PHL and CM), as the counters are<br />

already synchronized in this case.<br />

The synchronization action affects any IP owned by the partition. During initialization,<br />

software only needs to initiate synchronization once (before the BSP starts any other IP).<br />

During dynamic reconfiguration, synchronization must occur for any IP whose TOD<br />

counter has not been synchronized by the current partition. In the reconfiguration case,<br />

software must first select a master IP and quiet other running processors via DIAL and<br />

ANSWER.<br />

Synchronization requires participation by Server Control. The overall sequence follows:<br />

1. BSP (or master IP) sends an MCP to Server Control Synchronize Time message.<br />

2. BSP (or master IP) executes WIPS with a Synchronize TOD state identifier.<br />

3. Server Control triggers the time of day synchronization signal.<br />

4. Server Control acknowledges the MCP to Server Control message.<br />

The Synchronize TOD case of WIPS does the following:<br />

1. Disables the loop timer.<br />

2. Sets the processor’s light to Wait TOD Sync.<br />

3. Saves the MTOD result (MTOD base plus TOD counter).<br />

4. Enters a loop that continually reads the TOD counter until the synchronization signal<br />

clears it.<br />

5. Sets the processor’s light back to Running.<br />

6–22 6878 7530–007


6. Adds the last saved TOD counter to the RTOD base.<br />

7. Sets the MTOD base to the saved MTOD result.<br />

Restricted Operators<br />

Software provides the BSP (or master IP) unit number in the MCP to Server Control<br />

Synchronize Time message. Server Control must verify that the status light of that IP is<br />

Wait TOD Sync before it triggers the synchronization signal.<br />

The TOD counters are synchronized when WIPS completes execution. Note that the<br />

MTOD result is frozen (does not advance) during execution of this WIPS case.<br />

Time Management (Libra 4000 System)<br />

The Timer Module is a firmware operating environment application that provides time<br />

management services to the firmware. The Timer Module manages the following timing<br />

functions.<br />

• Real Time of Day (RTOD)<br />

• Machine Time of Day (MTOD)<br />

• Interval Timer<br />

• Run Timer<br />

• Loop Timer<br />

• Micro Timer<br />

• Performance Tuning<br />

The Timer Module supports interfaces to read and set these E-mode timers. The Timer<br />

Module is responsible for converting the timer resolution and format available on the<br />

host platform to the apparent resolution and format expected by the firmware. Except<br />

for the Micro Timer, the E-mode format is generally an integer with an apparent<br />

resolution of 2.4 microseconds. The Timer Module ensures access to monotonically<br />

increasing timer values. This is a critical requirement for MCP software.<br />

Another purpose of the Timer Module is to have a central and coherent repository for<br />

timing functions. This ensures that all functions requesting time values obtain them from<br />

the same source. As a result, there is no drift or inconsistency in the returned values. In<br />

addition, the Timer Module enables timing functions to be independent of the hardware<br />

platform.<br />

Time of Day Requirements<br />

MCP software places the following requirements on RTOD and MTOD:<br />

• The time of day result must have a 2.4-microsecond granularity.<br />

• At any point in time all processors must produce the same time-of-day result.<br />

The time-of-day result cannot decrease between any two read operations.<br />

Real Time of Day (RTOD)<br />

RTOD is a 36-bit counter that increments continuously, even when the MCP partition is<br />

stopped. RTOD reflects a 24-hour clock time.<br />

6878 7530–007 6–23


Restricted Operators<br />

The Read Time of Day (RTOD) operator returns this value as a 36-bit integer with an<br />

apparent resolution of 2.4-microseconds.<br />

The Write Time of Day (WTOD) operator sets the RTOD register. The argument to<br />

WTOD is a 36-bit integer in 2.4 microsecond units. In a multiprocessor configuration, the<br />

MCP must ensure that processors do not execute RTOD and WTOD at the same time.<br />

WTOD does not change the firmware operating environment time of day.<br />

WTOD is a fully implemented operator. On hard IP systems that support XFNC<br />

messages, WTOD generates an Unimplemented Operator interrupt and, in response, the<br />

MCP directs a message to the IOU.<br />

Machine Time of Day (MTOD)<br />

MTOD is a 36-bit counter that increments continuously while the MCP partition is<br />

running. MTOD stops incrementing when a partition halts and resumes incrementing<br />

when a partition continues. MTOD is initialized to 0 only when System Control starts a<br />

partition. MCP software cannot write MTOD.<br />

MCP software requires MTOD to initiate I/O requests, and IOM units require MTOD to<br />

time I/O operations. MTOD is useful in these cases because I/O finish time is<br />

guaranteed to be greater than I/O start time, even across midnight when RTOD is reset.<br />

MCP software reads MTOD by an XFNC message to the MIU. The MIU destination<br />

dates back to hard IOM systems. The soft IOM does not support an MIU function;<br />

however, IOM firmware knows how to route this message. The MTOD result is a 36-bit<br />

integer with an apparent resolution of 2.4 microseconds.<br />

MCP software maintains two global memory cells, MOFFSET and MTIMEBASE. These<br />

values are functions of MTOD and are used to handle wraparound of the 36-bit MTOD<br />

result. CLOCK is the MCP interface that returns machine running time. For TCU<br />

machines, CLOCK returns<br />

(((MTOD & 1 [36:1]) - MOFFSET).[35:36] + MTIMEBASE)<br />

On a programmatic halt/load, the MCP clears MTIMEBASE and sets MOFFSET to<br />

MTOD. This effectively “resets” CLOCK.<br />

Interval Timer<br />

The Interval Timer is set by MCP software by an XSUB message to the TCU. The Interval<br />

Timer has an apparent resolution of 2.4 microseconds and indicates the length of time a<br />

processor can execute on a stack when there are no higher priority stacks. The TCU<br />

maintains one Interval Timer per processor. When an Interval Timer decrements to 0, an<br />

Interval Timer interrupt is reported to the TCU, which might optionally reschedule the<br />

processor.<br />

6–24 6878 7530–007


Run Timer<br />

Restricted Operators<br />

The Run Timer is a partition-wide value reset periodically by MCP software by an XFNC<br />

message to the TCU. By convention, MCP software specifies a default setting of 30<br />

seconds. If the timer decrements to zero before being reset or disabled, a Run Timer<br />

interrupt is reported to the TCU, which then initiates a stop partition request to System<br />

Control.<br />

Loop Timer<br />

The Loop Timer is reset by the CPM at the start of each instruction and sometimes<br />

periodically during execution of “long” operators. If the Loop Timer reaches a value of 20<br />

seconds before being reset or disabled, the CPM reports a Loop Timer interrupt to the<br />

MCP.<br />

Micro Timer<br />

The Micro Timer is a counter that enables performance modeling software to measure<br />

code execution time with a finer granularity than the 2.4-microsecond interval of RTOD<br />

and MTOD.<br />

The CPM implements a 48-bit Micro Timer for each executable stack. The Micro Timer<br />

value for a given stack only accumulates when a CPM is on that stack. The initial Micro<br />

Timer value is zero.<br />

When a CPM moves off a stack, it saves the current Micro Timer value in internal stack<br />

state. When a CPM moves onto a stack, the saved Micro Timer value resumes<br />

incrementing from its previous value.<br />

Unlike the Micro Timer implementation for hard processors, the CPM provides this<br />

feature with no dependency on MCP software, such as the need to provide an extra cell<br />

on each new stack.<br />

The Read Micro Timer (RMTR) and Write Micro Timer (WMTR) operators provide access<br />

to the Micro Timer value for the current stack (SNR). MCP software cannot access the<br />

Micro Timer value of an inactive stack.<br />

Performance Tuning<br />

The Timer Module supports performance tuning functions. The Timer Module can<br />

change the performance of the CPM to calibrate system performance and to avoid<br />

starvation of other processes. Performance tuning allows the CPM to run at a specified<br />

percentage of its potential performance. The Timer Module provides an interface to the<br />

CPM for this feature. The WATI result optionally reports a value (PL) that maps to this<br />

specified percentage.<br />

6878 7530–007 6–25


Restricted Operators<br />

System-Specific Platform <strong>Support</strong> Operator<br />

WIPS is defined by various ClearPath MCP systems as required by the system features<br />

of each.<br />

WIPS <br />

WIPS assigns a state value to a specific processor state. WIPS accepts an integer in<br />

TOS2 (state value) and an integer in TOS (state identifier). WIPS produces no result.<br />

<br />

<br />

Top-of-stack State identifier <br />

<br />

<br />

<br />

transformation: State value Null<br />

<br />

<br />

Libra 6xx and 7xx Systems<br />

WIPS State<br />

Identifier<br />

Value<br />

Description<br />

Set RTOD Base 4’4’ Converts the state value argument to a value based on the<br />

interval of the system clock and uses the result to set the<br />

RTOD base word in the scratch pad.<br />

Synchronize TOD 4’5’ Sets the IP light value to Wait TOD Sync, saves the MTOD<br />

result, and loops reading RTOD until the counter is cleared by a<br />

synchronization signal triggered by Server Control. The state<br />

value argument is ignored.<br />

Move Idle 4’6’ Moves the IP off the current stack to an Initial Idle state<br />

regardless of control state. The TSCW for SNR is updated as if<br />

a MVST operator executed. The state value argument is<br />

ignored. This WIPS case must execute at LL=1.<br />

Continue<br />

Notification<br />

Low E-mode<br />

Memory Limit<br />

High E-mode<br />

Memory Base<br />

High E-mode<br />

Memory Limit<br />

Low NCB Memory<br />

Base<br />

Low NCB Memory<br />

Limit<br />

High NCB Memory<br />

Base<br />

4’7’ Indicates the IP has reported an interrupt after being continued<br />

from a halted state. The state value argument is ignored.<br />

4’15’ Sets the Low E-mode Memory Limit register to [35:20] of the<br />

state value argument.<br />

4’16’ Sets the High E-mode Memory Base register to [35:20] of the<br />

state value argument.<br />

4’17’ Sets the High E-mode Memory Limit register to [35:20] of the<br />

state value argument.<br />

4’18’ Sets the Low NCB Memory Base register to [35:20] of the<br />

state value argument.<br />

4’19’ Sets the Low NCB Memory Limit register to [35:20] of the<br />

state value argument.<br />

4’1A’ Sets the High NCB Memory Base register to [35:20] of the<br />

state value argument.<br />

6–26 6878 7530–007


WIPS State<br />

Identifier<br />

High NCB Memory<br />

Limit<br />

Value<br />

Description<br />

Restricted Operators<br />

4’1B’ Sets the High NCB Memory Limit register to [35:20] of the<br />

state value argument.<br />

Byte Memory Base 4’1C’ Sets the Byte Memory Base register to [35:20] of the state<br />

value argument.<br />

Byte Memory Limit 4’1D’ Sets the Byte Memory Limit register to [35:20] of the state<br />

value argument.<br />

Libra 4000 System<br />

WIPS State<br />

Identifier<br />

Value Description<br />

Low Stack PL 3 Sets the performance level of low stack numbers as specified<br />

by the state value argument:<br />

[38:07] = Encoded timeout value for this performance level<br />

[31:08] = Stack number limit for this performance level<br />

[23:08] = Performance level<br />

[15:16] = 0<br />

Restricted I/O <strong>Support</strong> Operator<br />

BAFP (Libra 6xx and 7xx Systems)<br />

BAFP converts an IDD argument to an equivalent integer byte address that assumes Emode<br />

addressing. The integer mod 8 ranges from 0 to 5, where 0 refers to byte [47:8], 1<br />

refers to byte [39:8], and so forth, down to byte [7:8]. The integer mod 8 always equals<br />

zero when the argument is a word IDD.<br />

BAFP accepts a word (size < 2) or byte (size = 4) unpaged IDD. The IDD word index<br />

must be less than 2**16. BAFP returns an integer equal to 8 * + 8<br />

* + .<br />

<br />

Top-of-stack <br />

IndexedDD Integer <br />

transformation: <br />

<br />

6878 7530–007 6–27


Restricted Operators<br />

Restricted Word Extension Operators<br />

Memory hardware on the CMP platform utilizes a 64-bit word. For ClearPath MCP<br />

processors, the TAG field has moved from [51:4] to [59:4]. Bits [55:4] are known as the<br />

word extension. Bits [63:4] and [51:4] are undefined. There is no change in the current<br />

hardware mechanism that supports bit addressing for bits [47:48].<br />

Four pairs of operators are defined for accessing the word extension:<br />

• One pair to get or set the stack number in a normal SIRW/ENVW or HISW/TSCW<br />

• One pair to get or set the ASD reference in a touched descriptor or PCW/RCW<br />

• One pair to get or set the ASD reference in a pseudo SIRW/ENVW<br />

• One pair to get or set the word extension itself<br />

The GET operators accept a bit vector argument in TOS. The SET operators accept a bit<br />

vector argument in TOS2 and require an integer argument in TOS.<br />

GASF <br />

GASF returns a 27-bit integer consisting of TOS.extension in [26:4] and TOS.[19:23] in<br />

[22:23].<br />

<br />

Top-of-stack <br />

any(bit vector) 27-bit integer <br />

transformation: <br />

<br />

SASF <br />

SASF inserts TOS.[26:4] in TOS2.extension and TOS.[22:23] in TOS2.[19:23].<br />

<br />

<br />

Top-of-stack Integer <br />

<br />

transformation: <br />

<br />

any(bit vector) dest’ <br />

<br />

<br />

GASP <br />

GASP returns a 27-bit integer consisting of TOS.extension in [26:4] and TOS.[46:23] in<br />

[22:23].<br />

<br />

Top-of-stack <br />

any(bit vector) 27-bit integer <br />

transformation: <br />

<br />

6–28 6878 7530–007


SASP <br />

Restricted Operators<br />

SASP inserts TOS.[26:4] in TOS2.extension and TOS.[22:23] in TOS2.[46:23].<br />

<br />

<br />

Top-of-stack Integer <br />

<br />

transformation: <br />

<br />

any(bit vector) dest’ <br />

<br />

<br />

GSTN <br />

GSTN returns a 19-bit integer consisting of TOS.extension in [18:4] and TOS.[46:15] in<br />

[14:15].<br />

<br />

Top-of-stack <br />

any(bit vector) 19-bit integer <br />

transformation: <br />

<br />

SSTN <br />

SSTN inserts TOS.[18:4] in TOS2.extension and TOS.[14:15] in TOS2.[46:15].<br />

<br />

<br />

Top-of-stack Integer <br />

<br />

transformation: <br />

<br />

any(bit vector) dest’ <br />

<br />

<br />

GEXT <br />

GEXT returns a 4-bit integer consisting of TOS.extension in [3:4].<br />

<br />

Top-of-stack <br />

any(bit vector) 4-bit integer <br />

transformation: <br />

<br />

6878 7530–007 6–29


Restricted Operators<br />

SEXT <br />

SEXT inserts TOS.[3:4] in TOS2.extension.<br />

<br />

<br />

Top-of-stack Integer <br />

<br />

transformation: <br />

<br />

any(bit vector) dest’ <br />

<br />

<br />

6–30 6878 7530–007


Appendix A<br />

Alphabetical Operator Code List<br />

The following table lists all operators alphabetically by mnemonic. The operator<br />

mnemonic and name are followed by the hexadecimal encoding, operator type, and<br />

parameters, if any. For operators that are not valid on all ClearPath MCP systems,<br />

information concerning compatibility is provided. Operators that are restricted are also<br />

denoted as such.<br />

The operator type is indicated with the following notation:<br />

p primary operator<br />

v variant operator<br />

e edit mode operator (same encoding in table and single edit)<br />

se edit mode operator (single edit only)<br />

te edit mode operator (table edit only)<br />

Mnemonic Operator Name Hex<br />

Operator<br />

Type<br />

ADD Add 80 p<br />

AMAX Arithmetic maximum 958A v<br />

AMIN Arithmetic minimum 9588 v<br />

ASRT Assert 9580 v interrupt_ code:8<br />

AVER Aver 958F v<br />

BAFP Byte address from<br />

pointer<br />

BCD Binary convert to<br />

decimal<br />

BMS Bounded masked<br />

search for equal<br />

9577 v N:8<br />

95A9 v<br />

BRFL Branch false A0 p op_psi:3<br />

op_pwi:13<br />

BRST Bit reset 9E p Db:8<br />

BRTR Branch true A1 p op_psi:3<br />

op_pwi:13<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

v Restricted: Selected<br />

systems<br />

6878 7530–007 A–1


Alphabetical Operator Code List<br />

Mnemonic Operator Name Hex<br />

Operator<br />

Type<br />

BRUN Branch unconditional A2 p op_psi:3<br />

op_pwi:13<br />

BSET Bit set 96 p Db:8<br />

CBON Count binary ones 95BB v<br />

CEQD Compare characters<br />

equal delete<br />

CGED Compare characters<br />

greater or equal<br />

delete<br />

CGTD Compare characters<br />

greater delete<br />

F4 p<br />

F1 p<br />

F2 p<br />

CHEK Compute check-hash 95C8 v<br />

CHES Change emulation<br />

segment<br />

CHSN Change sign 8E p<br />

CLED Compare characters<br />

less or equal delete<br />

CLSD Compare characters<br />

less delete<br />

CNED Compare characters<br />

not equal delete<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

9595 v Restricted: Selected<br />

systems<br />

F3 p<br />

F0 p<br />

F5 p<br />

CPV Copy vector 95E0 v<br />

CPVA Copy vector absolute 95E2 v<br />

CPVD Copy vector double 95E4 v<br />

CPVN Copy vector negated 95E1 v<br />

CPVS Copy vector single 95E3 v<br />

CREL Character sequence<br />

relational<br />

CVS2 Convert sign<br />

magnitude to 2’s<br />

complement<br />

CV2S Convert 2’s<br />

complement to sign<br />

magnitude<br />

DBCD Dynamic binary<br />

convert to decimal<br />

DBFL Dynamic branch<br />

false<br />

95A8 v<br />

9554 v <strong>Level</strong> <strong>Epsilon</strong><br />

9555 v <strong>Level</strong> <strong>Epsilon</strong><br />

957F v<br />

A8 p<br />

DBRS Dynamic bit reset 9F p<br />

A–2 6878 7530–007


Mnemonic Operator Name Hex<br />

Operator<br />

Type<br />

DBST Dynamic bit set 97 p<br />

DBTR Dynamic branch true A9 p<br />

DBUN Dynamic branch<br />

unconditional<br />

DEXI Disable external<br />

interrupts<br />

DFTR Dynamic field<br />

transfer<br />

AA p<br />

9547 v<br />

99 p<br />

DINS Dynamic field insert 9D p<br />

DISO Dynamic field isolate 9B p<br />

DIVD Divide 83 p<br />

DLET Delete top of stack B5 p<br />

DOT Dot (inner) product--<br />

single<br />

DOTX Dot (inner) product--<br />

extended<br />

95C4 v<br />

95C5 v<br />

DRNT Dynamic range test 9583 v<br />

DUPL Duplicate top of<br />

stack<br />

EEXI Enable external<br />

interrupts<br />

B7 p<br />

9546 v<br />

ENDE End edit DE te<br />

ENDF End float D5 te MinusChar:8<br />

PlusChar:8<br />

ENTR Enter AB p<br />

EQUL Equal to 8C p<br />

EVAL Evaluate AC p<br />

EXCH Exchange top of<br />

stack<br />

B6 p<br />

EXIT Exit A3 p<br />

EXPU Execute single edit<br />

operator, single<br />

pointer update<br />

EXSD Execute single edit<br />

operator delete<br />

EXSU Execute single edit<br />

operator update<br />

DD p<br />

D2 p<br />

DA p<br />

Alphabetical Operator Code List<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

6878 7530–007 A–3


Alphabetical Operator Code List<br />

Mnemonic Operator Name Hex<br />

Operator<br />

Type<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

EXTB External branch 954C v Restricted: Selected<br />

systems<br />

FLTR Field transfer 98 p Db:8 Sb:8 Len:8<br />

FMN Find minimum 95CA v<br />

FMX Find maximum 95C9 v<br />

FMXA Find maximum<br />

absolute value<br />

95CB v<br />

GASF Get ASD field 9558 v Restricted: <strong>Epsilon</strong><br />

GASP Get ASD pseudo 955A v Restricted: <strong>Epsilon</strong><br />

GATH Gather 95C1 v<br />

GESZ Get element_size 95CF v<br />

GEXT Get extension 955E v Restricted: <strong>Epsilon</strong><br />

GINX Get index 95CE v<br />

GLEN Get length 95CD v<br />

GREQ Greater than or equal<br />

to<br />

89 p<br />

GRTR Greater than 8A p<br />

GSTN Get stack number 955C v Restricted: <strong>Epsilon</strong><br />

HALT Conditional<br />

processor halt<br />

ICLD Input convert leftsigned<br />

delete<br />

ICRD Input convert rightsigned<br />

delete<br />

ICUD Input convert<br />

unsigned delete<br />

95DF v Restricted<br />

9575 v<br />

9576 v<br />

A4 p<br />

ICVD Input convert delete CA p<br />

IDIV Integer divide 84 p<br />

IDLE Idle until interrupt 9544 v Restricted<br />

IMKS Insert mark stack CF p<br />

INDX Index A6 p<br />

INOP Insert overpunch D8 e<br />

INSC Insert conditional DD te Length:8<br />

ZeroChar:8<br />

NonZeroChar:8<br />

A–4 6878 7530–007


Mnemonic Operator Name Hex<br />

Operator<br />

Type<br />

INSG Insert display sign D9 e MinusChar:8<br />

PlusChar:8<br />

INSR Field Insert 9C p Db:8 Len:8<br />

INSU Insert unconditional DC se Char:8<br />

INSU Insert unconditional DC te Length:8 Char:8<br />

Alphabetical Operator Code List<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

IPST IP Status 9596 v Restricted: Selected<br />

systems<br />

ISOL Field isolate 9A p Sb:8 Len:8<br />

JOIN Join two operands<br />

into double<br />

9542 v<br />

LAND Logical AND 90 p<br />

LDNC Load no check 9594 v Restricted: Selected<br />

systems<br />

LDNO Load no check<br />

original<br />

LEQV Logical equivalence 93 p<br />

LESS Less than 88 p<br />

959B v Restricted: Selected<br />

systems<br />

LNMC Long name call 958C v lambda:4 delta:12<br />

LNOT Logical NOT 92 p<br />

LOAD Load BD p<br />

LODC Load character FD p<br />

LODT Load transparent BC p<br />

LODT Load transparent 95BC v<br />

LOG2 Leading one test 958B v<br />

LOR Logical OR 91 p<br />

LSEQ Less than or equal to 8B p<br />

LT8 Insert 8-bit literal B2 p constant:8<br />

LT16 Insert 16-bit literal B3 p constant:16<br />

LT48 Insert 48-bit literal BE p word-aligned<br />

constant:48<br />

LVLC Long value name call 958D v lambda:4 delta:12<br />

MCHR Move characters D7 se<br />

MCHR Move characters D7 te Length:8<br />

MFLT Move with float D1 se ZeroChar:8<br />

MinusChar:8<br />

PlusChar:8<br />

6878 7530–007 A–5


Alphabetical Operator Code List<br />

Mnemonic Operator Name Hex<br />

Operator<br />

Type<br />

MFLT Move with float D1 te Length:8<br />

ZeroChar:8<br />

MinusChar:8<br />

PlusChar:8<br />

MINS Move with insert D0 se ZeroChar:8<br />

MINS Move with insert D0 te Length:8<br />

ZeroChar:8<br />

MKSN Mark-stack bound to<br />

name-call<br />

DF p<br />

MKST Mark stack AE p<br />

MPCW Make PCW BF p word-aligned<br />

SkeletonPCW: 48<br />

MPWL Make PCW LL F6 p<br />

MPWP Make PCW LL+1 F7 p<br />

MULT Multiply 82 p<br />

MULX Extended multiply 8F p<br />

MVNU Move numeric<br />

unconditional<br />

MVNU Move numeric<br />

unconditional<br />

D6 se<br />

D6 te Length:8<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

MVST Move stack 95AF v Restricted<br />

NAMC Name call 40-7F p variable-fence<br />

address couple:14<br />

(two syllables<br />

total)<br />

NEQL Not equal to 8D p<br />

NMC0 Name call lambda 0 C4 p delta:16<br />

NMC1 Name call lambda 1 C5 p delta:16<br />

NMC2 Name call lambda 2 C6 p delta:16<br />

NMC3 Name call lambda 3 C7 p delta:16<br />

NOOP No operation FE p<br />

NOOP No operation 95FE v<br />

NORM Normalize 958E v<br />

NORX Disable reindex of<br />

reference<br />

NOWR Disable write via<br />

reference<br />

957C v<br />

957D v<br />

A–6 6878 7530–007


Mnemonic Operator Name Hex<br />

NTGD Integerize double<br />

precision rounded<br />

Operator<br />

Type<br />

9587 v<br />

NTGR Integerize rounded 87 p<br />

NTIA Integerize truncated 86 p<br />

NTTD Integerize double<br />

precision truncated<br />

9586 v<br />

NVLD Invalid operator FF p<br />

NVLD Invalid operator 95FF v<br />

NXLN Index and load name A5 p<br />

NXLV Index and load value AD p<br />

OCRX Occurs index 9585 v<br />

ONE Insert literal one B1 p<br />

OVRD Overwrite delete BA p<br />

OVRN Overwrite non-delete BB p<br />

Alphabetical Operator Code List<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

PAUS Pause until interrupt 9584 v Restricted<br />

PKLD Pack left-signed<br />

delete<br />

PKRD Pack right-signed<br />

delete<br />

PKUD Pack unsigned<br />

delete<br />

POLY Polynomial<br />

recurrence<br />

PUSH Push working stack<br />

onto activation<br />

record<br />

RASD Read ASD-table<br />

word<br />

RCMT Read and clear<br />

machine time of day<br />

clock<br />

9573 v<br />

9574 v<br />

9572 v<br />

95C7 v<br />

B4 p<br />

RDIV Remainder divide 85 p<br />

RDLK Read and lock 95BA v<br />

RDMT Read machine time<br />

of day clock<br />

REMW Read external<br />

memory word<br />

RETN Return A7 p<br />

95B1 v Restricted<br />

956B v Restricted: Selected<br />

systems<br />

956A v Restricted: Selected<br />

systems<br />

9565 v Restricted: Selected<br />

systems<br />

6878 7530–007 A–7


Alphabetical Operator Code List<br />

Mnemonic Operator Name Hex<br />

REXI Return/exit from<br />

interrupt<br />

Operator<br />

Type<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

95F7 v Restricted<br />

RIPS Read IP state 9598 v Restricted: Selected<br />

systems<br />

RIRR Read interrupt<br />

request register<br />

9560 v Restricted: Selected<br />

systems<br />

RMTR Read micro timer 9568 v Restricted: Selected<br />

systems<br />

ROFF Read and reset<br />

overflow flip-flop<br />

RPRR Read processor<br />

register<br />

D7 p<br />

95B8 v Restricted<br />

RREG Read APIC register 9561 v Restricted: Selected<br />

systems<br />

RSDN Rotate stack down 95B7 v<br />

RSNR Read SNR 9581 v<br />

RSQR Real square root 9550 v<br />

RSTF Reset float flip-flop D4 e<br />

RSUP Rotate stack up 95B6 v<br />

RTAG Read tag 95B5 v<br />

RTFF Read true-false flipflop<br />

DE p<br />

RTN2 Return two items 95AE v<br />

RTOD Read real time of day<br />

clock<br />

95A7 v<br />

RUNI Indicate running 9541 v Restricted<br />

SAME Logical equality 94 p<br />

SASF Set ASD field 9559 v Restricted: <strong>Epsilon</strong><br />

SASP Set ASD pseudo 955B v Restricted: <strong>Epsilon</strong><br />

SCAT Scatter 95C0 v<br />

SCMP String compare 95AA v<br />

SCPY String copy 95AB v<br />

SCRD SLC read 9592 v Restricted: Selected<br />

systems<br />

SE4C Set element_size to<br />

hex characters<br />

95A0 v<br />

A–8 6878 7530–007


Mnemonic Operator Name Hex<br />

SE8C Set element_size to<br />

EBCDIC characters<br />

SEDW Set element_size to<br />

double words<br />

SEQ Sequential<br />

recurrence<br />

SEQD Scan while equal<br />

delete<br />

SEQU Scan while equal<br />

update<br />

SESW Set element_size to<br />

single words<br />

Operator<br />

Type<br />

95A1 v<br />

95A3 v<br />

95C6 v<br />

95F4 v<br />

95FC v<br />

95A2 v<br />

Alphabetical Operator Code List<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

SEXT Set extension 955F v Restricted: <strong>Epsilon</strong><br />

SFDC Skip forward<br />

destination<br />

characters<br />

SFDC Skip forward<br />

destination<br />

characters<br />

SFSC Skip forward source<br />

characters<br />

SFSC Skip forward source<br />

characters<br />

SGED Scan while greater or<br />

equal delete<br />

SGEU Scan while greater or<br />

equal update<br />

SGTD Scan while greater<br />

delete<br />

SGTU Scan while greater<br />

update<br />

DA se<br />

DA te Length:8<br />

D2 se<br />

D2 te Length:8<br />

95F1 v<br />

95F9 v<br />

95F2 v<br />

95FA v<br />

SINT Set interval timer 9545 v Restricted<br />

SISO String isolate D5 p<br />

SLED Scan while less or<br />

equal delete<br />

SLEU Scan while less or<br />

equal update<br />

SLSD Scan while less<br />

delete<br />

95F3 v<br />

95FB v<br />

95F0 v<br />

6878 7530–007 A–9


Alphabetical Operator Code List<br />

Mnemonic Operator Name Hex<br />

SLSU Scan while less<br />

update<br />

SNED Scan while not equal<br />

delete<br />

SNEU Scan while not equal<br />

update<br />

SNGL Set to single<br />

precision rounded<br />

SNGT Set to single<br />

precision truncated<br />

SPLT Split operand into<br />

two singles<br />

SPRR Set processor<br />

register<br />

SRCH Masked search for<br />

equal<br />

SRDC Skip reverse<br />

destination<br />

characters<br />

SRDC Skip reverse<br />

destination<br />

characters<br />

SRSC Skip reverse source<br />

characters<br />

SRSC Skip reverse source<br />

characters<br />

Operator<br />

Type<br />

95F8 v<br />

95F5 v<br />

95FD v<br />

CD p<br />

CC p<br />

9543 v<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

95B9 v Restricted<br />

95BE v<br />

DB se<br />

DB te Length:8<br />

D3 se<br />

D3 te Length:8<br />

SSTN Set stack number 955D v Restricted: <strong>Epsilon</strong><br />

STAG Set tag 95B4 v<br />

STCD Store character<br />

delete<br />

STCN Store character<br />

nondelete<br />

F8 p<br />

F9 p<br />

STFF Stuff AF p<br />

STOD Store delete B8 p<br />

STON Store nondelete B9 p<br />

STOP Unconditional<br />

processor halt<br />

95BF v<br />

SUBT Subtract 81 p<br />

A–10 6878 7530–007


Mnemonic Operator Name Hex<br />

SUM Summation over<br />

vector<br />

SUMA Summation over<br />

vector, absolute<br />

SUMW Summation over<br />

vector, word<br />

SWFD Scan while false<br />

delete<br />

SWFU Scan while false<br />

update<br />

SWTD Scan while true<br />

delete<br />

SWTU Scan while true<br />

update<br />

SXSN Set external sign flipflop<br />

TEED Table enter edit<br />

delete<br />

TEEU Table enter edit<br />

update<br />

TEQD Transfer while equal<br />

delete<br />

TEQU Transfer while equal<br />

update<br />

TGED Transfer while<br />

greater or equal<br />

delete<br />

TGEU Transfer while<br />

greater or equal<br />

update<br />

TGTD Transfer while<br />

greater delete<br />

TGTU Transfer while<br />

greater update<br />

TLED Transfer while less<br />

or equal delete<br />

TLEU Transfer while less<br />

or equal update<br />

TLSD Transfer while less<br />

delete<br />

Operator<br />

Type<br />

95C2 v<br />

95C3 v<br />

95CC v<br />

95D4 v<br />

95DC v<br />

95D5 v<br />

95DD v<br />

D6 p<br />

D0 p<br />

D8 p<br />

E4 p<br />

EC p<br />

E1 p<br />

E9 p<br />

E2 p<br />

EA p<br />

E3 p<br />

EB p<br />

E0 p<br />

Alphabetical Operator Code List<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

6878 7530–007 A–11


Alphabetical Operator Code List<br />

Mnemonic Operator Name Hex<br />

TLSU Transfer while less<br />

update<br />

TNED Transfer while not<br />

equal delete<br />

TNEU Transfer while not<br />

equal update<br />

Operator<br />

Type<br />

E8 p<br />

E5 p<br />

ED p<br />

TRNS Translate 95D7 v<br />

TUND Transfer characters<br />

unconditional delete<br />

TUNU Transfer characters<br />

unconditional update<br />

TWFD Transfer while false<br />

delete<br />

TWFU Transfer while false<br />

update<br />

TWOD Transfer words<br />

overwrite delete<br />

TWSD Transfer words<br />

delete<br />

TWSU Transfer words<br />

update<br />

TWTD Transfer while true<br />

delete<br />

TWTU Transfer while true<br />

update<br />

UPLD Unpack left-signed<br />

delete<br />

UPLU Unpack left-signed<br />

update<br />

UPRD Unpack right-signed<br />

delete<br />

UPRU Unpack right-signed<br />

update<br />

UPUD Unpack unsigned<br />

delete<br />

UPUU Unpack unsigned<br />

update<br />

USND Unpack signed<br />

delete<br />

E6 p<br />

EE p<br />

95D2 v<br />

95DA v<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

D4 p Restricted<br />

D3 p<br />

DB p<br />

95D3 v<br />

95DB v<br />

9570 v<br />

9578 v<br />

9571 v<br />

9579 v<br />

95D1 v<br />

95D9 v<br />

95D0 v<br />

A–12 6878 7530–007


Mnemonic Operator Name Hex<br />

USNU Unpack signed<br />

update<br />

Operator<br />

Type<br />

95D8 v<br />

VALC Value call 00-3F p variable-fence<br />

address couple:14<br />

(two syllables<br />

total)<br />

VARI Introduce variant<br />

operator<br />

95 p<br />

VLC0 Value call lambda 0 C0 p delta: 16<br />

VLC1 Value call lambda 1 C1 p delta: 16<br />

VLC2 Value call lambda 2 C2 p delta: 16<br />

VLC3 Value call lambda 3 C3 p delta: 16<br />

VMV Vector minus vector 95E6 v<br />

VMVN Vector minus vector<br />

negated<br />

VOV Vector over (divided<br />

by) vector<br />

95E7 v<br />

95E9 v<br />

VPS Vector plus scalar 95EB v<br />

VPV Vector plus vector 95E5 v<br />

VPVS Vector plus vector<br />

times scalar<br />

VSPV Vector times scalar<br />

plus vector<br />

95ED v<br />

95EE v<br />

VTS Vector times scalar 95EC v<br />

VTV Vector times vector 95E8 v<br />

VUV Vector under (divided<br />

into) vector<br />

WASD Write ASD-table<br />

word<br />

WATI Read machine<br />

identification<br />

WEMW Write external<br />

memory word<br />

95EA v<br />

Alphabetical Operator Code List<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

95B3 v Restricted<br />

95A4 v Restricted<br />

9566 v Restricted: Selected<br />

systems<br />

WHOI Read proc_id 954E v Restricted<br />

WIPS Write IP State 9599 v Restricted: Selected<br />

systems<br />

WMTR Write Micro Timer 9569 v Restricted: Selected<br />

systems<br />

6878 7530–007 A–13


Alphabetical Operator Code List<br />

Mnemonic Operator Name Hex<br />

Operator<br />

Type<br />

Code Stream<br />

Parameters <strong>Level</strong>/Feature<br />

WREG Write APIC register 9562 v Restricted: Selected<br />

systems<br />

WTOD Write real time of<br />

day clock<br />

XTND Set to double<br />

precision<br />

9549 v Restricted<br />

CE p<br />

ZERO Insert literal zero B0 p<br />

ZIC Zero Interrupt_Count 9540 v Restricted<br />

A–14 6878 7530–007


Appendix B<br />

Boolean Accumulator X-Ref<br />

The operators that interact with the four Boolean Accumulators are listed with the type<br />

of interaction.<br />

TFFF (true/false flip-flop)<br />

left in undefined state by:<br />

TUND/TUNU, SCPY, CREL, SCMP, PKUD, ICUD, ICLD, ICRD, ICVD;<br />

defined value for required subsequent RTFF, but left in undefined state<br />

by:<br />

CGTD, CGED, CEQD, CNED, CLED, CLSD<br />

SGTD, SGED, SEQD, SNED, SLED, SLSD<br />

set by:<br />

character relational operators (except for scan delete):<br />

SGTU, SGEU, SEQU, SNEU, SLEU, SLSU,<br />

TGTD/TGTU, TGED/TGEU, TEQD/TEQU, TNED/TNEU,<br />

TLED/TLEU, TLSD/TLSU<br />

character set membership operators:<br />

SWTD/SWTU, SWFD/SWFU, TWTD/TWTU, TWFD/TWFU<br />

pack operators (except PKUD):<br />

PKLD, PKRD<br />

read by:<br />

RTFF<br />

6878 7530–007 B–1


Boolean Accumulator X-Ref<br />

OFFF (overflow flip-flop)<br />

conditionally set to 1 (true) by:<br />

BCD/DBCD<br />

read and reset to 0 (false) by:<br />

ROFF<br />

EXTF (external sign flip-flop)<br />

left in undefined state by:<br />

PKUD, ICUD, ICLD, ICRD, ICVD<br />

set by:<br />

BCD/DBCD, SXSN, PKLD, PKRD<br />

read by:<br />

unpack signed operators:<br />

UPLD/UPLU, UPRD/UPRU, USND/USNU<br />

edit sign operators:<br />

INOP, INSG, MFLT, ENDF<br />

FLTF (float flip-flop)<br />

reset to 0 (false) by:<br />

TEED/TEEU, EXSD/EXSU in initial mode and by RSTF<br />

read and conditionally set to 1 (true) by:<br />

MINS, MFLT<br />

read and reset to 0 (false) by:<br />

ENDF<br />

read by:<br />

INSC<br />

B–2 6878 7530–007


TFFF, OFFF, and EXTF<br />

FLTF<br />

saved in the stack frame linkage by:<br />

enter operations<br />

restored from that linkage by:<br />

exit operations<br />

preserved as restart information at service interrupts from:<br />

edit operators<br />

restored by:<br />

enter-edit operators in restart mode<br />

Boolean Accumulator X-Ref<br />

6878 7530–007 B–3


Boolean Accumulator X-Ref<br />

B–4 6878 7530–007


Appendix C<br />

Operator Encoding<br />

The processor has three modes of interpretation of a one-syllable operator code.<br />

• Primary mode is the default interpretation of one-syllable operating code.<br />

• Variant mode is enabled by interpretation of the primary mode operator encoding<br />

VARI (hex 95). VARI causes the processor to interpret the next syllable as a variant<br />

mode operator. Following execution of this operator, the processor reverts to<br />

primary mode. For convenience, variant operator encodings are written hex 95xx,<br />

where xx is the one-syllable variant operator code.<br />

• Edit mode is enabled by interpretation of the primary mode operators TEED, TEEU,<br />

EXSD, EXSU, and EXPU (hex D0, D8, D2, DA, and DD, respectively). TEED and TEEU<br />

cause the processor to interpret the syllables in an external table as edit mode<br />

operators, each of which is followed by associated parameters. The processor<br />

returns to primary mode following interpretation of ENDE (hex DE) operator in the<br />

table. EXSD, EXSU, and EXPU cause the processor to interpret the next syllable as<br />

an edit mode operator followed by associated parameters. Following execution of<br />

the edit mode operator, the processor returns to primary mode interpretation.<br />

The following charts show for each interpretation mode the operator associated with<br />

each syllable encoding. Unflagged mnemonics are unrestricted; flag characters denote<br />

obsolete or restricted operators:<br />

– obsolete<br />

+ partially restricted<br />

# restricted<br />

6878 7530–007 C–1


Operator Encoding<br />

Primary Mode Operators<br />

0 1 2 3 4 5 6 7<br />

<br />

<br />

8 ADD SUBT MULT DIVD IDIV RDIV NTIA NTGR <br />

<br />

<br />

<br />

9 LAND LOR LNOT LEQV SAME VARI BSET DBST <br />

<br />

<br />

<br />

A BRFL BRTR BRUN EXIT ICUD NXLN INDX RETN <br />

<br />

<br />

<br />

B ZERO ONE LT8 LT16 PUSH DLET EXCH DUPL <br />

<br />

<br />

<br />

C VLCO VLC1 VLC2 VLC3 NMCO NMC1 NMC2 NMC3 <br />

<br />

<br />

<br />

D TEED EXSD TWSD #TWOD SISO SXSN ROFF <br />

<br />

<br />

<br />

E TLSD TGED TGTD TLED TEQD TNED TUND <br />

<br />

<br />

<br />

F -CLSD -CGED -CGTD -CLED -CEQD -CNED MPWL MPWP <br />

<br />

<br />

C–2 6878 7530–007


Primary encodings are 00-3F are VALC; primary encodings 40-7F are NAMC.<br />

8 9 A B C D E F<br />

<br />

<br />

LESS GREQ GRTR LSEQ EQUL NEQL CHSN MULX 8<br />

<br />

<br />

<br />

-FLTR DFTR ISOL DISO INSR DINS BRST DBRS 9<br />

<br />

<br />

<br />

DBFL DBTR DBUN ENTR EVAL NXLV MKST STFF A<br />

<br />

<br />

<br />

STOD STON +OVRD +OVRN +LODT LOAD LT48 MPCW B<br />

<br />

<br />

<br />

ICVD SNGT SNGL XTND IMKS C<br />

<br />

<br />

<br />

TEEU EXSU TWSU EXPU RTFF -MKSN D<br />

<br />

<br />

<br />

TLSU TGEU TGTU TLEU TEQU TNEU TUNU E<br />

<br />

<br />

<br />

STCD STCN LODC NOOP NVLD F<br />

<br />

<br />

Operator Encoding<br />

6878 7530–007 C–3


Operator Encoding<br />

Variant Mode Operators<br />

0 1 2 3 4 5 6 7<br />

<br />

<br />

3 <br />

<br />

<br />

<br />

4 #ZIC #RUNI JOIN SPLT #IDLE #SINT +EEXI +DEXI <br />

<br />

<br />

<br />

5 RSQR CVS2 CV2S <br />

<br />

<br />

<br />

6 #RIRR #RREG #WREG #REMW #WEMW <br />

<br />

<br />

<br />

7 UPLD UPRD PKUD PKLD PKRD ICLD ICRD BCD <br />

<br />

<br />

<br />

8 ASRT RSNR DRNT #PAUS -OCRX NTTD NTGD <br />

<br />

<br />

<br />

9 #SCRD #LDNC #CHES #IPST <br />

<br />

<br />

<br />

A SE4C SE8C SESW SEDW #WATI RTOD <br />

<br />

<br />

<br />

B #RASD #WASD +STAG RTAG RSUP RSDN <br />

<br />

<br />

<br />

C SCAT GATH SUM SUMA DOT DOTX SEQ POLY <br />

<br />

<br />

<br />

D -USND UPUD TWFD TWTD SWFD SWTD TRNS <br />

<br />

<br />

<br />

E CPV CPVN CPVA CPVS CPVD VPV VMV VMVN <br />

<br />

<br />

<br />

F SLSD SGED SGTD SLED SEQD SNED #REXI <br />

<br />

<br />

C–4 6878 7530–007


Variant encodings 00-2F are undefined.<br />

8 9 A B C D E F<br />

<br />

<br />

3<br />

<br />

<br />

<br />

#WTOD #EXTB #WHOI 4<br />

<br />

<br />

<br />

#GASF #SASF #GASP #SASP #GSTN #SSTN #GEXT #SEXT 5<br />

<br />

<br />

<br />

#RMTR #WMTR #RDMT #RCMT 6<br />

<br />

<br />

<br />

UPLU UPRU NORX NOWR DBCD 7<br />

<br />

<br />

<br />

AMIN AMAX LOG2 LNMC LVLC NORM AVER 8<br />

<br />

<br />

<br />

#RIPS #WIPS #LDNO #BAFP 9<br />

<br />

<br />

<br />

CREL BMS SCMP SCPY RTN2 #MVST A<br />

<br />

<br />

<br />

+RPRR #SPRR #RDLK CBON +LODT SRCH #STOP B<br />

<br />

<br />

<br />

CHEK FMX FMN FMXA SUMW GLEN GINX GESZ C<br />

<br />

<br />

<br />

-USNU UPUU TWFU TWTU SWFU SWTU #HALT D<br />

<br />

<br />

<br />

VTV VOV VUV VPS VTS VPVS VSPV E<br />

<br />

<br />

<br />

SLSU SGEU SGTU SLEU SEQU SNEU NOOP NVLD F<br />

<br />

<br />

Operator Encoding<br />

6878 7530–007 C–5


Operator Encoding<br />

Edit Mode Operators<br />

All edit operator encodings except D0--DF are undefined.<br />

0 1 2 3 4 5 6 7<br />

<br />

<br />

D MINS MFLT SFSC SRSC RSTF ENDF MVNU MCHR <br />

<br />

<br />

8 9 A B C D E F<br />

<br />

<br />

INOP INSG SFDC SRDC INSU INSC ENDE #HALT D<br />

<br />

<br />

C–6 6878 7530–007


Appendix D<br />

Data Type Formats<br />

Throughout this appendix, the first and second boxes represent the extension and tag,<br />

respectively.<br />

Single Precision, numericinterpretation<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

0 ms e <br />

<br />

x mantissa <br />

<br />

0 es p <br />

<br />

<br />

<br />

0 <br />

<br />

<br />

tag 0<br />

mant_sign [46: 1] Mantissa sign (0=positive, 1=negative)<br />

exp_sign [45: 1] Exponent sign (0=positive, 1=negative)<br />

exponent [44: 6] The power of eight to which the mantissa is scaled<br />

mantissa [38:39] The magnitude of the number before scaling<br />

6878 7530–007 D–1


Data Type Formats<br />

Single Precision, ICW (Index Control Word) interpretation<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

0 <br />

<br />

ICW_width ICW_limit ICW_offset <br />

<br />

0 <br />

<br />

<br />

<br />

0 <br />

<br />

<br />

tag 0<br />

ICW_width [47:16] The number of units in an element in the sequence<br />

ICW_limit [31:16] The number of elements in the sequence<br />

ICW_offset [15:16] The offset from the base of the record to the start of the<br />

sequence<br />

D–2 6878 7530–007


Double Precision, numeric interpretation<br />

Data Type Formats<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

0 ms e <br />

1st <br />

x mantissa <br />

word <br />

1 es p <br />

<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

0 <br />

hi_ <br />

2nd mantissa <br />

exp <br />

word 1 <br />

<br />

<br />

<br />

0 <br />

<br />

<br />

1st word:<br />

tag 2<br />

mant_sign [46: 1] Mantissa sign (0=positive, 1=negative)<br />

exp_sign [45: 1] Exponent sign (0=positive, 1=negative)<br />

exponent [44: 6] The low order 6 bits of the exponent<br />

mantissa [38:39] The integral portion of the mantissa<br />

2nd word:<br />

hi_order_exp [47: 9] The high order 9 bits of the exponent<br />

mantissa [38:39] The fractional portion of the mantissa<br />

6878 7530–007 D–3


Data Type Formats<br />

Single or Double Precision, Boolean interpretation<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

x <br />

<br />

<br />

<br />

0 b <br />

<br />

<br />

tag (0: single precision,<br />

2: double precision (2nd word ignored))<br />

[0:1] Boolean value (0=false, 1=true)<br />

Actual Segment Descriptor, First Word (ASD1<br />

<br />

<br />

1 hlt <br />

<br />

<br />

<br />

0 ns <br />

<br />

address <br />

<br />

0 pp pIO <br />

<br />

<br />

<br />

0 0 <br />

<br />

<br />

D–4 6878 7530–007


tag 8<br />

Data Type Formats<br />

segment_type [47: 2] Segment’s memory type (see “Platform Memory”)<br />

present_to_proc [45: 1] Segment-is-present indicator for non-I/O access<br />

(0=absent, 1=present)<br />

[44: 1] Reserved for co-existence<br />

hlt [43: 1] Enables switch-dependent halt when executing code<br />

from this segment<br />

not_stack [42: 1] Stack indicator (0=stack, 1=not stack)<br />

present_for_IO [41: 1] Segment-is-present indicator for use as an I/O buffer<br />

(0=absent, 1=present)<br />

[40:1] Must be zero<br />

address [35:36] If present_to_proc and present_for_IO are both zero, the<br />

address field is interpreted by software; otherwise, it<br />

contains the base address of the actual segment<br />

Actual Segment Descriptor, Second Word (ASD2)<br />

<br />

<br />

1 n <br />

<br />

s y <br />

<br />

0 o b <br />

<br />

f b deficit AS_length <br />

<br />

0 t l <br />

<br />

e <br />

<br />

0 s <br />

<br />

<br />

tag 8<br />

[47: 8] Reserved for software use<br />

nybbles [39: 4] 4-bit frames in addition to net words<br />

deficit [36:16] Words less than AS_length-derived length<br />

AS_length [19:20] Actual-segment length in words<br />

6878 7530–007 D–5


Data Type Formats<br />

Untouched CSD (Code Segment Descriptor)<br />

<br />

<br />

0 0 <br />

<br />

<br />

<br />

0 0 <br />

<br />

interpreted by software <br />

<br />

1 <br />

<br />

<br />

<br />

1 <br />

<br />

<br />

Touched CSD<br />

tag 3<br />

[47: 2] Binary 00<br />

[45:46] Interpreted by software<br />

<br />

<br />

1 1 <br />

<br />

ASD <br />

<br />

1 ref <br />

<br />

ASD ASD_ref hi <br />

<br />

ref 0 lo <br />

<br />

ext <br />

<br />

0 c <br />

<br />

<br />

ASD_ref ext [ext] ASD_number ms 4 bits<br />

tag C<br />

copy [44: 1] Copy bit (0=original, 1=copy)<br />

[0 by convention]<br />

read_only [43: 1] Read-only bit (1=read-only)<br />

[42:23] Reserved for software<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

D–6 6878 7530–007


Untouched DD<br />

Data Type Formats<br />

<br />

<br />

0 0 <br />

<br />

<br />

<br />

1 0 <br />

<br />

interpreted by software <br />

<br />

0 <br />

<br />

<br />

<br />

1 <br />

<br />

<br />

tag 5<br />

[47: 2] Binary 00<br />

[45:46] Interpreted by software<br />

Unindexed (Original or Copy) DD<br />

<br />

<br />

1 ro <br />

<br />

ASD <br />

<br />

1 ref s <br />

<br />

ASD i ASD_ref hi <br />

<br />

ref pg lo z <br />

<br />

ext e <br />

<br />

0 c <br />

<br />

<br />

6878 7530–007 D–7


Data Type Formats<br />

ASD_ref ext [ext] ASD_number ms 4 bits<br />

tag (C=unpaged, E=paged)<br />

copy [44: 1] Copy bit (0=original, 1=copy)<br />

read_only [43: 1] Read-only bit (0=read/write, 1=read only)<br />

element_size [42: 3] The type of array element (0=single precision,<br />

1=double precision, 2=hex, 4=EBCDIC; 3,5,6,7 are<br />

invalid)<br />

[39:20] Reserved for software<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

IndexedWordDD (Indexed Word Data Descriptor)<br />

<br />

<br />

1 ro <br />

<br />

ASD <br />

<br />

1 ref 0 <br />

<br />

ASD index ASD_ref hi <br />

<br />

ref pg lo 0 <br />

<br />

ext <br />

<br />

1 rx d <br />

<br />

<br />

ASD_ref ext [ext] ASD_number ms 4 bits<br />

tag (D: unpaged, F: paged)<br />

reindex [44: 1] Controls indexing, Data Array, and set-element_size operators<br />

(0=disabled, 1=enabled)<br />

read_only [43: 1] Read-only bit (0=read/write, 1=read only)<br />

element_size [42: 3] The type of array element (0=single precision; 1=double<br />

precision). (2,4 denote IndexedCharDD; 3,5,6,7, are invalid)<br />

index [39:20] The word index from the base of the array to the referenced<br />

item<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

D–8 6878 7530–007


IndexedCharDD (Indexed Character Data Descriptor)<br />

Data Type Formats<br />

<br />

<br />

1 ro <br />

<br />

ASD <br />

c <br />

1 ref s <br />

h <br />

ASD i word_index ASD_ref hi <br />

a <br />

ref pg lo z <br />

r <br />

ext e <br />

<br />

1 rx <br />

<br />

<br />

ASD_ref ext [ext] ASD_number ms 4 bits<br />

tag (D: unpaged, F: paged)<br />

reindex [44: 1] Controls indexing, Data Array, and set-element_size<br />

operators (0=disabled, 1=enabled)<br />

read_only [43: 1] Read-only bit (0=read/write, 1=read only)<br />

element_size [42: 3] The type of array element (2=hex, 4=EBCDIC). (0,1<br />

denote IndexedWordDD; 3, 5, 6, 7 are invalid)<br />

char_index [39: 4] The index within the word of the referenced character<br />

word_index [35:16] The index from the base of the array to the word<br />

containing the referenced character<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

6878 7530–007 D–9


Data Type Formats<br />

Environment Link<br />

<br />

<br />

psl <br />

<br />

stack_num & stack_disp <br />

<br />

or <br />

<br />

seg_num & seg_disp <br />

num <br />

<br />

ext <br />

(see SIRW & ENVW) <br />

<br />

<br />

<br />

<br />

Normal Environment Link<br />

num ext [ext] stack_num ms 4 bits<br />

pseudolink [47:1] 0: denotes normal env_link<br />

stack_num [46:15] The stack_number identifying the stack containing the<br />

referenced location (ls 15 bits)<br />

stack_disp [31:16] The displacement from the base of the stack to the<br />

MSCW of the normal activation record<br />

Pseudo Environment Link<br />

num ext [ext] seg_num ms 4 bits<br />

pseudolink [47:1] 1: denotes pseudo env_link<br />

seg_num [46:23] The ASD_number identifying the segment containing the<br />

referenced location (ls 23 bits)<br />

[23:2] reserved<br />

seg_disp [21:6] The displacement from the base of the segment to the<br />

MSCW of the pseudo activation record<br />

D–10 6878 7530–007


Stuffed Indirect <strong>Reference</strong> Word (SIRW)<br />

Data Type Formats<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

env 0 <br />

<br />

link env_link offset <br />

<br />

ext 0 <br />

<br />

<br />

<br />

1 <br />

<br />

<br />

env_link ext [ext] Env_link ms 4 bits<br />

tag 1<br />

env_link [47:32] Designates activation record in which reference occurs (ls<br />

32 bits)<br />

offset [15:16] The offset from the base of the activation record to the<br />

referenced location<br />

SIRW with normal env_link<br />

<br />

<br />

0 0 <br />

<br />

<br />

<br />

stk 0 <br />

<br />

num stack_num stack_disp offset <br />

<br />

ext 0 <br />

<br />

<br />

<br />

1 <br />

<br />

<br />

6878 7530–007 D–11


Data Type Formats<br />

SIRW with pseudo env_link<br />

<br />

<br />

0 1 <br />

<br />

<br />

<br />

0 <br />

seg <br />

seg_num offset <br />

num <br />

0 <br />

ext seg_ <br />

disp <br />

<br />

1 <br />

<br />

<br />

HISW (History Word)<br />

<br />

his <br />

0 0 opt dx ex <br />

<br />

<br />

<br />

stk 0 pop-opt of <br />

<br />

num stack_num history_disp or fl <br />

<br />

ext 0 action tf <br />

<br />

status <br />

<br />

1 _ rs b_e<br />

<br />

<br />

stk_num ext [ext] stack_num ms 4 bits<br />

tag 1<br />

[47: 1] must be zero<br />

stack_num [46:15] number of stack containing the HISW (ls 15 bits)<br />

history_disp [31:16] displacement of prior HISW in stack<br />

history_opt [15: 1] 0: no optimization; 1: new D[LL] = new F+1<br />

[14: 1] 0: no pop optimization; 1: top n memory stack items’ dp<br />

status in HISW;<br />

[13:6] n = 5 - # consecutive 0’s below bit 14; vector of dp bits<br />

follows 1 st<br />

1 below bit 14<br />

Action interpretation of 12:5 vald if no pop optimization:<br />

D–12 6878 7530–007


action_valid [12: 1] Action_status validity<br />

action_status [11: 4] Special actions taken by exit<br />

disable_ext [ 7: 1] Disable maskable externals when exit<br />

float_status [ 6: 2] Variant rs resumption status<br />

rs [ 4: 1] restart indicator (0=initial, 1=restart mode)<br />

extf [ 3: 1] EXTF (external sign flip-flop)<br />

offf [ 2: 1] OFFF (overflow flip-flop)<br />

tfff [ 1: 1] TFFF (true false flip-flop)<br />

block_exit [ 0: 1] (0=disarmed, 1=armed)<br />

ENVW (Environment Word)<br />

Data Type Formats<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

0 <br />

env <br />

env_link <br />

link <br />

1 <br />

ext <br />

<br />

<br />

1 <br />

<br />

<br />

env_link ext [ext] Env_link ms 4 bits<br />

tag 3<br />

env_link [47:32] Identifies the immediate global activation record (if lex_level > 0)<br />

(ls 32 bits)<br />

[15:16] undefined<br />

6878 7530–007 D–13


Data Type Formats<br />

ENVW with normal env_link<br />

<br />

<br />

0 0 <br />

<br />

<br />

<br />

stk 0 <br />

<br />

num stack_num stack_disp <br />

<br />

ext 1 <br />

<br />

<br />

<br />

1 <br />

<br />

<br />

ENVW with pseudo env_link<br />

<br />

<br />

0 1 <br />

<br />

<br />

<br />

seg 0 <br />

<br />

num seg_num <br />

<br />

ext 1 seg_disp <br />

<br />

<br />

<br />

1 <br />

<br />

<br />

D–14 6878 7530–007


Tag-4 Word and Tag-6 Word<br />

Data Type Formats<br />

<br />

<br />

0 <br />

<br />

<br />

<br />

1 <br />

<br />

(may be interpreted as a bit vector) <br />

<br />

x <br />

<br />

<br />

<br />

0 <br />

<br />

<br />

Program Control Word (PCW) Skeleton<br />

<br />

<br />

cs <br />

<br />

<br />

<br />

psi 0 <br />

<br />

0 pwi sdi <br />

<br />

sdl <br />

<br />

<br />

<br />

11 <br />

<br />

<br />

[47:12] Zero<br />

skeleton_psi [35: 3] The PSI code stream pointer component<br />

skeleton_pwi [32:13] The PWI code stream pointer component<br />

skeleton_CS [19: 1] The initial value of the CS Boolean<br />

(0=normal state, 1=control state)<br />

[18: 1] Must be 0 in user programs<br />

skeleton_LL [17: 4] The lex level for the new activation record<br />

sdll [13: 1] The lambda component of an address couple designating<br />

the CSD<br />

sdi [12:13] The delta component of an address couple designating<br />

the CSD<br />

6878 7530–007 D–15


Data Type Formats<br />

Program Control Word (PCW)<br />

<br />

<br />

0 0 <br />

ASD p <br />

s <br />

ref i <br />

1 0 <br />

ASD <br />

pwi 11 ASD_ref hi <br />

ref <br />

1 lo cs <br />

ext <br />

<br />

<br />

1 0 psi 0 <br />

<br />

<br />

ASD_ref ext [ext] ASD_number ms 4 bits<br />

tag 7<br />

[44: 3] zero (for expansion: ASD_ref, pwi, or exit_opt)<br />

pwi [41:13] The PWI code stream pointer component<br />

psi [28: 3] The PSI code stream pointer component<br />

control_state [25: 1] CS Boolean (0=normal state, 1=control state)<br />

[24: 1] Must be zero<br />

lex_level [23: 4] The lex_level for the new activation record<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

D–16 6878 7530–007


Return Control Word (RCW)<br />

Data Type Formats<br />

<br />

<br />

0 0 <br />

ASD p <br />

s <br />

ref i <br />

ASD 1 0 <br />

<br />

ref pwi 11 ASD_ref hi <br />

<br />

ext 1 lo cs <br />

<br />

<br />

<br />

1 0 psi e_o <br />

<br />

<br />

ASD_ref ext [ext] ASD_number ms 4 bits<br />

Tag 7<br />

[44: 3] zero (expansion: ASD_ref, pwi, or exit-)<br />

pwi [41:13] The PWI code stream pointer component<br />

psi [28:23] The PSI code stream pointer component<br />

control_state [25: 1] CS Boolean (0=normal state, 1=control state)<br />

exit_opt [24: 1] 0: no optimization information<br />

l: same global environment<br />

lex_level [23: 4] The lex_level at which the activation record runs<br />

ASD_ref [19:23] ASD_number ls 23 bits<br />

6878 7530–007 D–17


Data Type Formats<br />

Top of Stack Control Word (TSCW)<br />

<br />

<br />

0 0 <br />

<br />

<br />

<br />

stk 0 <br />

<br />

num stack_num history_disp offset <br />

<br />

ext 1 <br />

<br />

<br />

<br />

1 <br />

<br />

<br />

stk_num ext [ext] Stack_num ms 4 bits<br />

tag 3<br />

[47: 1] Must be zero<br />

stack_num [46:15] The stack_number identifying the stack containing the<br />

TSCW<br />

history_disp [31:16] Displacement to the topmost HISW<br />

offset [15:16] Offset of top of stack from topmost HISW<br />

D–18 6878 7530–007


Absolute Store <strong>Reference</strong> Word (ASRW)<br />

Data Type Formats<br />

<br />

<br />

1 <br />

<br />

<br />

<br />

0 <br />

<br />

address <br />

<br />

1 <br />

<br />

<br />

<br />

1 <br />

<br />

<br />

Tag B<br />

[47: 4] Reserved for coexistence<br />

address [38:39] Address of memory item<br />

Soft POW<br />

<br />

<br />

1 <br />

<br />

<br />

<br />

0 0 <br />

<br />

reserved for software <br />

<br />

1 <br />

<br />

<br />

<br />

0 <br />

<br />

<br />

tag A<br />

[46: 1] 0: denotes software POW<br />

[45:47] Reserved for software<br />

6878 7530–007 D–19


Data Type Formats<br />

Hard POW<br />

<br />

<br />

1 1 <br />

<br />

<br />

<br />

0 1 <br />

<br />

reserved for system <br />

<br />

1 <br />

<br />

<br />

<br />

0 <br />

<br />

<br />

Restart POW<br />

tag A<br />

[47: 2] Binary 11: denotes hardware POW<br />

[45: 46] Reserved for system<br />

<br />

<br />

1 0 <br />

<br />

<br />

<br />

0 1 <br />

<br />

reserved for hardware <br />

<br />

1 0 <br />

<br />

<br />

<br />

0 1 <br />

<br />

<br />

tag A<br />

[47: 4] Binary 0101: denotes restart POW<br />

[43:44] Reserved for hardware<br />

D–20 6878 7530–007


Appendix E<br />

Processor Features Operators<br />

The very restricted operators in this group are not used by user programs nor by most of<br />

the released software. They fall into two types:<br />

• Those that bring data into caches to accomplish a hardware design-specific purpose<br />

• Those that access the processor state used for performance measurement<br />

LDNC <br />

The restricted operator LDNC performs a single evaluation of an IDD, ASRW, or integer<br />

reference in TOS, but the target is not left on top of the stack. It provides the ability to<br />

change cache contents without detecting target memory errors. Data addressed by<br />

LDNC, that is not initially local in the first-level cache, is placed in the second-level cache<br />

as a copy unless it is already there as an original. If there is a structural problem with a<br />

correctly typed reference (for example, absent segment or bounds violation), no interrupt<br />

is generated.<br />

<br />

Top-of-stack <br />

ref: IDD, ASRW, integer Null<br />

transformation: <br />

<br />

LDNO <br />

The restricted operator LDNO is identical to LDNC, except that it places data in the<br />

second-level cache as an original rather than a copy.<br />

<br />

Top-of-stack <br />

ref: IDD, ASRW, integer Null<br />

transformation: <br />

<br />

6878 7530–007 E–1


Processor Features Operators<br />

RMTR <br />

The restricted operator RMTR leaves on top of the stack a 48-bit vector which is the<br />

integer value of the executing processor’s Micro Timer, which counts at the processor<br />

clock rate.<br />

<br />

Top-of-stack <br />

Null sp <br />

transformation: <br />

<br />

SCRD <br />

The restricted operator SCRD requires one 7-bit integer argument, which is interpreted<br />

as an SLC register identification. The result left on top of the stack is the value of the<br />

specified register.<br />

<br />

Top-of-stack <br />

reg-id: sp(integer) sp(integer) <br />

transformation: <br />

<br />

SCRD is intended for use only in temporary system evaluation procedures using<br />

algorithms provided by hardware designers.<br />

WMTR <br />

The restricted operator WMTR requires a 48-bit vector on top of the stack. WMTR sets<br />

the executing processor’s Micro Timer to the value of the argument, treating it as a 48bit<br />

integer. The Micro Timer counts at the processor clock rate.<br />

<br />

Top-of-stack <br />

timer-value: sp Null<br />

tranformation: <br />

<br />

E–2 6878 7530–007


Appendix F<br />

Operator and Common Action<br />

<strong>Reference</strong><br />

This appendix lists each operator and common action, in alphabetical order by<br />

mnemonic. (Common actions have mnemonics beginning with lowercase "a.") Several<br />

common actions are defined here for the purpose of consolidating the interrupt<br />

information for similar operations. Refer to "Common Actions" in Section 5 for more<br />

information.<br />

If the operator is fully restricted, that fact is indicated after the operator name. The<br />

following information follows the name line:<br />

p primary operator<br />

v variant operator<br />

e edit mode operator (same encoding in table and single edit)<br />

se edit mode operator (single edit only)<br />

te edit mode operator (table edit only)<br />

• The opcode is presented in hexadecimal notation, except for NAMC and VALC,<br />

which are in binary.<br />

• Any code-stream parameters are defined following the opcode, separated by<br />

ampersands.<br />

• If there are no ODI interrupts listed for this operator, a reference to another operator,<br />

or some other indication, appears at the right.<br />

• Similar operators that generate the same interrupts are treated as a group, with one<br />

operator representing the rest of the group. Each represented operator refers to the<br />

representative, under which all the members of the group are named. Citations of<br />

the group take the form "DBUN etc." or "DBFL & DBTR" when there are only two in<br />

the group. An operator (like DBUN) "partly" represents others (like DBFL and DBTR)<br />

that can generate all the same interrupts plus more.<br />

An instance of an operator-dependent interrupt is defined as a triple: an operator<br />

generates an interrupt for a reason. The interrupts and reasons are listed in this<br />

appendix under each operator and common action. All interrupts are summarized in<br />

Appendix G; the same instance triples are shown there by listing the operators/actions<br />

and reasons under each ODI.<br />

6878 7530–007 F–1


Operator and Common Action <strong>Reference</strong><br />

A similar triple defines the relationship of a common action to its client operators: a client<br />

invokes a common action for a reason. The same triples are shown twice in this<br />

appendix: the clients and reasons are listed under each common action; the actions and<br />

reasons are listed under each operator.<br />

For both interrupt instances and common action relationships, the form and content of<br />

the "reason" varies with the context. A typical interrupt entry shows the infraction and/or<br />

the data structure involved. A typical common action entry shows the purpose of the<br />

invocation and/or the "actual parameters": a common action is conceptually a "procedure"<br />

and most operate on "formal parameters."<br />

The following notation is used in this appendix and Appendix G.<br />

> = designates directly (via an ASD_number)<br />

>> = designates indirectly (through an ASD or a display register)<br />

[...] = indexed by ... (said of descriptors and the ASD table)<br />

< > = not equal<br />

... = absolute value<br />

’ marks the update source/dest/edtab argument (internal or<br />

stack result)<br />

ActSegLen(x): actual segment length:<br />

ASD2.AS_length from ASD designated by x<br />

(default x is the object under discussion)<br />

anticipation: action performed before need<br />

exhausted: pointer designates last+1 element of virtual segment<br />

Mem[x]: the contents of the memory location at absolute address x<br />

PageTable = unpaged unindexed SingleDD defining a page table:<br />

created from paged unindexed DD<br />

or from ASD3 referenced by paged indexed DD<br />

by effectively resetting tag and element_size<br />

Stk[x] = Mem[ASD1[SNR].address+x]<br />

Unless restart mode is specified explicitly, the interrupt descriptions that follow apply to<br />

the operator in initial mode.<br />

This appendix and Appendix G define ODIs; most of these cases for unrestricted<br />

operators are detected on all ClearPath MCP systems.<br />

F–2 6878 7530–007


aACCE <br />

Operator and Common Action <strong>Reference</strong><br />

This common action enters the procedure when a PCW is encountered in a reference<br />

chain. Refer to "Procedure Entry Operators" in Section 5 for more information on aACCE.<br />

Clients:<br />

EVAL<br />

STOD & STON: SIRW >> {PCW}<br />

VALC etc.: parameter or SIRW >> {PCW}<br />

Interrupts:<br />

See aEVCH: display update<br />

See aPRCW: distribute entry PCW code-stream pointer<br />

aAPIX <br />

This common action is a procedure with two formal parameters: a DD and an index value<br />

vI to be applied to the DD. The index value is a number of elements for the described<br />

array. Some clients pass I2DDs as I1DDs in order to reindex them in units of single<br />

words. Refer to "aAPIX " in Section 5 for more information.<br />

The actual parameters for each invocation are shown as "DD by vI". For Data Array<br />

operators with an effective length of zero, vI is changed to zero and no interrupts are<br />

generated.<br />

6878 7530–007 F–3


Operator and Common Action <strong>Reference</strong><br />

Clients:<br />

aCHAR: client ICDD (as I1DD) by +1<br />

aFOP, aSOP: client I2DD (as I1DD) by +1 (to access 2nd word)<br />

BMS: current domain by -1<br />

CHEK: current vector_A by stride_A<br />

CPV etc., CPVD,<br />

CPVS, DOT, DOTX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

FMN, etc.: current vector_A by stride_A<br />

GATH: current vector_A by stride_A<br />

vector_B argument by referent(vector_I)<br />

current vector_I by +1<br />

INDX, NXLN,<br />

and NXLV: DD argument by RaI(index argument)<br />

POLY: current vector_A by stride_A<br />

current vector_B by stride_B<br />

REMW: source UDD by (source index)/2<br />

SCAT: vector_A argument by referent(vector_I)<br />

current vector_B by stride_B<br />

current vector_I by +1<br />

SEQ: current vector_A by stride_A<br />

current vector_B by stride_B<br />

SESW & SEDW<br />

SE8C & SE4C: argument pointer by 0 (after element_size change)<br />

SFDC: current dest ICDD by +max(length,0)<br />

SFSC: current source ICDD by +max(length,0)<br />

SNGT IDD argument by 0<br />

SRCH: current domain by -1<br />

SRDC: current dest ICDD by -max(length,0)<br />

SRSC: current source ICDD by -max(length,0)<br />

SUM, SUMA, SUMW: current vector_A by stride_A<br />

SWFD etc.: set by WordIndex(c)<br />

TRNS: trtab by WordIndex(c)<br />

TWFD etc.: set by WordIndex(c)<br />

TWOD: current source or dest pointer (as I1DD) by +1<br />

TWSD & TWSU: current source or dest pointer (as I1DD) by +1<br />

VMV, VMNV, VOV,<br />

VPS, VPV, VPVS,<br />

VSPV, VTS, VTV,<br />

VUV: current vector_A by stride_A<br />

current vector_B by stride_B<br />

WEMW: dest UDD by (dest index)/2<br />

XTND: IDD argument by 0<br />

Interrupts:<br />

Absent Data: client paged unindexed DD (page table)<br />

ASD3 for client paged indexed DD (page table)<br />

Bounds Error: The following conditions detected by aAPIX cause client to generate<br />

interrupt if resulting (unrepresentable) DD is used or returned:<br />

new virtual index < 0<br />

unpaged DD and new index >= 2**20<br />

unpaged CharDD and new word index >= 2**16<br />

new page index >= ActSegLen(PageTable)<br />

Structure Error: ASD3 for paged indexed DD is not unpaged indexed DD<br />

(not checked if page index already known)<br />

ASD3 > not ASD1/ASD2 (page table)<br />

paged unindexed DD > not ASD1/ASD2 (page table)<br />

PageTable[new page index]<br />

not {unpaged unindexed DD, untouched DD}<br />

Touch <strong>Reference</strong>: PageTable[new page index] is untouched DD<br />

F–4 6878 7530–007


Operator and Common Action <strong>Reference</strong><br />

For convenience, Bounds Error conditions arising from attempts to generate<br />

unrepresentable indexed DDs are shown under aAPIX. However, not every instance can<br />

occur for every client; some pass only IWDDs or ICDDs; some can only increase or only<br />

decrease the virtual index. Furthermore, errors cannot be reported unless the indexed<br />

DD is evaluated or returned, so the actual interrupt generation is the responsibility of the<br />

client. For example, non-edit array operators that index a pointer or vector in anticipation<br />

of another iteration cannot generate an interrupt unless the anticipated iteration (or<br />

pointer update) occurs.<br />

aCHAR <br />

This interrupt-consolidation common action accesses the designated word via an ICDD<br />

and advances the ICDD to designate the successor word.<br />

The clients are all the non-edit character operators and the edit operators that move data.<br />

Note that these operators all coerce IWDD pointers to ICDDs. If the effective length is<br />

zero, the aAPIX index is zero and no interrupts are generated.<br />

Clients:<br />

CEQD etc.,<br />

CREL & SCMP: access word via source1 or source2 ICDD<br />

ICUD etc.: access word via source ICDD<br />

INSU etc.: access word via dest ICDD<br />

MCHR etc.: access word via source or dest ICDD<br />

PKUD etc.: access word via source ICDD<br />

SCPY: access word via source or dest ICDD<br />

SEQD etc., SISO, SWFD etc.: access word via source ICDD<br />

TEQD etc., TRNS, TUND & TUNU,<br />

TWFD etc.: access word via source or dest ICDD<br />

UPUD etc.: access word via dest ICDD<br />

Interrupts:<br />

See aAPIX: client ICDD (as I1DD) by +1<br />

See aEIXD: evaluate current client ICDD<br />

Inv Target: client dest ICDD >> not operand<br />

client source ICDD >> not operand<br />

6878 7530–007 F–5


Operator and Common Action <strong>Reference</strong><br />

aEIRW <br />

This common action performs basic evaluation of an SIRW.<br />

Clients:<br />

aFOP: evaluate client SIRW<br />

aINTE: evaluate SIRW at F+2 or successor SIRW<br />

aSOP: evaluate client SIRW<br />

DBUN etc.: evaluate SIRW<br />

ENTR: evaluate SIRW at F+2 or successor SIRW<br />

EXTB: evaluate D[0] address couple to MEI PCW<br />

EVAL, INDX, LODT,<br />

MPWL & MPWP, NXLN,<br />

NXLV, OVRD etc., STOD<br />

& STON: evaluate SIRW<br />

Interrupts:<br />

See aEVLK: SIRW environment_link evaluation<br />

Bounds Error: displacement+offset >= ActSegLen<br />

aEIXD <br />

This interrupt-consolidation common action performs basic evaluation of an indexed DD.<br />

Clients:<br />

aCHAR: evaluate current client ICDD<br />

aFOP & aSOP: evaluate client IDD<br />

BMS: evaluate current domain<br />

LODC, LODT,<br />

MPWL & MPWP: evaluate IDD<br />

INDX & NXLN: evaluate final indexed DD<br />

OVRD etc.: evaluate IDD<br />

REMW: evaluate final indexed source DD<br />

SRCH: evaluate current domain<br />

STCD & STCN: evaluate IDD<br />

SWFD etc.: evaluate set[WordIndex(c)]<br />

TRNS: evaluate trtab[WordIndex(c)]<br />

TWFD etc.: evaluate set[WordIndex(c)]<br />

TWOD: evaluate current source or dest pointer<br />

TWSD & TWSU: evaluate current source or dest pointer<br />

WEMW: evaluate final indexed dest DD<br />

Interrupts:<br />

Absent Data: client indexed DD<br />

ASD3 for client paged index DD (page table)<br />

Bounds Error: word index >= ActSegLen<br />

(except when ultimate client can generate<br />

Source or Destination Boundary interrupt)<br />

page index >= ActSegLen(PageTable)<br />

Structure Error: client indexed DD ---> not ASD1/ASD2<br />

ASD3 for paged indexed DD is not unpaged indexed DD<br />

(not checked if page index already known)<br />

ASD3 ---> not ASD1/ASD2 (page table)<br />

PageTable[page index] not {unpaged unindexed DD,<br />

untouched DD}<br />

Touch <strong>Reference</strong>: PageTable[page index] is untouched DD<br />

F–6 6878 7530–007


aEVCH <br />

Operator and Common Action <strong>Reference</strong><br />

This common action consolidates the interrupts generated in traversing the<br />

environmental chain.<br />

Clients:<br />

aACCE, aINTE, MVST<br />

ENTR, EXIT etc.: display update<br />

Interrupts:<br />

See aEVLK: ENVW environment-link evaluation<br />

Structure Error: for each AR traversed on environmental chain:<br />

ENVW.env_link or D register >> not entered ENVW<br />

aEVLK <br />

This common action affects the basic evaluation of an Environmental Link.<br />

Clients:<br />

aEIRW: SIRW environment-link evaluation<br />

aEVCH: ENVW environment-link evaluation<br />

Interrupts:<br />

Absent Data: if pseudolink = 0:<br />

ASD1[stack_num].present_to_proc = 0<br />

if pseudolink = 1:<br />

ASD1[seg_num].present_to_proc = 0<br />

Bounds Errors: displacement >= ActSegLen<br />

Structure Error: if pseudolink = 0:<br />

stack_num > not ASD1/ASD2<br />

if pseudolink = 1:<br />

seg_num > not ASD1/ASD2<br />

aFOP <br />

This common action fetches an operand value via an SIRW, address-couple parameter,<br />

IWDD, or ICDD. Refer to "Read Evaluation Operators" in Section 5 for more information<br />

on aFOP. Validity checking of the target is performed by aFOP except when a nonoperand<br />

value must be examined by the client as a possible reference or valid target;<br />

aFOP returns any non-operand argument to the client when fetching:<br />

• For VALC etc. via address-couple parameter or SIRW<br />

• For LOAD via SIRW or I1DD or ICDD<br />

For vector operators with a zero length, aFOP does nothing.<br />

6878 7530–007 F–7


Operator and Common Action <strong>Reference</strong><br />

Clients:<br />

CHEK: fetch via current vector_A<br />

CPV etc.,<br />

CPVD, CPVS: fetch via current vector_B<br />

DOT, DOTX: fetch via current vector_A or vector_B<br />

FMN etc.: fetch via current vector_A<br />

GATH: fetch via current vector_B or vector_I<br />

LOAD: fetch via SIRW or IDD<br />

NXLV: fetch via final indexed DD<br />

POLY: fetch via current vector_A or vector_B<br />

SCAT: fetch via current vector_B or vector_I<br />

SEQ: fetch via current vector_B<br />

SUM, SUMA, SUMW: fetch via current vector_A<br />

VALC etc.: fetch via parameter or subsequent reference<br />

VMV, VMVN, VOV: fetch via current vector_A or vector_B<br />

VPS: fetch via current vector_B<br />

VPV, VPVS, VSPV: fetch via current vector_A or vector_B<br />

VTS: fetch via current vector_B<br />

VTV, VUV: fetch via current vector_A or vector_B<br />

Interrupts:<br />

See aAPIX: client I2DD (as I1DD) by +1 (to access 2nd word)<br />

See aEAC: evaluate parameter for client VALC etc.<br />

See aEIRW: evaluate client SIRW<br />

See aEIXD: evaluate client IDD<br />

Inv Target: 2nd word via SIRW or address couple not operand<br />

I1DD >> not operand (except for LOAD)<br />

I2DD >> not operand<br />

ICDD >> not operand (except for LOAD)<br />

2nd word via I2DD not operand<br />

aINTE <br />

This common action generates an interrupt, which is implemented as entry to an<br />

operating-system procedure designated by a processor-generated reference.<br />

Thereference is an SIRW whose env_link and offset fields are set according to the<br />

interrupt situation.<br />

The action can be defined as four steps:<br />

1. Invoke MKST<br />

2. Place the interrupt reference on the stack (at Mem[F+2])<br />

3. Place any parameter words on the stack<br />

4. Invoke ENTR<br />

Clients (not listed): all operations that generate interrupts<br />

Interrupts:<br />

See aEIRW: evaluate SIRW at F+2 or successor SIRW<br />

See aEVCH: display update<br />

See aPRCW: distribute entry PCW code-stream pointer<br />

Missing PCW: SIRW >> not {SIRW, PCW}<br />

F–8 6878 7530–007


aPOAV <br />

Operator and Common Action <strong>Reference</strong><br />

This common action consolidates the interrupts generated during the validation of the<br />

arguments to pointer operators. The action can be described as a procedure with two to<br />

four formal parameters, each of which names an argument to be validated. The<br />

arguments for each client operator are listed in order up the stack (TOS last). The valid<br />

type or set of types for each argument (except length) is appended to the name. For<br />

length, the upper limit is specified.<br />

The clients are all non-edit pointer operators and the enter-edit operators, which validate<br />

arguments for edit operators. The term "pointer" is interpreted only here to include<br />

unindexed copy DDs.<br />

6878 7530–007 F–9


Operator and Common Action <strong>Reference</strong><br />

Clients:<br />

CEQD etc., CREL &<br />

SCMP: validate source1:pointer, source2:{pointer,opnd},<br />

length:MaxInx<br />

EXPU: validate dest:pointer, length:MaxInx<br />

EXSD & EXSU: validate dest:pointer, source:{pointer, opnd},<br />

length:MaxInx<br />

ICUD etc.: validate source:{pointer, opnd}, length:23<br />

PKUD etc.: validate source:{pointer, opnd}, length:24<br />

SCPY: validate dest:pointer, source:{pointer, opnd},<br />

length:MaxInx, delim:sp operand<br />

SEQD etc.: validate source:{pointer, opnd},<br />

length:MaxInx, delim:sp operand<br />

SISO: validate source:{pointer,opnd},<br />

length:{if source is hex then 24 else 12)<br />

SWFD etc.: validate source:{pointer,opnd},<br />

length:MaxInx, set:I1DD<br />

TEED & TEEU: validate dest:pointer, source:{pointer, opnd},<br />

edtab: unpaged indexed DD<br />

TEQD etc.: validate dest:pointer, source:{pointer, opnd},<br />

length:MaxInx, delim:sp operand<br />

TRNS: validate dest:pointer, source:{pointer, opnd},<br />

length:MaxInx, trtab:I1DD<br />

TUND & TUNU: validate dest:pointer, source:{pointer, opnd},<br />

length:MaxInx<br />

TWFD etc.: validate dest:pointer, source:{pointer, opnd},<br />

length:MaxInx, set:I1DD<br />

TWOD: validate dest:{pointer,ASRW},<br />

source:{pointer,ASRW,opnd}<br />

length:MaxInx<br />

TWSD & TWSU: validate dest:pointer, source:{pointer, opnd},<br />

length:MaxInx<br />

UPUD etc.: validate dest:pointer, source:operand, length:MaxInv<br />

(Note: other ClearPath MCP systems detect length >24)<br />

Interrupts:<br />

Bounds Error: for client source or destination pointer<br />

(blocked by zero-length operator that deletes<br />

its arguments)<br />

IWDD.index > ActSegLen<br />

ICDD.word_index > ActSegLen<br />

ICDD.word_index = ActSegLen and .char_index > 0<br />

IWDD.index >= 2**16<br />

and client is not Transfer Words<br />

Inv Arg/Par: client length not operand or RaI(length) > limit<br />

client argument not specified type<br />

reindex disabled in client indexed DD<br />

(source, dest, set, trtab, or edtab)<br />

Structure Error: ASD3 for client paged indexed DD is not unpaged<br />

indexed DD (not checked if page index known)<br />

Uninit Arg: client argument tag in {6, 4}<br />

F–10 6878 7530–007


aPRCW <br />

Operator and Common Action <strong>Reference</strong><br />

The common action aPRCW distributes a code stream pointer from a PCW or RCW, as<br />

follows:<br />

1. PSN is set from the ASD_ref field of the PCW or RCW.<br />

2. PWI and PSI are set from the pwi and psi fields, respectively. PWI must be in the<br />

range {0 to ASD2.AS_length-1} for the ASD referenced by the new PSN value; PSI<br />

must be in the range {0 to 5}.<br />

3. If ASD1.present_to_proc is not set in the ASD designated by the new PSN value, an<br />

Absent Code interrupt is generated.<br />

Clients:<br />

aACCE, aINTE: distribute entry PCW code-stream pointer<br />

DBUN etc.: distribute branch-dest PCW code-stream pointer<br />

ENTR: distribute entry PCW code-stream pointer<br />

EXIT etc.: distribute RCW code-stream pointer<br />

EXTB: distribute MEI PCW code-stream pointer<br />

Interrupts:<br />

Absent Code: PCW or RCW<br />

Bounds Error: (PCW or RCW).pwi >= ActSegLen (only detected if code reference fails)<br />

(PCW or RCW).psi > 5<br />

Structure Error: PCW or RCW > not ASD1/ASD2<br />

aSOP <br />

This common action stores an operand value for operators that perform store evaluation<br />

of references. Refer to "Normal Store Operators" in Section 5 for more information on<br />

aSOP. aSOP accepts two formal parameters: the value to be stored and the reference.<br />

When the reference is an SIRW, the client (normal store) operator verifies that the target<br />

is a Data Word.<br />

For vector operators with a zero length, aSOP does nothing.<br />

6878 7530–007 F–11


Operator and Common Action <strong>Reference</strong><br />

Clients:<br />

CPV etc., CPVD, CPVS,<br />

GATH, SCAT, SEQ: store via current vector_A<br />

STOD & STON: store via SIRW or IDD<br />

VMV, VMVN, VOV, VPS,<br />

VPV, VPVS, VSPV,<br />

VTS, VTV, VUV: store via current vector_A<br />

Interrupts:<br />

See aAPIX: client I2DD (as I1DD) by +1 (to access 2nd word)<br />

See aEIRW: evaluate client SIRW<br />

See aEIXD: evaluate client IDD<br />

Inv Access: read_only IDD<br />

Inv Arg/Par: object is sp and reference is I2DD<br />

object is sp and SIRW >> dp opnd<br />

object is dp and reference is I1DD or ICDD<br />

object is dp and SIRW >> {sp opnd, tag-6 word,<br />

tag-4 word}<br />

Inv Target: IDD >> not Data Word (STOD & STON do not check)<br />

2nd word not Data Word (STOD & STON do not check)<br />

aVOAV <br />

This common action consolidates the interrupts generated during the validation of the<br />

arguments to vector operators. The action can be described as a procedure with four to<br />

six formal parameters, each of which names an argument to be validated. The<br />

arguments for each client operator are listed in order up the stack (TOS last). The valid<br />

type or set of types is appended to each name, except for length and stride arguments,<br />

which have fixed type.<br />

Additional type checking is defined under several vector operators to enforce<br />

consistency of precision between arguments. Many of these checks are in anticipation<br />

of the type checking in aSOP.<br />

F–12 6878 7530–007


Clients:<br />

CHEK: validate vector_A:I1DD, length, stride_A,<br />

hash:sp operand<br />

CPV etc.: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

CPVD: validate vector_A:I2DD, vector_B:IWDD,<br />

length, stride_A, stride_B<br />

CPVS: validate vector_A:I1DD, vector_B:IWDD,<br />

length, stride_A, stride_B<br />

DOT: validate vector_A:I1DD, vector_B:I1DD, length,<br />

stride_A, stride_B, sum:sp operand<br />

DOTX: validate vector_A:IWDD, vector_B:IWDD, length,<br />

stride_A, stride_B, sum:dp operand<br />

FMN etc.: validate vector_A:IWDD, length, stride_A,<br />

X:sp operand, V:operand<br />

GATH: validate vector_A:IWDD, vector_B:IWDD,<br />

length, stride_A, vector_I:I1DD<br />

POLY: validate vector_A:IWDD, vector_B:{IWDD, opnd},<br />

length, stride_A, stride_B, Z:operand<br />

SCAT: validate vector_A:IWDD, vector_B:{IWDD, opnd},<br />

length, vector_I:I1DD, stride_B<br />

SEQ: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B, Z:operand<br />

SUM & SUMA: validate vector_A:IWDD, length, stride_A,<br />

sum:operand<br />

SUMW: validate vector_A:I1DD, length, stride_A,<br />

sum:operand<br />

VMV, VMVN, VOV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

VPS: validate vector_A:IWDD, vector_B:IWDD,<br />

length, stride_A, stride_B, S:operand<br />

VPV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

VPVS: validate vector_A:IWDD, vector_B:IWDD,<br />

length, stride_A, stride_B, S:operand<br />

VSPV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B, S:operand<br />

VTS: validate vector_A:IWDD, vector_B:IWDD,<br />

length, stride_A, stride_B, S:operand<br />

VTV, VUV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

Interrupts:<br />

Operator and Common Action <strong>Reference</strong><br />

Inv Arg/Par: client length not sp integer or length > MaxInx<br />

client stride not sp integer<br />

or stride > MaxInx<br />

(client stride)*(restart count) > MaxInx<br />

(restart mode)<br />

client argument not specified type<br />

client vector IWDD reindex disabled<br />

Structure Error: ASD3 for client paged indexed DD is not unpaged<br />

indexed DD (not checked if page index known)<br />

Uninit Arg: client argument tag in {6, 4}<br />

6878 7530–007 F–13


Operator and Common Action <strong>Reference</strong><br />

ADD <br />

p 80<br />

Arith Overflow: R(x+y) = TooBig [Exponent Overflow]<br />

Inv Arg/Par: x (TOS2) not operand or y (TOS) not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

AMAX <br />

v 958A<br />

also represents AMIN<br />

Inv Arg/Par: x (TOS2) not operand or y (TOS) not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

AMIN <br />

v 9588 See AMAX<br />

ASRT <br />

v 9580 & interrupt_code:8 See AVER<br />

AVER <br />

v 958F<br />

also represents ASRT<br />

False Assertion: Boolean (TOS) is False<br />

BAFP (restricted) – (Libra 680 and 690<br />

Systems)<br />

v 959C<br />

Inv Arg/Par: TOS not IDD<br />

BCD <br />

v 9577 & N:8<br />

Int Overflow: RId(B) = TooBig<br />

Int Arg/Par: B (TOS) not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

BMS <br />

v 95A9<br />

See aAPIX: current domain by -1<br />

See aEIXD: evaluate current domain, if length > 0<br />

Inv Arg/Par: length (TOS) not operand or RaI(length) > MaxInx<br />

domain (TOS2) not I1DD<br />

domain reindex disabled<br />

Structure Error: ASD3 for paged indexed domain is not unpaged indexed<br />

DD (not checked if page index known)<br />

Uninit Arg: length or domain tag in {6, 4}<br />

F–14 6878 7530–007


BRFL <br />

Operator and Common Action <strong>Reference</strong><br />

p A0 & op_psi:3 & op_pwi:13 See BRUN<br />

BRST <br />

p 9E & Db:8 No interrupts<br />

BRTR <br />

p A1 & op_psi:3 & op_pwi:13 See BRUN<br />

BRUN <br />

p A2 & op_psi:3 & op_pwi:13<br />

also represents BRFL & BRTR<br />

Bounds Error: op_pwi >= ActSegLen(PSN)<br />

op_psi > 5<br />

BSET <br />

p 96 & Db:8 No interrupts<br />

CBON <br />

v 95BB<br />

Inv Arg/Par: TOS not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

CEQD <br />

p F4<br />

also represent CGED, CGTD, CLED,<br />

CLSD, CNED, CREL, SCMP<br />

See aCHAR: access word via source1 or source2 ICDD<br />

See aPOAV: validate source1:pointer, source2:{pointer, opnd},<br />

length:MaxInx<br />

Inv Arg/Par: source1 is EBCDIC and source2 is hex or vice versa<br />

CGED <br />

p F1 See CEQD<br />

CGTD <br />

p F2 See CEQD<br />

CHEK <br />

v 95C8<br />

See aAPIX: current vector_A by stride_A<br />

See aFOP: fetch via current vector_A<br />

See aVOAV: validate vector_A:I1DD, length, stride_A,<br />

hash:sp operand<br />

6878 7530–007 F–15


Operator and Common Action <strong>Reference</strong><br />

CHES (restricted) – (Libra 680 and 690<br />

Systems)<br />

v 9595<br />

Absent Data: PCW<br />

Bounds Error: ASD2[PCW.ASD_ref].AS_length not ASD1/ASD2<br />

ASD1[PCW.ASD_ref].address mod 2**13 >0<br />

CHSN <br />

p 8E<br />

Inv Arg/Par: TOS not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

CLED <br />

p F3 See CEQD<br />

CLSD <br />

p F0 See CEQD<br />

CNED <br />

p F5 See CEQD<br />

CPV <br />

v 95E0<br />

also represents CPVA, CPVN<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd}<br />

length, stride_A, stride_B<br />

Inv Arg/Par: vector_A is sp and vector_B is dp or vice versa<br />

CPVA <br />

v 95E2 See CPV<br />

CPVD <br />

v 95E4<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:I2DD, vector_B:IWDD,<br />

length, stride_A, stride_B<br />

F–16 6878 7530–007


CPVN <br />

Operator and Common Action <strong>Reference</strong><br />

v 95E1 See CPV<br />

CPVS <br />

v 95E3<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_B<br />

See aSOP: fetch via current vector_A<br />

See aVOAV: validate vector_A:I1DD, vector_B:IWDD,<br />

length, stride_A, stride_B<br />

Vect Arith Exc: RS(ND(B(i))) = TooBig [Exponent Overflow]<br />

RS(ND(B(i))) = TooSmall [Exponent Underflow]<br />

NS(RS(ND(B(i)))) = TooSmall [Exponent Underflow]<br />

CREL <br />

v 95A8 See CEQD<br />

CVS2 <br />

v 9554<br />

also partly represents CV2S<br />

Inv Arg/Par: x(TOS) not single integer<br />

Uninit Arg: x(TOS) tag in {6,4}<br />

CV2S <br />

v 9555<br />

Interrupts same as CVS2, plus:<br />

Inv Arg/Par: X(TOS) 47:3 > 0 or 38:7 > 0<br />

DBCD <br />

v 957F<br />

Int Overflow: RId(B) = TooBig<br />

Int Arg/Par: N (TOS) not operand or RaI(N) not {0 to 24}<br />

B (TOS2) not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

DBFL <br />

p A8 See DBUN<br />

DBRS <br />

p 9F<br />

also represents DBST<br />

Inv Arg/Par: Db (TOS) not operand or RaI(Db) not {0 to 47}<br />

Uninit Arg: Db tag in {6, 4}<br />

6878 7530–007 F–17


Operator and Common Action <strong>Reference</strong><br />

DBST <br />

p 97 See DBRS<br />

DBTR <br />

p A9 See DBUN<br />

DBUN <br />

p AA<br />

also represents DBFL & DBTR<br />

See aEIRW: evaluate SIRW<br />

See aPRCW: distribute branch-dest PCW code-stream pointer<br />

Bounds Error: (branch-dest opnd.dyn_pwi)mod 2**14 >= ActSegLen(PSN)<br />

Inv Arg/Par: branch-dest (TOS) not {operand, PCW, SIRW}<br />

(branch-dest operand) > 2**39-1<br />

Inv Target: SIRW >> not PCW<br />

Uninit Arg: branch-dest (TOS) tag in {6, 4}<br />

DEXI <br />

v 9547 No interrupts<br />

DFTR <br />

p 99<br />

Inv Arg/Par: Len (TOS) not operand or RaI(Len) not {0 to 48}<br />

Sb (TOS2) not operand or RaI(Sb) not {0 to 47}<br />

Db (TOS3) not operand or RaI(Db) not {0 to 47}<br />

Uninit Arg: Len or Sb or Db tag in {6, 4}<br />

DINS <br />

p 9D<br />

Inv Arg/Par: Len (TOS2) not operand or RaI(Len) not {0 to 48}<br />

Db (TOS3) not operand or RaI(Db) not {0 to 47}<br />

Uninit Arg: Len or Db tag in {6, 4}<br />

DISO <br />

p 9B<br />

Inv Arg/Par: Len (TOS) not operand or RaI(Len) not {0 to 48}<br />

Sb (TOS2) not operand or RaI(Sb) not {0 to 47}<br />

Uninit Arg: Len or Sb tag in {6, 4}<br />

DIVD <br />

p 83<br />

Arith Overflow: R(x/y) = TooBig [Exponent Overflow]<br />

divisor (TOS) is 0 [Divide by Zero]<br />

Arith Underflow: R(x/y) = TooSmall [Exponent Underflow]<br />

R(x/y) < > R*(x/y) [Precision Loss]<br />

N(R(x/y)) = TooSmall but R = R* < > 0 [spurious]<br />

Inv Arg/Par: x (TOS2) not operand or y (TOS) not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

F–18 6878 7530–007


DLET <br />

Operator and Common Action <strong>Reference</strong><br />

p B5 No interrupts<br />

DOT <br />

v 95C4<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aVOAV: validate vector_A:I1DD, vector_B:I1DD, length,<br />

stride_A, stride_B, sum:sp operand<br />

Vect Arith Exc: R(A(i)*B(i)) = TooBig [Exponent Overflow]<br />

R(A(i)*B(i)) = TooSmall [Exponent Underflow]<br />

R(A(i)*B(i)) < > R*(A(i)*B(i)) [Precision Loss]<br />

N(R(A(i)*B(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(sum+...) = TooBig [Exponent Overflow]<br />

DOTX <br />

v 95C5<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aVOAV: validate vector_A:IWDD, vector_B:IWDD, length,<br />

stride_A, stride_B, sum:dp operand<br />

Vect Arith Exc: R(A(i)*B(i)) = TooBig [Exponent Overflow]<br />

R(A(i)*B(i)) = TooSmall [Exponent Underflow]<br />

R(A(i)*B(i)) < > R*(A(i)*B(i)) [Precision Loss]<br />

N(R(A(i)*B(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(sum+...) = TooBig [Exponent Overflow]<br />

DRNT <br />

v 9583<br />

Inv Arg/Par: X (TOS3) or L (TOS2) or H (TOS) not operand<br />

Uninit Arg: X or L or H tag in {6, 4}<br />

DUPL <br />

p B7 No interrupts<br />

EEXI <br />

v 9546 No interrupts<br />

ENDE <br />

te DE No interrupts<br />

ENDF <br />

te D5 & MinusChar:8 & PlusChar:8 See INSU<br />

6878 7530–007 F–19


Operator and Common Action <strong>Reference</strong><br />

ENTR <br />

p AB<br />

See aEIRW: evaluate SIRW at F+2 or successor SIRW<br />

See aEVCH: display update<br />

See aPRCW: distribute entry PCW code-stream pointer<br />

Missing PCW: Stk[F+2] not {SIRW, PCW}<br />

SIRW >> not {SIRW, PCW}<br />

EQUL <br />

p 8C<br />

also represents GREQ, GRTR, LESS, LSEQ, NEQL<br />

Inv Arg/Par: TOS not operand or TOS2 not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

EVAL <br />

p AC<br />

See aACCE: SIRW >> PCW<br />

See aEIRW: evaluate SIRW<br />

Inv Arg/Par: reference (TOS) not {SIRW, IDD}<br />

Uninit Arg: TOS tag in {6, 4}<br />

EXCH <br />

p B6 No interrupts<br />

EXIT <br />

p A3<br />

also represents RETN & REXI, RTN2<br />

See aEVCH: display update<br />

See aPRCW: distribute RCW code-stream pointer<br />

Block Exit: HISW.block_exit=1<br />

Structure Error: Stk[D[LL]+1] not RCW<br />

Stk[F] not HISW<br />

Stk[Histlink+1] not {entered ENVW, inactive ENVW}<br />

EXPU <br />

p DD<br />

See aPOAV: validate dest:pointer, length:MaxInx<br />

Undefined Op: next operator is ENDE, ENDF, or INSC<br />

next operator is MCHR, MVNU, MINS, MFLT, SFSC, or SRSC<br />

(which requires source)<br />

F–20 6878 7530–007


EXSD <br />

p D2<br />

also represents EXSU<br />

See aPOAV: validate dest:pointer, source:{pointer,opnd},<br />

length:MaxInx<br />

Inv Arg/Par: source is EBCDIC and dest is hex or vice versa<br />

Undefined Op: next operator is ENDE, ENDF, or INSC<br />

EXSU <br />

Operator and Common Action <strong>Reference</strong><br />

p DA See EXSD<br />

EXTB (restricted) – (Libra 680 and 690 Systems)<br />

v 954C<br />

see aEIRW evaluate D[0] address couple to MEI PCW<br />

see aPRCW distribute MEI PCW code-stream pointer<br />

Missing PCW: D[0] address couple target not PCW<br />

FLTR <br />

p 98 & Db:8 & Sb:8 & Len:8<br />

Inv Arg/Par: Db > 47 or Sb > 47 or Len > 48<br />

FMN <br />

v 95CA<br />

also represents FMX, FMXA<br />

See aAPIX: current vector_A by stride_A<br />

See aFOP: fetch via current vector_A<br />

See aVOAV: validate vector_A:IWDD, length, stride_A,<br />

X:sp operand, V:operand<br />

Inv Arg/Par: vector_A is sp and V is dp or vice versa<br />

FMX <br />

v 95C9 See FMN<br />

FMXA <br />

v 95CB See FMN<br />

GASF (restricted)<br />

v 9558 No interrupts<br />

GASP (restricted)<br />

v 955A No interrupts<br />

6878 7530–007 F–21


Operator and Common Action <strong>Reference</strong><br />

GATH <br />

v 95C1<br />

See aAPIX: current vector_A by stride_A<br />

vector_B argument by referent(vector_I)<br />

current vector_I by +1<br />

See aFOP: fetch via current vector_B or vector_I<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:IWDD,<br />

length, stride_A, vector_I:I1DD<br />

Inv Arg/Par: vector_A is sp and vector_B is dp or vice versa<br />

Inv Target: current vector_I >> not single_integer<br />

vector_I single_integer > MaxInx<br />

GESZ <br />

v 95CF<br />

Inv Arg/Par: TOS not touched DD<br />

Uninit Arg: TOS tag in {6,4}<br />

GEXT (restricted)<br />

v 955E No interrupts<br />

GINX <br />

v 95CE<br />

Inv Arg/Par: TOS not touched DD<br />

Structure Error: ASD3 for paged indexed DD is not unpaged indexed DD<br />

(not checked if page index known)<br />

Uninit Arg: TOS tag in {6, 4}<br />

GLEN <br />

v 95CD<br />

Inv Arg/Par: TOS not touched DD<br />

Structure Error: unpaged or unindexed DD not ASD2<br />

ASD3 for paged indexed DD is not unpaged indexed DD<br />

(not checked if page index known)<br />

paged indexed DD PageTable.ASD_ref not ASD2<br />

Uninit Arg: TOS tag in {6, 4}<br />

GREQ <br />

p 89 See EQUL<br />

GRTR <br />

p 8A See EQUL<br />

GSTN (restricted)<br />

v 955C No interrupts<br />

HALT (restricted)<br />

v 95DF No interrupts<br />

F–22 6878 7530–007


ICLD <br />

Operator and Common Action <strong>Reference</strong><br />

v 9575 See ICUD<br />

ICRD <br />

v 9576 See ICUD<br />

ICUD <br />

p A4<br />

also represents ICLD, ICRD, ICVD<br />

See aCHAR: access word via source ICDD<br />

See aPOAV: validate source:{pointer,opnd}, length:23<br />

ICVD <br />

p CA See ICUD<br />

IDIV <br />

p 84<br />

also partly represents RDIV<br />

Arith Overflow: divisor (TOS) is 0 [Divide by Zero]<br />

Int Overflow: x and y are sp and x DIV y >= 2**39<br />

x or y is dp and x DIV y >= 2**78<br />

Inv Arg/Par: x (TOS2) not operand or y (TOS) not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

IDLE (restricted) – (Libra 680 and 690 Systems)<br />

v 9544 No interrupts<br />

IMKS <br />

p CF No interrupts<br />

INDX <br />

p A6<br />

The representability interrupts associated with applying index to a DD<br />

are shown under aAPIX.<br />

See aAPIX: DD argument by RaI(index argument)<br />

See aEIRW: evaluate SIRW<br />

See aEIXD: evaluate final IDD<br />

Bounds Error: RaI(index argument) > MaxInx<br />

Inv Arg/Par: not ( TOS in {CopyDD, SIRW} and<br />

TOS2 is operand<br />

or TOS is operand and<br />

TOS2 in {CopyDD, SIRW} )<br />

TOS or TOS2 is reindex-disabled IDD<br />

SIRW >> reindex-disabled IDD<br />

Inv Target: SIRW >> not {SIRW, touched DD, untouched DD}<br />

Touch <strong>Reference</strong>: SIRW >> untouched DD<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

6878 7530–007 F–23


Operator and Common Action <strong>Reference</strong><br />

INOP <br />

e D8 See INSG<br />

INSC <br />

te DD & Length:8 & ZeroChar:8 & NonZeroChar:8 See INSU<br />

INSG <br />

e D9 & MinusChar:8 & PlusChar:8<br />

also represents INOP<br />

Interrupts same as INSU, plus:<br />

Inv Arg/Par: dest is hex<br />

INSR <br />

p 9C & Db:8 & Len:8 No interrupts<br />

INSU <br />

se DC & Char:8<br />

te DC & Length:8 & Char:8<br />

also represents ENDF, INSC<br />

also partly represents INSG & INOP<br />

See aCHAR: access word via dest ICDD<br />

Dest Boundary: dest segment exhausted<br />

Inv Access: read_only destination pointer<br />

IPST (restricted) – (Libra 680 and 690 Systems)<br />

v 9596 No interrupts<br />

ISOL <br />

p 9A & Sb:8 & Len:8 No interrupts<br />

JOIN <br />

v 9542<br />

Inv Arg/Par: TOS not operand or TOS2 not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

LAND <br />

p 90 No interrupts<br />

LDNC (restricted) – (Libra 680 and 690 Systems)<br />

v 9594<br />

also represents LDNO<br />

Inv Arg/Par: ref (TOS) not {IDD, ASRW, sp integer}<br />

|sp integer| > MaxInx<br />

Uninit Arg: TOS tag in {6, 4}<br />

F–24 6878 7530–007


Operator and Common Action <strong>Reference</strong><br />

LDNO (restricted) – (Libra 680 and 690 Systems)<br />

v 959B See LDNC<br />

LEQV <br />

p 93 No interrupts<br />

LESS <br />

p 88 See EQUL<br />

LNMC <br />

v 958C & lambda:4 & delta:12 See NAMC<br />

LNOT <br />

p 92 No interrupts<br />

LOAD <br />

p BD<br />

See aFOP: fetch via SIRW or IDD<br />

Inv Arg/Par: reference (TOS) not {SIRW, IDD}<br />

Inv Target: SIRW or I1DD or ICDD >> not {SIRW, DD, Data Word}<br />

Touch Load: SIRW or I1DD or ICDD >> untouched DD<br />

Uninit Arg: TOS tag in {6, 4}<br />

LODC <br />

p FD<br />

See aEIXD: evaluate IDD<br />

Inv Arg/Par: TOS not IDD<br />

Inv Target: IDD >> not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

LODT <br />

p BC<br />

v 95BC<br />

See aEIRW: evaluate SIRW<br />

See aEIXD: evaluate IDD<br />

Bounds Error: |sp integer| not > MaxInx, but<br />

sp integer < 0 or > 2**36-1 (Libra 680 and 690 systems)<br />

sp integer < 0 or > 2**32-1 (Libra 4000 systems)<br />

Inv Arg/Par: ref (TOS) not {SIRW, IDD, ASRW, sp integer}<br />

|sp integer| > MaxInx<br />

Uninit Arg: TOS tag in {6, 4}<br />

LOG2 <br />

v 958B No interrupts<br />

6878 7530–007 F–25


Operator and Common Action <strong>Reference</strong><br />

LOR <br />

p 91 No interrupts<br />

LSEQ <br />

p 8B See EQUL<br />

LT8 <br />

p B2 & constant:8 No interrupts<br />

LT16 <br />

p B3 & constant:16 No interrupts<br />

LT48 <br />

p BE & word-aligned constant:48 No interrupts<br />

LVLC <br />

v 958D & lambda:4 & delta:12 See VALC<br />

MCHR <br />

se D7<br />

te D7 & Length:8<br />

also represents MFLT, MINS, MVNU<br />

See aCHAR: access word via source or dest ICDD<br />

Dest Boundary: dest segment exhausted<br />

Inv Access: read_only destination pointer<br />

Source Boundary: source segment exhausted<br />

MFLT <br />

se D1 & ZeroChar:8 & MinusChar:8 & PlusChar:8<br />

te D1 & Length:8 & ZeroChar:8 & MinusChar:8 & PlusChar:8 See MCHR<br />

MINS <br />

se D0 & ZeroChar:8<br />

te D0 & Length:8 & ZeroChar:8 See MCHR<br />

MKSN <br />

p DF No interrupts<br />

MKST <br />

p AE No interrupts<br />

MPCW <br />

p BF & word-aligned SkeletonPCW:48<br />

See aEAC: evaluate (sdll,sdi) from parameter<br />

Inv Target: (sdll,sdi) >> not {CSD, untouched CSD}<br />

Touch CSD: (sdll,sdi) >> untouched CSD<br />

F–26 6878 7530–007


MPWL <br />

p F6<br />

also represents MPWP<br />

See aEIRW: evaluate SIRW<br />

See aEIXD: evaluate IDD<br />

Inv Arg/Par: TOS not in {SIRW, IDD}<br />

Inv Target: SIRW or IDD >> not {CSD, untouched CSD}<br />

Touch CSD: SIRW or IDD >> untouched CSD<br />

MPWP <br />

Operator and Common Action <strong>Reference</strong><br />

p F7 See MPWL<br />

MULT <br />

p 82<br />

also represents MULX<br />

Arith Overflow: R(x*y) = TooBig [Exponent Overflow]<br />

Arith Underflow: R(x*y) = TooSmall [Exponent Underflow]<br />

R(x*y) < > R*(x*y) [Precision Loss]<br />

N(R(x*y)) = TooSmall but R = R* < > 0 [spurious]<br />

Inv Arg/Par: x (TOS2) not operand or y (TOS) not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

MULX <br />

p 8F See MULT<br />

MVNU <br />

se D6<br />

te D6 & Length:8 See MCHR<br />

MVST (restricted)<br />

v 95AF<br />

See aEVCH: display update<br />

Super Halt: stack-number > not ASD1/ASD2<br />

destination Stk[0] not TSCW<br />

NAMC <br />

p 01:2 & variable-fence address couple:14 (two syllables total)<br />

No interrupts<br />

NEQL <br />

p 8D See EQUL<br />

NMC0 <br />

p C4 & delta:16 No interrupts<br />

NMC1 <br />

p C5 & delta:16 No interrupts<br />

6878 7530–007 F–27


Operator and Common Action <strong>Reference</strong><br />

NMC2 <br />

p C6 & delta:16 No interrupts<br />

NMC3 <br />

p C7 & delta:16 No interrupts<br />

NOOP <br />

p FE<br />

v 95FE No interrupts<br />

NORM <br />

v 958E<br />

Arith Overflow: N(x) = TooSmall [Exponent Underflow]<br />

Inv Arg/Par: x (TOS) not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

NORX <br />

v 957C<br />

Inv Arg/Par: TOS not indexed DD<br />

Uninit Arg: TOS tag in {6, 4}<br />

NOWR <br />

v 957D<br />

Inv Arg/Par: TOS not touched DD<br />

Uninit Arg: TOS tag in {6, 4}<br />

NTGD <br />

v 9587<br />

Int Overflow: RId(x) = TooBig<br />

Inv Arg/Par: x (TOS) not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

NTGR <br />

p 87<br />

Int Overflow: RaI(x) = TooBig<br />

Inv Arg/Par: x (TOS) not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

NTIA <br />

p 86<br />

Int Overflow: TI(x) = TooBig<br />

Inv Arg/Par: x (TOS) not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

F–28 6878 7530–007


NTTD <br />

v 9586<br />

Int Overflow: TId(x) = TooBig<br />

Inv Arg/Par: x (TOS) not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

NVLD <br />

p FF<br />

v 95FF<br />

Invalid Operator: (unconditional)<br />

NXLN <br />

p A5<br />

See aAPIX: DD argument by RaI(index argument)<br />

See aEIRW: evaluate SIRW<br />

See aEIXD: evaluate final IDD<br />

Bounds Error: RaI(index argument) > MaxInx<br />

Inv Arg/Par: not ( TOS in {CopyDD, SIRW} and<br />

TOS2 is operand<br />

or TOS is operand and<br />

TOS2 in {CopyDD, SIRW} )<br />

TOS or TOS2 is reindex-disabled IDD<br />

SIRW >> reindex-disabled IDD<br />

Inv Target: SIRW >> not {SIRW, touchedDD, untouched DD}<br />

DD[index argument] >> not {untouched DD,<br />

unindexed DD}<br />

Touch Load: DD[index argument] >> untouched DD<br />

Touch <strong>Reference</strong>: SIRW >> untouched DD<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

NXLV <br />

p AD<br />

See aAPIX: DD argument by RaI(index argument)<br />

See aEIRW: evaluate SIRW<br />

See aFOP: fetch via final indexed DD<br />

Bounds Error: RaI(index argument) > MaxInx<br />

Inv Arg/Par: not ( TOS in {CopyDD, SIRW} and<br />

TOS2 is operand<br />

or TOS is operand and<br />

TOS2 in {CopyDD, SIRW} )<br />

TOS or TOS2 is reindex-disabled IDD<br />

SIRW >> reindex-disabled IDD<br />

Inv Target: SIRW >> not {SIRW, touchedDD, untouched DD}<br />

Touch <strong>Reference</strong>: SIRW >> untouched DD<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

Operator and Common Action <strong>Reference</strong><br />

6878 7530–007 F–29


Operator and Common Action <strong>Reference</strong><br />

OCRX <br />

v 9585<br />

Bounds Error: RaI(index argument) not {1 to ICW.ICW_limit}<br />

Inv Arg/Par: ICW (TOS) not sp opnd or index (TOS2) not opnd<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

ONE <br />

p B1 No interrupts<br />

OVRD <br />

p BA<br />

also represents LCEX, OVRN, and RDLK<br />

See aEIRW: evaluate SIRW<br />

See aEIXD: evaluate IDD<br />

Inv Access: read_only IDD<br />

Inv Arg/Par: reference (TOS) not {SIRW, IDD, ASRW}<br />

Inv Address: if address is greater than 2**32-1 (Libra 4000 systems)<br />

Uninit Arg: reference tag in {6, 4}<br />

OVRN <br />

p BB See OVRD<br />

Inv Address: if address is greater than 2**32-1 (Libra 4000 systems)<br />

PAUS (restricted) – (Libra 680 and 690 Systems)<br />

v 9584 No interrupts<br />

PKLD <br />

v 9573 See PKUD<br />

PKRD <br />

v 9574 See PKUD<br />

PKUD <br />

v 9572<br />

also represents PACD, PKLD, PKRD<br />

See aCHAR: access word via source ICDD<br />

See aPOAV: validate source:{pointer,opnd}, length:24<br />

F–30 6878 7530–007


POLY <br />

v 95C7<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B, Z:operand<br />

Operator and Common Action <strong>Reference</strong><br />

Inv Arg/Par: vector_A or vector_B is dp and Z is sp<br />

Vect Arith Exc: R(B(i)*Z) = TooBig [Exponent Overflow]<br />

R(B(i)*Z) = TooSmall [Exponent Underflow]<br />

R(B(i)*Z) < > R*(B(i)*Z) [Precision Loss]<br />

N(R(B(i)*Z)) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(A(i)+...) = TooBig [Exponent Overflow]<br />

PUSH <br />

p B4 No interrupts<br />

RASD (restricted)<br />

v 95B1<br />

also represents WASD<br />

Inv Arg/Par: specifier (TOS) not sp integer < MaxInx<br />

ASD_num (TOS2) not sp integer < MaxInx<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

RCMT (restricted) – (Libra<br />

680 and 690 Systems)<br />

v 956B No interrupts<br />

RDIV <br />

p 85<br />

Interrupts same as IDIV, plus:<br />

Arith Underflow: N(x MOD y) = TooSmall [spurious]<br />

RDLK <br />

v 95BA See OVRD<br />

RDMT (restricted) – (Libra 680 and 690<br />

Systems)<br />

v 956A No interrupts<br />

6878 7530–007 F–31


Operator and Common Action <strong>Reference</strong><br />

REMW (restricted) – (Libra 680 and 690<br />

Systems)<br />

v 9565<br />

See aAPIX: source UDD by (source index)/2<br />

See aEIXD: evaluate final indexed source DD<br />

Inv Arg/Par: source UDD not in {SIRW, DD}<br />

source index not sp integer<br />

|source sp integer| > MaxInx<br />

Uninit Arg: any argument tag in {6, 4}<br />

RETN <br />

p A7 See EXIT<br />

REXI (restricted)<br />

v 95F7 See EXIT<br />

RIPS (restricted)<br />

v 9598 No interrupts<br />

RIRR (restricted) – (Libra 680 and 690<br />

Systems)<br />

v 9560 No interrupts<br />

RMTR (restricted)<br />

v 9568 No interrupts<br />

ROFF <br />

p D7 No interrupts<br />

RPRR (restricted)<br />

v 95B8<br />

also represents RREG, WREG<br />

Inv Arg/Par: reg-id (TOS) not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

RREG (restricted) – (Libra 680 and 690 Systems)<br />

v 9561 See RPRR<br />

RSDN <br />

v 95B7 No interrupts<br />

RSNR <br />

v 9581 No interrupts<br />

F–32 6878 7530–007


RSQR <br />

v 9550<br />

Inv Arg/Par: x (TOS) not operand or x < 0<br />

Uninit Arg: TOS tag in {6, 4}<br />

RSTF <br />

Operator and Common Action <strong>Reference</strong><br />

e D4 No interrupts<br />

RSUP <br />

v 95B6 No interrupts<br />

RTAG <br />

v 95B5 No interrupts<br />

RTFF <br />

p DE No interrupts<br />

RTN2 <br />

v 95AE See EXIT<br />

RTOD <br />

v 95A7 No interrupts<br />

RUNI (restricted) – (Libra 680 and 690 Systems)<br />

v 9541 No interrupts<br />

SAME <br />

p 94 No interrupts<br />

SASF (restricted)<br />

v 9559<br />

also represents SASP, SSTN<br />

Inv Arg/Par: TOS not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

SASP (restricted)<br />

v 955B See SASF<br />

6878 7530–007 F–33


Operator and Common Action <strong>Reference</strong><br />

SCAT <br />

v 95C0<br />

See aAPIX: vector_A argument by referent(vector_I)<br />

current vector_B by stride_B<br />

current vector_I by +1<br />

See aFOP: fetch via current vector_B or vector_I<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, vector_I:I1DD, stride_B<br />

Inv Arg/Par: vector_A is sp and vector_B is dp or vice versa<br />

Inv Target: current vector_I >> not single_integer<br />

vector_I single_integer > MaxInx<br />

SCMP <br />

v 95AA See CEQD<br />

SCPY <br />

v 95AB See TEQD<br />

SCRD (restricted) – (Libra 680 and 690 Systems)<br />

v 9592 No interrupts<br />

SEDW <br />

v 95A3 See SESW<br />

SEQ <br />

v 95C6<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B, Z:operand<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

vector_A is sp and Z is dp or vice versa<br />

Vect Arith Exc: R(Z+B(i)) = TooBig [Exponent Overflow]<br />

SEQD <br />

v 95F4<br />

also represents SEQU, SGED, SGEU, SGTD, SGTU, SLED,<br />

SLEU, SLSD, SLSU, SNED, SNEU<br />

See aCHAR: access word via source ICDD<br />

See aPOAV: validate source:{pointer,opnd},<br />

length:MaxInx, delim:sp operand<br />

SEQU <br />

v 95FC See SEQD<br />

F–34 6878 7530–007


SESW <br />

v 95A2<br />

also represents SEDW<br />

Operator and Common Action <strong>Reference</strong><br />

See aAPIX: argument pointer by 0 (after element_size change)<br />

Inv Arg/Par: TOS not copyDD<br />

pointer reindex disabled<br />

Uninit Arg: TOS in tag {6, 4}<br />

SEXT (restricted)<br />

v 955F No interrupts<br />

SE4C <br />

v 95A0 See SE8C<br />

SE8C <br />

v 95A1<br />

also represents SE4C<br />

See aAPIX: argument pointer by 0 (after element_size change)<br />

Bounds Error: IWDD.index >= 2**16 (implied by aAPIX)<br />

Inv Arg/Par: TOS not copyDD<br />

pointer reindex disabled<br />

Uninit Arg: TOS tag in {6, 4}<br />

SFDC <br />

se DA<br />

te DA & Length:8<br />

See aAPIX: current dest ICDD by +max(length,0)<br />

aAPIX errors caused by new index not reported by EXSD SFDC.<br />

SFSC <br />

se D2<br />

te D2 & Length:8<br />

See aAPIX: current source ICDD by +max(length,0)<br />

aAPIX errors caused by new index not reported by EXSD SFDC.<br />

SGED <br />

v 95F1 See SEQD<br />

SGEU <br />

v 95F9 See SEQD<br />

SGTD <br />

v 95F2 See SEQD<br />

6878 7530–007 F–35


Operator and Common Action <strong>Reference</strong><br />

SGTU <br />

v 95FA See SEQD<br />

SINT – (Libra 680 and 690 Systems) (restricted)<br />

v 9545<br />

Inv Arg/Par: TOS not operand<br />

NTGR (TOS) result not 11-bit integer<br />

Uninit Arg: TOS tag in {6, 4}<br />

SISO <br />

p D5<br />

See aCHAR: access word via source ICDD<br />

See aPOAV: validate source:{pointer,opnd},<br />

length:(if source is hex then 24 else 12)<br />

SLED <br />

v 95F3 See SEQD<br />

SLEU <br />

v 95FB See SEQD<br />

SLSD <br />

v 95F0 See SEQD<br />

SLSU <br />

v 95F8 See SEQD<br />

SNED <br />

v 95F5 See SEQD<br />

SNEU <br />

v 95FD See SEQD<br />

SNGL <br />

p CD<br />

Arith Overflow: RS(ND(x)) = TooBig [Exponent Overflow]<br />

Arith Underflow: RS(ND(x)) = TooSmall [Exponent Underflow]<br />

NS(RS(ND(x))) = TooSmall [Exponent Underflow]<br />

Inv Arg/Par: x (TOS) not operand<br />

Uninit Arg: TOS in tag {6, 4}<br />

F–36 6878 7530–007


SNGT <br />

p CC<br />

See aAPIX: IDD argument by 0<br />

Operator and Common Action <strong>Reference</strong><br />

Arith Overflow: TS(ND(x)) = TooBig [Exponent Overflow]<br />

Arith Underflow: TS(ND(x)) = TooSmall [Exponent Underflow]<br />

NS(TS(ND(x))) = TooSmall [Exponent Underflow]<br />

Inv Arg/Par: x (TOS) not {operand, copyDD}<br />

IDD reindex disabled<br />

Uninit Arg: TOS in tag {6, 4}<br />

SPLT <br />

v 9543<br />

Inv Arg/Par: TOS not operand<br />

Uninit Arg: TOS in tag {6, 4}<br />

SPRR (restricted)<br />

v 95B9<br />

Inv Arg/Par: reg-val (TOS) not operand<br />

reg-id (TOS2) not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

SRCH <br />

v 95BE<br />

It is convenient to define SRCH as a variant of BMS in which the length<br />

argument is implicitly one more than the initial virtual index of the<br />

domain argument. The domain is exhausted when the length is counted to<br />

zero.<br />

See aAPIX: current domain by -1<br />

See aEIXD: evaluate current domain<br />

Inv Arg/Par: domain (TOS) not I1DD<br />

domain reindex disabled<br />

Uninit Arg: domain tag in {6, 4}<br />

SRDC <br />

se DB<br />

te DB & Length:8<br />

See aAPIX: current dest ICDD by -max(length,0)<br />

aAPIX errors caused by new index not reported by EXSD SFDC.<br />

SRSC <br />

se D3<br />

te D3 & Length:8<br />

See aAPIX: current source ICDD by -max(length,0)<br />

aAPIX errors caused by new index not reported by EXSD SFDC.<br />

6878 7530–007 F–37


Operator and Common Action <strong>Reference</strong><br />

SSTN (restricted)<br />

v 955D See SASF<br />

STAG <br />

v 95B4<br />

Inv Arg/Par: tag value (TOS) not operand<br />

Uninit Arg: TOS in tag {6, 4}<br />

STCD <br />

p F8<br />

also represents STCN<br />

See aEIXD: evaluate IDD<br />

Inv Access: read_only IDD<br />

Inv Arg/Par: not ( TOS is IDD and TOS2 is operand<br />

or TOS is sp operand and TOS2 is IDD)<br />

Inv Target: IDD >> not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

STCN <br />

p F9 See STCD<br />

STFF <br />

p AF No interrupts<br />

STOD <br />

p B8<br />

also represents STON<br />

See aACCE: SIRW >> PCW<br />

See aEIRW: evaluate SIRW<br />

See aSOP: store via SIRW or IDD<br />

Inv Arg/Par: not ( TOS in {SIRW, IDD} and TOS2 is operand<br />

or TOS is operand and TOS2 in {SIRW, IDD} )<br />

Inv Target: SIRW >> not {SIRW, IDD, PCW, untouched DD,<br />

Data Word}<br />

Touch <strong>Reference</strong>: SIRW >> untouched DD<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

STON <br />

p B9 See STOD<br />

STOP (restricted)<br />

v 95BF No interrupts<br />

F–38 6878 7530–007


SUBT <br />

p 81<br />

Operator and Common Action <strong>Reference</strong><br />

Arith Overflow: R(x-y) = TooBig [Exponent Overflow]<br />

Inv Arg/Par: x (TOS2) not operand or y (TOS) not operand<br />

Uninit Arg: TOS or TOS2 tag in {6, 4}<br />

SUM <br />

v 95C2<br />

also represents SUMA<br />

See aAPIX: current vector_A by stride_A<br />

See aFOP: fetch via current vector_A<br />

See aVOAV: validate vector_A:IWDD, length, stride_A,<br />

sum:operand<br />

Inv Arg/Par: current vector_A is dp and sum is sp<br />

Vect Arith Exc: R(sum+A(i)) = TooBig [Exponent Overflow]<br />

SUMA <br />

v 95C3 See SUM<br />

SUMW <br />

v 95CC<br />

See aAPIX: current vector_A by stride_A<br />

See aFOP: fetch via current vector_A<br />

See aVOAV: validate vector_A:I1DD, length, stride_A, SUM:operand<br />

SWFD <br />

v 95D4<br />

also represents SWFU, SWTD, SWTU<br />

See aAPIX: set by WordIndex(c)<br />

See aCHAR: access word via source ICDD<br />

See aEIXD: evaluate set[WordIndex(c)], if length > 0<br />

See aPOAV: validate source:{pointer,opnd},<br />

length:MaxInx, set:I1DD<br />

Inv Target: set[WordIndex(c)] >> not operand<br />

SWFU <br />

v 95DC See SWFD<br />

SWTD <br />

v 95D5 See SWFD<br />

SWTU <br />

v 95DD See SWFD<br />

6878 7530–007 F–39


Operator and Common Action <strong>Reference</strong><br />

SXSN <br />

p D6<br />

Inv Arg/Par: TOS not operand<br />

Uninit Arg: TOS tag in {6, 4}<br />

TEED <br />

p D0<br />

also represents TEEU<br />

See aPOAV: validate dest:pointer, source:{pointer,opnd},<br />

edtab: unpaged indexed DD<br />

Absent Data: edtab<br />

Bounds Error: edtab.ewi >= ActSegLen(table)<br />

edtab.esi > 5<br />

Inv Arg/Par: source is EBCDIC and dest is hex or vice versa<br />

Structure Error: edtab not ASD1/ASD2<br />

TEEU <br />

p D8 See TEED<br />

TEQD <br />

p E4<br />

also represents TEQU, TGED, TGEU, TGTD, TGTU, TLED,<br />

TLEU, TLSD, TLSU, TNED, TNEU, SCPY<br />

See aCHAR: access word via source or dest ICDD<br />

See aPOAV: validate dest:pointer, source:{pointer,opnd},<br />

length:MaxInx, delim:sp operand<br />

Dest Boundary: dest segment exhausted<br />

Inv Access: read_only destination pointer<br />

Inv Arg/Par: source is EBCDIC and dest is hex or vice versa<br />

Source Boundary: source element exhausted<br />

TEQU <br />

p EC See TEQD<br />

TGED <br />

p E1 See TEQD<br />

TGEU <br />

p E9 See TEQD<br />

TGTD <br />

p E2 See TEQD<br />

TGTU <br />

p EA See TEQD<br />

F–40 6878 7530–007


TLED <br />

Operator and Common Action <strong>Reference</strong><br />

p E3 See TEQD<br />

TLEU <br />

p EB See TEQD<br />

TLSD <br />

p E0 See TEQD<br />

TLSU <br />

p E8 See TEQD<br />

TNED <br />

p E5 See TEQD<br />

TNEU <br />

p ED See TEQD<br />

TRNS <br />

v 95D7<br />

See aAPIX: trtab by WordIndex(c)<br />

See aCHAR: access word via source or dest ICDD<br />

See aEIXD: evaluate trtab[WordIndex(c)], if length > 0<br />

See aPOAV: validate dest:pointer, source:{pointer,opnd},<br />

length:MaxInx, trtab:I1DD<br />

Dest Boundary: dest segment exhausted<br />

Inv Access: read_only destination pointer<br />

Inv Target: trtab[WordIndex(c)] >> not operand<br />

Source Boundary: source segment exhausted<br />

TUND <br />

p E6<br />

also represents TUNU<br />

See aCHAR: access word via source or dest ICDD<br />

See aPOAV: validate dest:pointer, source:{pointer,opnd},<br />

length:MaxInx<br />

Dest Boundary: dest segment exhausted<br />

Inv Access: read_only destination pointer<br />

Inv Arg/Par: source is EBCDIC and dest is hex or vice versa<br />

Source Boundary: source segment exhausted<br />

TUNU <br />

p EE See TUND<br />

6878 7530–007 F–41


Operator and Common Action <strong>Reference</strong><br />

TWFD <br />

v 95D2<br />

also represents TWFU, TWTD, TWTU<br />

See aAPIX: set by WordIndex(c)<br />

See aCHAR: access word via source or dest ICDD<br />

See aEIXD: evaluate set[WordIndex(c)], if length > 0<br />

See aPOAV: validate dest:pointer, source:{pointer,opnd},<br />

length:MaxInx, set:I1DD<br />

Dest Boundary: dest segment exhausted<br />

Inv Access: read_only destination pointer<br />

Inv Arg/Par: source is EBCDIC and dest is hex or vice versa<br />

Inv Target: set[WordIndex(c)] >> not operand<br />

Source Boundary: source segment exhausted<br />

TWFU <br />

v 95DA See TWFD<br />

TWOD (restricted)<br />

p D4<br />

See aAPIX: current source or dest pointer (as I1DD) by +1<br />

See aEIXD: evaluate current source or dest pointer, if length > 0<br />

See aPOAV: validate dest:{pointer,ASRW},<br />

source:{pointer,ASRW,opnd},<br />

length:MaxInx<br />

Inv Access: read_only destination pointer<br />

Inv Address: if address is greater than 2**32-1 (Libra 4000 systems)<br />

TWSD <br />

p D3<br />

also represents TWSU<br />

See aAPIX: current source or dest pointer (as I1DD) by +1<br />

See aEIXD: evaluate current source or dest pointer, if length > 0<br />

See aPOAV: validate dest:pointer, source:{pointer,opnd},<br />

length:MaxInx<br />

Dest Boundary: dest segment exhausted<br />

Inv Access: read_only destination pointer<br />

Inv Target: source pointer >> not operand<br />

Source Boundary: source segment exhausted<br />

TWSU <br />

p DB See TWSD<br />

TWTD <br />

v 95D3 See TWFD<br />

TWTU <br />

v 95DB See TWFD<br />

F–42 6878 7530–007


UPLD <br />

Operator and Common Action <strong>Reference</strong><br />

v 9570 See UPUD<br />

UPLU <br />

v 9578 See UPUD<br />

UPRD <br />

v 9571 See UPUD<br />

UPRU <br />

v 9579 See UPUD<br />

UPUD <br />

v 95D1<br />

also represents UPLD, UPLU, UPRD, UPRU, UPUU, USND, USNU<br />

See aCHAR: access word via dest ICDD<br />

See aPOAV: validate dest:pointer, source:operand, length:MaxInx<br />

Dest Boundary: dest segment exhausted<br />

Inv Access: read_only destination pointer<br />

UPUU <br />

v 95D9 See UPUD<br />

USND <br />

v 95D0 See UPUD<br />

USNU <br />

v 95D8 See UPUD<br />

VALC <br />

p 00:2 & variable-fence address couple:14 (two syllables total)<br />

also represents LVLC, VLCO, VLC1, VLC2, VLC3<br />

See aACCE: parameter or SIRW >> PCW<br />

See aFOP: fetch via parameter or subsequent reference<br />

Inv Arg/Par: restart TOS not {SIRW, IDD, operand}<br />

Inv Target: parameter or SIRW >><br />

not {SIRW, IDD, PCW, untouched DD, opnd}<br />

Touch <strong>Reference</strong>: parameter or SIRW >> untouched DD<br />

VARI <br />

p 95 No interrupts<br />

VLC0 <br />

p C0 & delta:16 See VALC<br />

6878 7530–007 F–43


Operator and Common Action <strong>Reference</strong><br />

VLC1 <br />

p C1 & delta:16 See VALC<br />

VLC2 <br />

p C2 & delta:16 See VALC<br />

VLC3 <br />

p C3 & delta:16 See VALC<br />

VMV <br />

v 95E6<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

Vect Arith Exc: R(A(i)-B(i)) = TooBig [Exponent Overflow]<br />

VMVN <br />

v 95E7<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

Vect Arith Exc: R(B(i)-A(i)) = TooBig [Exponent Overflow]<br />

VOV <br />

v 95E9<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

Vect Arith Exc: R(A(i)/B(i)) = TooBig [Exponent Overflow]<br />

R(A(i)/B(i)) = TooSmall [Exponent Underflow]<br />

R(A(i)/B(i)) < > R*(A(i)/B(i)) [Precision Loss]<br />

N(R(A(i)/B(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

B(i) is 0 [Divide by Zero]<br />

F–44 6878 7530–007


VPS <br />

v 95EB<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:IWDD,<br />

length, stride_A, stride_B, S:operand<br />

Operator and Common Action <strong>Reference</strong><br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

vector_A is sp and S is dp or vice versa<br />

Vect Arith Exc: R(B(i)+S) = TooBig [Exponent Overflow]<br />

VPV <br />

v 95E5<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

Vect Arith Exc: R(A(i)+B(i)) = TooBig [Exponent Overflow]<br />

VPVS <br />

v 95ED<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:IWDD,<br />

length, stride_A, stride_B, S:operand<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

vector_A is sp and S is dp or vice versa<br />

Vect Arith Exc: R(B(i)*S) = TooBig [Exponent Overflow]<br />

R(B(i)*S) = TooSmall [Exponent Underflow]<br />

R(B(i)*S) < > R*(B(i)*S) [Precision Loss]<br />

N(R(B(i)*S)) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(A(i)+...) = TooBig [Exponent Overflow]<br />

6878 7530–007 F–45


Operator and Common Action <strong>Reference</strong><br />

VSPV <br />

v 95EE<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd}<br />

length, stride_A, stride_B, S:operand<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

vector_A is sp and S is dp or vice versa<br />

Vect Arith Exc: R(A(i)*S) = TooBig [Exponent Overflow]<br />

R(A(i)*S) = TooSmall [Exponent Underflow]<br />

R(A(i)*S) < > R*(A(i)*S) [Precision Loss]<br />

N(R(A(i)*S)) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(...+B(i)) = TooBig [Exponent Overflow]<br />

VTS <br />

v 95EC<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:IWDD,<br />

length, stride_A, stride_B, S:operand<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

vector_A is sp and S is dp or vice versa<br />

Vect Arith Exc: R(B(i)*S) = TooBig [Exponent Overflow]<br />

R(B(i)*S) = TooSmall [Exponent Underflow]<br />

R(B(i)*S) < > R*(B(I)*S) [Precision Loss]<br />

N(R(B(i)*S)) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

VTV <br />

v 95E8<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

Vect Arith Exc: R(B(i)*A(i)) = TooBig [Exponent Overflow]<br />

R(B(i)*A(i)) = TooSmall [Exponent Underflow]<br />

R(B(i)*A(i)) < > R*(B(i)*A(i)) [Precision Loss]<br />

N(R(B(i)*A(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

F–46 6878 7530–007


VUV <br />

v 95EA<br />

See aAPIX: current vector_A by stride_A<br />

current vector_B by stride_B<br />

See aFOP: fetch via current vector_A or vector_B<br />

See aSOP: store via current vector_A<br />

See aVOAV: validate vector_A:IWDD, vector_B:{IWDD,opnd},<br />

length, stride_A, stride_B<br />

Operator and Common Action <strong>Reference</strong><br />

Inv Arg/Par: vector_A is sp and vector_B is dp<br />

Vect Arith Exc: R(B(i)/A(i)) = TooBig [Exponent Overflow]<br />

R(B(i)/A(i)) = TooSmall [Exponent Underflow]<br />

R(B(i)/A(i)) < > R*(B(i)/A(i)) [Precision Loss]<br />

N(R(B(i)/A(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

A(i) is 0 [Divide by Zero]<br />

WASD (restricted)<br />

v 95B3 See RASD<br />

WATI (restricted)<br />

v 95A4 No interrupts<br />

WEMW (restricted) – (Libra 680 and 690<br />

Systems)<br />

v 9566<br />

See aAPIX: dest UDD by (dest index)/2<br />

See aEIXD: evaluate final indexed dest DD<br />

Inv Access: read_only dest UDD<br />

Inv Arg/Par: dest UDD not in {SIRW, DD}<br />

dest index not sp integer<br />

|dest sp integer| > MaxInx<br />

Uninit Arg: any argument tag in {6, 4}<br />

WHOI (restricted)<br />

v 954E No interrupts<br />

WIPS (restricted)<br />

v 9599<br />

Undefined Op: state identifier 5:1 true (N68xx code)<br />

WMTR (restricted)<br />

v 9569<br />

Inv Arg/Par: timer value not operand<br />

WREG (restricted) – (Libra 680 and 690 Systems)<br />

v 9562 See RPRR<br />

6878 7530–007 F–47


Operator and Common Action <strong>Reference</strong><br />

WTOD (restricted)<br />

v 9549<br />

Structure Error: TOS not operand<br />

XTND <br />

p CE<br />

See aAPIX: IDD argument by 0<br />

Inv Arg/Par: TOS not {operand, copyDD}<br />

IDD reindex disabled<br />

Uninit Arg: TOS tag in {6, 4}<br />

ZERO <br />

p B0 No interrupts<br />

ZIC (restricted)<br />

v 9540 No interrupts<br />

F–48 6878 7530–007


Appendix G<br />

Interupt <strong>Reference</strong><br />

This appendix lists each interrupt in alphabetical order of the interrupt name. The<br />

condition group (CVI or OVI) is shown for each interrupt. The offset is shown for each<br />

OVI. The characterization as operator-dependent (ODI) or spontaneous (SI) is also shown.<br />

The common actions and operators that invoke each ODI are listed alphabetically along<br />

with an indication of the reason for the invocation. The same notation and conventions<br />

are used as in Appendix F.<br />

Absent Code Segment CVI 4 (04) ODI<br />

The interrupt condition is ASD1.present_to_proc = 0 in the ASD designated by the object<br />

indicated.<br />

aPRCW: PCW or RCW<br />

Absent Data Segment CVI 3 (03) ODI<br />

The interrupt condition is ASD1.present_to_proc = 0 in the ASD designated by the object<br />

indicated.<br />

aAPIX: client paged unindexed DD (page table)<br />

ASD3 for client paged indexed DD (page table)<br />

aEIXD: client indexed DD<br />

ASD3 for client paged indexed DD (page table)<br />

aEVLK: if pseudolink = 0:<br />

ASD1[stack_num].present_to_proc = 0<br />

if pseudolink = 1:<br />

ASD1[seg_num].present_to_proc = 0<br />

CHES ASD1[PCW.ASD_ref].present_to_proc = 0<br />

TEED & TEEU: edtab<br />

6878 7530–007 G–1


Interupt <strong>Reference</strong><br />

Arithmetic Overflow OVI 0 ODI<br />

The arithmetic exception condition reported to software (defined in Section 4) is named<br />

in brackets following the arithmetic situation that causes the interrupt.<br />

ADD: R(x+y) = TooBig [Exponent Overflow]<br />

DIVD: R(x/y) = TooBig [Exponent Overflow]<br />

divisor (TOS) is 0 [Divide by Zero]<br />

IDIV & RDIV: divisor (TOS) is 0 [Divide by Zero]<br />

MULT & MULX: R(x*y) = TooBig [Exponent Overflow]<br />

SNGL: RS(ND(x)) = TooBig [Exponent Overflow]<br />

SNGT: TS(ND(x)) = TooBig [Exponent Overflow]<br />

SUBT: R(x-y) = TooBig [Exponent Overflow]<br />

Arithmetic Underflow OVI 1 ODI<br />

The arithmetic exception condition reported to software (defined in Section 4) is named<br />

in brackets following the arithmetic situation that causes the interrupt. The processor<br />

generates interrupts for a subset of those situations labeled "spurious."<br />

DIVD: R(x/y) = TooSmall [Exponent Underflow]<br />

R(x/y) < > R*(x/y) [Precision Loss]<br />

N(R(x/y)) = TooSmall but R = R* < > 0 [spurious]<br />

MULT & MULX: R(x*y) = TooSmall [Exponent Underflow]<br />

R(x*y) < > R*(x*y) [Precision Loss]<br />

N(R(x*y)) = TooSmall but R = R* < > 0 [spurious]<br />

NORM: N(x) = TooSmall [Exponent Underflow]<br />

RDIV: N(x MOD y) = TooSmall [spurious]<br />

SNGL: N(x) = TooSmall [Exponent Underflow]<br />

RS(ND(x)) = TooSmall [Exponent Underflow]<br />

NS(RS(ND(x))) = TooSmall [Exponent Underflow]<br />

SNGT: N(x) = TooSmall [Exponent Underflow]<br />

TS(ND(x)) = TooSmall [Exponent Underflow]<br />

NS(TS(ND(x))) = TooSmall [Exponent Underflow]<br />

Block Exit CVI 11 (0B) ODI<br />

EXIT etc.: HISW.block_exit=1<br />

G–2 6878 7530–007


Bounds Error CVI 18 (12) ODI<br />

aAPIX: The following conditions detected by aAPIX cause<br />

client to generate interrupt if resulting<br />

(unrepresentable) DD is used or returned:<br />

new virtual index < 0<br />

unpaged DD and new index >= 2**20<br />

unpaged CharDD and new word index >= 2**16<br />

new page index >= ActSegLen(PageTable)<br />

aEIRW: displacement+offset >= ActSegLen<br />

aEIXD: word index >= ActSegLen<br />

(except when ultimate client can generate<br />

Source or Destination Boundary interrupt)<br />

page index >= ActSegLen (Page Table)<br />

aEVLK: displacement >= ActSegLen<br />

aPOAV: for client source or destination pointer<br />

(blocked by zero-length operator that deletes<br />

its arguments)<br />

IWDD.index > ActSegLen<br />

ICDD.word_index > ActSegLen<br />

ICDD.word_index = ActSegLen and .char_index > 0<br />

IWDD.index >= 2**16<br />

and client is not Transfer Words<br />

aPRCW: (PCW or RCW).pwi >= ActSegLen<br />

(PCW or RCW).psi > 5<br />

BRUN etc.: op_pwi >= ActSegLen(PSN)<br />

op_psi > 5<br />

CHES: PCW ASD2.AS_length < 2**13<br />

DBUN etc.: (branch-dest opnd.dyn_pwi)mod 2**14 >=<br />

ActSegLen(PSN)<br />

INDX,<br />

NXLN, & NXLV: RAI(index argument) > MaxInx<br />

OCRX: RaI(index argument) not {1 to ICW.ICW_limit}<br />

SE8C & SE4C: IWDD.index >= 2**16 (implied by aAPIX)<br />

TEED & TEEU: edtab.ewi >= ActSegLen(table)<br />

edtab.esi > 5<br />

TWSU: updated source or destination ICDD has word_index<br />

>= 2**16<br />

Interupt <strong>Reference</strong><br />

A Bounds Error interrupt is also generated when code execution runs off the end of the<br />

code or edit-table segment. The latter case is reported as an ODI on the enter-table-edit<br />

operator and the former case might appear as an ODI on VARI or on the first syllable of a<br />

polysyllabic primary operator, but in general the situation cannot be related to a particular<br />

operator. Note also that the error will be reported only when the code stream execution<br />

crosses the segment boundary, not for any anticipatory code fetch.<br />

Destination Boundary CVI 8 (08) ODI<br />

The Destination Boundary condition is that the destination pointer designates the last+1<br />

element of the destination sequence. For the relevent operators, this interrupt takes<br />

precedence over a Bounds Error interrupt (via aEIXD) on the destination pointer.<br />

INSU etc., MCHR etc., SCPY & TEQD etc., TRNS,<br />

TUND & TUNU, TWFD etc., TWSD & TWSU,<br />

UPUD etc.: dest segment exhausted<br />

6878 7530–007 G–3


Interupt <strong>Reference</strong><br />

Emulation Consistency Error CVI 45 (2D) SI<br />

Emulation Error - Here CVI 28 (1C) SI<br />

Emulation Error - Lost CVI 29 (1D) SI<br />

External Memory Write Error CVI 25 (19) SI<br />

False Assertion OVI 0 ODI<br />

AVER & ASRT: Boolean (TOS) is False<br />

Hardware Error - Here CVI 42 (2A) SI<br />

Hardware Error - Lost CVI 37 (25) SI<br />

Integer Overflow OVI 2 ODI<br />

BCD,DBCD: RId(B) = TooBig<br />

IDIV & RDIV: x and y are sp and x DIV y >= 2**39<br />

x or y is dp and x DIV y >= 2**78<br />

NTGD: RId(x) = TooBig<br />

NTGR: RaI(x) = TooBig<br />

NTIA: TI(x) = TooBig<br />

NTTD: TId(x) = TooBig<br />

Interval Timer CVI 44 (2C) SI<br />

Invalid Access CVI 22 (16) ODI<br />

aSOP: read_only IDD<br />

INSU etc.,<br />

MCHR etc.: read_only destination pointer<br />

OVRD etc. read_only I1DD<br />

SCPY: read_only destination pointer<br />

STCD & STCN: read_only IDD<br />

TEQD etc., TRNS, TUND & TUNU, TWFD etc., TWOD, TWSD & TWSU,<br />

UPUD etc.: read_only destination pointer<br />

WEMW: read_only destination UDD<br />

G–4 6878 7530–007


Invalid Address - Here CVI 15 (0F) SI<br />

Invalid Address - Lost CVI 32 (20) SI<br />

Invalid Argument or Parameter CVI 17 (11) ODI<br />

Interupt <strong>Reference</strong><br />

Checks on code parameters are so marked; all other checks are on stack arguments.<br />

If the criterion for an Uninitialized Argument interrupt holds, that interrupt takes<br />

precedence over this one.<br />

aPOAV: client length not operand or RaI(length) > limit<br />

client argument not specified type<br />

reindex disabled in client indexed DD<br />

(source, dest, set, trtab, or edtab)<br />

aSOP: object is sp and reference is I2DD<br />

object is sp and SIRW -->> dp opnd<br />

object is dp and reference is I1DD or ICDD<br />

object is dp and SIRW -->> {sp opnd, tag-6 word, tag-4 word}<br />

aVOAV: client length not sp integer or length > MaxInx<br />

client stride not sp integer<br />

or stride > MaxInx<br />

(client stride) * (restart count) > MaxInx<br />

client argument not specified type<br />

client vector IWDD reindex disabled<br />

ADD, AMAX & AMIN: x (TOS2) not operand or y (TOS) not operand<br />

BAFP: TOS not IDD<br />

BCD: B (TOS) not operand<br />

BMS: length (TOS) not operand or RaI(length) > MaxInx<br />

domain (TOS2) not I1DD<br />

domain reindex disabled<br />

CBON: TOS not operand<br />

CEQD etc.,<br />

CREL & SCMP: source1 is EBCDIC and source2 is hex or vice versa<br />

CHES: TOS not PCW<br />

CHSN etc.: TOS not operand<br />

CPV etc.: vector_A is sp and vector_B is dp or vice versa<br />

CVS2 & CV2S: x(TOS) not single integer<br />

DBCD: N(TOS) not operand or RaI(N) not {0 to 24}<br />

B(TOS2) not operand<br />

DBRS & DBST: Db (TOS) not operand or RaI(Db) not {0 to 47}<br />

DBUN etc.: branch-dest (TOS) not {operand, PCW, SIRW}<br />

(branch-dest operand) > 2**39-1<br />

DFTR: Len (TOS) not operand or RaI(Len) not {0 to 48}<br />

Sb (TOS2) not operand or RaI(Sb) not {0 to 47}<br />

Db (TOS3) not operand or RaI(Db) not {0 to 47}<br />

DINS: Len (TOS2) not operand or RaI(Len) not {0 to 48}<br />

Db (TOS3) not operand or RaI(Db) not {0 to 47}<br />

DISO: Len (TOS) not operand or RaI(Len) not {0 to 48}<br />

Sb (TOS2) not operand or RaI(Sb) not {0 to 47}<br />

DIVD: x (TOS2) not operand or y (TOS) not operand<br />

DRNT: X (TOS3) or L (TOS2) or H (TOS) not operand<br />

EQUL etc.: TOS not operand or TOS2 not operand<br />

EVAL: reference (TOS) not {SIRW, IDD}<br />

EXSD & EXSU: source is EBCDIC and dest is hex or vice versa<br />

FLTR: Db > 47 or Sb > 47 or Len > 48<br />

FMN etc.: vector_A is sp and V is dp or vice versa<br />

GATH: vector_A is sp and vector_B is dp or vice versa<br />

GESZ, GINX, & GLEN: TOS not touched DD<br />

6878 7530–007 G–5


Interupt <strong>Reference</strong><br />

IDIV & RDIV: x (TOS2) not operand or y (TOS) not operand<br />

INDX: not ( TOS in {copy DD, SIRW} and<br />

TOS2 is operand<br />

or TOS is operand and<br />

TOS2 in {copy DD, SIRW} )<br />

TOS or TOS2 is reindex-disabled IDD<br />

SIRW >> reindex-disabled IDD<br />

INSG & INOP: dest is hex<br />

JOIN: TOS is not operand or TOS2 not operand<br />

LDNC & LNDO: reference (TOS) not {IDD, ASRW, sp integer}<br />

|sp integer| > MaxInx<br />

LOAD: reference (TOS) not {SIRW, IDD}<br />

LODC: TOS not IDD<br />

LODT: reference (TOS) not {SIRW, IDD, ASRW, sp integer}<br />

|sp integer| > MaxInx<br />

MPWL & MPWP: reference (TOS) not {IRW, IDD}<br />

MULT & MULX: x (TOS2) not operand or y (TOS) not operand<br />

NORM: x (TOS) not operand<br />

NORX: TOS not indexed DD<br />

NOWR: TOS not touched DD<br />

NTGD,<br />

NTGR, NTIA, NTTD: x (TOS) not operand<br />

NXLN & NXLV: not ( TOS in {copy DD, SIRW} and<br />

TOS2 is operand<br />

or TOS is operand and<br />

TOS2 in {copy DD, SIRW} )<br />

TOS or TOS2 is reindex-disabled IDD<br />

SIRW >> reindex-disabled IDD<br />

OCRX: ICW (TOS) not sp opnd or index (TOS2) not opnd<br />

OVRD etc.: reference (TOS) not {SIRW, IDD, ASRW}<br />

POLY: vector_A or vector_B is dp and Z is sp<br />

RASD etc.: specifier (TOS) not sp integer < MaxInx<br />

ASD_num (TOS2) not sp integer < MaxInx<br />

REMW: source UDD not in {SIRW, DD}<br />

source index not sp integer<br />

|source sp integer| > MaxInx<br />

RPRR etc.: reg-id (TOS) not operand<br />

RSQR: x (TOS) not operand or x < 0<br />

SASF etc.: TOS not operand<br />

SCAT: vector_A is sp and vector_B is dp or vice versa<br />

SCPY: source is EBCDIC and dest is hex or vice versa<br />

SEQ: vector_A is sp and vector_B is dp<br />

vector_A is sp and Z is dp or vice versa<br />

SESW & SEDW: TOS not copy DD<br />

pointer reindex disabled<br />

SE8C & SE4C: TOS not copy DD<br />

pointer reindex disabled<br />

SINT: TOS not operand<br />

NTGR (TOS) result not 11-bit integer<br />

SNGL: x (TOS) not operand<br />

SNGT: x (TOS) not {operand, copy DD}<br />

IWDD reindex disabled<br />

SPLT: TOS not operand<br />

SPRR: reg-val (TOS) not operand<br />

reg-id (TOS2) not operand<br />

SRCH: domain (TOS) not I1DD<br />

domain reindex disabled<br />

STAG: tag value (TOS) not operand<br />

STCD & STCN: not ( TOS is IDD and TOS2 is sp operand<br />

or TOS is sp operand and TOS2 is IDD )<br />

STOD & STON: not ( TOS in {SIRW, IDD} and TOS2 is operand<br />

G–6 6878 7530–007


or TOS is operand and TOS2 in {SIRW, IDD} )<br />

SUBT: x (TOS2) not operand or y (TOS) not operand<br />

SUM & SUMA: vector_A is sp and sum is dp<br />

SXSN: TOS not operand<br />

TEED & TEEU: source is EBCDIC and dest is hex or vice versa<br />

TEQD etc., TUND & TUNU,<br />

TWFD etc.: source is EBCDIC and dest is hex or vice versa<br />

VALC etc.: restart TOS not {SIRW, IWDD, operand}<br />

VMV, VMVN, VOV: vector_A is sp and vector_B is dp<br />

VPS: vector_A is sp and vector_B is dp<br />

vector_A is sp and S is dp or vice versa<br />

VPV: vector_A is sp and vector_B is dp<br />

VPVS, VSPV, VTS: vector_A is sp and vector_B is dp<br />

vector_A is sp and S is dp or vice versa<br />

VTV, VUV: vector_A is sp and vector_B is dp<br />

WEMW: dest index not in {SIRW, DD}<br />

dest index not sp integer<br />

|dest sp integer| > MaxInx<br />

WMTR: timer value (TOS) not operand<br />

WTOD: TOS is not 36-bit integer<br />

XTND: TOS not {operand, copy DD}<br />

IDD reindex disabled<br />

Invalid Code Word CVI 35 (23) SI<br />

Invalid Operator CVI 21 (15) ODI<br />

NVLD: (unconditional)<br />

Interupt <strong>Reference</strong><br />

6878 7530–007 G–7


Interupt <strong>Reference</strong><br />

Invalid Target CVI 14 (OE) ODI<br />

aCHAR: client dest ICDD >> not operand<br />

client source ICDD >> not operand<br />

aFOP: 2nd word via SIRW or address couple<br />

not operand<br />

I1DD >> not operand (except for LOAD)<br />

I2DD >> not operand<br />

ICDD >> not operand (except for LOAD)<br />

2nd word via I2DD not operand<br />

aSOP: IWDD >> not Data Word (not checked for STOD & STON)<br />

2nd word not Data Word (not checked for STOD & STON)<br />

DBUN etc.: SIRW >> not PCW<br />

GATH: current vector_I >> not single_integer<br />

vector_I single_integer > MaxInx<br />

INDX: SIRW >> not {SIRW, touched DD, untouched DD}<br />

LOAD: SIRW or ICDD >> not {SIRW, DD, Data Word}<br />

LODC: IDD >> not operand<br />

MPCW: (sdll,sdi) >> not {CSD, untouched CSD}<br />

MPWL & MPWP: SIRW or IDD >> not {CSD, untouched CSD}<br />

NXLN: SIRW >> not {SIRW, touched DD, untouched DD}<br />

DD[index argument] >> not {untouched DD, unindexed DD}<br />

NXLV: SIRW >> not {SIRW, touched DD, untouched DD}<br />

SCAT: current vector_I >> not single_integer<br />

vector_I single_integer > MaxInx<br />

STCD & STCN: IDD >> not operand<br />

STOD & STON: SIRW >> not {SIRW, IWDD, PCW, untouched DD, Data Word}<br />

SWFD etc.: set [WordIndex(c)] >> not operand<br />

TRNS: trtab[WordIndex(c)] >> not operand<br />

TWFD etc.: set[WordIndex(c)] >> not operand<br />

TWSD & TWSU: source pointer >> not operand<br />

VALC etc.: address couple or SIRW >> not {SIRW, IDD, PCW, untouched DD, opnd}<br />

Loop Timer - Here CVI 41 (29) SI<br />

Loop Timer - Lost CVI 36 (24) SI<br />

Memory Data Error - Here CVI 30 (1E) SI<br />

Memory Data Error - Lost CVI 16 (10) SI<br />

Missing PCW CVI 2 (02) ODI<br />

aINTE: SIRW >> not {SIRW, PCW}<br />

ENTR: Stk[F+1] not {SIRW, PCW}<br />

SIRW >> not {SIRW, PCW}<br />

EXTB: D[0] address couple target not PCW<br />

G–8 6878 7530–007


Non-maskable External CVI 27 (1B) SI<br />

Running Timeout CVI 40 (28) SI<br />

SLC Interface Error - Here CVI 31 (1F) SI<br />

SLC Interface Error - Lost CVI 39 (27) SI<br />

Source Boundary CVI 9 (09) ODI<br />

Interupt <strong>Reference</strong><br />

The Source Boundary condition is that the source pointer designates the last+1 element<br />

of the source sequence for a pointer operator that transfers data from a source to a<br />

destination. For the relevant operators, this interrupt takes precedence over a Bounds<br />

Error interrupt (via aEIXD) on the source pointer.<br />

MCHR etc.,<br />

SCPY,<br />

TEQD etc.,<br />

TRNS,<br />

TUND & TUNU,<br />

TWFD etc.,<br />

TWSD & TWSU: source segment exhausted<br />

Stack Overflow CVI 33 (21) SI<br />

Stack Overflow, while caused by operator action, is defined as a spontaneous interrupt.<br />

Any operator that produces more words of stack output than it consumes as stack<br />

arguments increases the size of the expression stack. The actual interrupt generation<br />

may occur because of an operator like PUSH or ENTR that has no net effect on the size<br />

of the stack, but forces expression- stack values to migrate from processor registers to<br />

the stack in memory.<br />

Stack Underflow CVI 34 (22) SI<br />

Stack Underflow interrupts can be generated by or on behalf of any operator that<br />

consumes one or more arguments from the top of the stack. These situations are not<br />

listed as operator-dependent interrupts; they are considered spontaneous interrupts<br />

generated by the stack-adjust mechanism.<br />

6878 7530–007 G–9


Interupt <strong>Reference</strong><br />

Structure Error CVI 20 (14) ODI<br />

aAPIX: ASD3 for paged indexed DD is not unpaged indexedDD<br />

(not checked if page index known)<br />

ASD3 > not ASD1/ASD2 (page table)<br />

paged unindexed DD > not ASD1/ASD2 (page table)<br />

PageTable[new page index]<br />

not {unpaged unindexed DD, untouched DD}<br />

aEIXD: client indexed DD > not ASD1/ASD2<br />

ASD3 for paged indexed DD is not unpaged indexedDD<br />

(not checked if page index known)<br />

ASD3 > not ASD1/ASD2 (page table)<br />

PageTable[page index] not {unpaged unindexed DD,<br />

untouched DD}<br />

aEVCH: for each AR traversed on environmental chain:<br />

MSCW.env_link or D register >> not entered MSCW<br />

aEVLK: if pseudolink = 0:<br />

stack_num > not ASD1/ASD2<br />

if pseudolink = 1:<br />

seg_num > not ASD1/ASD2<br />

aPOAV: ASD3 for client paged indexed DD is not unpaged<br />

indexed DD (not checked if page index known)<br />

aPRCW: PCW or RCW > not ASD1/ASD2<br />

aVOAV: ASD3 for client paged indexed DD is not unpaged<br />

indexed DD (not checked if page index known)<br />

CHES: PCW > not ASD1/ASD2<br />

ASD1[PCW.ASD_ref].address mod 2**13 > 0<br />

EXIT etc.: Stk[D{LL}+1] not RCW<br />

Stk[F] not HISW<br />

Stk[Hist-Link + 1] not {entered ENVW, inactive ENVN}<br />

GINX: ASD3 for paged indexed DD is not unpaged indexedDD<br />

(not checked if page index known)<br />

GLEN: unpaged or unindexed DD > not ASD2<br />

ASD3 for paged indexed DD is not unpaged indexedDD<br />

(not checked if page index known)<br />

paged indexed DD PageTable.ASD_ref > not ASD2<br />

MVST: Stack_number > not ASD1/ASD2<br />

destination Stk[0] not TSCW<br />

TEED & TEEU: edtab > not ASD1/ASD2<br />

A Structure Error is also generated during reference evaluation when:<br />

ASD1.address MOD 2**36 + offset > 2**36- 1<br />

Touch CSD CVI 1 (01) ODI<br />

MPCW: (sdll,sdi) >> untouched CSD<br />

MPWL & MPWP: SIRW or IDD >> untouched CSD<br />

Touch Load CVI 6 (06) ODI<br />

LOAD: SIRW or I1DD or ICDD >> untouched DD<br />

NXLN: DD[index argument] >> untouched DD<br />

Touch <strong>Reference</strong> CVI 5 (05) ODI<br />

aAPIX: PageTable[new page index] is untouched DD<br />

aEIXD: PageTable[page index] is untouched DD<br />

INDX, NXLN,<br />

NXLV,STOD & STON: SIRW >> untouched DD<br />

VALC etc.: parameter or SIRW >> untouched DD<br />

G–10 6878 7530–007


Undefined Operator CVI 23 (17) ODI<br />

Interupt <strong>Reference</strong><br />

This interrupt is generated for any opcode that is not defined in the current context.<br />

It is also generated in the following circumstances:<br />

EXPU: next operator is ENDE, ENDF, or INSC<br />

next operator is MCHR, MVNU, MINS, MFLT,<br />

SFSC, or SRSC (which requires source)<br />

EXSD & EXSU: next operator is ENDE, ENDF, or INSC<br />

WIPS: state identifier 5:1 true (NX68xx code)<br />

Unimplemented Operator OVI 3 ODI<br />

Unused by the Libra 680, 690, and 4000 systems processor<br />

6878 7530–007 G–11


Interupt <strong>Reference</strong><br />

Uninitialized Argument CVI 24 (18) ODI<br />

aPOAV, aVOAV: client argument tag in {6,4}<br />

ADD, AMAX & AMIN: TOS or TOS2 tag in {6,4}<br />

BAFP: TOS tag in {6,4}<br />

BCD: TOS tag in {6,4}<br />

BMS: length or domain tag in {6,4}<br />

CBON: TOS tag in {6,4}<br />

CHSN: TOS tag in {6,4}<br />

CVS2 & CV2S: x(TOS) tag in {6, 4}<br />

DBCD: TOS or TOS2 tag in {6,4}<br />

DBRS & DBST: Db tag in {6,4}<br />

DBUN etc.: branch-dest (TOS) tag in {6,4}<br />

DFTR: Len or Sb or Db tag in {6,4}<br />

DINS: Len or Db tag in {6,4}<br />

DISO: Len or Sb tag in {6,4}<br />

DIVD: TOS or TOS2 tag in {6,4}<br />

DRNT: X or L or H tag in {6,4}<br />

EQUL etc.: TOS or TOS2 tag in {6,4}<br />

EVAL, GESZ,<br />

GINX, GLEN: TOS tag in {6,4}<br />

IDIV & RDIV,<br />

INDX, JOIN: TOS or TOS2 tag in {6,4}<br />

LDNC, LDNO,<br />

LOAD, LODC, LODT,<br />

MPWL & MPWP: TOS tag in {6,4}<br />

MULT & MULX: TOS or TOS2 tag in {6,4}<br />

NORM, NORX,<br />

NOWR, NTGD,<br />

NTGR, NTIA, NTTD: TOS tag in {6,4}<br />

NXLN,<br />

NXLV, OCRX: TOS or TOS2 tag in {6,4}<br />

OVRD etc.: reference tag in {6,4}<br />

RASD etc.: TOS or TOS2 tag in {6,4}<br />

REMW: any argument tag in {6,4}<br />

RPRR: TOS tag in {6,4}<br />

RSQR, SESW & SEDW,<br />

SE8C & SE4C: TOS tag in {6,4}<br />

SASF etc: TOS tag in {6,4}<br />

SINT: TOS tag in {6,4}<br />

SNGL, SNGT, SPLT: TOS tag in {6,4}<br />

SPRR: TOS or TOS2 tag in {6,4}<br />

SRCH: domain tag in {6,4}<br />

STCD & STCN,<br />

STOD & STON, SUBT: TOS or TOS2 tag in {6,4}<br />

SXSN: TOS tag in {6,4}<br />

WEMW: any argument tag in {6,4}<br />

WTOD: TOS or TOS2 tag in {6,4}<br />

XTND: TOS tag in {6,4}<br />

G–12 6878 7530–007


Vector Arithmetic Exception OVI 2 ODI<br />

Interupt <strong>Reference</strong><br />

The following operators generate the interrupt because of arithmetic exceptions, as<br />

noted. Only a subset of those cases labeled "spurious" generate the interrupt.<br />

CPVS: RS(ND(B(i))) = TooBig [Exponent Overflow]<br />

RS(ND(B(i))) = TooSmall [Exponent Underflow]<br />

NS(RS(ND(B(i)))) = TooSmall [Exponent Underflow]<br />

DOT, DOTX: R(A(i)*B(i)) = TooBig [Exponent Overflow]<br />

R(A(i)*B(i)) = TooSmall [Exponent Underflow]<br />

R(A(i)*B(i)) < > R*(A(i)*B(i)) [Precision Loss]<br />

N(R(A(i)*B(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(sum+...) = TooBig [Exponent Overflow]<br />

POLY: R(B(i)*Z) = TooBig [Exponent Overflow]<br />

R(B(i)*Z) = TooSmall [Exponent Underflow]<br />

R(B(i)*Z) < > R*(B(i)*Z) [Precision Loss]<br />

N(R(B(i)*Z)) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(A(i)+...) = TooBig [Exponent Overflow]<br />

SEQ: R(Z + B(i)) = TooBig [Exponent Overflow]<br />

SUM & SUMA: R(sum + A(i)) = TooBig [Exponent Overflow]<br />

VMV: R(A(i)-B(i)) = TooBig [Exponent Overflow]<br />

VMVN: R(B(i)-A(i)) = TooBig [Exponent Overflow]<br />

VOV: R(A(i)/B(i)) = TooBig [Exponent Overflow]<br />

R(A(i)/B(i)) = TooSmall [Exponent Underflow]<br />

R(A(i)/B(i)) < > R*(A(i)/B(i)) [Precision Loss]<br />

N(R(A(i)/B(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

B(i) is 0 [Divide by Zero]<br />

VPS: R(B(i)+S) = TooBig [Exponent Overflow]<br />

VPV: R(A(i)+B(i)) = TooBig [Exponent Overflow]<br />

VPVS: R(B(i)*S) = TooBig [Exponent Overflow]<br />

R(B(i)*S) = TooSmall [Exponent Underflow]<br />

R(B(i)*S) < > R*(B(i)*S) [Precision Loss]<br />

N(R(B(i)*S)) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(A(i)+...) = TooBig [Exponent Overflow]<br />

VSPV: R(A(i)*S) = TooBig [Exponent Overflow]<br />

R(A(i)*S) = TooSmall [Exponent Underflow]<br />

R(A(i)*S) < > R*(A(i)*S) [Precision Loss]<br />

N(R(A(i)*S)) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

R(...+B(i)) = TooBig [Exponent Overflow]<br />

VTS: R(B(i)*S) = TooBig [Exponent Overflow]<br />

R(B(i)*S) = TooSmall [Exponent Underflow]<br />

R(B(i)*S) < > R*(B(i)*S) [Precision Loss]<br />

N(R(B(i)*S)) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

VTV: R(A(i)*B(i)) = TooBig [Exponent Overflow]<br />

R(A(i)*B(i)) = TooSmall [Exponent Underflow]<br />

R(A(i)*B(i)) < > R*(A(i)*B(i)) [Precision Loss]<br />

N(R(A(i)*B(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

VUV: R(B(i)/A(i)) = TooBig [Exponent Overflow]<br />

R(B(i)/A(i)) = TooSmall [Exponent Underflow]<br />

R(B(i)/A(i)) < > R*(B(i)/A(i)) [Precision Loss]<br />

N(R(B(i)/A(i))) = TooSmall<br />

but R = R* < > 0 [spurious]<br />

A(i) is 0 [Divide by Zero]<br />

6878 7530–007 G–13


Interupt <strong>Reference</strong><br />

G–14 6878 7530–007


Index<br />

A<br />

aACCE , 5-70, F-3<br />

aAPIX , 5-45,<br />

F-3<br />

absent code segment, 4-10, G-1<br />

absent data segment, 4-10, G-1<br />

absent segment, 4-10<br />

Absolute Store <strong>Reference</strong> Word (ASRW), 2-6,<br />

3-7<br />

access checking, 5-42<br />

access control, 2-8<br />

accessing segments, 2-7<br />

aCHAR , F-5<br />

activation records<br />

description, 2-3<br />

Actual Segment Descriptors (ASDs), 2-2<br />

actual segments, description, 2-2<br />

ADD , 5-20, A-1, F-14<br />

address couple evaluation, 5-42<br />

address couples, 2-3, 3-12<br />

CSD, 3-12<br />

fixed fence, 3-12<br />

variable fence, 3-12<br />

addressing, 2-1, 2-9<br />

current environment, 2-5<br />

environment, 2-9<br />

aEIRW , F-6<br />

aEIXD , F-6<br />

aEVCH , F-7<br />

aEVLK , F-7<br />

aFOP , 5-52, F-7<br />

aINTE , 4-1, F-8<br />

alarm interrupts, 4-22<br />

hardware error, 4-22<br />

invalid address, 4-24<br />

memory data error, 4-25<br />

alphabetical operator code list, A-1<br />

AMAX , 5-23, A-1,<br />

F-14<br />

AMIN , 5-23, A-1, F-14<br />

APIC, 6-15<br />

aPOAV , F-9<br />

approximation functions, 5-18<br />

aPRCW , F-11<br />

argument<br />

description, 5-1<br />

argument value checks, 4-17<br />

arithmetic exceptions, 5-10<br />

arithmetic interrupts, 4-7<br />

arithmetic overflow, 4-7<br />

arithmetic underflow, 4-8<br />

exception conditions, 4-7<br />

integer overflow, 4-9<br />

spurious interrupts, 4-7<br />

arithmetic operators, 5-19<br />

ADD, 5-20<br />

AMAX, 5-23<br />

AMIN, 5-23<br />

DIVD, 5-21<br />

IDIV, 5-21<br />

MULT, 5-20<br />

MULX, 5-21<br />

NORM, 5-22<br />

RDIV, 5-22<br />

SUBT, 5-20<br />

arithmetic overflow, 4-7, G-2<br />

divide by zero, 4-7<br />

exponent overflow, 4-7<br />

arithmetic underflow, 4-8, G-2<br />

precision loss, 4-8<br />

ASD<br />

description, 3-5<br />

structure errors, 4-20<br />

ASD memory, 2-12<br />

ASD Segment Types, 6-12<br />

ASD table, 2-12<br />

ASD1, 3-5<br />

ASD2, 3-5<br />

ASDs, 2-2<br />

ASD table, 2-12<br />

fields, 3-6<br />

memory, 2-12<br />

aSOP , 5-59, F-11<br />

ASRT , 5-73, A-1, F-14<br />

ASRW, 2-6, 3-7<br />

6878 7530–007 Index–1


Index<br />

assertion operators, 5-73<br />

ASRT, 5-73<br />

AVER, 5-73<br />

asynchronous interrupts, 4-26<br />

automatic page switching, 3-10<br />

AVER , 5-73, A-1, F-14<br />

aVOAV , F-12<br />

B<br />

BAFP , 6-27,<br />

F-14<br />

BCD , 5-27, A-1,<br />

F-14<br />

binary-to-decimal conversion operators, 5-27<br />

BCD, 5-27<br />

DBCD, 5-27<br />

binding-request token, 2-2<br />

bit vector interpretation, 5-29<br />

bit vector type transfer operators, 5-32<br />

evaluate word structure operators, 5-34<br />

literal operators, 5-31<br />

logical operators, 5-29<br />

word manipulation operators, 5-35<br />

bit vector type transfer operators, 5-32<br />

JOIN, 5-33<br />

SPLT, 5-32, 5-34<br />

STAG, 5-32<br />

XTND, 5-32<br />

bit-vector type-transfer operators<br />

JOIN, 5-32<br />

block exit, 4-11, G-2<br />

BMS , 5-79, A-1, F-14<br />

Boolean accumulators, 2-12<br />

Boolean Accumulators, B-1<br />

Boolean operands, 3-2<br />

bounds error, 4-14, G-3<br />

branching operators, 5-65<br />

BRFL, 5-66<br />

BRTR, 5-66<br />

BRUN, 5-66<br />

DBFL, 5-67<br />

DBUN, 5-67<br />

dynamic branches, 5-66<br />

static branches, 5-65<br />

BRFL , 5-66, A-1, F-15<br />

BRST , 5-36, A-1, F-15<br />

BRTR , 5-66, A-1, F-15<br />

BRUN , 5-66, A-2,<br />

F-15<br />

BSET , 5-36, A-2, F-15<br />

Byte Memory, 6-11<br />

Index–2 6878 7530–007<br />

C<br />

calling sequences, 4-2<br />

CBON , 5-34, A-2, F-15<br />

CEQD , 5-89, A-2, F-15<br />

CGED , 5-89, A-2, F-15<br />

CGTD , 5-89, A-2, F-15<br />

char_index, 3-8<br />

character descriptor, 3-8<br />

character insert operators, 5-105<br />

ENDF, 5-106<br />

INOP, 5-105<br />

INSC, 5-105<br />

INSG, 5-106<br />

INSU, 5-105<br />

MCHR, 5-106<br />

MFLT, 5-107<br />

MINS, 5-107<br />

MVNU, 5-107<br />

character move operators, 5-106<br />

MFLT, 5-107<br />

MINS, 5-107<br />

character reference evaluation<br />

operators, 5-63<br />

character relational operators, 5-85<br />

scan operators, 5-86<br />

SEQD, 5-86<br />

SEQU, 5-86<br />

SGED, 5-86<br />

SGEU, 5-86<br />

SGTD, 5-86<br />

SGTU, 5-86<br />

SLED, 5-86<br />

SLEU, 5-86<br />

SLSD, 5-86<br />

SLSU, 5-86<br />

SNED, 5-86<br />

SNEU, 5-86<br />

transfer operators, 5-87<br />

TEQD, 5-87<br />

TEQU, 5-87<br />

TGED, 5-87<br />

TGEU, 5-87


TGTD, 5-87<br />

TGTU, 5-87<br />

TLED, 5-87<br />

TLEU, 5-87<br />

TLSD, 5-87<br />

TLSU, 5-87<br />

TNED, 5-87<br />

TNEU, 5-87<br />

character sequence extraction operator, 5-94<br />

character sequence relation operators, 5-89<br />

character sequence relational supplant old<br />

comparisons, 5-90<br />

character set membership operators, 5-90<br />

scan operators, 5-90, 5-91<br />

SWFD, 5-91<br />

SWFU, 5-91<br />

SWTD, 5-91<br />

SWTU, 5-91<br />

transfer operators, 5-92<br />

TWFD, 5-92<br />

TWFU, 5-92<br />

TWTD, 5-92<br />

TWTU, 5-92<br />

character skip operators<br />

skip forward, 5-104<br />

SFDC, 5-104<br />

SFSC, 5-104<br />

skip reverse, 5-104<br />

SRDC, 5-104<br />

SRSC, 5-104<br />

character translate operator, 5-93<br />

TRNS, 5-93<br />

character-sequence compare operators, 5-88<br />

CEQD, 5-89<br />

CGED, 5-89<br />

CGTD, 5-89<br />

CLED, 5-89<br />

CLSD, 5-89<br />

CNED, 5-89<br />

CharDD, 3-8<br />

CHEK , 5-118, A-2,<br />

F-15<br />

CHES , 6-4,<br />

F-16<br />

CHSN , 5-39, A-2, F-16<br />

CLED , 5-89, A-2, F-16<br />

CLSD , 5-89, A-2, F-16<br />

CNED , 5-89, A-2, F-16<br />

Code Segment Descriptor (CSD), 3-9<br />

Code Segment Descriptors (CSDs), 2-1<br />

Index<br />

code segment dictionary, 2-4<br />

code segments, 2-11<br />

code stream<br />

defunct notation, 4-3<br />

designation, 4-3<br />

distribution, 5-65<br />

pointer, 2-11<br />

resumption, 4-3<br />

code stream pointer distribution, 5-65<br />

Coherent Memory, 6-11<br />

common actions<br />

aACCE, 5-70, F-3<br />

aAPIX, 5-45, F-3<br />

aCHAR, F-5<br />

aEIRW, F-6<br />

aEIXD, F-6<br />

aEVCH, F-7<br />

aEVLK, F-7<br />

aFOP, 5-52, F-7<br />

aINTE, F-8<br />

alphabetical listing, F-1<br />

aPOAV, F-9<br />

aPRCW, F-11<br />

aSOP, 5-59, F-11<br />

aVOAV, F-12<br />

description, 5-2<br />

computational operators, 5-8<br />

bit vector interpretation, 5-29<br />

linear index function operator, 5-39<br />

numeric operand interpretation, 5-8<br />

Condition-Vectored Interrupts (CVIs), 4-2<br />

consistency checks, 4-17<br />

control structures access rights, 2-8<br />

CPV , 5-111, A-2, F-16<br />

CPVA , 5-112, A-2,<br />

F-16<br />

CPVD , 5-112, A-2, F-16<br />

CPVN , 5-111, A-2,<br />

F-17<br />

CPVS , 5-112, A-2, F-17<br />

CREL , 5-89,<br />

A-2, F-17<br />

CSD address couples, 3-12<br />

CSDs, 2-1, 3-9<br />

untouched CSD, 3-9<br />

CU hardware errors, 4-24<br />

CV2S , 5-29, A-2, F-17<br />

CVIs, 4-2<br />

CVS2 , A-2, F-17<br />

CVS2 , 5-29<br />

6878 7530–007 Index–3


Index<br />

D<br />

data array operators, 5-77<br />

paged array operations, 5-77<br />

pointer operators, 5-80<br />

character relational operators, 5-85<br />

character sequence extraction<br />

operator, 5-94<br />

character set membership<br />

operators, 5-90<br />

character translate operator, 5-93<br />

character-sequence compare<br />

operators, 5-88<br />

decimal character sequence<br />

operators, 5-94<br />

edit operators, 5-100<br />

unconditional character transfer<br />

operators, 5-84<br />

word transfer operators, 5-99<br />

searching operators, 5-78<br />

vector operators, 5-109<br />

recurrence operators, 5-116<br />

reduction operators, 5-115<br />

search operators, 5-119<br />

vector assignment operators, 5-111<br />

Data Segment Descriptors (DSDs), 2-1<br />

data structure access, 3-20<br />

DDs, 3-20<br />

descriptors, 3-20<br />

operands, 3-20<br />

operators, 3-20<br />

PCWs, 3-20<br />

primitive code, 3-20<br />

data structures and types, 3-1<br />

data type formats, D-1<br />

ASD1, D-4<br />

ASD2, D-5<br />

double precision/numeric, D-3<br />

single or double precision, Boolean<br />

interpretation, D-4<br />

single precision/ICW, D-2<br />

data word, 3-2<br />

DBCD , 5-27, A-2, F-17<br />

DBFL , 5-67, A-2,<br />

F-17<br />

DBRS , 5-36, A-2, F-17<br />

DBST , 5-36, A-3, F-18<br />

DBTR , 5-67, A-3, F-18<br />

DBUN , 5-67,<br />

A-3, F-18<br />

DCU hardware errors, 4-24<br />

DDs<br />

data structure access, 3-20<br />

decimal character sequence operators, 5-94<br />

input convert operators, 5-98<br />

pack operators, 5-95<br />

unpack operators, 5-96<br />

unpack signed operators, 5-97<br />

unpack unsigned operators, 5-97<br />

decimal sequence operands, 3-4<br />

defined hardware error codes, 4-23<br />

descriptor, 2-1<br />

descriptor attribute extraction operators, 5-51<br />

GESZ, 5-52<br />

GINX, 5-52<br />

GLEN, 5-51<br />

descriptor interpretation, 5-7<br />

descriptors<br />

data structure access, 3-20<br />

destination argument, 5-82<br />

destination boundary, 4-15, G-3<br />

Destination Boundary<br />

lengthening destination segment, 4-15<br />

Destination ID (Dest ID), 6-17<br />

DEXI , 5-75, A-3,<br />

F-18<br />

DFTR , 5-39, A-3,<br />

F-18<br />

diagrams, reading, 5-6<br />

digit sequence, 3-4<br />

DINS , 5-38, A-3, F-18<br />

DISO , 5-37, A-3, F-18<br />

display register, 2-5<br />

DIVD , 5-21, A-3, F-18<br />

Divide by Zero, 4-8<br />

DLET , 5-73, A-3, F-19<br />

DOT , 5-116,<br />

A-3, F-19<br />

DOTX , 5-116, A-3, F-19<br />

double precision floating point, 3-3<br />

double precision operands, 3-2<br />

double_integer<br />

magnitude, 3-4<br />

DoubleDD, 3-8<br />

DRNT , 5-24, A-3, F-19<br />

DSDs, 2-1<br />

DUPL , 5-74, A-3,<br />

F-19<br />

dyadic operators, 5-19<br />

dyadic vector operators, 5-111<br />

CPV, 5-111<br />

CPVA, 5-112<br />

CPVD, 5-112<br />

Index–4 6878 7530–007


CPVN, 5-111<br />

CPVS, 5-112<br />

VMV, 5-112<br />

VMVN, 5-112<br />

VOV, 5-112<br />

VPV, 5-112<br />

VTV, 5-112<br />

VUV, 5-112<br />

dyadic vector operators with scalar, 5-112<br />

VPS, 5-113<br />

VPVS, 5-113<br />

VSPV, 5-113<br />

VTS, 5-113<br />

dynamic branches, 5-66<br />

DBFL, 5-67<br />

DBUN, 5-67<br />

dynamic chain, 2-6<br />

E<br />

edit mode, 5-100<br />

edit mode operators, 5-103, C-1<br />

character insert operators, 5-105<br />

character move operators, 5-106<br />

character skip operators, 5-104<br />

edit operators, 5-103<br />

Edit Mode Operators, C-6<br />

edit modes, C-1<br />

edit op code, 5-2<br />

edit operators, 5-100<br />

character skip operators, 5-104<br />

edit mode operators, 5-103<br />

enter-edit operators, 5-100<br />

enter-single-edit operators, 5-102<br />

enter-table-edit operators, 5-100<br />

miscellaneous edit operators, 5-108<br />

EEXI , 5-75, A-3,<br />

F-19<br />

element_size conventions, 5-80<br />

E-mode Memory, 6-11<br />

emulation consistency error, 4-22, G-4<br />

emulation error, 4-22<br />

emulation error - here, 4-22, G-4<br />

emulation error - lost, 4-22, G-4<br />

ENDE , 5-108, A-3, F-19<br />

ENDF , 5-106, A-3, F-19<br />

enforcement interrupts, 4-14<br />

bounds error, 4-14<br />

destination boundary, 4-15<br />

false assertion, 4-16<br />

invalid access, 4-16<br />

invalid argument or parameter, 4-16<br />

invalid code word, 4-17<br />

invalid operator, 4-18<br />

invalid target, 4-18<br />

scratch pad error, 4-19<br />

source boundary, 4-18<br />

stack underflow, 4-19<br />

structure error, 4-19<br />

ASD, 4-19<br />

page, 4-19<br />

stack, 4-19<br />

undefined operator, 4-21<br />

Unimplemented Operator, 4-12<br />

uninitialized argument, 4-21<br />

enforcing segment boundaries, 2-7<br />

enter edit operators, 5-100<br />

enter table edit operator<br />

EXPU, 5-2<br />

EXSD, 5-2<br />

EXSU, 5-2<br />

TEED, 5-2<br />

TEEU, 5-2<br />

enter-edit operators<br />

enter single-edit operators, 5-102<br />

EXPU, 5-103<br />

EXSD, 5-102<br />

EXSU, 5-103<br />

enter table-edit operators, 5-100<br />

TEED, 5-101<br />

TEEU, 5-102<br />

single edit mode, 5-100<br />

table edit mode, 5-100<br />

enter-single-edit operators, 5-102<br />

enter-table-edit operators, 5-100<br />

ENTR , 5-69, A-3, F-20<br />

entry points, 4-28<br />

environment link, 2-5<br />

description, 3-13<br />

elements, 2-5<br />

fields, 3-13<br />

pseudo, 2-5<br />

pseudolink, 3-13<br />

environment link evaluation, 5-41<br />

Environment Word (ENVW), 3-15<br />

environmental chain, 2-5<br />

EQUL , 5-23, A-3, F-20<br />

EU hardware errors, 4-23<br />

EVAL , 5-57, A-3, F-20<br />

evaluate word structure operators, 5-34<br />

CBON, 5-34<br />

LOG2, 5-35<br />

RTAG, 5-34<br />

Index<br />

6878 7530–007 Index–5


Index<br />

EXCH , 5-74, A-3,<br />

F-20<br />

executable code stream, 2-11<br />

EXIT , 5-71, A-3, F-20<br />

exponent overflow, 4-7<br />

exponent underflow, 4-7<br />

expression stack control, 5-5<br />

EXPU , 5-103, A-3, F-20<br />

EXSD , 5-102, A-3, F-21<br />

EXSU , 5-103, A-3, F-21<br />

EXTB , 6-19, F-21<br />

extended address couples, 3-12<br />

external interrupts, 4-27<br />

External Memory, 6-11<br />

External Memory Access, 6-12<br />

external memory write error, 4-22<br />

EXTF , B-2<br />

F<br />

false assertion, 4-16, G-4<br />

field specifications, 3-1<br />

fixed fence address couples, 3-12<br />

FLTF, B-3<br />

FLTF , B-2<br />

FLTR , 5-38, A-4, F-21<br />

FMN , 5-120, A-4, F-21<br />

FMX , 5-120, A-4, F-21<br />

FMXA , 5-120, A-4, F-21<br />

G<br />

GASF , 6-28, A-4, F-21<br />

GASP , 6-28, A-4, F-21<br />

GATH , 5-114, A-4, F-22<br />

GESZ , 5-52, A-4, F-22<br />

GEXT , 6-29, A-4, F-22<br />

GINX , 5-52, A-4, F-22<br />

GLEN , 5-51, A-4, F-22<br />

GREQ , 5-23, A-4,<br />

F-22<br />

GRTR , 5-23, A-4, F-22<br />

GSTN , 6-29, A-4, F-22<br />

Index–6 6878 7530–007<br />

H<br />

HALT , 6-4, A-4,<br />

F-22<br />

hard POW, 3-18<br />

hardware error, 4-22<br />

hardware error - here, 4-22, G-4<br />

hardware error - lost, 4-23, G-4<br />

hidden state<br />

program restrictions, 6-3<br />

programrestrictions, 5-122<br />

historical chain, 2-5<br />

history links, 2-5<br />

History Word (HISW), 3-15<br />

HISW, 3-16<br />

block_exit bit, 3-16<br />

I<br />

I1DD, 3-9<br />

I2DD, 3-9<br />

ICDD, 3-9<br />

ICLD , 5-98, A-4, F-23<br />

ICR , 6-17<br />

ICRD , 5-98, A-4, F-23<br />

ICUD , 5-98,<br />

A-4, F-23<br />

ICVD , 5-98, A-4, F-23<br />

IDIV , 5-21, A-4, F-23<br />

IDLE , 6-9, A-4, F-23<br />

IMKS , 5-68, A-4, F-23<br />

IMR , 6-16<br />

indexed copy DD, 2-6<br />

IndexedCharDD, 3-9<br />

index field, 3-9<br />

char_index, 3-9<br />

word_index, 3-9<br />

IndexedDD (Indexed Data Descriptor), 3-8<br />

IndexedDoubleDD, 3-9<br />

IndexedSingleDD, 3-9<br />

IndexedWordDD, 3-9<br />

index field, 3-9<br />

IndexedWordDD evaluation, 5-42<br />

access checking, 5-42<br />

INDX , 5-47, A-4, F-23<br />

initialization error<br />

superhalt, 4-1<br />

INOP , 5-105, A-4, F-24<br />

input convert operators, 5-98


ICLD, 5-98<br />

ICRD, 5-98<br />

ICUD, 5-98<br />

INSC , 5-105, A-4, F-24<br />

INSG , 5-106, A-5, F-24<br />

INSR , 5-37, A-5, F-24<br />

INSU , 5-105, A-5, F-24<br />

integer magnitude checks, 4-17<br />

integer overflow, 4-7, 4-9, G-4<br />

integerize with rounding, 5-14<br />

Inter-Processor Interrupts, 6-17<br />

interrupt conditions, 4-2<br />

interrupt definition<br />

description, 4-6<br />

interrupt definitions, 4-6<br />

types, 4-6<br />

interrupt formats, 4-2<br />

POI, 4-2<br />

ROI, 4-3<br />

interrupt parameters, 4-4<br />

Interrupt <strong>Reference</strong>, G-1<br />

Interrupt Routing, 6-16<br />

interrupt slot, 4-2<br />

interrupt vector, 4-2, 4-29<br />

Interrupt Vectors, 6-15<br />

interrupts, 4-1, 5-3, G-2<br />

absent data segment, G-1<br />

arithmetic overflow, G-2<br />

arithmetic underflow, G-2<br />

block exit, G-2<br />

bounds error, G-3<br />

destination boundary, G-3<br />

false assertion, G-4<br />

hardware error - here, G-4<br />

hardware error - lost, G-4<br />

invalid<br />

address - here, G-5<br />

address - lost, G-5<br />

argument/parameter, G-5<br />

code word, G-7<br />

operator, G-7<br />

target, G-8<br />

invalid access, G-4<br />

loop timer - here, G-8<br />

loop timer - lost, G-8<br />

memory data error, G-8<br />

missing PCW, G-8<br />

operator-dependent ODI, 4-1<br />

source boundary, G-9<br />

spontaneous, 4-1<br />

stack overflow, G-9<br />

stack underflow, G-9<br />

structure error, G-10<br />

touch CSD, G-10<br />

touch load, G-10<br />

touch reference, G-10<br />

undefined operator, G-11<br />

uninitialized argument, G-12<br />

vector arithmetic exception, G-13<br />

invalid<br />

access, 4-16<br />

address, 4-24<br />

address - here, G-5<br />

address - lost, G-5<br />

argument value checks, 4-17<br />

argument/parameter, 4-16, G-5<br />

consistency checks, 4-17<br />

integer magnitude checks, 4-17<br />

invalid address, 4-24<br />

invalid address - Lost, 4-25<br />

reindex checks, 4-17<br />

spontaneous, 4-1<br />

type checks, 4-16<br />

invalid access, G-4<br />

Invalid Address Detection, 6-14<br />

invalid code word, 4-17, G-7<br />

invalid operator, 4-18, 5-121, G-7<br />

invalid target, 4-18, G-8<br />

invariants, operators, 5-3<br />

IPI Mode Flag Format, 6-17<br />

IPST , 6-4, A-5, F-24<br />

IRR , 6-16<br />

IRW chain, 5-43<br />

ISOL , 5-37, A-5, F-24<br />

item<br />

description, 2-1<br />

IWDD, 3-9<br />

Index<br />

6878 7530–007 Index–7<br />

J<br />

JOIN , 5-33,<br />

A-5, F-24<br />

L<br />

LAND , 5-30, A-5, F-24<br />

LDNC , A-5, E-1, F-24<br />

LDNO , A-5, E-1,<br />

F-25<br />

length argument, 5-81<br />

lengthening destination segment, 4-15<br />

LEQV , 5-30, A-5, F-25<br />

LESS , 5-23, A-5, F-25


Index<br />

lex level<br />

description, 2-3<br />

LID , 6-17<br />

linear index function operator<br />

OCRX, 5-39<br />

linear sum operators, 5-115<br />

SUM, 5-115<br />

SUMA, 5-115<br />

literal operators, 5-31<br />

LT16, 5-31<br />

LT48, 5-31<br />

LT8, 5-31<br />

ONE, 5-31<br />

ZERO, 5-31<br />

LNMC , 5-45, A-5, F-25<br />

LNOT , 5-30, A-5, F-25<br />

LOAD , 5-58, A-5, F-25<br />

Local APIC Registers, 6-16<br />

LODC , 5-63, A-5, F-25<br />

LODT , 5-58, A-5, F-25<br />

LOG2 , 5-35, A-5, F-25<br />

logical equality, 5-30<br />

logical operators, 5-29<br />

LAND, 5-30<br />

LEQV, 5-30<br />

LNOT, 5-30<br />

LOR, 5-30<br />

SAME, 5-30<br />

loop timer - here, 4-25, G-8<br />

loop timer - lost, 4-25, G-8<br />

LOR , 5-30, A-5, F-26<br />

LSEQ , 5-23, A-5, F-26<br />

LT16 , 5-31, A-5, F-26<br />

LT48 , 5-31, A-5, F-26<br />

LT8 , 5-31, A-5, F-26<br />

LVLC , 5-54, A-5, F-26<br />

M<br />

Machine Time of Day, 6-22<br />

mantissa field, 3-3<br />

maskable external interrupts, 4-28<br />

Maskable Interrupt Request, 6-18<br />

mathematical function operator<br />

RSQR, 5-28<br />

MaxInx, 3-10<br />

MaxLen, 3-10<br />

MCHR , 5-106, A-5, F-26<br />

memory data error - here, 4-25, G-8<br />

memory data error - lost, 4-25, G-8<br />

memory word, 2-12<br />

MFLT , 5-107, A-5, A-6,<br />

F-26<br />

MINS , 5-107, A-6, F-26<br />

miscellaneous edit operators, 5-108<br />

ENDE, 5-108<br />

RSTF, 5-108<br />

miscellaneous operators, 5-121<br />

NOOP, 5-121<br />

NVLD, 5-121<br />

PUSH, 5-121<br />

VARI, 5-121<br />

missing PCW, 4-11, G-8<br />

MKSN ,<br />

5-68, A-6, F-26<br />

MKST , 5-67, A-6, F-26<br />

modified capability architecture<br />

description, 2-7<br />

MPCW , 5-49, A-6, F-26<br />

MPWL , 5-49, A-6, F-27<br />

MPWP , 5-49, A-6, F-27<br />

MPWx , 5-49<br />

MULT , 5-20, A-6, F-27<br />

multiprocessing, 2-4<br />

multiprogramming, 2-4<br />

MULX , 5-21, A-6, F-27<br />

MVNU , 5-107, A-6, F-27<br />

MVST , 6-8, F-27<br />

Index–8 6878 7530–007<br />

N<br />

NAMC , 5-44, A-6, F-27<br />

NEQL , 5-23, A-6, F-27<br />

NMC0 , 5-45, A-6, F-27<br />

NMC1 , 5-45, A-6, F-27<br />

NMC2 , 5-45, A-6, F-28<br />

NMC3 , 5-45, A-6, F-28<br />

Non-coherent Byte Memory, 6-11<br />

Non-coherent I/O, 6-11<br />

nondigit, 5-95<br />

Non-maskable Interrupt Request, 6-18<br />

NOOP , 5-121, A-6, F-28<br />

NORM , 5-22, A-6, F-28<br />

normal store operators, 5-59<br />

aSOP, 5-59<br />

STOD, 5-60<br />

STON, 5-60<br />

normalization function N, 5-17<br />

normalized values, 5-9<br />

NORX , 5-51, A-6, F-28


NOWR , 5-51, A-6,<br />

F-28<br />

NTGD , 5-26, A-7, F-28<br />

NTGR , 5-24, A-7, F-28<br />

NTIA , 5-25, A-7, F-28<br />

NTTD , 5-26, A-7, F-29<br />

numeric interpretation operators, 5-19<br />

arithmetic operators, 5-19<br />

binary-to-decimal conversion<br />

operators, 5-27<br />

numeric relational operators, 5-23<br />

numeric type transfer operators, 5-24<br />

range test operators, 5-24<br />

numeric operand interpretation, 5-8<br />

representable values, 5-8<br />

numeric relational operators, 5-23<br />

EQUL, 5-23<br />

GREQ, 5-23<br />

GRTR, 5-23<br />

LESS, 5-23<br />

LSEQ, 5-23<br />

NEQL, 5-23<br />

numeric type transfer operators, 5-24<br />

NTGD, 5-26<br />

NTGR, 5-24<br />

NTIA, 5-25<br />

NTTD, 5-26<br />

SNGL, 5-25<br />

SNGT, 5-25<br />

NVLD , 5-121, A-7, F-29<br />

NXLN , 5-56, A-7,<br />

F-29<br />

NXLV , 5-55, A-7, F-29<br />

O<br />

obsolete operators, 5-4<br />

OCRX , 5-39, A-7, F-30<br />

ODI, 4-1<br />

resumable, 4-3<br />

OFFF , B-2<br />

ONE , 5-31, A-7, F-30<br />

op code, 5-1<br />

op codes<br />

edit, 5-2<br />

primary, 5-2<br />

variant, 5-2<br />

operands, 3-2<br />

data structure access, 3-20<br />

Index<br />

double precision, 3-2<br />

real numeric, 3-3<br />

single precision, 3-2<br />

operator and common action reference, F-1<br />

operator applicability, 5-4<br />

operator encoding, C-1<br />

interpreting one-syllable op code, C-1<br />

edit mode, C-1<br />

primary modem, C-1<br />

variant, C-1<br />

operator subdivision, 4-5<br />

Operator-dependent interrupts (ODIs), 4-1<br />

operators, 5-1<br />

classes, 5-4<br />

obsolete, 5-4<br />

partially restricted, 5-4<br />

restricted, 5-4<br />

unrestricted, 5-4<br />

data structure access, 3-20<br />

order of execution, 5-2<br />

overwrite, 5-61<br />

operators and code streams, 5-1<br />

Operator-Vectored Interrupts (OVIs), 4-2<br />

other synchronous hardware errors, 4-24<br />

overlapping source and destination, 5-82<br />

overwrite operators, 5-61<br />

OVRD, 5-62<br />

OVRN, 5-62<br />

RDLK, 5-62<br />

OVRD , 5-62, A-7, F-30<br />

OVRN , 5-62, A-7,<br />

F-30<br />

6878 7530–007 Index–9<br />

P<br />

pack operators, 5-95<br />

PKLD, 5-95<br />

PKRD, 5-95<br />

PKUD, 5-95<br />

page boundary interrupt, 5-77<br />

Page Structure errors, 4-19<br />

page table, 3-10<br />

ASD_ref, 3-9<br />

paged array operations, 5-77<br />

paged virtual segment, 3-10<br />

page table, 3-10<br />

paged virtual segments<br />

MaxInx, 3-10<br />

MaxLen, 3-10<br />

parameter, description, 5-1<br />

Partitioning of Logical Memory, 6-13


Index<br />

PAUS , 6-9, A-7, F-30<br />

PCW, 2-4<br />

code stream pointer, 3-14<br />

data structure access, 3-20<br />

description, 3-14<br />

evaluation, 5-43<br />

skeleton, 3-15<br />

PCW evaluation, 5-43<br />

PKLD , 5-95, A-7,<br />

F-30<br />

PKRD , 5-95, A-7,<br />

F-30<br />

PKUD , 5-95, A-7,<br />

F-30<br />

POI, 4-2<br />

pointer, 5-80<br />

pointer index restrictions, 5-108<br />

pointer operators, 5-80<br />

character relational operators, 5-85<br />

scan operators, 5-86<br />

transfer operators, 5-87<br />

character sequence extraction<br />

operator, 5-94<br />

character set membership operators, 5-90<br />

character-sequence compare<br />

operators, 5-88<br />

decimal character sequence<br />

operators, 5-94<br />

input convert operators, 5-98<br />

unpack operators, 5-96<br />

delete variation, 5-83<br />

destination arguments, 5-80<br />

edit operators, 5-100<br />

edit mode operators, 5-103<br />

enter edit operators, 5-100<br />

element_size conventions, 5-80<br />

length argument, 5-81<br />

overlapping source and destination, 5-82<br />

pointer index restrictions, 5-108<br />

segment boundary, 5-81<br />

short source operators, 5-82<br />

source1 and source2 arguments, 5-82<br />

update variation, 5-83<br />

word transfer operators, 5-99<br />

POLY , 5-117, A-7,<br />

F-31<br />

POW<br />

forms, 3-18<br />

precision loss, 4-7<br />

preconditions<br />

operators, 5-3<br />

primary mode, C-1<br />

operator, C-1<br />

primary op code, 5-2<br />

primitive code<br />

data structure access, 3-20<br />

procedure<br />

description, 2-3<br />

entry, 2-10<br />

accidental, 2-10<br />

explicit, 2-10<br />

implicit, 2-10<br />

procedure entry operators, 5-67<br />

aACCE, 5-70<br />

ENTR, 5-69<br />

IMKS, 5-68<br />

MKSN, 5-68<br />

MKST, 5-67<br />

procedure entry/exit, 2-9<br />

procedure exit operators, 5-71<br />

EXIT, 5-71<br />

RETN, 5-72<br />

RTN2, 5-72<br />

process<br />

creation, 2-4<br />

description, 2-4<br />

process model, 2-1<br />

process stack, 3-15<br />

processes<br />

stack, 2-4<br />

processor register, 2-5<br />

processor state operators, 5-65<br />

assertion operators, 5-73<br />

branching operators, 5-65<br />

code stream pointer distribution, 5-65<br />

processor-state manipulation<br />

operators, 5-75<br />

stack frame operators, 5-67<br />

procedure entry operators, 5-67<br />

top-of-stack operators, 5-73<br />

processor-state manipulation operators, 5-75<br />

DEXI, 5-75<br />

EEXI, 5-75<br />

ROFF, 5-75<br />

RPRR, 6-5<br />

RSNR, 5-76<br />

RTFF, 5-75<br />

SXSN, 5-76<br />

program<br />

description, 2-3<br />

program code words, 2-11, 3-5<br />

syllables, 2-11, 3-5<br />

Program Control Word (PCW), 2-4<br />

program restrictions, 5-122, 6-3<br />

Program Segment Number (PSN), 2-11<br />

Program Syllable Index (PSI), 2-11<br />

Index–10 6878 7530–007


Program Word Index (PWI), 2-11<br />

Programmed Operator Interrupt (POI), 4-2<br />

Protected Object Words (POWs), 3-18<br />

protection, 2-7<br />

protection mechanisms, 2-7<br />

pseudo activation records, 3-13<br />

PSN, 2-11<br />

PUSH , 5-121, A-7, F-31<br />

Q<br />

quadratic sum operators, 5-115<br />

DOT, 5-116<br />

DOTX, 5-116<br />

R<br />

range test operators, 5-24<br />

DRNT, 5-24<br />

RASD , 6-1, A-7, F-31<br />

RCMT , 6-10, A-7, F-31<br />

RCW, 2-5, 3-15<br />

RDIV , 5-22, A-7, F-31<br />

RDLK , 5-62, A-7, F-31<br />

RDMT , 6-10, A-7, F-31<br />

read evaluation operators, 5-52<br />

aFOP, 5-52<br />

EVAL, 5-57<br />

LOAD, 5-58<br />

LODT, 5-58<br />

LVLC, 5-54<br />

NXLN, 5-56<br />

NXLV, 5-55<br />

VALC, 5-53<br />

real numeric operands, 3-3<br />

mantissa field, 3-3<br />

Real Time of Day, 6-21<br />

recurrence operators, 5-116<br />

CHEK, 5-118<br />

POLY, 5-117<br />

SEQ, 5-116<br />

reduction operators, 5-115<br />

linear sum operators, 5-115<br />

SUM, 5-115<br />

SUMA, 5-115<br />

quadratic sum operators, 5-115<br />

DOT, 5-116<br />

Index<br />

DOTX, 5-116<br />

reference chains, 5-43<br />

chaining rule<br />

notation, 5-43<br />

IRW chain, 5-43<br />

SIRW chain, 5-43<br />

reference evaluation, 5-54<br />

address couple evaluation, 5-42<br />

IndexedWordDD evaluation, 5-55<br />

PCW evaluation, 5-43<br />

reference chains, 5-43<br />

SIRW evaluation, 5-42<br />

reference generation and evaluation<br />

operators, 5-41<br />

reference generation operators, 5-44<br />

aAPIX, 5-45<br />

INDX, 5-47<br />

LNMC, 5-45<br />

MPCW, 5-49<br />

NAMC, 5-44<br />

STFF, 5-45<br />

reference modification operators, 5-50<br />

NORX, 5-51<br />

NOWR, 5-51<br />

SEsz, 5-50<br />

reference generation operators, 5-44<br />

reference modification operators, 5-50<br />

reference types, 3-12<br />

activation records, 3-13<br />

address couples, 3-12<br />

variable fence, 3-12<br />

CSD address couples, 3-12<br />

environment links, 3-13<br />

fixed fence address couples, 3-12<br />

PCWs, 3-14<br />

references, 2-6<br />

registers<br />

values, 2-12<br />

reindex bit, 3-9<br />

reindex checks, 4-17<br />

REMW , 6-14,<br />

A-7, F-32<br />

representable values, 5-8<br />

normalized values, 5-9<br />

restart configuration, 4-5<br />

restart mode, 4-5, 5-3<br />

description, 5-6<br />

Restartable Operator Interrupt (ROI), 4-2<br />

restricted operators, 5-4<br />

HALT, 6-4<br />

RASD, 6-1<br />

REXI, 6-5<br />

STOP, 6-6<br />

6878 7530–007 Index–11


Index<br />

TWOD, 6-2<br />

WASD, 6-2<br />

WATI, 6-7<br />

WHOI, 6-7<br />

WTOD, 6-10<br />

restrictions due to hidden state, 5-122, 6-3<br />

RETN , 5-72, A-7, F-32<br />

Return Control Word (RCW), 2-5, 3-15<br />

REXI , 6-5, A-8,<br />

F-32<br />

RIPS , 6-9, A-8, F-32<br />

RIRR , 6-19,<br />

A-8, F-32<br />

RMTR , A-8, E-2, F-32<br />

ROFF ,<br />

5-75, A-8, F-32<br />

ROI, 4-3<br />

P2 parameter, 4-4<br />

rounding function<br />

Rai, 5-14<br />

rounding function R, 5-11<br />

rounding functions, 5-12<br />

R, example, 5-12<br />

RaI, 5-14<br />

Ri, 5-13<br />

RI, 5-13<br />

RId, 5-13<br />

RPRR , 6-5, A-8,<br />

F-32<br />

RREG , 6-20, A-8, F-32<br />

RSDN , 5-75, A-8, F-32<br />

RSNR , 5-76, A-8, F-32<br />

RSQR , 5-28, A-8, F-33<br />

RSTF , 5-108, A-8, F-33<br />

RSUP , 5-74, A-8, F-33<br />

RTAG , 5-34, A-8, F-33<br />

RTFF , 5-75, A-8,<br />

F-33<br />

RTN2 , 5-71, 5-72, A-8,<br />

F-33<br />

RTOD , 5-76,<br />

A-8, F-33<br />

RUNI , A-8, F-33<br />

RUNI , 6-9<br />

S<br />

SAME , 5-30, A-8, F-33<br />

SASF , 6-28, A-8, F-33<br />

SASP , 6-29, A-8, F-33<br />

scalars, 5-109<br />

SCAT , 5-114, A-8, F-34<br />

scatter/gather operators, 5-113<br />

GATH, 5-114<br />

SCAT, 5-114<br />

SCMP , 5-90, A-8, F-34<br />

SCPY , 5-88, A-8, F-34<br />

scratch pad errors, 4-19<br />

SCRD , A-8, E-2<br />

SE4C , 5-50, A-8, F-35<br />

SE8C , 5-50, A-9, F-35<br />

search operators, 5-119<br />

FMN, 5-120<br />

FMX, 5-120<br />

FMXA, 5-120<br />

searching operators, 5-78<br />

BMS, 5-78<br />

SRCH, 5-78<br />

SEDW , 5-50, A-9, F-34<br />

segment<br />

actual, 2-2<br />

segment boundary, 5-81<br />

segments<br />

code, 2-11<br />

description, 2-1, 2-12<br />

virtual, 2-2<br />

SEQ , 5-116, A-9,<br />

F-34<br />

SEQD , 5-86, A-9,<br />

F-34<br />

SEQU , 5-86, A-9,<br />

F-34<br />

service interrupts, 4-10<br />

absent code segment, 4-10<br />

absent data segment, 4-10<br />

absent segment, 4-10<br />

block exit, 4-11<br />

missing PCW, 4-11<br />

stack overflow, 4-11<br />

touch, 4-11<br />

vector arithmetic exception, 4-13<br />

service request, 5-44<br />

SESW , 5-50, A-9, F-35<br />

SEsz , 5-50<br />

SE4C , 5-50<br />

SEDW , 5-50<br />

SESW , 5-50<br />

Index–12 6878 7530–007


SEXT , 6-30, A-9, F-35<br />

SFDC , 5-104, A-9, F-35<br />

SFSC , 5-104, A-9, F-35<br />

SGED , 5-86, A-9, F-35<br />

SGEU , 5-86, A-9, F-35<br />

SGTD , 5-86, A-9,<br />

F-35<br />

SGTU , 5-86,<br />

A-9, F-36<br />

short destination operators, 5-97<br />

short source operators, 5-82<br />

SI, 4-1<br />

resumable, 4-3<br />

single edit mode, 5-100<br />

single precision floating point operand, 3-3<br />

single precision operands, 3-2<br />

single precision/numeric, D-1<br />

single_integer<br />

magnitude, 3-3<br />

SingleDD, 3-8<br />

SINT , 6-9, A-9, F-36<br />

SIRW, 2-6<br />

description, 3-14<br />

evaluation, 5-42<br />

SIRWs<br />

chain, 5-43<br />

SISO , 5-94, A-9, F-36<br />

skip forward, 5-104<br />

SFDC, 5-104<br />

SFSC, 5-104<br />

skip reverse, 5-104<br />

SRDC, 5-104<br />

SRSC, 5-104<br />

SLC interface error, 4-26<br />

SLC interface error - here, 4-26<br />

SLC interface error - lost, 4-26<br />

SLED , 5-86, A-9, F-36<br />

SLEU , 5-86, A-9, F-36<br />

SLSD , 5-86, A-9,<br />

F-36<br />

SLSU , 5-86, A-10,<br />

F-36<br />

SNED , 5-86,<br />

A-10, F-36<br />

SNEU , 5-86,<br />

A-10, F-36<br />

Index<br />

SNGL , 5-25, A-10, F-36<br />

SNGT , 5-25, A-10, F-37<br />

soft POW, 3-18<br />

source<br />

description, 5-35<br />

source argument, 5-81<br />

source boundary, 4-18, G-9<br />

source1 and source2 arguments, 5-82<br />

SPLT , 5-34,<br />

A-10, F-37<br />

spontaneous interrupt (SI), 4-1<br />

SPRR , 6-5, A-10,<br />

F-37<br />

spurious interrupts, 4-7<br />

SRCH , 5-78,<br />

A-10, F-37<br />

SRDC , 5-104, A-10, F-37<br />

SRSC , 5-104, A-10, F-37<br />

SSTN , 6-29, A-10, F-38<br />

stack and display registers, 2-11<br />

stack frame linkage, 3-16<br />

TSCW, 3-15<br />

stack frame operators, 5-67<br />

procedure entry operators, 5-67<br />

procedure exit operators, 5-71<br />

stack overflow, 4-11, G-9<br />

stack references, 5-41<br />

stack structure, 3-15<br />

stack structure errors, 4-19<br />

stack underflow, 4-19, G-9<br />

stacks<br />

description, 2-4<br />

expression<br />

current, 2-10<br />

frame, 2-5, 2-10<br />

stack-state transformation, 5-6<br />

STAG , 5-32, A-10, F-38<br />

Startup Request, 6-18<br />

static branches, 5-65<br />

BRFL, 5-66<br />

BRTR, 5-66<br />

BRUN, 5-66<br />

static chain, 2-6<br />

STCD , 5-64, A-10,<br />

F-38<br />

STCN , 5-64,<br />

A-10, F-38<br />

STFF , 5-45, A-10, F-38<br />

STOD , 5-60, A-10, F-38<br />

6878 7530–007 Index–13


Index<br />

STON , 5-60, A-10, F-38<br />

STOP , 6-6,<br />

A-10, F-38<br />

strides, 5-110<br />

structure error, 4-19, G-10<br />

ASD structure errors, 4-20<br />

page structure errors, 4-20<br />

scratch pad errors, 4-21<br />

stack structure errors, 4-19<br />

types, 4-19<br />

Stuffed Indirect <strong>Reference</strong> Word (SIRW), 2-6,<br />

3-14<br />

SUBT , 5-20, A-10, F-39<br />

SUM , 5-115, A-10,<br />

F-39<br />

SUMA , 5-115, A-11, F-39<br />

SUMW , 5-118, A-11, F-39<br />

superhalt, 4-1<br />

SWFD , 5-91, A-11,<br />

F-39<br />

SWFU , 5-91, A-11,<br />

F-39<br />

SWTD , 5-91, A-11,<br />

F-39<br />

SWTU , 5-91, A-11,<br />

F-39<br />

SXSN , 5-76,<br />

A-11, F-40<br />

Synchronization, 6-22<br />

T<br />

table edit mode, 5-100<br />

tag values, 3-19<br />

RTAG, 3-19<br />

STAG, 3-19<br />

Tag-4 word, 3-5<br />

Tag-6 word, 3-5<br />

TEED , 5-101, A-11,<br />

F-40<br />

TEEU , 5-102, A-11,<br />

F-40<br />

TEQD , 5-87,<br />

A-11, F-40<br />

TEQU , 5-87,<br />

A-11, F-40<br />

TFFF , B-1<br />

TFFF, OFFF, and EXTF, B-3<br />

TGED , 5-87, A-11, F-40<br />

TGEU , 5-87, A-11, F-40<br />

TGTD , 5-87,<br />

A-11, F-40<br />

TGTU , 5-87,<br />

A-11, F-40<br />

thunk, 2-10<br />

TI function, 5-16<br />

TId function, 5-16<br />

TLED , 5-87, A-11, F-41<br />

TLEU , 5-87, A-11, F-41<br />

TLSD , 5-87,<br />

A-11, F-41<br />

TLSU , 5-87,<br />

A-11, F-41<br />

TNED , 5-87, A-12, F-41<br />

TNEU , 5-87, A-12, F-41<br />

Top of Stack Control Word (TSCW), 3-15<br />

top-of-stack linkage, 3-17<br />

top-of-stack operators, 5-73<br />

DLET, 5-73<br />

DUPL, 5-74<br />

EXCH, 5-74<br />

RSDN, 5-75<br />

RSUP, 5-74<br />

top-of-stack pop operations, 5-6<br />

top-of-stack push operations, 5-5<br />

touch, 4-11<br />

Touch<br />

touch CSD, G-10<br />

touch load, G-10<br />

touch reference, G-10<br />

touch CSD, 4-12<br />

touch load, 4-12<br />

touch reference, 4-12<br />

touched CSD, 3-8<br />

untouched CSD, D-6<br />

TRNS , 5-93, A-12, F-41<br />

truncate-to-integer, 5-16<br />

truncation function<br />

T, 5-15<br />

Ti, 5-16<br />

truncation functions, 5-15<br />

TI, 5-16<br />

TId, 5-16<br />

TS, 5-15<br />

TSCW, 3-15<br />

Index–14 6878 7530–007


TUND , 5-84, A-12, F-41<br />

TUNU , 5-85, A-12, F-41<br />

TWFD , 5-92,<br />

A-12, F-42<br />

TWFU , 5-92,<br />

A-12, F-42<br />

TWOD , 6-2, A-12, F-42<br />

TWSD , 5-99, A-12,<br />

F-42<br />

TWSU , 5-99, A-12,<br />

F-42<br />

TWTD , 5-92,<br />

A-12, F-42<br />

TWTU , 5-92,<br />

A-12, F-42<br />

type checks, 4-16<br />

U<br />

unconditional character-transfer<br />

operators, 5-84<br />

TUND, 5-84<br />

TUNU, 5-85<br />

undefined operator, 4-21, G-11<br />

unimplemented operator, 4-12, G-11<br />

Unimplemented Operator<br />

Operator Emulation, 4-12<br />

unindexed copy DD, 2-6<br />

unindexed DD, 3-8<br />

uninitialized argument, 4-21, G-12<br />

uninitialized single datum, 3-5<br />

unpack operators<br />

unpack signed operators<br />

UPLD, 5-97<br />

UPLU, 5-97<br />

UPND, 5-97<br />

UPNU, 5-97<br />

UPRD, 5-97<br />

UPRU, 5-97<br />

unpack unsigned operators<br />

UPUD, 5-97<br />

UPUU, 5-97<br />

unpaged virtual segment, 3-10<br />

unrestricted operators, 5-4<br />

untouched CSD, 3-9<br />

untouched DD, 3-7<br />

untouched original, 2-2<br />

untouched VSD, 3-7<br />

Index<br />

update, 5-83<br />

UPLD , 5-97,<br />

A-12, F-43<br />

UPLU , 5-97,<br />

A-12, F-43<br />

UPRD , 5-97,<br />

A-12, F-43<br />

UPRU , 5-97,<br />

A-12, F-43<br />

UPUD , 5-97, A-12,<br />

F-43<br />

UPUU , 5-97,<br />

A-12, F-43<br />

USND , 5-97, A-12,<br />

F-43<br />

USNU , 5-97, A-12,<br />

F-43<br />

6878 7530–007 Index–15<br />

V<br />

VALC , 5-53, A-13, F-43<br />

VARI , 5-121,<br />

A-13, F-43<br />

variable fence address couples, 3-12<br />

variant mode, C-1<br />

variant op codes, 5-2<br />

vector access, 5-110<br />

vector arguments, 5-109<br />

vector arithmetic exception, 4-13, 5-110, G-13<br />

vector assignment operators, 5-111<br />

dyadic vector operators, 5-111<br />

CPV, 5-111<br />

CPVA, 5-112<br />

CPVD, 5-112<br />

CPVN, 5-111<br />

CPVS, 5-112<br />

VMV, 5-112<br />

VMVN, 5-112<br />

VOV, 5-112<br />

VPV, 5-112<br />

VTV, 5-112<br />

VUV, 5-112<br />

dyadic vector operators with scalar, 5-112<br />

VPS, 5-113<br />

VSPV, 5-113<br />

VTS, 5-113<br />

scatter/gather operators, 5-113<br />

GATH, 5-114<br />

SCAT, 5-114<br />

vector length, 5-110<br />

vector operators, 5-109


Index<br />

recurrence operators, 5-116<br />

reduction operators, 5-115<br />

scalars, 5-109<br />

search operators, 5-119<br />

strides, 5-110<br />

vector access, 5-110<br />

vector arguments, 5-109<br />

vector arithmetic, 5-110<br />

vector assignment operators, 5-111<br />

vectors, 5-109<br />

vectors, 5-109<br />

virtual index<br />

components, 3-11<br />

description, 3-11<br />

Virtual Segment Descriptor (VSD), 2-1, 3-7<br />

virtual segments<br />

description, 2-2<br />

domain, 5-78<br />

paged, 3-10<br />

MaxInx, 3-10<br />

MaxLen, 3-10<br />

unpaged, 3-10<br />

VLC0 , 5-54, A-13, F-43<br />

VLC1 , 5-54, A-13, F-44<br />

VLC2 , 5-54, A-13, F-44<br />

VLC3 , 5-54, A-13, F-44<br />

VMV , 5-112, A-13,<br />

F-44<br />

VMVN , 5-112, A-13, F-44<br />

VOV , 5-112,<br />

A-13, F-44<br />

VPS , 5-113, A-13, F-45<br />

VPV , 5-112, A-13, F-45<br />

VPVS , 5-113, A-13, F-45<br />

VSDs, 2-2, 3-7<br />

classes of, 2-2<br />

untouched, 2-2<br />

VSPV , 5-113, A-13, F-46<br />

VTS , 5-113, A-13, F-46<br />

VTV , 5-112, A-13, F-46<br />

VUV , 5-112, A-13, F-47<br />

W<br />

WASD , 6-2, A-13,<br />

F-47<br />

WATI , 6-7,<br />

A-13, F-47<br />

WEMW , 6-15, A-13, F-47<br />

WHOI , 6-7, A-13, F-47<br />

WIPS , 6-26<br />

WIPS , A-13, F-47<br />

WMTR , A-13, E-2, F-47<br />

word descriptor, 3-8<br />

word format, 3-1<br />

fields, 3-1<br />

word manipulation operators, 5-35<br />

BRST, 5-36<br />

BSET, 5-36<br />

CHSN, 5-39<br />

DBRS, 5-36<br />

DBST, 5-36<br />

DFTR, 5-39<br />

DINS, 5-38<br />

DISO, 5-37<br />

FLTR, 5-38<br />

INSR, 5-37<br />

ISOL, 5-37<br />

word transfer operators, 5-99<br />

TWSD, 5-99<br />

TWSU, 5-99<br />

word_index, 3-9<br />

WordDD, 3-8<br />

words<br />

description, 2-1<br />

format, 3-1<br />

WREG , 6-20, A-13,<br />

F-47<br />

WTOD , 6-10,<br />

A-14, F-48<br />

Index–16 6878 7530–007<br />

X<br />

XTND , 5-32, A-14,<br />

F-48<br />

Z<br />

ZERO , 5-31, A-14, F-48<br />

ZIC , 6-7, A-14, F-48


© 2012 Unisys Corporation.<br />

All rights reserved.<br />

*68787530-007*<br />

6878 7530–007

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!