<> <> <> <> < const4.>> <> <> <<>> <> DIRECTORY Basics USING [BITXOR], DragOpsCross USING [XopBase, TrapBase, TrapWidthBytes, bytesPerWord, TrapIndex, Word], --Word, wordsPerPage, bytesPerWord, charsPerWord, bitsPerByte, bitsPerCharacter, bitsPerWord, bytesPerPage, logWordsPerPage, logBitsPerByte, logBitsPerChar, logBytesPerWord, logCharsPerWord, logBitsPerWord, logBytesPerPage, PageCount, PageNumber, maxPagesInVM, SixBitIndex, FiveBitIndex, TwoWords, FourBitIndex, Half, ThreeBitIndex, FourHalves, TwoHalves, Byte, ZerosByte, OnesByte, EightBytes, FourBytes, ByteIndex, BytesPerWord, TwoBytes, Comparison, ByteAddress, WordAddress, FieldDescriptor, RegIndex, PadByte, Lit8, Op4, Op8, JDist8, Inst, OIFormat, OQBformat, LRformat, QRformat, ShortRegQR, OBformat, LRBformat, RRformat, ODBformat, LRRBformat, RJBformat, ShortRegRJB, JBBformat, TrapWidthWords, TrapWidthBytes, XopBase, TrapBase, KernalLimit, TrapIndex, StackUnderflowTrap, IFUPageFaultTrap, ResetTrap, IFUStackOverflowTrap, EUStackOverflowTrap, RescheduleTrap, ALUCondFalse, ALUCondEZ, ALUCondLZ, ALUCondLE, ALUCondSpare, ALUCondNE, ALUCondGE, ALUCondGZ, ALUCondOver, ALUCondBC, ALUCondIL, ALUCondDO, ALUCondNotOver, ALUCondNB, ALUCondNI, ModeFault, MemAccessFault, IOAccessFault, EUPageFault, EUWriteFault, AUFault, euStack, euJunk, euToKBus, euMAR, euField, euConstant, euAux, euBogus, euLast, ifuYoungestL, ifuYoungestPC, ifuEldestL, ifuEldestPC, ifuSLimit, ifuBogus, ifuL, ifuS, ifuPC, ifuLast, EURegs, EULegalRegs, IFURegs, IFULegalRegs, StackedStatusWord, IFUStackIndex, IFUStackSize, IFUOverflow, EUStackIndex, EUStackSize, EULocalIndex, EULocals, EUAuxIndex, EUAuxRegs, EUConstIndex, EUConstants, IOLocation, ioRescheduleRequest, ioResetRequest, IOOperand, PCmdFormat, PCmdByteSelect, PCmdClass, PCmdSpace, PCmdDirection DragOpsCrossUtils USING [CardToWord], --InstToBytes, InstToFormat, BytePCToWordAddress, WordAddressToBytePC, IOOperandToCard, CardToIOOperand, FieldDescriptorToCard, CardToFieldDescriptor, BytesToWord, BytesToHalf, WordToBytes, HalfToBytes, HalvesToWord, WordToHalves, HighHalf, LowHalf, LeftHalf, RightHalf, SwapHalves, WordToInt, IntToWord, WordToCard, HalfToCard, ByteToCard, CardToWord, CardToHalf, CardToByte, DragAnd, DragOr, DragXor, DragNot, VanillaAdd, VanillaSub, AddDelta, HalfNot, HalfAnd, HalfOr, HalfXor, HalfShift, DoubleWordShiftLeft, SingleWordShiftLeft, SingleWordShiftRight, XopToBytePC, TrapIndexToBytePC, FieldUnit HandCoding, --Has opcode and register defs. HandCodingPseudos, --Label, SetLabel, GenLabel, GenLabelHere, UseLabel8A, UseLabel8B, UseLabel16, UseLabel32, LReg, PReg, SReg, AddReg, SubReg, SetRegConst, MoveReg, MoveRegI, LRegI, IndexedJump, ProcedureEntry, ProcedureExit, SetupField, ExtractField, ShiftLeft, LoadProcessorReg, StoreProcessorReg, CauseReschedule, CauseReset, GetSPLimit, SetSPLimit, GetYoungestPC, GetYoungestStatus, GetEldestPC, GetEldestStatus, SetYoungestPC, SetYoungestStatus, SetEldestPC, SetEldestStatus, Pause, Halt HandCodingSupport; --Area, GetProc, PutProc, ProcList, NewArea, GenWithArea, Gen1WithArea, ForceOut, GetCurrentArea, LoadArea, GetOutputPC, SetOutputPC, WordAlign, ReserveData, OutputByte, OutputOneByte, OutputAlphaBeta, OutputAlphaBetaGammaDelta, OutputWord GenLICJ: CEDAR PROGRAM IMPORTS Basics, DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport = BEGIN OPEN DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport; Word: TYPE = DragOpsCross.Word; All: PROC = { <> FillXop: PROC [inst: CARDINAL, dest: Label] = { SetOutputPC[inst * DragOpsCross.TrapWidthBytes + DragOpsCross.XopBase * DragOpsCross.bytesPerWord]; drJDB[UseLabel16[dest]]; }; FillTrap: PROC [tx: DragOpsCross.TrapIndex, dest: Label] = { SetOutputPC[LOOPHOLE[tx, CARDINAL] * DragOpsCross.TrapWidthBytes + DragOpsCross.TrapBase * DragOpsCross.bytesPerWord]; drJDB[UseLabel16[dest]]; }; area: Area = GetCurrentArea[]; const0OK: Label = GenLabel[]; enterLIQBTest: Label = GenLabel[]; enterLIDBTest: Label = GenLabel[]; enterLIBTest: Label = GenLabel[]; enterJEBTest: Label = GenLabel[]; <> <<>> <> <<>> GenLI: PROC = { <> TestE1: PROC [] ~ { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; bad1: Label _ GenLabel[]; drRJEB[left: topSrc, right: belowSrc, dist: UseLabel8B[ok1]]; Pause[]; --Bug: [s] = [s-1] but RJEB didn't jump. SetLabel[ok1]; <> drRJNEB[left: popSrc, right: belowSrcPop, dist: UseLabel8B[bad1]]; drJB[UseLabel8A[ok2]]; SetLabel[bad1]; Pause[]; --Bug: [s] = [s-1] but RJNEB jumped. <> SetLabel[ok2]; }; <> TestE2: PROC [] ~ { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; bad1: Label _ GenLabel[]; drJ1[]; --No-op to preserve alignment drRAND[c: const4, a: topSrc, b: popSrc]; <> drRJEBJ[left: topSrc, right: const4, dist: UseLabel8B[ok1]]; Pause[]; --Bug: [s] = const4 but RJEBJ didn't jump. SetLabel[ok1]; <> drRJNEBJ[left: popSrc, right: const4, dist: UseLabel8B[bad1]]; drJB[UseLabel8A[ok2]]; SetLabel[bad1]; Pause[]; --Bug: [s] = const4 but RJNEB jumped. <> SetLabel[ok2]; }; <> TestNE1: PROC [] ~ { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; bad1: Label _ GenLabel[]; drRJNEB[left: topSrc, right: belowSrc, dist: UseLabel8B[ok1]]; Pause[]; --Bug: [s] # [s-1] but RJNEB didn't jump. SetLabel[ok1]; <> drRJEB[left: popSrc, right: belowSrcPop, dist: UseLabel8B[bad1]]; drJB[UseLabel8A[ok2]]; SetLabel[bad1]; Pause[]; --Bug: [s] # [s-1] but RJEB jumped. <> SetLabel[ok2]; }; <> TestNE2: PROC [] ~ { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; bad1: Label _ GenLabel[]; drJ1[]; --No-op to preserve word alignment drRAND[c: const4, a: topSrc, b: popSrc]; drRJNEBJ[left: topSrc, right: const4, dist: UseLabel8B[ok1]]; Pause[]; --Bug: [s] # const4 but RJNEBJ didn't jump. SetLabel[ok1]; <> drRJEBJ[left: popSrc, right: const4, dist: UseLabel8B[bad1]]; drJB[UseLabel8A[ok2]]; SetLabel[bad1]; Pause[]; --Bug: [s] # const4 but RJEBJ jumped. <> SetLabel[ok2]; }; GenLIQBTest: PROC [value: LONG CARDINAL] = { w: Word _ CardToWord[value]; <> nw: Word _ CardToWord[LOOPHOLE[- LOOPHOLE[value, INT] - 1, LONG CARDINAL]]; z: Word _ CardToWord[0]; nz: Word _ CardToWord[37777777777B]; <> drLIQB[w]; drLIQB[w]; TestE1[]; drLIQB[w]; drLIQB[z]; TestNE1[]; drLIQB[z]; drLIQB[w]; TestNE1[]; drLIQB[nw]; drLIQB[nz]; TestNE1[]; drLIQB[nz]; drLIQB[nw]; TestNE1[]; drLIQB[nw]; drLIQB[nw]; TestE1[]; <> drLIQB[w]; drLIQB[w]; TestE2[]; drLIQB[w]; drLIQB[z]; TestNE2[]; drLIQB[z]; drLIQB[w]; TestNE2[]; drLIQB[nw]; drLIQB[nz]; TestNE2[]; drLIQB[nz]; drLIQB[nw]; TestNE2[]; drLIQB[nw]; drLIQB[nw]; TestE2[]; }; <> GenLIDBTest: PROC [value: CARDINAL] = { w: Word _ CardToWord[LONG[value]]; drLIDB[value]; drLIQB[w]; TestE1[]; }; <> GenLIBTest: PROC [value: CARDINAL] = { drLIB[value]; drLIDB[value]; TestE1[]; }; <> GenJEBTest: PROC [value: CARDINAL] = { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; ok3: Label _ GenLabel[]; ok4: Label _ GenLabel[]; bad: Label _ GenLabel[]; notValue: CARDINAL _ Basics.BITXOR[value, 377B]; drLIB[value]; drJEBB[value, UseLabel8B[ok1]]; Pause[]; --JEBB should have jumped but didn't SetLabel[ok1]; drLIB[value]; drJNEBB[0, UseLabel8B[ok2]]; Pause[]; --JNEBB should have jumped but didn't SetLabel[ok2]; drLIB[value]; drJEBB[0, UseLabel8B[bad]]; drLIB[value]; drJNEBB[value, UseLabel8B[bad]]; drLIB[notValue]; drJEBBJ[377B, UseLabel8B[bad]]; drLIB[notValue]; drJNEBBJ[notValue, UseLabel8B[bad]]; drLIB[notValue]; drJEBBJ[notValue, UseLabel8B[ok3]]; Pause[]; --JEBBJ should have jumped but didn't SetLabel[ok3]; drLIB[notValue]; drJNEBBJ[377B, UseLabel8B[ok4]]; SetLabel[bad]; Pause[]; SetLabel[ok4]; }; val: LONG CARDINAL _ 1; hval: CARDINAL _ 1; bval: CARDINAL _ 1; jval: CARDINAL _ 1; WordAlign[area]; SetLabel[enterLIQBTest]; <> drJ1[]; drJ1[]; drJ1[]; UNTIL val = 0 DO GenLIQBTest[val]; val _ val + val; ENDLOOP; SetLabel[enterLIDBTest]; UNTIL hval = 0 DO GenLIDBTest[hval]; hval _ hval + hval; ENDLOOP; SetLabel[enterLIBTest]; UNTIL bval = 400B DO GenLIBTest[bval]; bval _ bval + bval; ENDLOOP; SetLabel[enterJEBTest]; UNTIL jval = 400B DO GenJEBTest[jval]; jval _ jval + jval; ENDLOOP; }; <> drLC0[]; drJEBB[0, UseLabel8B[const0OK]]; Pause[]; --const0 wrong SetLabel[const0OK]; <<**Don't remove this jump; code alignment is important here.**>> drJDB[UseLabel16[enterLIQBTest]]; GenLI[]; Halt[177777B]; --Terminate here at the end of the program }; END. <<>>