-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathBitwise.Mod
More file actions
220 lines (196 loc) · 5.31 KB
/
Copy pathBitwise.Mod
File metadata and controls
220 lines (196 loc) · 5.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
MODULE Bitwise;
(** This module implements bitwise operations for the INTEGER and BYTE types. *)
IMPORT SYSTEM;
PROCEDURE And8*(a, b: BYTE): BYTE;
(** Perform bitwise AND operation on two bytes. *)
VAR result: SET;
BEGIN
result := SYSTEM.VAL(SET, a) * SYSTEM.VAL(SET, b);
RETURN SYSTEM.VAL(BYTE, result)
END And8;
PROCEDURE And*(a, b: INTEGER): INTEGER;
(** Perform bitwise AND operation on two integers. *)
VAR result: SET;
BEGIN
result := SYSTEM.VAL(SET, a) * SYSTEM.VAL(SET, b);
RETURN SYSTEM.VAL(INTEGER, result)
END And;
PROCEDURE Or8*(a, b: BYTE): BYTE;
(** Perform bitwise OR operation on two bytes. *)
VAR result: SET;
BEGIN
result := SYSTEM.VAL(SET, a) + SYSTEM.VAL(SET, b);
RETURN SYSTEM.VAL(BYTE, result)
END Or8;
PROCEDURE Or*(a, b: INTEGER): INTEGER;
(** Perform bitwise OR operation on two integers. *)
VAR result: SET;
BEGIN
result := SYSTEM.VAL(SET, a) + SYSTEM.VAL(SET, b);
RETURN SYSTEM.VAL(INTEGER, result)
END Or;
PROCEDURE Xor8*(a, b: BYTE): BYTE;
(** Perform bitwise XOR operation on two bytes. *)
VAR result: SET;
BEGIN
result := SYSTEM.VAL(SET, a) / SYSTEM.VAL(SET, b);
RETURN SYSTEM.VAL(BYTE, result)
END Xor8;
PROCEDURE Xor*(a, b: INTEGER): INTEGER;
(** Perform bitwise XOR operation on two integers. *)
VAR result: SET;
BEGIN
result := SYSTEM.VAL(SET, a) / SYSTEM.VAL(SET, b);
RETURN SYSTEM.VAL(INTEGER, result)
END Xor;
PROCEDURE Not8*(a: BYTE): BYTE;
(** Perform bitwise NOT operation on a byte. *)
VAR result: SET;
BEGIN
result := SYSTEM.VAL(SET, 0FFH) - SYSTEM.VAL(SET, a);
RETURN SYSTEM.VAL(BYTE, result)
END Not8;
PROCEDURE Not*(a: INTEGER): INTEGER;
(** Perform bitwise NOT operation on an integer. *)
VAR result: SET;
BEGIN
result := SYSTEM.VAL(SET, 0FFFFFFFFH) - SYSTEM.VAL(SET, a);
RETURN SYSTEM.VAL(INTEGER, result)
END Not;
PROCEDURE ShiftLeft8*(a: BYTE; n: INTEGER): BYTE;
(** Perform shift left operation on a byte. *)
VAR
temp: INTEGER;
result: INTEGER;
BEGIN
temp := a;
IF n >= 8 THEN
result := 0
ELSIF n < 0 THEN
result := a
ELSE
result := LSL(temp, n) MOD 256
END;
RETURN SYSTEM.VAL(BYTE, result)
END ShiftLeft8;
PROCEDURE ShiftRight8*(a: BYTE; n: INTEGER): BYTE;
(** Perform logical shift right operation on a byte. *)
VAR
temp: INTEGER;
result: INTEGER;
BEGIN
temp := a;
IF n >= 8 THEN
result := 0
ELSIF n < 0 THEN
result := a
ELSE
(* For bytes, we always want logical shift (no sign extension) *)
result := temp DIV LSL(1, n) (* Equivalent to logical shift right *)
END;
RETURN SYSTEM.VAL(BYTE, result)
END ShiftRight8;
PROCEDURE RotateLeft8*(a: BYTE; n: INTEGER): BYTE;
(** Perform rotate left operation on a byte. *)
VAR
normalizedN: INTEGER;
temp: INTEGER;
shifted: INTEGER;
overflow: INTEGER;
result: INTEGER;
BEGIN
normalizedN := n MOD 8;
temp := a;
shifted := LSL(temp, normalizedN) MOD 256;
overflow := ASR(temp, 8 - normalizedN);
result := Or(shifted, overflow);
RETURN SYSTEM.VAL(BYTE, result)
END RotateLeft8;
PROCEDURE RotateRight8*(a: BYTE; n: INTEGER): BYTE;
(** Perform rotate right operation on a byte. *)
VAR
normalizedN: INTEGER;
temp: INTEGER;
shifted: INTEGER;
overflow: INTEGER;
result: INTEGER;
BEGIN
normalizedN := n MOD 8;
temp := a;
shifted := ASR(temp, normalizedN);
overflow := LSL(temp, 8 - normalizedN) MOD 256;
result := Or(shifted, overflow);
RETURN SYSTEM.VAL(BYTE, result)
END RotateRight8;
PROCEDURE ShiftLeft*(a: INTEGER; n: INTEGER): INTEGER;
(** Perform shift left operation on an integer. *)
VAR result: INTEGER;
BEGIN
IF n >= 32 THEN
result := 0
ELSIF n < 0 THEN
result := a
ELSE
result := LSL(a, n)
END;
RETURN result
END ShiftLeft;
PROCEDURE ShiftRight*(a: INTEGER; n: INTEGER): INTEGER;
(** Perform arithmetic shift right operation on an integer. *)
VAR result: INTEGER;
BEGIN
IF n >= 32 THEN
IF a < 0 THEN
result := -1
ELSE
result := 0
END
ELSIF n < 0 THEN
result := a
ELSE
result := ASR(a, n)
END;
RETURN result
END ShiftRight;
PROCEDURE LogicalShiftRight*(a: INTEGER; n: INTEGER): INTEGER;
(** Perform logical shift right operation on an integer (fills with zeros). *)
VAR
result: INTEGER;
mask: INTEGER;
BEGIN
IF n >= 32 THEN
result := 0
ELSIF n < 0 THEN
result := a
ELSE
(* Use arithmetic shift but clear sign-extended bits for negative numbers *)
result := ASR(a, n);
IF a < 0 THEN
(* Create mask to clear the sign-extended bits *)
mask := ASR(7FFFFFFFH, n - 1);
result := And(result, mask)
END
END;
RETURN result
END LogicalShiftRight;
PROCEDURE RotateLeft*(a: INTEGER; n: INTEGER): INTEGER;
(** Perform rotate left operation on an integer. *)
VAR
normalizedN: INTEGER;
result: INTEGER;
BEGIN
normalizedN := n MOD 32;
result := ROR(a, 32 - normalizedN);
RETURN result
END RotateLeft;
PROCEDURE RotateRight*(a: INTEGER; n: INTEGER): INTEGER;
(** Perform rotate right operation on an integer. *)
VAR
normalizedN: INTEGER;
result: INTEGER;
BEGIN
normalizedN := n MOD 32;
result := ROR(a, normalizedN);
RETURN result
END RotateRight;
END Bitwise.