*TITLEARMVE -- MOVE ELEMENTS FROM ONE ARRAY TO ANOTHER 00010006 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** *A AUTHOR R. MCMILLAN 00020006 *A DESIGNER ACIE NOBLES (IBM) 00030006 *A LANGUAGE S/370 ASSEMBLER 00040006 *A SYSTEM IBM (SEE CRAY) 00050006 *A WRITTEN 04/11/89 00060006 * REVISED 05/15/89 REM. TEST N FOR LE 0. 00070006 *A 00080006 *A 00090006 *A CALL ARMVE (A, B, N) 00100006 *A 00110006 *A IN/OUT ARGUMENT TYPE DESCRIPTION 00120006 *A 00130006 *A IN A I4/R4 REAL OR INTEGER ARRAY TO BE MOVED 00140006 *A OUT B I4/R4 REAL OR INTEGER ARRAY FOR RECEIVING 00150006 *A IN N I4 NUMBER OF ELEMENTS TO BE MOVED 00160006 *A 00170006 *A 00180006 *A ARMVE MOVES THE N SINGLE-WORD ELEMENTS IN A TO B. OVERLAYING OF 00190006 *A THE INPUT ARRAY IS PROPERLY CORRECTED FOR BY FORWARD OR REVERSE 00200006 *A MOVING AS REQUIRED. TO MOVE COMPLEX ARRAYS USE A DOUBLE N. 00210006 *AEND 00220006 * 00230006 MACRO 00240006 &NAME SAVE &NN 00250006 * 00260006 &NAME CSECT 00270006 B 12(0,R15) 00280006 &NAME.P1 DC X'06' 00290006 DC CL7'&NAME' 00300006 STM R14,R12,12(R13) 00310006 BALR BASER,0 00320006 USING *,BASER 00330006 ST R13,&NAME.SS+4 BACK CHAIN 00340006 LA R2,&NAME.SS 00350006 ST R2,8(,R13) FORWARD CHAIN 00360006 LR R13,R2 SAVE IN R13 FOR VECSIM 00370006 B &NAME.SS+86 00380006 AIF ('&NN' NE 'N').SVNN 00390006 * 00400006 &NAME.NN DC F'0' 00410006 * 00420006 .SVNN ANOP 00430006 * 00440006 &NAME.SS DC 18F'0' 00450006 * 00460006 &NAME.XX L R13,4(,R13) RECOVER CALLERS SAVE AREA 00470006 LM R14,R12,12(R13) 00480006 MVI 12(R13),X'FF' INDICATE RETURN FOR FORTRAN 00490006 BR R14 00500006 * 00510006 MEND 00520006 * 00530006 * 00540006 * ********************************************************************* 00550006 * 00560006 R0 EQU 0 00570006 R1 EQU 1 00580006 R2 EQU 2 00590006 R3 EQU 3 00600006 R4 EQU 4 00610006 R5 EQU 5 00620006 R6 EQU 6 00630006 R7 EQU 7 00640006 R8 EQU 8 00650006 R9 EQU 9 00660006 R10 EQU 10 00670006 R11 EQU 11 00680006 R12 EQU 12 00690006 R13 EQU 13 00700006 R14 EQU 14 00710006 R15 EQU 15 00720006 BASER EQU R10 00730006 V0 EQU 0 00740006 * 00750006 * ********************************************************************* 00760006 * 00770006 ARMVE SAVE 00780006 LM R3,R5,0(R1) (A,B,N) B(I)=A(I) 00790006 L R15,0(,R5) GET "N" - # OF ELEMENTS 00800006 LTR R15,R15 N <= 0? 00810006 BNP ARMVEXX 00820006 * 00830006 ARMVE10 LR R2,R3 MOVE "A" ADDR TO R2 FOR MVCL 00840006 LR R3,R15 00850006 SLL R3,2 CONVERT "N" TO BYTES 00860006 LR R5,R3 MAKE "B" LENGTH SAME AN "A" 00870006 MVCL R4,R2 DO MOVE IF NOT OVERLAPPING 00880006 BZ ARMVEXX OK - DONE: NO OVERLAPPING 00890006 * 00900006 * ARRAYS OVERLAP: USE VECTORS TO MOVE FROM BACK TO FRONT OF ARRAYS 00910006 * 00920006 ARMVE20 LR R2,R15 GET "N" AGAIN: TO CALC LAST ADDR 00930006 BCTR R2,0 00940006 SLL R2,2 CONVERT TO BYTES 00950006 LM R3,R4,0(R1) GET ARRAY ADDRESSES AGAIN 00960006 AR R3,R2 GET LAST ADDR OF "A" 00970006 AR R4,R2 GET LAST ADDR OF "B" 00980006 L R8,=F'-1' R8 IS "STRIDE" REGISTER 00990006 * 01000006 ARMVE30 VLVCU R15 USE VECTORS FOR MOVE 01010006 VLE V0,R3(R8) 01020006 VSTE V0,R4(R8) 01030006 BP ARMVE30 MORE TO DO? 01040006 B ARMVEXX DONE 01050006 LTORG 01060006 END 01070006