1 ------------------------------------------------------------------------------ 2 ------------------------------------------------------------------------------ 3 -- This file is part of 'Finite Field Arithmetic', aka 'FFA'. -- 4 -- -- 5 -- (C) 2019 Stanislav Datskovskiy ( www.loper-os.org ) -- 6 -- http://wot.deedbot.org/17215D118B7239507FAFED98B98228A001ABFFC7.html -- 7 -- -- 8 -- You do not have, nor can you ever acquire the right to use, copy or -- 9 -- distribute this software ; Should you use this software for any purpose, -- 10 -- or copy and distribute it to anyone or in any manner, you are breaking -- 11 -- the laws of whatever soi-disant jurisdiction, and you promise to -- 12 -- continue doing so for the indefinite future. In any case, please -- 13 -- always : read and understand any software ; verify any PGP signatures -- 14 -- that you use - for any purpose. -- 15 -- -- 16 -- See also http://trilema.com/2015/a-new-software-licensing-paradigm . -- 17 ------------------------------------------------------------------------------ 18 ------------------------------------------------------------------------------ 19 20 with W_Shifts; use W_Shifts; 21 22 23 package body FZ_Shift is 24 25 -------------------------------------------------------------- 26 -- Shift Right 27 -------------------------------------------------------------- 28 29 -- ShiftedN := N >> Count (with Overflow Input and Output) 30 -- WARNING: OF_in MUST be of valid bit-width for the shift! 31 procedure FZ_ShiftRight_O_I(N : in FZ; 32 ShiftedN : out FZ; 33 Count : in WBit_Index; 34 Overflow : out Word; 35 OF_in : in Word) is 36 Ni : Word; 37 Carry : Word := OF_in; 38 begin 39 for i in reverse N'Range loop 40 Ni := N(i); 41 ShiftedN(i) := Shift_Right(Ni, Count) or Carry; 42 Carry := Shift_Left(Ni, Bitness - Count); 43 end loop; 44 Overflow := Carry; 45 end FZ_ShiftRight_O_I; 46 47 48 -- ShiftedN := N >> Count (with Overflow Output only) 49 procedure FZ_ShiftRight_O(N : in FZ; 50 ShiftedN : out FZ; 51 Count : in WBit_Index; 52 Overflow : out Word) is 53 begin 54 FZ_ShiftRight_O_I(N, ShiftedN, Count, Overflow, 0); 55 end FZ_ShiftRight_O; 56 57 58 -- ShiftedN := N >> Count (no Overflow output or input) 59 procedure FZ_ShiftRight(N : in FZ; 60 ShiftedN : out FZ; 61 Count : in WBit_Index) is 62 Overflow : Word; 63 pragma Unreferenced(Overflow); 64 begin 65 FZ_ShiftRight_O_I(N, ShiftedN, Count, Overflow, 0); 66 end FZ_ShiftRight; 67 68 -------------------------------------------------------------- 69 -- Shift Left 70 -------------------------------------------------------------- 71 72 -- ShiftedN := N << Count (with Overflow Input and Output) 73 -- WARNING: OF_in MUST be of valid bit-width for the shift! 74 procedure FZ_ShiftLeft_O_I(N : in FZ; 75 ShiftedN : out FZ; 76 Count : in WBit_Index; 77 Overflow : out Word; 78 OF_in : in Word) is 79 Ni : Word; 80 Carry : Word := OF_in; 81 begin 82 for i in N'Range loop 83 Ni := N(i); 84 ShiftedN(i) := Shift_Left(Ni, Count) or Carry; 85 Carry := Shift_Right(Ni, Bitness - Count); 86 end loop; 87 Overflow := Carry; 88 end FZ_ShiftLeft_O_I; 89 90 91 -- ShiftedN := N << Count (with Overflow Output only) 92 procedure FZ_ShiftLeft_O(N : in FZ; 93 ShiftedN : out FZ; 94 Count : in WBit_Index; 95 Overflow : out Word) is 96 begin 97 FZ_ShiftLeft_O_I(N, ShiftedN, Count, Overflow, 0); 98 end FZ_ShiftLeft_O; 99 100 101 -- ShiftedN := N << Count (no Overflow output or input) 102 procedure FZ_ShiftLeft(N : in FZ; 103 ShiftedN : out FZ; 104 Count : in WBit_Index) is 105 Overflow : Word; 106 pragma Unreferenced(Overflow); 107 begin 108 FZ_ShiftLeft_O_I(N, ShiftedN, Count, Overflow, 0); 109 end FZ_ShiftLeft; 110 111 end FZ_Shift;