add missing forms
[libreriscv.git] / openpower / isa / fixedarith.mdwn
1 # Add Immediate
2
3 D-Form
4
5 * addi RT,RA,SI
6
7 if RA = 0 then RT <- EXTS(SI)
8 else RT <- (RA) + EXTS(SI)
9
10 # Add Immediate Shifted
11
12 D-Form
13
14 * addis RT,RA,SI
15
16 if RA = 0 then RT <- EXTS(SI || 160)
17 else RT <- (RA) + EXTS(SI || [0]*16)
18
19 # Add PC Immediate Shifted
20
21 DX-Form
22
23 * addpcis RT,D
24
25 D <- d0||d1||d2
26 RT <- NIA + EXTS(D || [0]*16)
27
28
29 # Add
30
31 XO-Form
32
33 * add RT,RA,RB (OE=0 Rc=0)
34 * add. RT,RA,RB (OE=0 Rc=1)
35 * addo RT,RA,RB (OE=1 Rc=0)
36 * addo. RT,RA,RB (OE=1 Rc=1)
37
38 RT <- (RA) + (RB)
39
40 # Subtract From
41
42 XO-Form
43
44 * subf RT,RA,RB (OE=0 Rc=0)
45 * subf. RT,RA,RB (OE=0 Rc=1)
46 * subfo RT,RA,RB (OE=1 Rc=0)
47 * subfo. RT,RA,RB (OE=1 Rc=1)
48
49 RT <- ¬(RA) + (RB) + 1
50
51 # Add Immediate Carrying
52
53 D-Form
54
55 * addic RT,RA,SI
56
57 RT <- (RA) + EXTS(SI)
58
59 # Add Immediate Carrying and Record
60
61 D-Form
62
63 * addic. RT,RA,SI
64
65 RT <- (RA) + EXTS(SI)
66
67 # Subtract From Immediate Carrying
68
69 D-Form
70
71 * subfic RT,RA,SI
72
73 RT <- ¬(RA) + EXTS(SI) + 1
74
75 # Add Carrying
76
77 XO-Form
78
79 * addc RT,RA,RB (OE=0 Rc=0)
80 * addc. RT,RA,RB (OE=0 Rc=1)
81 * addco RT,RA,RB (OE=1 Rc=0)
82 * addco. RT,RA,RB (OE=1 Rc=1)
83
84 RT <- (RA) + (RB)
85
86 # Subtract From Carrying
87
88 XO-Form
89
90 * subfc RT,RA,RB (OE=0 Rc=0)
91 * subfc. RT,RA,RB (OE=0 Rc=1)
92 * subfco RT,RA,RB (OE=1 Rc=0)
93 * subfco. RT,RA,RB (OE=1 Rc=1)
94
95 RT <- ¬(RA) + (RB) + 1
96
97 # Add Extended
98
99 XO-Form
100
101 * adde RT,RA,RB (OE=0 Rc=0)
102 * adde. RT,RA,RB (OE=0 Rc=1)
103 * addeo RT,RA,RB (OE=1 Rc=0)
104 * addeo. RT,RA,RB (OE=1 Rc=1)
105
106 RT <- (RA) + (RB) + CA
107
108 # Subtract From Extended
109
110 XO-Form
111
112 * subfe RT,RA,RB (OE=0 Rc=0)
113 * subfe. RT,RA,RB (OE=0 Rc=1)
114 * subfeo RT,RA,RB (OE=1 Rc=0)
115 * subfeo. RT,RA,RB (OE=1 Rc=1)
116
117 RT <- ¬(RA) + (RB) + CA
118
119 # Add to Minus One Extended
120
121 XO-Form
122
123 * addme RT,RA (OE=0 Rc=0)
124 * addme. RT,RA (OE=0 Rc=1)
125 * addmeo RT,RA (OE=1 Rc=0)
126 * addmeo. RT,RA (OE=1 Rc=1)
127
128 RT <- (RA) + CA - 1
129
130 # Subtract From Minus One Extended
131
132 XO-Form
133
134 * subfme RT,RA (OE=0 Rc=0)
135 * subfme. RT,RA (OE=0 Rc=1)
136 * subfmeo RT,RA (OE=1 Rc=0)
137 * subfmeo. RT,RA (OE=1 Rc=1)
138
139 RT <- ¬(RA) + CA - 1
140
141 # Add Extended using alternate carry bit
142
143 Z23-Form
144
145 * addex RT,RA,RB,CY
146
147 if CY=0 then RT <- (RA) + (RB) + OV
148
149 # Subtract From Zero Extended
150
151 XO-form
152
153 * subfze RT,RA (OE=0 Rc=0)
154 * subfze. RT,RA (OE=0 Rc=1)
155 * subfzeo RT,RA (OE=1 Rc=0)
156 * subfzeo. RT,RA (OE=1 Rc=1)
157
158 RT <- ¬(RA) + CA
159
160 # Add to Zero Extended
161
162 XO-form
163
164 * addze RT,RA (OE=0 Rc=0)
165 * addze. RT,RA (OE=0 Rc=1)
166 * addzeo RT,RA (OE=1 Rc=0)
167 * addzeo. RT,RA (OE=1 Rc=1)
168
169 RT <- (RA) + CA
170
171 # Negate
172
173 XO-form
174
175 * neg RT,RA (OE=0 Rc=0)
176 * neg. RT,RA (OE=0 Rc=1)
177 * nego RT,RA (OE=1 Rc=0)
178 * nego. RT,RA (OE=1 Rc=1)
179
180 RT <- ¬(RA) + 1
181
182 # Multiply Low Immediate
183
184 D-form
185
186 * mulli RT,RA,SI
187
188 prod[0:127] <- (RA) * EXTS(SI)
189 RT <- prod[64:127]
190
191 # Multiply High Word
192
193 XO-form
194
195 * mulhw RT,RA,RB (Rc=0)
196 * mulhw. RT,RA,RB (Rc=1)
197
198 prod[0:63] <- (RA)[32:63] * (RB)[32:63]
199 RT[32:63] <- prod[0:31]
200 RT[0:31] <- undefined
201
202 # Multiply Low Word
203
204 XO-form
205
206 * mullw RT,RA,RB (OE=0 Rc=0)
207 * mullw. RT,RA,RB (OE=0 Rc=1)
208 * mullwo RT,RA,RB (OE=1 Rc=0)
209 * mullwo. RT,RA,RB (OE=1 Rc=1)
210
211 RT <- (RA)[32:63] * (RB)[32:63]
212
213 # Multiply High Word Unsigned
214
215 XO-form
216
217 * mulhwu RT,RA,RB (Rc=0)
218 * mulhwu. RT,RA,RB (Rc=1)
219
220 prod[0:63] <- (RA)[32:63] * (RB)[32:63]
221 RT[32:63] <- prod[0:31]
222 RT[0:31] <- undefined
223
224 # Divide Word
225
226 XO-form
227
228 * divw RT,RA,RB (OE=0 Rc=0)
229 * divw. RT,RA,RB (OE=0 Rc=1)
230 * divwo RT,RA,RB (OE=1 Rc=0)
231 * divwo. RT,RA,RB (OE=1 Rc=1)
232
233 dividend[0:31] <- (RA)[32:63]
234 divisor[0:31] <- (RB) [32:63]
235 RT[32:63] <- dividend / divisor
236 RT[0:31] <- undefined
237
238 # Divide Word Unsigned
239
240 XO-form
241
242 * divwu RT,RA,RB (OE=0 Rc=0)
243 * divwu. RT,RA,RB (OE=0 Rc=1)
244 * divwuo RT,RA,RB (OE=1 Rc=0)
245 * divwuo. RT,RA,RB (OE=1 Rc=1)
246
247 dividend[0:31] <- (RA)[32:63]
248 divisor[0:31] <- (RB)[32:63]
249 RT[32:63] <- dividend / divisor
250 RT[0:31] <- undefined
251
252 # Divide Word Extended
253
254 XO-form
255
256 * divwe RT,RA,RB (OE=0 Rc=0)
257 * divwe. RT,RA,RB (OE=0 Rc=1)
258 * divweo RT,RA,RB (OE=1 Rc=0)
259 * divweo. RT,RA,RB (OE=1 Rc=1)
260
261 dividend[0:63] <- (RA)[32:63] || [0]*32
262 divisor[0:31] <- (RB)[32:63]
263 RT[32:63] <- dividend / divisor
264 RT[0:31] <- undefined
265
266 # Divide Word Extended Unsigned
267
268 XO-form
269
270 * divweu RT,RA,RB (OE=0 Rc=0)
271 * divweu. RT,RA,RB (OE=0 Rc=1)
272 * divweuo RT,RA,RB (OE=1 Rc=0)
273 * divweuo. RT,RA,RB (OE=1 Rc=1)
274
275 dividend[0:63] <- (RA)[32:63] || [0]*32
276 divisor[0:31] <- (RB)[32:63]
277 RT[32:63] <- dividend / divisor
278 RT[0:31] <- undefined
279
280 # Modulo Signed Word X-form
281
282 X-form
283
284 * modsw RT,RA,RB
285
286 dividend[0:31] <- (RA)[32:63]
287 divisor [0:31] <- (RB)[32:63]-
288 RT[32:63] <- dividend % divisor
289 RT[0:31 ] <- undefined
290
291 # Modulo Unsigned Word X-form
292
293 X-form
294
295 * moduw RT,RA,RB
296
297 dividend[0:31] <- (RA) [32:63]
298 divisor [0:31] <- (RB) [32:63]
299 RT[32:63] <- dividend % divisor
300 RT[0:31 ] <- undefined
301
302
303 # Deliver A Random Number
304
305 X-form
306
307 * darn RT,L
308
309 RT <- random(L)
310
311 # Multiply Low Doubleword
312
313 XO-form
314
315 * mulld RT,RA,RB (OE=0 Rc=0)
316 * mulld. RT,RA,RB (OE=0 Rc=1)
317 * mulldo RT,RA,RB (OE=1 Rc=0)
318 * mulldo. RT,RA,RB (OE=1 Rc=1)
319
320 prod[0:127] <- (RA) * (RB)
321 RT <- prod[64:127]
322
323 # Multiply High Doubleword
324
325 XO-form
326
327 * mulhd RT,RA,RB (Rc=0)
328 * mulhd. RT,RA,RB (Rc=1)
329
330 prod[0:127] <- (RA) * (RB)
331 RT <- prod[0:63]
332
333 # Multiply High Doubleword Unsigned
334
335 XO-form
336
337 * mulhdu RT,RA,RB (Rc=0)
338 * mulhdu. RT,RA,RB (Rc=1)
339
340 prod[0:127] <- (RA) * (RB)
341 RT <- prod[0:63]
342
343 # Multiply-Add High Doubleword VA-form
344
345 VA-form
346
347 * maddhd RT,RA.RB,RC
348
349 prod[0:127] <- (RA) * (RB)
350 sum[0:127] <- prod + EXTS(RC)
351 RT <- sum[0:63]
352
353 # Multiply-Add High Doubleword Unsigned
354
355 VA-form
356
357 * maddhdu RT,RA.RB,RC
358
359 prod[0:127] <- (RA) * (RB)
360 sum[0:127] <- prod + EXTZ(RC)
361 RT <- sum[0:63]
362
363 # Multiply-Add Low Doubleword
364
365 VA-form
366
367 * maddld RT,RA.RB,RC
368
369
370 prod[0:127] <- (RA) * (RB)
371 sum[0:127] <- prod + EXTS(RC)
372 RT <- sum[64:127]
373
374 # Divide Doubleword
375
376 XO-form
377
378 * divd RT,RA,RB (OE=0 Rc=0)
379 * divd. RT,RA,RB (OE=0 Rc=1)
380 * divdo RT,RA,RB (OE=1 Rc=0)
381 * divdo. RT,RA,RB (OE=1 Rc=1)
382
383 dividend[0:63] <- (RA)
384 divisor[0:63] <- (RB)
385 RT <- dividend / divisor
386
387 # Divide Doubleword Unsigned
388
389 XO-form
390
391 * divdu RT,RA,RB (OE=0 Rc=0)
392 * divdu. RT,RA,RB (OE=0 Rc=1)
393 * divduo RT,RA,RB (OE=1 Rc=0)
394 * divduo. RT,RA,RB (OE=1 Rc=1)
395
396 dividend[0:63] <- (RA)
397 divisor[0:63] <- (RB)
398 RT <- dividend / divisor
399
400 # Divide Doubleword Extended
401
402 XO-form
403
404 * divde RT,RA,RB (OE=0 Rc=0)
405 * divde. RT,RA,RB (OE=0 Rc=1)
406 * divdeo RT,RA,RB (OE=1 Rc=0)
407 * divdeo. RT,RA,RB (OE=1 Rc=1)
408
409 dividend[0:127] <- (RA) || [0]*64
410 divisor[0:63] <- (RB)
411 RT <- dividend / divisor
412
413 # Divide Doubleword Extended Unsigned
414
415 XO-form
416
417 * divdeu RT,RA,RB (OE=0 Rc=0)
418 * divdeu. RT,RA,RB (OE=0 Rc=1)
419 * divdeuo RT,RA,RB (OE=1 Rc=0)
420 * divdeuo. RT,RA,RB (OE=1 Rc=1)
421
422 dividend[0:127] <- (RA) || [0]*64
423 divisor[0:63] <- (RB)
424 RT <- dividend / divisor
425
426 # Modulo Signed Doubleword
427
428 X-form
429
430 * modsd RT,RA,RB
431
432 dividend <- (RA)
433 divisor <- (RB)
434 RT <- dividend % divisor
435
436 # Modulo Unsigned Doubleword
437
438 X-form
439
440 * modud RT,RA,RB
441
442 dividend <- (RA)
443 divisor <- (RB)
444 RT <- dividend % divisor
445