DIRECTORY Basics, IO, DragOpsCross, DragOpsCrossUtils, HandCoding, HandCodingSupport, HandCodingPseudos; GenMulDivFPTest: CEDAR PROGRAM IMPORTS Basics, DragOpsCrossUtils, HandCoding, HandCodingPseudos, IO = BEGIN OPEN DOC: DragOpsCross, DOCU: DragOpsCrossUtils, HC: HandCoding, HCP: HandCodingPseudos; fpModeNibble0: HC.Lit8 = 300B; fpModeNibble1: HC.Lit8 = 320B; fpU32ToD32Ex: HC.Lit8 = 64 + 48; fpU64ToD64Ex: HC.Lit8 = 64 + 49; fpD32ToW32: HC.Lit8 = 64 + 50; ffppD64ToW64: HC.Lit8 = 64 + 51; fpU32ToD32: HC.Lit8 = 64 + 52; fpU64ToD64: HC.Lit8 = 64 + 53; fpF32ToI32: HC.Lit8 = 64 + 56; fpF64ToI32: HC.Lit8 = 64 + 57; fpI32ToF32: HC.Lit8 = 64 + 58; fpI32ToF64: HC.Lit8 = 64 + 59; fpF32ToF64: HC.Lit8 = 64 + 60; fpF64ToF32: HC.Lit8 = 64 + 61; fpSubF32: HC.Lit8 = 64 + 0; fpSubF64: HC.Lit8 = 64 + 1; fpAbsSubF32: HC.Lit8 = 64 + 2; fpAbsSubF64: HC.Lit8 = 64 + 3; fpNegF32: HC.Lit8 = 64 + 8; fpNegF64: HC.Lit8 = 64 + 9; fpNegAbsF32: HC.Lit8 = 64 + 12; fpNegAbsF64: HC.Lit8 = 64 + 13; fpAddF32: HC.Lit8 = 64 + 16; fpAddF64: HC.Lit8 = 64 + 17; fpAbsAddF32: HC.Lit8 = 64 + 18; fpAbsAddF64: HC.Lit8 = 64 + 19; fpAddAbsF32: HC.Lit8 = 64 + 20; fpAddAbsF64: HC.Lit8 = 64 + 21; fpPassF32: HC.Lit8 = 64 + 24; fpPassF64: HC.Lit8 = 64 + 25; fpPassAbsF32: HC.Lit8 = 64 + 28; fpPassAbsF64: HC.Lit8 = 64 + 29; fpCompF32: HC.Lit8 = 64 + 32; fpCompF64: HC.Lit8 = 64 + 33; fpCompNegF32: HC.Lit8 = 64 + 34; fpCompNegF64: HC.Lit8 = 64 + 35; fpCompAbsF32: HC.Lit8 = 64 + 36; fpCompAbsF64: HC.Lit8 = 64 + 37; fpCompF32Zero: HC.Lit8 = 64 + 40; fpCompF64Zero: HC.Lit8 = 64 + 41; fpMultF32: HC.Lit8 _ FPMulCode[double: FALSE]; fpMultF64: HC.Lit8 _ FPMulCode[double: TRUE]; FPMulCode: PROC[ double: BOOL _ FALSE, bMagnitude: BOOL _ FALSE, aMagnitude: BOOL _ FALSE, bWrapped: BOOL _ FALSE, aWrapped: BOOL _ FALSE, comp: BOOL _ FALSE ] RETURNS[lit: HC.Lit8] = { lit _ 128; IF comp THEN lit _ lit + 32; IF aWrapped THEN lit _ lit + 16; IF bWrapped THEN lit _ lit + 8; IF aMagnitude THEN lit _ lit + 4; IF bMagnitude THEN lit _ lit + 2; IF double THEN lit _ lit + 1 }; LdCard: PROC[val: DOCU.CARD] = {HC.drLIQB[DOCU.CardToWord [val]]}; CkCard: PROC[val: DOCU.CARD] = {LdCard[val]; Check[]}; Check: PROC = { checkLabel: HCP.Label = HCP.GenLabel[]; labelRope: IO.ROPE _ IO.PutFR["MulDivFPTest.Check%03g", IO.card[checkIndex]]; HC.drRJEBJ[popLeft: FALSE, right: HC.popSrc, dist: HCP.UseLabel8[checkLabel]]; HCP.Halt[checkIndex]; HCP.SetLabel[checkLabel]; HCP.MakeLabelGlobal[labelRope, checkLabel]; checkIndex _ checkIndex + 1 }; CkDiv: PROC[divisor, quotient, remainder: DOCU.CARD] = { dividendHi, dividendLo, delta: DOCU.CARD; [dividendHi, dividendLo] _ MulCard [divisor, quotient]; delta _ 37777777777B-dividendLo; IF delta < remainder THEN {dividendLo _ remainder-delta-1; dividendHi_dividendHi+1} ELSE {dividendLo _ remainder+dividendLo}; LdCard[dividendHi]; LdCard[dividendLo]; LdCard[divisor]; HC.drUDIV[]; CkCard[remainder]; HC.drDIS[]; CkCard[quotient]; HC.drDIS[] }; CkMul: PROC[type: {unsigned, signed}, v1, v2: DOCU.CARD] = { m, l: DOCU.CARD; [m, l] _ MulInt[v1, v2]; LdCard[v1]; LdCard[v2]; HC.drSMUL[]; CkCard[l]; HC.drDIS[]; -- Check LSW CkCard[m]; HC.drDIS[] }; -- Check MSW MulCard: PROC[v1, v2: DOCU.CARD] RETURNS[m, l: DOCU.CARD] = { a, b, lsw, Ab, aB, msw, acc: Basics.LongNumber; a.lc _ v1; b.lc _ v2; lsw.lc _ Basics.LongMult[a.lowbits, b.lowbits]; Ab.lc _ Basics.LongMult[a.highbits, b.lowbits]; aB.lc _ Basics.LongMult[a.lowbits, b.highbits]; msw.lc _ Basics.LongMult[a.highbits, b.highbits]; acc.lc _ LONG[Ab.lowbits] +LONG[aB.lowbits] +LONG[lsw.highbits]; lsw.highbits _ acc.lowbits; msw.lc _ msw.lc +LONG[Ab.highbits] +LONG[aB.highbits] +LONG[acc.highbits]; RETURN[msw.lc, lsw.lc] }; MulInt: PROC[v1, v2: DOCU.CARD] RETURNS[m, l: DOCU.CARD] = { negResult: BOOL; a, b: Basics.LongNumber; a.lc _ v1; b.lc _ v2; negResult _ (a.li < 0) # (b.li < 0); IF a.lc IN (20000000000B..37777777777B] THEN a.li _ -a.li; IF b.lc IN (20000000000B..37777777777B] THEN b.li _ -b.li; [a.lc, b.lc] _ MulCard[a.lc, b.lc]; IF negResult THEN { IF a.lc # 20000000000B THEN a.li _ -a.li; IF b.lc # 20000000000B THEN b.li _ -b.li; a.li _ a.li -(IF b.lc=0 THEN 0 ELSE 1) }; RETURN[a.lc, b.lc] }; Abs: PROC[int: DOCU.CARD] RETURNS[abs: DOCU.CARD] = { a: Basics.LongNumber; a.lc _ int; IF int IN (20000000000B..37777777777B] THEN a.li _ -a.li; RETURN[a.lc] }; checkIndex: CARDINAL _ 0; All: PROC = { startLabel: HCP.Label = HCP.GenLabelHere[]; endLabel: HCP.Label = HCP.GenLabel[]; card: ARRAY [0..10) OF DOCU.CARD = [ 0B, 1B, 1415926535, 7777777776B, 17777777777B, 20000000000B, 20000000001B, 3141592653, 37777777776B, 37777777777B ]; HC.drFP[fpModeNibble0]; -- C0 HC.drFP[fpModeNibble1]; -- D0 HC.drLC6[]; -- -1 HC.drSHL[DragOpsCrossUtils.FieldDescriptorToCard[[insert: FALSE, mask: 32, shift: 16]]]; HCP.StoreProcessorReg[ifuFPMaskFlags]; CkDiv[12431251407B, 20000000000B, 27320163115B]; CkDiv[1415926535, 2147483648, 3141592653]; CkDiv[20000000001B, 37777777776B, 0]; CkDiv[20000000001B, 37777777776B, 0]; CkDiv[20000000001B, 37777777776B, 1]; CkDiv[20000000001B, 37777777776B, 2]; CkDiv[20000000001B, 37777777776B, 0]; CkDiv[20000000001B, 37777777776B, 37777777776B]; FOR d: CARDINAL IN [1..10) DO FOR q: CARDINAL IN [0..10) DO FOR r: CARDINAL IN [0..10) DO divisor, quotient, remainder: Basics.LongNumber; divisor.lc _ card[d]; quotient.lc _ card[q]; remainder.lc _ card[r]; IF remainder.lc < divisor.lc THEN CkDiv[card[d], card[q], card[r]]; IF Abs[remainder.lc] >= Abs[divisor.lc] THEN LOOP; IF (divisor.li<0) = (remainder.li<0) THEN CkDiv[card[d], card[q], card[r]]; IF ((divisor.li<0) # (quotient.li<0)) = (remainder.li<0) THEN CkDiv[card[d], card[q], card[r]]; ENDLOOP ENDLOOP; ENDLOOP; HCP.LoadProcessorReg[ifuFPModeAlu]; HCP.LoadProcessorReg[ifuFPModeMult]; HCP.LoadProcessorReg[ifuFPMaskFlags]; HCP.SetLabel[endLabel]; HCP.MakeLabelGlobal["MulDivFPTest.End", endLabel]; HCP.Halt[255]; }; END. κGenMulDivFPTest.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Last edited by Curry, August 26, 1984 11:52:32 am PDT To create quad file: quad -chx GenMulDivFPTest.quad _ GenBasics GenMulDivFPTest Floating point function codes Initialize FP LdCard[123]; -- 7B HC.drFP[fpI32ToF32]; -- 42F60000 40005B/173000B LdCard[321]; -- 141 HC.drFP[fpI32ToF32]; -- 43A08000 40007B/120200B HC.drFP[fpAddF32]; -- 43DE0000 40007B/157000B HC.drFP[fpF32ToI32]; CkCard[123+321]; LdCard[123]; -- 7B HC.drFP[fpI32ToF32]; -- 42F60000 40005B/173000B LdCard[321]; -- 141 HC.drFP[fpI32ToF32]; -- 43A08000 40007B/120200B HC.drFP[fpMultF32]; -- 43DE0000 40007B/157000B HC.drFP[fpF32ToI32]; CkCard[123*321]; FOR i: CARDINAL IN [0..8) DO FOR j: CARDINAL IN [0..8) DO CkUMul [card[i], card[j]]; CkMul [card[i], card[j]] ENDLOOP ENDLOOP; LdCard[963]; HC.drDIV[]; HC.drDIS[]; LdCard[123]; HC.drFP[fpI32ToF32]; LdCard[321]; HC.drFP[fpI32ToF32]; HC.drFP[fpSubF32]; HC.drFP[fpNegF32]; HC.drFP[fpF32ToI32]; LdCard[123]; HC.drFP[fpI32ToF32]; LdCard[321]; HC.drFP[fpI32ToF32]; HC.drFP[fpSubF32]; HC.drFP[fpF32ToI32]; LdCard[41]; HC.drFP[fpI32ToF32]; LdCard[963]; HC.drFP[fpI32ToF32]; HC.drFP[fpMultF32]; HC.drFP[fpF32ToI32]; LdCard[41]; HC.drFP[fpI32ToF64]; LdCard[963]; HC.drFP[fpI32ToF64]; HC.drFP[fpMultF64]; HC.drFP[fpF64ToI32]; LdCard[prod]; HC.drFP[fpI32ToF32]; HC.drFP[fpCompF32]; LdCard[41]; HC.drFP[fpI32ToF64]; LdCard[963]; HC.drFP[fpI32ToF64]; HC.drFP[fpMultF64]; LdCard[prod]; HC.drFP[fpI32ToF64]; HC.drFP[fpCompF64]; LdCard[41]; HC.drFP[fpI32ToF64]; HC.drFP[fpF64ToF32]; HC.drFP[fpF32ToF64]; HC.drFP[fpF64ToI32]; LdCard[M41]; HC.drFP[fpI32ToF64]; HC.drFP[fpF64ToF32]; HC.drFP[fpF32ToF64]; HC.drFP[fpF64ToI32]; Κ Θ– "cedar" style˜šœ™Jšœ<™Jšœ%˜)—Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœœ ˜Jšœœ ˜ J˜—šžœœ#œœ˜Jšœ/˜/Jšœ ˜ Jšœ ˜ Jšœ1˜1Jšœ1˜1Jšœ1˜1Jšœ2˜2Jšœ œœœ˜BJšœ˜Jšœœœœ˜KJšœ˜—J˜š žœœ  œœ œ˜=Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ$˜$Jšœ&œ˜:Jšœ&œ˜:Jšœ#˜#šœ œ˜Jšœœ˜)Jšœœ˜)Jšœ œœœ˜)—Jšœ˜—J˜šžœœœœœœœ˜6Jšœ!˜!Jšœœœ˜9Jšœ ˜—J˜Jšœ œ˜J˜šžœœ˜ Jšœ œ œ˜+Jšœ œ œ ˜&šœœ œ œ˜$JšœF˜FJšœE˜E—J˜™ JšœŸ˜JšœŸ˜JšœŸ˜Jšœ8œ˜XJšœ#˜&—J˜Jšœ0˜0Jšœ,˜,J™Jšœ%˜%Jšœ%˜%Jšœ%˜%Jšœ%˜%Jšœ%˜%Jšœ0˜0J˜šœœœ ˜šœœœ ˜šœœœ ˜Jšœ0˜0Jšœ˜Jšœ˜Jšœ˜šœ˜!Jšœ!˜!—Jšœ&œœ˜2šœ"˜$Jšœ"˜&—šœ6˜8Jšœ"˜&—Jš˜—Jšœ˜—Jšœ˜—˜Jšœ™Jšœ0™0Jšœ™Jšœ0™0Jšœ.™.Jšœ™J™J™Jšœ™Jšœ0™0Jšœ™Jšœ0™0Jšœ/™/Jšœ™J™J™šœœœ™šœœœ™Jšœ™Jšœ™Jš™—Jšœ™——˜Jšœ ™ Jšœ ™ Jšœ ™ J™Jšœ ™ Jšœ™Jšœ ™ Jšœ™Jšœ™Jšœ™Jšœ™J™Jšœ ™ Jšœ™Jšœ ™ Jšœ™Jšœ™Jšœ™J™Jšœ ™ Jšœ™Jšœ ™ Jšœ™Jšœ™Jšœ™J™Jšœ ™ Jšœ™Jšœ ™ Jšœ™Jšœ™Jšœ™J˜Jšœ ™ Jšœ™Jšœ™J™Jšœ ™ Jšœ™Jšœ ™ Jšœ™Jšœ™Jšœ ™ Jšœ™Jšœ™J˜Jšœ ™ Jšœ™Jšœ™Jšœ™Jšœ™J™Jšœ ™ Jšœ™Jšœ™Jšœ™Jšœ™—J˜Jšœ ˜#Jšœ!˜$Jšœ"˜%J˜Jšœ˜Jšœ/˜2J˜Jšœ ˜J˜J˜J˜J˜—Jšœ˜—J˜J˜—…—n)