<> <> <> DIRECTORY DragOpsCross USING [FieldDescriptor, OnesWord, Word, ZerosWord], DragOpsCrossUtils USING [DoubleWordShiftLeft, DragAnd, DragNot, DragOr, SingleWordShiftLeft, SingleWordShiftRight]; FieldUnit: CEDAR PROGRAM IMPORTS DragOpsCrossUtils = BEGIN OPEN DragOpsCrossUtils; FieldDescriptor: TYPE = DragOpsCross.FieldDescriptor; Word: TYPE = DragOpsCross.Word; ZerosWord: Word = DragOpsCross.ZerosWord; OnesWord: Word = DragOpsCross.OnesWord; Operate: PROC [Left,Right: Word, fd: FieldDescriptor] RETURNS [out: Word] = { shifter: Word = DoubleWordShiftLeft[Left, Right, fd.shift]; <> mask: Word _ SingleWordShiftRight[OnesWord, 32-fd.mask]; <> IF fd.insert THEN mask _ DragAnd[mask, SingleWordShiftLeft[OnesWord, fd.shift]]; < clear rightmost fd.shift bits of the mask >> out _ DragAnd[mask, shifter]; <<1 bits in the mask select the shifter output>> IF fd.insert THEN out _ DragOr[out, DragAnd[DragNot[mask], Right]]; < 0 bits in the mask select bits from Right to OR in to the result>> }; END. <> FieldDescriptor: TYPE = MACHINE DEPENDENT RECORD [ reserved: [0..15] _ 0, <> insert: BOOL, <> mask: [0..31], <<31-mask gives # of leading 0s in the mask>> shift: [0..32] <> ]; <> <<>> <> <> <> <> <<2**(mask+1)-1 XOR>> <> <> <<(DoubleWord[Left, Right] * 2**shift) AND OnesWord;>> <> <> <> <<};>> Word: TYPE = PACKED ARRAY [0..bitsPerWord) OF BOOL; ZerosWord: Word = LOOPHOLE[LONG[0]]; OnesWord: Word = LOOPHOLE[LONG[-1]]; <> DoubleWordShiftLeft: PROC [w0,w1: Word, dist: SixBitIndex] RETURNS [Word] = TRUSTED INLINE { <> <<<< code omitted >>>> }; SingleWordShiftLeft: PROC [word: Word, dist: SixBitIndex] RETURNS [Word] = TRUSTED INLINE { <> <<<< code omitted >>>> }; SingleWordShiftRight: PROC [word: Word, dist: SixBitIndex] RETURNS [Word] = TRUSTED INLINE { <> <<<< code omitted >>>> }; DragAnd: PROC [a,b: Word] RETURNS [Word] = INLINE { <> <<<< code omitted >>>> }; DragOr: PROC [a,b: Word] RETURNS [Word] = INLINE { <> <<<< code omitted >>>> };