<> <> <> <<>> <> <> 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.