[0*64] should have been [0]*64
[libreriscv.git] / openpower / isa / fixedarith.mdwn
1 # Add Immediate
2
3 D-Form
4
5 * addi RT,RA,SI
6
7 Pseudo-code:
8
9 if RA = 0 then RT <- EXTS(SI)
10 else RT <- (RA) + EXTS(SI)
11
12 Special Registers Altered:
13
14 None
15
16 # Add Immediate Shifted
17
18 D-Form
19
20 * addis RT,RA,SI
21
22 Pseudo-code:
23
24 if RA = 0 then RT <- EXTS(SI || [0]*16)
25 else RT <- (RA) + EXTS(SI || [0]*16)
26
27 Special Registers Altered:
28
29 None
30
31 # Add PC Immediate Shifted
32
33 DX-Form
34
35 * addpcis RT,D
36
37 Pseudo-code:
38
39 D <- d0||d1||d2
40 RT <- NIA + EXTS(D || [0]*16)
41
42 Special Registers Altered:
43
44 None
45
46 # Add
47
48 XO-Form
49
50 * add RT,RA,RB (OE=0 Rc=0)
51 * add. RT,RA,RB (OE=0 Rc=1)
52 * addo RT,RA,RB (OE=1 Rc=0)
53 * addo. RT,RA,RB (OE=1 Rc=1)
54
55 Pseudo-code:
56
57 RT <- (RA) + (RB)
58
59 Special Registers Altered:
60
61 CR0 (if Rc=1)
62 SO OV OV32 (if OE=1)
63
64 # Subtract From
65
66 XO-Form
67
68 * subf RT,RA,RB (OE=0 Rc=0)
69 * subf. RT,RA,RB (OE=0 Rc=1)
70 * subfo RT,RA,RB (OE=1 Rc=0)
71 * subfo. RT,RA,RB (OE=1 Rc=1)
72
73 Pseudo-code:
74
75 RT <- ¬(RA) + (RB) + 1
76
77 Special Registers Altered:
78
79 CR0 (if Rc=1)
80 SO OV OV32 (if OE=1)
81
82 # Add Immediate Carrying
83
84 D-Form
85
86 * addic RT,RA,SI
87
88 Pseudo-code:
89
90 RT <- (RA) + EXTS(SI)
91
92 Special Registers Altered:
93
94 CA CA32
95
96 # Add Immediate Carrying and Record
97
98 D-Form
99
100 * addic. RT,RA,SI
101
102 Pseudo-code:
103
104 RT <- (RA) + EXTS(SI)
105
106 Special Registers Altered:
107
108 CR0 CA CA32
109
110 # Subtract From Immediate Carrying
111
112 D-Form
113
114 * subfic RT,RA,SI
115
116 Pseudo-code:
117
118 RT <- ¬(RA) + EXTS(SI) + 1
119
120 Special Registers Altered:
121
122 CA CA32
123
124 # Add Carrying
125
126 XO-Form
127
128 * addc RT,RA,RB (OE=0 Rc=0)
129 * addc. RT,RA,RB (OE=0 Rc=1)
130 * addco RT,RA,RB (OE=1 Rc=0)
131 * addco. RT,RA,RB (OE=1 Rc=1)
132
133 Pseudo-code:
134
135 RT <- (RA) + (RB)
136
137 Special Registers Altered:
138
139 CA CA32
140 CR0 (if Rc=1)
141 SO OV OV32 (if OE=1)
142
143 # Subtract From Carrying
144
145 XO-Form
146
147 * subfc RT,RA,RB (OE=0 Rc=0)
148 * subfc. RT,RA,RB (OE=0 Rc=1)
149 * subfco RT,RA,RB (OE=1 Rc=0)
150 * subfco. RT,RA,RB (OE=1 Rc=1)
151
152 Pseudo-code:
153
154 RT <- ¬(RA) + (RB) + 1
155
156 Special Registers Altered:
157
158 CA CA32
159 CR0 (if Rc=1)
160 SO OV OV32 (if OE=1)
161
162 # Add Extended
163
164 XO-Form
165
166 * adde RT,RA,RB (OE=0 Rc=0)
167 * adde. RT,RA,RB (OE=0 Rc=1)
168 * addeo RT,RA,RB (OE=1 Rc=0)
169 * addeo. RT,RA,RB (OE=1 Rc=1)
170
171 Pseudo-code:
172
173 RT <- (RA) + (RB) + CA
174
175 Special Registers Altered:
176
177 CA CA32
178 CR0 (if Rc=1)
179 SO OV OV32 (if OE=1)
180
181 # Subtract From Extended
182
183 XO-Form
184
185 * subfe RT,RA,RB (OE=0 Rc=0)
186 * subfe. RT,RA,RB (OE=0 Rc=1)
187 * subfeo RT,RA,RB (OE=1 Rc=0)
188 * subfeo. RT,RA,RB (OE=1 Rc=1)
189
190 Pseudo-code:
191
192 RT <- ¬(RA) + (RB) + CA
193
194 Special Registers Altered:
195
196 CA CA32
197 CR0 (if Rc=1)
198 SO OV OV32 (if OE=1)
199
200 # Add to Minus One Extended
201
202 XO-Form
203
204 * addme RT,RA (OE=0 Rc=0)
205 * addme. RT,RA (OE=0 Rc=1)
206 * addmeo RT,RA (OE=1 Rc=0)
207 * addmeo. RT,RA (OE=1 Rc=1)
208
209 Pseudo-code:
210
211 RT <- (RA) + CA - 1
212
213 Special Registers Altered:
214
215 CA CA32
216 CR0 (if Rc=1)
217 SO OV OV32 (if OE=1)
218
219 # Subtract From Minus One Extended
220
221 XO-Form
222
223 * subfme RT,RA (OE=0 Rc=0)
224 * subfme. RT,RA (OE=0 Rc=1)
225 * subfmeo RT,RA (OE=1 Rc=0)
226 * subfmeo. RT,RA (OE=1 Rc=1)
227
228 Pseudo-code:
229
230 RT <- ¬(RA) + CA - 1
231
232 Special Registers Altered:
233
234 CA CA32
235 CR0 (if Rc=1)
236 SO OV OV32 (if OE=1)
237
238 # Add Extended using alternate carry bit
239
240 Z23-Form
241
242 * addex RT,RA,RB,CY
243
244 Pseudo-code:
245
246 if CY=0 then RT <- (RA) + (RB) + OV
247
248 Special Registers Altered:
249
250 OV OV32 (if CY=0 )
251
252 # Subtract From Zero Extended
253
254 XO-Form
255
256 * subfze RT,RA (OE=0 Rc=0)
257 * subfze. RT,RA (OE=0 Rc=1)
258 * subfzeo RT,RA (OE=1 Rc=0)
259 * subfzeo. RT,RA (OE=1 Rc=1)
260
261 Pseudo-code:
262
263 RT <- ¬(RA) + CA
264
265 Special Registers Altered:
266
267 CA CA32
268 CR0 (if Rc=1)
269 SO OV OV32 (if OE=1)
270
271 # Add to Zero Extended
272
273 XO-Form
274
275 * addze RT,RA (OE=0 Rc=0)
276 * addze. RT,RA (OE=0 Rc=1)
277 * addzeo RT,RA (OE=1 Rc=0)
278 * addzeo. RT,RA (OE=1 Rc=1)
279
280 Pseudo-code:
281
282 RT <- (RA) + CA
283
284 Special Registers Altered:
285
286 CA CA32
287 CR0 (if Rc=1)
288 SO OV OV32 (if OE=1)
289
290 # Negate
291
292 XO-Form
293
294 * neg RT,RA (OE=0 Rc=0)
295 * neg. RT,RA (OE=0 Rc=1)
296 * nego RT,RA (OE=1 Rc=0)
297 * nego. RT,RA (OE=1 Rc=1)
298
299 Pseudo-code:
300
301 RT <- ¬(RA) + 1
302
303 Special Registers Altered:
304
305 CR0 (if Rc=1)
306 SO OV OV32 (if OE=1)
307
308 # Multiply Low Immediate
309
310 D-Form
311
312 * mulli RT,RA,SI
313
314 Pseudo-code:
315
316 prod[0:127] <- MULS((RA), EXTS(SI))
317 RT <- prod[64:127]
318
319 Special Registers Altered:
320
321 None
322
323 # Multiply High Word
324
325 XO-Form
326
327 * mulhw RT,RA,RB (Rc=0)
328 * mulhw. RT,RA,RB (Rc=1)
329
330 Pseudo-code:
331
332 prod[0:63] <- MULS((RA)[32:63], (RB)[32:63])
333 RT[32:63] <- prod[0:31]
334 RT[0:31] <- prod[0:31]
335
336 Special Registers Altered:
337
338 CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1)
339
340 # Multiply Low Word
341
342 XO-Form
343
344 * mullw RT,RA,RB (OE=0 Rc=0)
345 * mullw. RT,RA,RB (OE=0 Rc=1)
346 * mullwo RT,RA,RB (OE=1 Rc=0)
347 * mullwo. RT,RA,RB (OE=1 Rc=1)
348
349 Pseudo-code:
350
351 prod[0:63] <- MULS((RA)[32:63], (RB)[32:63])
352 RT <- prod
353 overflow <- ((prod[0:32] != 0x0_0000_0000) &
354 (prod[0:32] != 0x1_ffff_ffff))
355
356 Special Registers Altered:
357
358 CR0 (if Rc=1)
359 SO OV OV32 (if OE=1)
360
361 # Multiply High Word Unsigned
362
363 XO-Form
364
365 * mulhwu RT,RA,RB (Rc=0)
366 * mulhwu. RT,RA,RB (Rc=1)
367
368 Pseudo-code:
369
370 prod[0:63] <- (RA)[32:63] * (RB)[32:63]
371 RT[32:63] <- prod[0:31]
372 RT[0:31] <- prod[0:31]
373
374 Special Registers Altered:
375
376 CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1)
377
378 # Divide Word
379
380 XO-Form
381
382 * divw RT,RA,RB (OE=0 Rc=0)
383 * divw. RT,RA,RB (OE=0 Rc=1)
384 * divwo RT,RA,RB (OE=1 Rc=0)
385 * divwo. RT,RA,RB (OE=1 Rc=1)
386
387 Pseudo-code:
388
389 dividend[0:31] <- (RA)[32:63]
390 divisor[0:31] <- (RB) [32:63]
391 if (((dividend = 0x8000_0000) &
392 (divisor = 0xffff_ffff)) |
393 (divisor = 0x0000_0000)) then
394 RT[0:63] <- undefined[0:63]
395 overflow <- 1
396 else
397 RT[32:63] <- DIVS(dividend, divisor)
398 RT[0:31] <- undefined[0:31]
399 overflow <- 0
400
401 Special Registers Altered:
402
403 CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1)
404 SO OV OV32 (if OE=1)
405
406 # Divide Word Unsigned
407
408 XO-Form
409
410 * divwu RT,RA,RB (OE=0 Rc=0)
411 * divwu. RT,RA,RB (OE=0 Rc=1)
412 * divwuo RT,RA,RB (OE=1 Rc=0)
413 * divwuo. RT,RA,RB (OE=1 Rc=1)
414
415 Pseudo-code:
416
417 dividend[0:31] <- (RA)[32:63]
418 divisor[0:31] <- (RB)[32:63]
419 if divisor != 0 then
420 RT[32:63] <- dividend / divisor
421 RT[0:31] <- undefined[0:31]
422 overflow <- 0
423 else
424 RT[0:63] <- undefined[0:63]
425 overflow <- 1
426
427 Special Registers Altered:
428
429 CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1)
430 SO OV OV32 (if OE=1)
431
432 # Divide Word Extended
433
434 XO-Form
435
436 * divwe RT,RA,RB (OE=0 Rc=0)
437 * divwe. RT,RA,RB (OE=0 Rc=1)
438 * divweo RT,RA,RB (OE=1 Rc=0)
439 * divweo. RT,RA,RB (OE=1 Rc=1)
440
441 Pseudo-code:
442
443 dividend[0:63] <- (RA)[32:63] || [0]*32
444 divisor[0:63] <- [0]*32 || (RB)[32:63]
445 if (divisor = 0x0000_0000_0000_0000) then
446 overflow <- 1
447 else
448 result <- DIVS(dividend, divisor)
449 if (result[32:63] = 0) then
450 RT[32:63] <- result[0:31]
451 RT[0:31] <- undefined[0:31]
452 overflow <- 0
453 else
454 overflow <- 1
455 if overflow = 1 then
456 RT[0:63] <- undefined[0:63]
457
458 Special Registers Altered:
459
460 CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1)
461 SO OV OV32 (if OE=1)
462
463 # Divide Word Extended Unsigned
464
465 XO-Form
466
467 * divweu RT,RA,RB (OE=0 Rc=0)
468 * divweu. RT,RA,RB (OE=0 Rc=1)
469 * divweuo RT,RA,RB (OE=1 Rc=0)
470 * divweuo. RT,RA,RB (OE=1 Rc=1)
471
472 Pseudo-code:
473
474 dividend[0:63] <- (RA)[32:63] || [0]*32
475 divisor[0:63] <- [0]*32 || (RB)[32:63]
476 if (divisor = 0x0000_0000_0000_0000) then
477 overflow <- 1
478 else
479 result <- dividend / divisor
480 if (RA) < (RB) then
481 RT[32:63] <- result[0:31]
482 RT[0:31] <- undefined[0:31]
483 overflow <- 0
484 else
485 overflow <- 1
486 if overflow = 1 then
487 RT[0:63] <- undefined[0:63]
488
489 Special Registers Altered:
490
491 CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1)
492 SO OV OV32 (if OE=1)
493
494 # Modulo Signed Word
495
496 X-Form
497
498 * modsw RT,RA,RB
499
500 Pseudo-code:
501
502 dividend[0:31] <- (RA)[32:63]
503 divisor [0:31] <- (RB)[32:63]
504 if (((dividend = 0x8000_0000) &
505 (divisor = 0xffff_ffff)) |
506 (divisor = 0x0000_0000)) then
507 RT[0:63] <- undefined[0:63]
508 overflow <- 1
509 else
510 RT[32:63] <- MODS(dividend, divisor)
511 RT[0:31] <- undefined[0:31]
512 overflow <- 0
513
514 Special Registers Altered:
515
516 None
517
518 # Modulo Unsigned Word
519
520 X-Form
521
522 * moduw RT,RA,RB
523
524 Pseudo-code:
525
526 dividend[0:31] <- (RA) [32:63]
527 divisor [0:31] <- (RB) [32:63]
528 if divisor = 0x0000_0000 then
529 RT[0:63] <- undefined[0:63]
530 overflow <- 1
531 else
532 RT[32:63] <- MODS(dividend, divisor)
533 RT[0:31] <- undefined[0:31]
534 overflow <- 0
535
536 Special Registers Altered:
537
538 None
539
540 # Deliver A Random Number
541
542 X-Form
543
544 * darn RT,L
545
546 Pseudo-code:
547
548 RT <- random(L)
549
550 Special Registers Altered:
551
552 none
553
554 # Multiply Low Doubleword
555
556 XO-Form
557
558 * mulld RT,RA,RB (OE=0 Rc=0)
559 * mulld. RT,RA,RB (OE=0 Rc=1)
560 * mulldo RT,RA,RB (OE=1 Rc=0)
561 * mulldo. RT,RA,RB (OE=1 Rc=1)
562
563 Pseudo-code:
564
565 prod[0:127] <- MULS((RA), (RB))
566 RT <- prod[64:127]
567 overflow <- ((prod[0:64] != 0x0_0000_0000_0000_0000) &
568 (prod[0:64] != 0x1_ffff_ffff_ffff_ffff))
569
570 Special Registers Altered:
571
572 CR0 (if Rc=1)
573 SO OV OV32 (if OE=1)
574
575 # Multiply High Doubleword
576
577 XO-Form
578
579 * mulhd RT,RA,RB (Rc=0)
580 * mulhd. RT,RA,RB (Rc=1)
581
582 Pseudo-code:
583
584 prod[0:127] <- MULS((RA), (RB))
585 RT <- prod[0:63]
586
587 Special Registers Altered:
588
589 CR0 (if Rc=1)
590
591 # Multiply High Doubleword Unsigned
592
593 XO-Form
594
595 * mulhdu RT,RA,RB (Rc=0)
596 * mulhdu. RT,RA,RB (Rc=1)
597
598 Pseudo-code:
599
600 prod[0:127] <- (RA) * (RB)
601 RT <- prod[0:63]
602
603 Special Registers Altered:
604
605 CR0 (if Rc=1)
606
607 # Multiply-Add High Doubleword VA-Form
608
609 VA-Form
610
611 * maddhd RT,RA.RB,RC
612
613 Pseudo-code:
614
615 prod[0:127] <- MULS((RA), (RB))
616 sum[0:127] <- prod + EXTS(RC)
617 RT <- sum[0:63]
618
619 Special Registers Altered:
620
621 None
622
623 # Multiply-Add High Doubleword Unsigned
624
625 VA-Form
626
627 * maddhdu RT,RA.RB,RC
628
629 Pseudo-code:
630
631 prod[0:127] <- (RA) * (RB)
632 sum[0:127] <- prod + EXTZ(RC)
633 RT <- sum[0:63]
634
635 Special Registers Altered:
636
637 None
638
639 # Multiply-Add Low Doubleword
640
641 VA-Form
642
643 * maddld RT,RA.RB,RC
644
645 Pseudo-code:
646
647 prod[0:127] <- MULS((RA), (RB))
648 sum[0:127] <- prod + EXTS(RC)
649 RT <- sum[64:127]
650
651 Special Registers Altered:
652
653 None
654
655 # Divide Doubleword
656
657 XO-Form
658
659 * divd RT,RA,RB (OE=0 Rc=0)
660 * divd. RT,RA,RB (OE=0 Rc=1)
661 * divdo RT,RA,RB (OE=1 Rc=0)
662 * divdo. RT,RA,RB (OE=1 Rc=1)
663
664 Pseudo-code:
665
666 dividend[0:63] <- (RA)
667 divisor[0:63] <- (RB)
668 if (((dividend = 0x8000_0000_0000_0000) &
669 (divisor = 0xffff_ffff_ffff_ffff)) |
670 (divisor = 0x0000_0000_0000_0000)) then
671 RT[0:63] <- undefined[0:63]
672 overflow <- 1
673 else
674 RT <- DIVS(dividend, divisor)
675 overflow <- 0
676
677 Special Registers Altered:
678
679 CR0 (if Rc=1)
680 SO OV OV32 (if OE=1)
681
682 # Divide Doubleword Unsigned
683
684 XO-Form
685
686 * divdu RT,RA,RB (OE=0 Rc=0)
687 * divdu. RT,RA,RB (OE=0 Rc=1)
688 * divduo RT,RA,RB (OE=1 Rc=0)
689 * divduo. RT,RA,RB (OE=1 Rc=1)
690
691 Pseudo-code:
692
693 dividend[0:63] <- (RA)
694 divisor[0:63] <- (RB)
695 if (divisor = 0x0000_0000_0000_0000) then
696 RT[0:63] <- undefined[0:63]
697 overflow <- 1
698 else
699 RT <- dividend / divisor
700 overflow <- 0
701
702 Special Registers Altered:
703
704 CR0 (if Rc=1)
705 SO OV OV32 (if OE=1)
706
707 # Divide Doubleword Extended
708
709 XO-Form
710
711 * divde RT,RA,RB (OE=0 Rc=0)
712 * divde. RT,RA,RB (OE=0 Rc=1)
713 * divdeo RT,RA,RB (OE=1 Rc=0)
714 * divdeo. RT,RA,RB (OE=1 Rc=1)
715
716 Pseudo-code:
717
718 dividend[0:127] <- (RA) || [0]*64
719 divisor[0:127] <- [0]*64 || (RB)
720 if divisor = [0]*128 then
721 overflow <- 1
722 else
723 result <- DIVS(dividend, divisor)
724 if result[64:127] = 0x0000_0000_0000_0000 then
725 RT <- result[63:127]
726 overflow <- 0
727 else
728 overflow <- 1
729 if overflow = 1 then
730 RT[0:63] <- undefined[0:63]
731
732 Special Registers Altered:
733
734 CR0 (if Rc=1)
735 SO OV OV32 (if OE=1)
736
737 # Divide Doubleword Extended Unsigned
738
739 XO-Form
740
741 * divdeu RT,RA,RB (OE=0 Rc=0)
742 * divdeu. RT,RA,RB (OE=0 Rc=1)
743 * divdeuo RT,RA,RB (OE=1 Rc=0)
744 * divdeuo. RT,RA,RB (OE=1 Rc=1)
745
746 Pseudo-code:
747
748 dividend[0:127] <- (RA) || [0]*64
749 divisor[0:127] <- [0]*64 || (RB)
750 if divisor = [0]*128 then
751 overflow <- 1
752 else
753 result <- dividend / divisor
754 if (RA) < (RB) then
755 RT <- result[63:127]
756 overflow <- 0
757 else
758 overflow <- 1
759 if overflow = 1 then
760 RT[0:63] <- undefined[0:63]
761
762 Special Registers Altered:
763
764 CR0 (if Rc=1)
765 SO OV OV32 (if OE=1)
766
767 # Modulo Signed Doubleword
768
769 X-Form
770
771 * modsd RT,RA,RB
772
773 Pseudo-code:
774
775 dividend <- (RA)
776 divisor <- (RB)
777 if (((dividend = 0x8000_0000_0000_0000) &
778 (divisor = 0xffff_ffff_ffff_ffff)) |
779 (divisor = 0x0000_0000_0000_0000)) then
780 RT[0:63] <- undefined[0:63]
781 overflow <- 1
782 else
783 RT <- MODS(dividend, divisor)
784 overflow <- 0
785
786 Special Registers Altered:
787
788 None
789
790 # Modulo Unsigned Doubleword
791
792 X-Form
793
794 * modud RT,RA,RB
795
796 Pseudo-code:
797
798 dividend <- (RA)
799 divisor <- (RB)
800 if (divisor = 0x0000_0000_0000_0000) then
801 RT[0:63] <- undefined[0:63]
802 overflow <- 1
803 else
804 RT <- dividend % divisor
805 overflow <- 0
806
807 Special Registers Altered:
808
809 None
810