[TT# 1592][t] Improve test for open opcode delegation. All tests in the file pass...
[parrot.git] / t / op / jit.t
blob4c633e0e0325157ce613eba912fdfaa7e05911d1
1 #!perl
2 # Copyright (C) 2001-2005, Parrot Foundation.
3 # $Id$
5 use strict;
6 use warnings;
7 use lib qw( . lib ../lib ../../lib );
8 use Test::More;
9 use Parrot::Test tests => 61;
11 =head1 NAME
13 t/op/jit.t - JIT register allocation
15 =head1 SYNOPSIS
17         % prove t/op/jit.t
19 =head1 DESCRIPTION
21 Tests JIT register allocation. The tests are written for 4 mapped
22 registers per kind, i.e. the crippled x86 architecture. If you are
23 experimenting with register allocation please just use settings like
24 in jit/i386/jit_emit, i.e. 4 mapped regs, 2 volatile ints ...
26 These tests are of course usable for other run cores too, the results
27 should just be the same.
29 =cut
31 pasm_output_is( <<'CODE', <<'OUTPUT', "add_i_i_i 1,2,3 mapped" );
32 set I0,0
33 set I1,1
34 set I2,2
35 add I0,I1,I2
36 print I0
37 print I1
38 print I2
39 print "\n"
40 end
41 CODE
42 312
43 OUTPUT
45 pasm_output_is( <<'CODE', <<'OUTPUT', "add_i_i_i 1,2 mapped" );
46 set I0,0
47 set I1,1
48 set I2,2
49 set I3,3
50 set I4,4
51 set I0,I1
52 set I2,I3
53 set I0,I1
54 set I2,I3
55 add I0,I1,I4
56 print I0
57 print I1
58 print I4
59 print "\n"
60 end
61 CODE
62 514
63 OUTPUT
65 pasm_output_is( <<'CODE', <<'OUTPUT', "add_i_i_i 1,3 mapped" );
66 set I0,0
67 set I1,1
68 set I2,2
69 set I3,3
70 set I4,4
71 set I0,I1
72 set I2,I3
73 set I0,I1
74 set I2,I3
75 add I0,I4,I1
76 print I0
77 print I4
78 print I1
79 print "\n"
80 end
81 CODE
82 541
83 OUTPUT
85 pasm_output_is( <<'CODE', <<'OUTPUT', "add_i_i_i 2,3 mapped" );
86 set I0,0
87 set I1,1
88 set I2,2
89 set I3,3
90 set I4,4
91 set I0,I1
92 set I2,I3
93 set I0,I1
94 set I2,I3
95 add I4,I0,I1
96 print I4
97 print I0
98 print I1
99 print "\n"
101 CODE
103 OUTPUT
105 pasm_output_is( <<'CODE', <<'OUTPUT', "add_i_i_i 1 mapped" );
106 cleari
107 set I0,0
108 set I1,1
109 set I2,2
110 set I3,3
111 set I4,4
112 set I0,I1
113 set I2,I3
114 set I0,I1
115 set I2,I3
116 add I1,I5,I4
117 print I1
118 print I5
119 print I4
120 print "\n"
122 CODE
124 OUTPUT
126 pasm_output_is( <<'CODE', <<'OUTPUT', "add_i_i_i 2 mapped" );
127 set I0,0
128 set I1,1
129 set I2,2
130 set I3,3
131 set I4,4
132 set I0,I1
133 set I2,I3
134 set I0,I1
135 set I2,I3
136 add I5,I1,I4
137 print I5
138 print I1
139 print I4
140 print "\n"
142 CODE
144 OUTPUT
146 pasm_output_is( <<'CODE', <<'OUTPUT', "add_i_i_i 3 mapped" );
147 set I0,0
148 set I1,1
149 set I2,2
150 set I3,3
151 set I4,4
152 set I0,I1
153 set I2,I3
154 set I0,I1
155 set I2,I3
156 add I5,I4,I1
157 print I5
158 print I1
159 print I4
160 print "\n"
162 CODE
164 OUTPUT
166 pasm_output_is( <<'CODE', <<'OUTPUT', "add_i_i_i 0 mapped" );
167 cleari
168 set I0,0
169 set I1,1
170 set I2,2
171 set I3,3
172 set I4,4
173 set I0,I1
174 set I2,I3
175 set I0,I1
176 set I2,I3
177 add I5,I6,I4
178 print I5
179 print I6
180 print I4
181 print "\n"
183 CODE
185 OUTPUT
187 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_i_i 1,2,3 mapped" );
188 set I0,0
189 set I1,1
190 set I2,2
191 sub I0,I1,I2
192 print I0
193 print I1
194 print I2
195 print "\n"
197 CODE
198 -112
199 OUTPUT
201 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_i_i 1,2 mapped" );
202 set I0,0
203 set I1,1
204 set I2,2
205 set I3,3
206 set I4,4
207 set I0,I1
208 set I2,I3
209 set I0,I1
210 set I2,I3
211 sub I0,I1,I4
212 print I0
213 print I1
214 print I4
215 print "\n"
217 CODE
218 -314
219 OUTPUT
221 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_i_i 1,3 mapped" );
222 set I0,0
223 set I1,1
224 set I2,2
225 set I3,3
226 set I4,4
227 set I0,I1
228 set I2,I3
229 set I0,I1
230 set I2,I3
231 sub I0,I4,I1
232 print I0
233 print I4
234 print I1
235 print "\n"
237 CODE
239 OUTPUT
241 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_i_i 2,3 mapped" );
242 set I0,0
243 set I1,1
244 set I2,2
245 set I3,3
246 set I4,4
247 set I0,I1
248 set I2,I3
249 set I0,I1
250 set I2,I3
251 sub I4,I0,I1
252 print I4
253 print I0
254 print I1
255 print "\n"
257 CODE
259 OUTPUT
261 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_i_i 1 mapped" );
262 cleari
263 set I0,0
264 set I1,1
265 set I2,2
266 set I3,3
267 set I4,4
268 set I0,I1
269 set I2,I3
270 set I0,I1
271 set I2,I3
272 sub I1,I5,I4
273 print I1
274 print I5
275 print I4
276 print "\n"
278 CODE
279 -404
280 OUTPUT
282 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_i_i 2 mapped" );
283 set I0,0
284 set I1,1
285 set I2,2
286 set I3,3
287 set I4,4
288 set I0,I1
289 set I2,I3
290 set I0,I1
291 set I2,I3
292 sub I5,I1,I4
293 print I5
294 print I1
295 print I4
296 print "\n"
298 CODE
299 -314
300 OUTPUT
302 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_i_i 3 mapped" );
303 set I0,0
304 set I1,1
305 set I2,2
306 set I3,3
307 set I4,4
308 set I0,I1
309 set I2,I3
310 set I0,I1
311 set I2,I3
312 sub I5,I4,I1
313 print I5
314 print I1
315 print I4
316 print "\n"
318 CODE
320 OUTPUT
322 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_ic 0 mapped" );
323 cleari
324 set I0,0
325 set I1,1
326 set I2,2
327 set I3,3
328 set I4,4
329 set I0,I1
330 set I2,I3
331 set I0,I1
332 set I2,I3
333 sub I5, 2
334 print I5
335 print I1
336 print I4
337 print "\n"
339 CODE
340 -214
341 OUTPUT
343 pasm_output_is( <<'CODE', <<'OUTPUT', "sub_i_i_i 0 mapped" );
344 cleari
345 set I0,0
346 set I1,1
347 set I2,2
348 set I3,3
349 set I4,4
350 set I0,I1
351 set I2,I3
352 set I0,I1
353 set I2,I3
354 sub I5,I6,I4
355 print I5
356 print I6
357 print I4
358 print "\n"
360 CODE
361 -404
362 OUTPUT
364 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i_i 1,2,3 mapped" );
365 set I0,0
366 set I1,1
367 set I2,2
368 mul I0,I1,I2
369 print I0
370 print I1
371 print I2
372 print "\n"
374 CODE
376 OUTPUT
378 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i_i 1,2 mapped" );
379 set I0,0
380 set I1,1
381 set I2,2
382 set I3,3
383 set I4,4
384 set I0,I1
385 set I2,I3
386 set I0,I1
387 set I2,I3
388 mul I0,I1,I4
389 print I0
390 print I1
391 print I4
392 print "\n"
394 CODE
396 OUTPUT
398 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i_i 1,3 mapped" );
399 set I0,0
400 set I1,1
401 set I2,2
402 set I3,3
403 set I4,4
404 set I0,I1
405 set I2,I3
406 set I0,I1
407 set I2,I3
408 mul I0,I4,I1
409 print I0
410 print I4
411 print I1
412 print "\n"
414 CODE
416 OUTPUT
418 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i_i 2,3 mapped" );
419 set I0,0
420 set I1,1
421 set I2,2
422 set I3,3
423 set I4,4
424 set I0,I1
425 set I2,I3
426 set I0,I1
427 set I2,I3
428 mul I4,I1,I3
429 print I4
430 print I1
431 print I3
432 print "\n"
434 CODE
436 OUTPUT
438 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i_i 1 mapped" );
439 cleari
440 set I0,0
441 set I1,1
442 set I2,2
443 set I3,3
444 set I4,4
445 set I0,I1
446 set I2,I3
447 set I0,I1
448 set I2,I3
449 mul I1,I5,I4
450 print I1
451 print I5
452 print I4
453 print "\n"
455 CODE
457 OUTPUT
459 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i_i 2 mapped" );
460 set I0,0
461 set I1,1
462 set I2,2
463 set I3,3
464 set I4,4
465 set I0,I1
466 set I2,I3
467 set I0,I1
468 set I2,I3
469 mul I5,I1,I4
470 print I5
471 print I1
472 print I4
473 print "\n"
475 CODE
477 OUTPUT
479 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i_i 3 mapped" );
480 set I0,0
481 set I1,1
482 set I2,2
483 set I3,3
484 set I4,4
485 set I0,I1
486 set I2,I3
487 set I0,I1
488 set I2,I3
489 mul I5,I4,I1
490 print I5
491 print I1
492 print I4
493 print "\n"
495 CODE
497 OUTPUT
499 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i_i 0 mapped" );
500 cleari
501 set I0,0
502 set I1,1
503 set I2,2
504 set I3,3
505 set I4,4
506 set I0,I1
507 set I2,I3
508 set I0,I1
509 set I2,I3
510 mul I5,I6,I4
511 print I5
512 print I6
513 print I4
514 print "\n"
516 CODE
518 OUTPUT
520 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i 1,2 mapped" );
521 set I0,0
522 set I1,1
523 set I2,2
524 set I3,3
525 set I4,4
526 set I0,I1
527 set I2,I3
528 set I0,I1
529 set I2,I3
530 mul I2, I3
531 print I2
532 print I3
533 print "\n"
535 CODE
537 OUTPUT
539 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i 1 mapped" );
540 set I0,0
541 set I1,1
542 set I2,2
543 set I3,3
544 set I4,4
545 set I0,I1
546 set I2,I3
547 set I0,I1
548 set I2,I3
549 mul I2, I4
550 print I2
551 print I4
552 print "\n"
554 CODE
556 OUTPUT
558 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i 2 mapped" );
559 set I0,0
560 set I1,1
561 set I2,2
562 set I3,3
563 set I4,4
564 set I0,I1
565 set I2,I3
566 set I0,I1
567 set I2,I3
568 mul I4, I2
569 print I4
570 print I2
571 print "\n"
573 CODE
575 OUTPUT
577 pasm_output_is( <<'CODE', <<'OUTPUT', "mul_i_i 0 mapped" );
578 cleari
579 set I0,0
580 set I1,1
581 set I2,2
582 set I3,3
583 set I4,4
584 set I0,I1
585 set I2,I3
586 set I0,I1
587 set I2,I3
588 mul I4, I5
589 print I4
590 print I5
591 print "\n"
593 CODE
595 OUTPUT
597 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i_i 1,2,3 mapped" );
598 set I0,0
599 set I1,6
600 set I2,2
601 div I0,I1,I2
602 print I0
603 print I1
604 print I2
605 print "\n"
607 CODE
609 OUTPUT
611 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i_i 1,2 mapped" );
612 set I0,0
613 set I1,8
614 set I2,2
615 set I3,3
616 set I4,4
617 set I0,I1
618 set I2,I3
619 set I0,I1
620 set I2,I3
621 div I0,I1,I4
622 print I0
623 print I1
624 print I4
625 print "\n"
627 CODE
629 OUTPUT
631 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i_i 1,3 mapped" );
632 set I0,0
633 set I1,1
634 set I2,2
635 set I3,3
636 set I4,4
637 set I0,I1
638 set I2,I3
639 set I0,I1
640 set I2,I3
641 div I0,I4,I1
642 print I0
643 print I4
644 print I1
645 print "\n"
647 CODE
649 OUTPUT
651 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i_i 2,3 mapped" );
652 set I0,0
653 set I1,9
654 set I2,2
655 set I3,3
656 set I4,4
657 set I0,I1
658 set I2,I3
659 set I0,I1
660 set I2,I3
661 div I4,I1,I3
662 print I4
663 print I1
664 print I3
665 print "\n"
667 CODE
669 OUTPUT
671 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i_i 1 mapped" );
672 cleari
673 set I0,0
674 set I1,1
675 set I2,2
676 set I3,3
677 set I4,4
678 set I0,I1
679 set I2,I3
680 set I0,I1
681 set I2,I3
682 div I1,I5,I4
683 print I1
684 print I5
685 print I4
686 print "\n"
688 CODE
690 OUTPUT
692 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i_i 2 mapped" );
693 set I0,0
694 set I1,8
695 set I2,2
696 set I3,3
697 set I4,4
698 set I0,I1
699 set I2,I3
700 set I0,I1
701 set I2,I3
702 div I5,I1,I4
703 print I5
704 print I1
705 print I4
706 print "\n"
708 CODE
710 OUTPUT
712 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i_i 3 mapped" );
713 set I0,0
714 set I1,1
715 set I2,2
716 set I3,3
717 set I4,4
718 set I0,I1
719 set I2,I3
720 set I0,I1
721 set I2,I3
722 div I5,I4,I1
723 print I5
724 print I1
725 print I4
726 print "\n"
728 CODE
730 OUTPUT
732 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i_i 0 mapped" );
733 cleari
734 set I0,0
735 set I1,1
736 set I2,2
737 set I3,3
738 set I4,4
739 set I0,I1
740 set I2,I3
741 set I0,I1
742 set I2,I3
743 div I5,I6,I4
744 print I5
745 print I6
746 print I4
747 print "\n"
749 CODE
751 OUTPUT
753 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i 1,2 mapped" );
754 set I0,0
755 set I1,1
756 set I2,9
757 set I3,9
758 set I4,4
759 set I0,I1
760 set I2,I3
761 set I0,I1
762 set I2,I3
763 div I2, I3
764 print I2
765 print I3
766 print "\n"
768 CODE
770 OUTPUT
772 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i 1 mapped" );
773 set I0,0
774 set I1,1
775 set I2,8
776 set I3,8
777 set I4,4
778 set I0,I1
779 set I2,I3
780 set I0,I1
781 set I2,I3
782 div I2, I4
783 print I2
784 print I4
785 print "\n"
787 CODE
789 OUTPUT
791 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i 2 mapped" );
792 set I0,0
793 set I1,1
794 set I2,2
795 set I3,2
796 set I4,4
797 set I0,I1
798 set I2,I3
799 set I0,I1
800 set I2,I3
801 div I4, I2
802 print I4
803 print I2
804 print "\n"
806 CODE
808 OUTPUT
810 pasm_output_is( <<'CODE', <<'OUTPUT', "div_i_i 0 mapped" );
811 set I0,0
812 set I1,1
813 set I2,2
814 set I3,3
815 set I4,4
816 set I5,1
817 set I0,I1
818 set I2,I3
819 set I0,I1
820 set I2,I3
821 div I4, I5
822 print I4
823 print I5
824 print "\n"
826 CODE
828 OUTPUT
830 # tests for JIT CGP
831 pasm_output_is( <<'CODE', <<'OUTPUT', "1 non jit" );
832         set I0, 16
833         print "ok 1\n"
834         end
835 CODE
836 ok 1
837 OUTPUT
839 pasm_output_is( <<'CODE', <<'OUTPUT', "2 non jit" );
840         print "ok 1\n"
841         print "ok 2\n"
842         end
843 CODE
844 ok 1
845 ok 2
846 OUTPUT
848 pasm_output_is( <<'CODE', <<'OUTPUT', "2 non jit" );
849         set I0, 16
850         print "ok 1\n"
851         print "ok 2\n"
852         end
853 CODE
854 ok 1
855 ok 2
856 OUTPUT
858 pasm_output_is( <<'CODE', <<'OUTPUT', "2 non jit, JITed branch to JIT" );
859         set I0, 42
860         print I0
861         print "\n"
862         eq I0, 42, sub
863 ret:
864         end
865 sub:
866         set I0, 43
867         print I0
868         print "\n"
869         branch ret
870 CODE
873 OUTPUT
875 pasm_output_is( <<'CODE', <<'OUTPUT', "2 non jit, non JITed branch to JIT" );
876         set I0, 42
877         print I0
878         print "\n"
879         new P0, 'ResizableIntegerArray'
880         local_branch P0, sub
881         end
882 sub:
883         set I0, 43
884         print I0
885         print "\n"
886         local_return P0
887 CODE
890 OUTPUT
892 pasm_output_is( <<'CODE', <<'OUTPUT', "2 non jit, JITed branch to non JIT" );
893         set I0, 42
894         print I0
895         print "\n"
896         eq I0, 42, sub
897 ret:
898         end
899 sub:
900         print "ok\n"
901         branch ret
902 CODE
905 OUTPUT
907 pasm_output_is( <<'CODE', <<'OUTPUT', "2 non jit, non JITed branch to non JIT" );
908         set I0, 42
909         print I0
910         print "\n"
911         new P0, 'ResizableIntegerArray'
912         local_branch P0, sub
913         end
914 sub:
915         print "ok\n"
916         local_return P0
917 CODE
920 OUTPUT
922 pasm_output_is( <<'CODE', <<'OUTPUT', "set_addr" );
923        set_addr I1, FOO
924        jump I1
925        print "Jump failed\n"
926        end
928 FOO:   print "Jump succeeded\n"
929        end
930 CODE
931 Jump succeeded
932 OUTPUT
934 pasm_output_is( <<'CODE', <<'OUTPUT', "last is branch" );
935     print "ok 1\n"
936     branch l2
938     print "ok 3\n"
939     end
941     print "ok 2\n"
942     branch l1
943 CODE
944 ok 1
945 ok 2
946 ok 3
947 OUTPUT
949 pasm_output_is( <<'CODE', <<'OUTPUT', "last is branch" );
950     print "ok 1\n"
951     branch l2
953     print "ok 4\n"
954     end
956     print "ok 2\n"
957     print "ok 3\n"
958     branch l1
959 CODE
960 ok 1
961 ok 2
962 ok 3
963 ok 4
964 OUTPUT
966 pasm_output_is( <<'CODE', <<'OUTPUT', "last is JIT branch" );
967     null I0
968     print "ok 1\n"
969     branch l2
971     print "ok 3\n"
972     end
974     print "ok 2\n"
975     eq I0, 0, l1
976 CODE
977 ok 1
978 ok 2
979 ok 3
980 OUTPUT
982 pasm_output_is( <<'CODE', <<'OUTPUT', "last is JIT branch" );
983     null I0
984     print "ok 1\n"
985     branch l2
987     print "ok 4\n"
988     end
990     print "ok 2\n"
991     print "ok 3\n"
992     eq I0, 0, l1
993 CODE
994 ok 1
995 ok 2
996 ok 3
997 ok 4
998 OUTPUT
1000 pasm_output_is( <<'CODE', <<'OUTPUT', "t/op/arithmetic_26: non jit seq w. branch" );
1001 new P0, 'Integer'
1002 set N0, 4000
1003 set P0, 123
1004 div P0, P0, N0
1006 set     N0, P0
1007 set     N1, 0.03074969250307496925
1008 sub     N2, N1,N0
1009 abs     N2, N2
1010 gt      N2, 0.000001, local__fp_eq__FPEQNOK__1
1012 branch  EQ1
1013 local__fp_eq__FPEQNOK__1:
1014 print P0
1015 print "not "
1016 EQ1:    print "ok 1"
1017 print "\n"
1019 CODE
1020 ok 1
1021 OUTPUT
1023 # multiply optimization tests
1025 pasm_output_is( <<'CODE', <<'OUTPUT', "mul power of 2" );
1026    set I0, 5
1027    mul I1, I0, 0
1028    eq I1, 0, ok_1
1029    print "nok mul 0 "
1030 ok_1:
1031    print "ok 1\n"
1033    mul I1, I0, 1
1034    eq I1, 5, ok_2
1035    print "nok mul 1 "
1036 ok_2:
1037    print "ok 2\n"
1039    mul I1, I0, 2
1040    eq I1, 10, ok_3
1041    print "nok mul 2 "
1042 ok_3:
1043    print "ok 3\n"
1045    mul I1, I0, 4
1046    eq I1, 20, ok_4
1047    print "nok mul 4 "
1048 ok_4:
1049    print "ok 4\n"
1051    mul I1, I0, 8
1052    eq I1, 40, ok_5
1053    print "nok mul 8 "
1054 ok_5:
1055    print "ok 5\n"
1057    mul I1, I0, 1024
1058    eq I1, 5120, ok_6
1059    print "nok mul 1024 "
1060 ok_6:
1061    print "ok 6\n"
1062    end
1063 CODE
1064 ok 1
1065 ok 2
1066 ok 3
1067 ok 4
1068 ok 5
1069 ok 6
1070 OUTPUT
1072 pasm_output_is( <<'CODE', <<'OUTPUT', "small imm" );
1073    set I0, 5
1074    mul I1, I0, 3
1075    eq I1, 15, ok_1
1076    print "nok mul 3 "
1077 ok_1:
1078    print "ok 1\n"
1080    mul I1, I0, 5
1081    eq I1, 25, ok_2
1082    print "nok mul 5 "
1083 ok_2:
1084    print "ok 2\n"
1086    mul I1, I0, 6
1087    eq I1, 30, ok_3
1088    print "nok mul 6 "
1089 ok_3:
1090    print "ok 3\n"
1092    mul I1, I0, 9
1093    eq I1, 45, ok_4
1094    print "nok mul 9 "
1095 ok_4:
1096    print "ok 4\n"
1098    mul I1, I0, 10
1099    eq I1, 50, ok_5
1100    print "nok mul 10 "
1101 ok_5:
1102    print "ok 5\n"
1104    mul I1, I0, 12
1105    eq I1, 60, ok_6
1106    print "nok mul 12 "
1107 ok_6:
1108    print "ok 6\n"
1110    mul I1, I0, 100
1111    eq I1, 500, ok_7
1112    print "nok mul 100 "
1113 ok_7:
1114    print "ok 7\n"
1116    end
1117 CODE
1118 ok 1
1119 ok 2
1120 ok 3
1121 ok 4
1122 ok 5
1123 ok 6
1124 ok 7
1125 OUTPUT
1127 pasm_output_is( <<'CODE', <<'OUTPUT', "div power of 2" );
1128    set I0, 1024
1129    div I1, I0, 2
1130    eq I1, 512, ok_1
1131    print "nok div 2 "
1132 ok_1:
1133    print "ok 1\n"
1135    div I1, I0, 4
1136    eq I1, 256, ok_2
1137    print "nok div 4 "
1138 ok_2:
1139    print "ok 2\n"
1141    div I1, I0, 8
1142    eq I1, 128, ok_3
1143    print "nok div 8 "
1144 ok_3:
1145    print "ok 3\n"
1147    div I1, I0, 16
1148    eq I1, 64, ok_4
1149    print "nok div 16 "
1150 ok_4:
1151    print "ok 4\n"
1152    end
1153 CODE
1154 ok 1
1155 ok 2
1156 ok 3
1157 ok 4
1158 OUTPUT
1160 my $code;
1161 for ( 0 .. 4096 ) {
1162     $code .= qq{   set S0, "hello"\n};
1164 $code .= <<CODE;
1165    print S0
1166    print "\\ndone\\n"
1167    end
1168 CODE
1170 pasm_output_is( $code, <<OUTPUT, "large code" );
1171 hello
1172 done
1173 OUTPUT
1175 pasm_output_is( <<'CODE', <<'OUTPUT', "volatile clobbered by function call" );
1176   null I3
1177   null I6
1178   null I5
1179   add I4, I5, I6
1180   add I4, I5, I6
1181   add I4, I5, I6
1182   add I4, I5, I3
1183   add I4, I5, I3
1184   add I4, I5, I3
1185   set I3, 2
1186   set I1, 2
1187   set S0, "Hi"
1188   mul I5, I1, 77
1189   print I3
1190   print "\n"
1191   print I4
1192   print "\n"
1193   print I5
1194   print "\n"
1195   end
1196 CODE
1200 OUTPUT
1202 pasm_output_is( <<'CODE', <<'OUTPUT', "div bug" );
1203     set I1, 1
1204     set I2, 2
1205     set I3, 4
1206     set I4, 4
1207     mul I3, I1
1208     div I3, I2
1209     print I3
1210     print "\n"
1211     end
1212 CODE
1214 OUTPUT
1216 pir_output_is( <<'CODE', <<'OUTPUT', "shr_i_i" );
1217 # on x86 the shift count is always in %cl
1218 .sub main :main
1219     .local int i
1220     i = 2
1221     $I0 = 'shr'(i, i, i, i, 32)
1222     print $I0
1223     print "\n"
1224 .end
1225 .sub 'shr'
1226     .param int i
1227     .param int j
1228     .param int k
1229     .param int l
1230     .param int m
1231     i = i + 1  # force shown reg alloc on x86
1232     i = i + 1
1233     i = i + 1
1234     i = i + 1  # edi
1235     j = j + 1
1236     j = j + 1
1237     j = j + 1  # esi
1238     k = k + 1
1239     k = k + 1  # edx
1240     m = m + 32 # ecx
1241     m >>= l    # opt_shift_rm (count l in memory)
1242     .return (m)
1243 .end
1244 CODE
1246 OUTPUT
1248 # Local Variables:
1249 #   mode: cperl
1250 #   cperl-indent-level: 4
1251 #   fill-column: 100
1252 # End:
1253 # vim: expandtab shiftwidth=4: