Multics Technical Bulletin MTB-683 Fortran Typeless Functions. To: Distribution From: Michael H. Mabey Date: 9 October 1984 Subject: Fortran Typeless Functions Specification. 1. Abstract This MTB describes the Multics implementation of the typeless functions found in GCOS Fortran. The "typeless" data type as well as the actual object code generated, is discussed. Comments on this MTB should be sent to the author - via Multics mail to: Mabey.Multics on System M via posted mail to: Michael Mabey Advanced Computing Technology Center Foothills Professional Building Room #301, 1620 - 29th Street N.W. Calgary, Alberta T2N-4L7 CANADA via telephone to: (403)-270-5400 (403)-270-5413 ________________________________________ Multics project internal documentation; not to be reproduced or distributed outside the Multics project. MTB-683 Multics Technical Bulletin Fortran Typeless Functions. TABLE OF CONTENTS Section Page Subject ======= ==== ======= 1 i Abstract 2 1 Introduction 3 2 The Typeless Data Type 3.1 2 . . Typeless Arithmetic 3.2 2 . . Typeless Assignments 4 3 The Typeless Functions 4.1 3 . . The AND Function 4.2 3 . . The BOOL Function 4.3 3 . . The COMPL Function 4.4 4 . . The FLD Function 4.4.1 4 . . . . The FLD Function on The Right Hand Side 4.4.2 4 . . . . The FLD Function on The Left Hand Side 4.5 5 . . The OR Function 4.6 6 . . The XOR Function 5 7 The New Nontypeless Functions 5.1 7 . . The ilr Function 5.2 7 . . The ils Function 5.3 7 . . The irl Function 5.4 8 . . The irs Function Multics Technical Bulletin MTB-683 Fortran Typeless Functions. 2. Introduction To aid in the migration of GCOS software to Multics, ten builtin functions have been added to Multics Fortran. The functions involve new concepts to the language. All the builtins are used to manipulate bits, and several return their values in a new data type which GCOS calls "typeless". This document discusses the Multics implementation of these GCOS functions. MTB-683 Multics Technical Bulletin Fortran Typeless Functions. 3. The Typeless Data Type Six of the new functions, AND, OR, XOR, BOOL, COMPL, and FLD, return their results in a new data type called "typeless". A typeless value is treated as a special form of integer. 3.1. Typeless Arithmetic There are no typeless variables or constants, only typeless expressions. Typeless entities can only exist as a result of one of the six typeless functions. Typeless entities can only be combined with other typeless values or integers. If an integer is present in a typeless expression, the integer is treated as a typeless value within the expression. Typeless arithmetic expressions can only contain the four basic mathematical operators: "+", "-", "*", and "/". Typeless relational expressions can contain any of the relational operators (".lt.", ".le", ".eq.", ".ne.", ".ge.", and ".gt."). When typeless values are combined, the operations are done in the same manner as they are performed on normal signed integers. With the arithmetic operators the result is typeless. With the relational operators, the result is logical. 3.2. Typeless Assignments Assignments of this data type can only be to variables that require exactly one word of storage. The variables can be either scalar or subscripted. The typeless value that is to be assigned is copied into the memory address of the variable without any conversion. The one exception to this is in assignments to logical variables. If any bit is set in the typeless value, a .TRUE. is assigned to the logical. Otherwise a .FALSE. value is given. Multics Technical Bulletin MTB-683 Fortran Typeless Functions. 4. The Typeless Functions None of the typeless functions requires any runtime support routines - all can be generated with inline code. A description of each function and the required ALM code is given: 4.1. The AND Function The AND function returns a bit by bit logical product of its two or more arguments. All arguments must have a one word data type. The alm code for the AND function is very simple: ldq (argument 1) anq (argument 2) ... anq (argument N) The result is in the Q register. 4.2. The BOOL Function This function returns its single argument as a typeless bit string. Its function is analogous to the PL/1 unspec function. The argument must have a one word data type. No alm code is necessary to perform the type conversion. 4.3. The COMPL Function The COMPL function returns a bit string which is the one's complement of its single argument. The argument must have a one word data type. The alm code: lcq 1,dl erq (argument) The result is now in the Q register. MTB-683 Multics Technical Bulletin Fortran Typeless Functions. 4.4. The FLD Function The FLD function is used to manipulate individual bits and is a special case. It is the only function that can appear on the left hand side of an assignment statement as well as on the right hand side. 4.4.1. The FLD Function on The Right Hand Side The FLD function takes three arguments. The first two arguments are integer expressions where 0 <= first argument <= 35, 1 <= second argument <= 36, and the sum of argument one and argument two must not be greater than 36. This function extracts a bit field of argument2 bits from a 36 bit string represented by argument3. The field is extracted starting from argument1 - counting from left to right where the 0'th bit is the leftmost. The resulting field is right justified and the remaining bits are set to zero. The alm for this function is: ldq (argument3) load the value into the Q lda (argument1) load the starting position into A qls 0,al shift Q left by the A lca (argument2) load the negated string length qrl 36,al shift Q right by 36-string length The result is in the Q register. A few optimizations can be made with constant arguments. If the value of the first or second argument is known at compile time, it would not have to be loaded into the A register to be used as an offset for a shift instruction. Instead, a shift of a constant amount would be generated. In addition, if the first argument was a zero, the first shift instruction, "qls", would not be needed. If the first argument is zero and the second argument is thirty-six, then no shifting would be needed at all. If the field to be extracted is right justified in argument three (i.e. if 36 - (argument1 + argument2) = 0), then a single "anq" of a bit mask could be generated. 4.4.2. The FLD Function on The Left Hand Side The three arguments to the FLD function are the same on the left hand side as they are on the right hand side, with the exception that the third argument must be a variable. The argument2 rightmost bits of the value to be assigned is inserted into argument3 starting at the bit position indicated be argument1. Multics Technical Bulletin MTB-683 Fortran Typeless Functions. It would be easy to generate a single EIS intruction to perform the insertion, but the start up time for such an instruction is relatively slow. The following ALM sequence executes in less time than an equivalent EIS intruction. lxl0 (argument 1) load initial bit position in X0 lxl1 (argument 2) load string length in X1 lda (argument 3) load word to be updated in A alr 0,x0 rotate left until the field alr 0,x1 is right justified in the A era (assigned value) xor in the new bit string ldq 0,dl zero the Q lrs 0,x1 put the field into the correct qrl 0,x0 position in the Q ersq (argument 3) xor with origional word. The variable to be changed (argument 3) now has the new bits inserted in the correct place. If one of the first two arguments is constant, only one X register would have to be loaded in the above code. As well, only a single "alr" instruction would be needed. If both the first and the second arguments are constant, a bit mask can be generated and the code shorted even more. lda (assigned value) als (36 - argument1 - argument2) era (argument 3) ana (bit mask) ersa (argument 3) A further optimization can be made by excluding the second instruction, "als", if (36 - argument1 - argument2) is zero or if the assigned value itself is constant (as the left shift could be done at compile time). If the first argument is zero and the second argument thirty-six, then a simple assignment could be generated. 4.5. The OR Function This function returns the bit by bit logical sum of its two or more arguments. All arguments must have a one word data type. The alm code: ldq (argument 1) orq (argument 2) ... orq (argument N) MTB-683 Multics Technical Bulletin Fortran Typeless Functions. The result is in the Q register. 4.6. The XOR Function This function returns the bit by bit "exclusive or" of its two or more arguments. All arguments must have a one word data type. The alm code: ldq (argument 1) erq (argument 2) ... erq (argument N) The result is left in the Q register. Multics Technical Bulletin MTB-683 Fortran Typeless Functions. 5. The New Nontypeless Functions GCOS Fortran has four integer functions that perform bit shifting operations. These builtins were added to Multics because of their natural relation to the typeless functions. Each of the following integer functions accepts two arguments. Both arguments are integer expressions. The returned integer value is the first argument shifted (or rotated) by the number of bit positions indicated by the second argument. A minor extension has been made to the Multics implementation: the first argument to each of the functions may be a typeless expression. 5.1. The ilr Function This function returns an integer value derived from left rotating the first argument by the number of bit positions indicated by the second argument. The ALM code: ldq (argument 1) lda (argument 2) qlr 0,al The result is in the Q register. 5.2. The ils Function This function returns an integer value derived from shifting the first argument left by the number of bit positions indicated by the second argument. The ALM code: ldq (argument 1) lda (argument 2) qls 0,al The result is left in the Q register. 5.3. The irl Function This function returns an integer value derived from right shifting (without sign extension) the first argument by the number of bit positions indicated by the second argument. MTB-683 Multics Technical Bulletin Fortran Typeless Functions. The ALM code: ldq (argument 1) lda (argument 2) qrl 0,al The result is in the Q register. 5.4. The irs Function This function returns an integer value derived from right shifting (with sign extension) the first argument by the number of bit positions indicated by the second argument. The ALM code: ldq (argument 1) lda (argument 2) qrs 0,al The result is in the Q register.