]> gitweb.factorcode.org Git - factor.git/blob - extra/compiler/cfg/gvn/gvn-tests.factor
factor: rename [ ] [ ] unit-test -> { } [ ] unit-test using a refactoring tool!
[factor.git] / extra / compiler / cfg / gvn / gvn-tests.factor
1 USING: combinators compiler.cfg.gvn compiler.cfg.instructions
2 compiler.cfg.registers compiler.cfg.debugger
3 compiler.cfg.comparisons cpu.architecture tools.test kernel
4 math combinators.short-circuit accessors sequences
5 compiler.cfg.predecessors compiler.cfg.utilities locals compiler.cfg.dce
6 compiler.cfg.ssa.destruction compiler.cfg.loop-detection
7 compiler.cfg.representations compiler.cfg assocs vectors arrays
8 layouts literals namespaces alien compiler.cfg.gvn.simd system ;
9 QUALIFIED-WITH: alien.c-types c
10 IN: compiler.cfg.gvn.tests
11
12 : trim-temps ( insns -- insns )
13     [
14         dup {
15             [ ##compare? ]
16             [ ##compare-imm? ]
17             [ ##compare-integer? ]
18             [ ##compare-integer-imm? ]
19             [ ##compare-float-unordered? ]
20             [ ##compare-float-ordered? ]
21             [ ##test? ]
22             [ ##test-imm? ]
23             [ ##test-vector? ]
24             [ ##test-vector-branch? ]
25         } 1|| [ f >>temp ] when
26     ] map ;
27
28 : value-number-bb ( insns -- insns' )
29     0 test-bb
30     0 get block>cfg
31     value-numbering
32     0 get instructions>> ;
33
34 ! Folding constants together
35 {
36     V{
37         T{ ##load-reference f 0 0.0 }
38         T{ ##load-reference f 1 -0.0 }
39     }
40 } [
41     V{
42         T{ ##load-reference f 0 0.0 }
43         T{ ##load-reference f 1 -0.0 }
44     } value-number-bb
45 ] unit-test
46
47 {
48     V{
49         T{ ##load-reference f 0 0.0 }
50         T{ ##copy f 1 0 any-rep }
51     }
52 } [
53     V{
54         T{ ##load-reference f 0 0.0 }
55         T{ ##load-reference f 1 0.0 }
56     } value-number-bb
57 ] unit-test
58
59 {
60     V{
61         T{ ##load-reference f 0 t }
62         T{ ##copy f 1 0 any-rep }
63     }
64 } [
65     V{
66         T{ ##load-reference f 0 t }
67         T{ ##load-reference f 1 t }
68     } value-number-bb
69 ] unit-test
70
71 ! ##load-reference/##replace fusion
72 cpu x86? [
73     [
74         V{
75             T{ ##load-integer f 0 10 }
76             T{ ##replace-imm f 10 D 0 }
77         }
78     ] [
79         V{
80             T{ ##load-integer f 0 10 }
81             T{ ##replace f 0 D 0 }
82         } value-number-bb
83     ] unit-test
84
85     [
86         V{
87             T{ ##load-reference f 0 f }
88             T{ ##replace-imm f f D 0 }
89         }
90     ] [
91         V{
92             T{ ##load-reference f 0 f }
93             T{ ##replace f 0 D 0 }
94         } value-number-bb
95     ] unit-test
96 ] when
97
98 cpu x86.32? [
99     [
100         V{
101             T{ ##load-reference f 0 + }
102             T{ ##replace-imm f + D 0 }
103         }
104     ] [
105         V{
106             T{ ##load-reference f 0 + }
107             T{ ##replace f 0 D 0 }
108         } value-number-bb
109     ] unit-test
110 ] when
111
112 cpu x86.64? [
113     [
114         V{
115             T{ ##load-integer f 0 10,000,000,000 }
116             T{ ##replace f 0 D 0 }
117         }
118     ] [
119         V{
120             T{ ##load-integer f 0 10,000,000,000 }
121             T{ ##replace f 0 D 0 }
122         } value-number-bb
123     ] unit-test
124
125     ! Boundary case
126     [
127         V{
128             T{ ##load-integer f 0 0x7fffffff }
129             T{ ##replace f 0 D 0 }
130         }
131     ] [
132         V{
133             T{ ##load-integer f 0 0x7fffffff }
134             T{ ##replace f 0 D 0 }
135         } value-number-bb
136     ] unit-test
137 ] when
138
139 ! Double compare elimination
140 {
141     V{
142         T{ ##peek f 1 D 1 }
143         T{ ##peek f 2 D 2 }
144         T{ ##compare f 4 2 1 cc= }
145         T{ ##copy f 6 4 any-rep }
146         T{ ##replace f 4 D 0 }
147     }
148 } [
149     V{
150         T{ ##peek f 1 D 1 }
151         T{ ##peek f 2 D 2 }
152         T{ ##compare f 4 2 1 cc= }
153         T{ ##compare-imm f 6 4 f cc/= }
154         T{ ##replace f 6 D 0 }
155     } value-number-bb trim-temps
156 ] unit-test
157
158 {
159     V{
160         T{ ##peek f 1 D 1 }
161         T{ ##compare-imm f 2 1 16 cc= }
162         T{ ##copy f 3 2 any-rep }
163         T{ ##replace f 2 D 0 }
164     }
165 } [
166     V{
167         T{ ##peek f 1 D 1 }
168         T{ ##compare-imm f 2 1 16 cc= }
169         T{ ##compare-imm f 3 2 f cc/= }
170         T{ ##replace f 3 D 0 }
171     } value-number-bb trim-temps
172 ] unit-test
173
174 {
175     V{
176         T{ ##peek f 1 D 1 }
177         T{ ##peek f 2 D 2 }
178         T{ ##compare-integer f 4 2 1 cc> }
179         T{ ##copy f 6 4 any-rep }
180         T{ ##replace f 4 D 0 }
181     }
182 } [
183     V{
184         T{ ##peek f 1 D 1 }
185         T{ ##peek f 2 D 2 }
186         T{ ##compare-integer f 4 2 1 cc> }
187         T{ ##compare-imm f 6 4 f cc/= }
188         T{ ##replace f 6 D 0 }
189     } value-number-bb trim-temps
190 ] unit-test
191
192 {
193     V{
194         T{ ##peek f 1 D 1 }
195         T{ ##peek f 2 D 2 }
196         T{ ##compare-integer f 4 2 1 cc<= }
197         T{ ##compare-integer f 6 2 1 cc/<= }
198         T{ ##replace f 6 D 0 }
199     }
200 } [
201     V{
202         T{ ##peek f 1 D 1 }
203         T{ ##peek f 2 D 2 }
204         T{ ##compare-integer f 4 2 1 cc<= }
205         T{ ##compare-imm f 6 4 f cc= }
206         T{ ##replace f 6 D 0 }
207     } value-number-bb trim-temps
208 ] unit-test
209
210 {
211     V{
212         T{ ##peek f 1 D 1 }
213         T{ ##compare-integer-imm f 2 1 100 cc<= }
214         T{ ##compare-integer-imm f 3 1 100 cc/<= }
215         T{ ##replace f 3 D 0 }
216     }
217 } [
218     V{
219         T{ ##peek f 1 D 1 }
220         T{ ##compare-integer-imm f 2 1 100 cc<= }
221         T{ ##compare-imm f 3 2 f cc= }
222         T{ ##replace f 3 D 0 }
223     } value-number-bb trim-temps
224 ] unit-test
225
226 {
227     V{
228         T{ ##peek f 8 D 0 }
229         T{ ##peek f 9 D -1 }
230         T{ ##compare-float-unordered f 12 8 9 cc< }
231         T{ ##compare-float-unordered f 14 8 9 cc/< }
232         T{ ##replace f 14 D 0 }
233     }
234 } [
235     V{
236         T{ ##peek f 8 D 0 }
237         T{ ##peek f 9 D -1 }
238         T{ ##compare-float-unordered f 12 8 9 cc< }
239         T{ ##compare-imm f 14 12 f cc= }
240         T{ ##replace f 14 D 0 }
241     } value-number-bb trim-temps
242 ] unit-test
243
244 {
245     V{
246         T{ ##peek f 29 D -1 }
247         T{ ##peek f 30 D -2 }
248         T{ ##compare f 33 29 30 cc= }
249         T{ ##compare-branch f 29 30 cc= }
250     }
251 } [
252     V{
253         T{ ##peek f 29 D -1 }
254         T{ ##peek f 30 D -2 }
255         T{ ##compare f 33 29 30 cc= }
256         T{ ##compare-imm-branch f 33 f cc/= }
257     } value-number-bb trim-temps
258 ] unit-test
259
260 {
261     V{
262         T{ ##peek f 29 D -1 }
263         T{ ##peek f 30 D -2 }
264         T{ ##compare-integer f 33 29 30 cc<= }
265         T{ ##compare-integer-branch f 29 30 cc<= }
266     }
267 } [
268     V{
269         T{ ##peek f 29 D -1 }
270         T{ ##peek f 30 D -2 }
271         T{ ##compare-integer f 33 29 30 cc<= }
272         T{ ##compare-imm-branch f 33 f cc/= }
273     } value-number-bb trim-temps
274 ] unit-test
275
276 {
277     V{
278         T{ ##peek f 29 D -1 }
279         T{ ##peek f 30 D -2 }
280         T{ ##test f 33 29 30 cc= }
281         T{ ##test-branch f 29 30 cc= }
282     }
283 } [
284     V{
285         T{ ##peek f 29 D -1 }
286         T{ ##peek f 30 D -2 }
287         T{ ##test f 33 29 30 cc= }
288         T{ ##compare-imm-branch f 33 f cc/= }
289     } value-number-bb trim-temps
290 ] unit-test
291
292 {
293     V{
294         T{ ##peek f 29 D -1 }
295         T{ ##test-imm f 33 29 30 cc= }
296         T{ ##test-imm-branch f 29 30 cc= }
297     }
298 } [
299     V{
300         T{ ##peek f 29 D -1 }
301         T{ ##test-imm f 33 29 30 cc= }
302         T{ ##compare-imm-branch f 33 f cc/= }
303     } value-number-bb trim-temps
304 ] unit-test
305
306 {
307     V{
308         T{ ##peek f 1 D -1 }
309         T{ ##test-vector f 2 1 f float-4-rep vcc-any }
310         T{ ##test-vector-branch f 1 f float-4-rep vcc-any }
311     }
312 } [
313     V{
314         T{ ##peek f 1 D -1 }
315         T{ ##test-vector f 2 1 f float-4-rep vcc-any }
316         T{ ##compare-imm-branch f 2 f cc/= }
317     } value-number-bb trim-temps
318 ] unit-test
319
320 cpu x86.32? [
321     [
322         V{
323             T{ ##peek f 1 D 0 }
324             T{ ##compare-imm f 2 1 + cc= }
325             T{ ##compare-imm-branch f 1 + cc= }
326         }
327     ] [
328         V{
329             T{ ##peek f 1 D 0 }
330             T{ ##compare-imm f 2 1 + cc= }
331             T{ ##compare-imm-branch f 2 f cc/= }
332         } value-number-bb trim-temps
333     ] unit-test
334 ] when
335
336 ! Immediate operand fusion
337 {
338     V{
339         T{ ##peek f 0 D 0 }
340         T{ ##load-integer f 1 100 }
341         T{ ##add-imm f 2 0 100 }
342     }
343 } [
344     V{
345         T{ ##peek f 0 D 0 }
346         T{ ##load-integer f 1 100 }
347         T{ ##add f 2 0 1 }
348     } value-number-bb
349 ] unit-test
350
351 {
352     V{
353         T{ ##peek f 0 D 0 }
354         T{ ##load-integer f 1 100 }
355         T{ ##add-imm f 2 0 100 }
356     }
357 } [
358     V{
359         T{ ##peek f 0 D 0 }
360         T{ ##load-integer f 1 100 }
361         T{ ##add f 2 1 0 }
362     } value-number-bb
363 ] unit-test
364
365 {
366     V{
367         T{ ##peek f 0 D 0 }
368         T{ ##load-integer f 1 100 }
369         T{ ##add-imm f 2 0 -100 }
370     }
371 } [
372     V{
373         T{ ##peek f 0 D 0 }
374         T{ ##load-integer f 1 100 }
375         T{ ##sub f 2 0 1 }
376     } value-number-bb
377 ] unit-test
378
379 {
380     V{
381         T{ ##peek f 0 D 0 }
382         T{ ##load-integer f 1 0 }
383     }
384 } [
385     V{
386         T{ ##peek f 0 D 0 }
387         T{ ##sub f 1 0 0 }
388     } value-number-bb
389 ] unit-test
390
391 {
392     V{
393         T{ ##peek f 0 D 0 }
394         T{ ##load-integer f 1 100 }
395         T{ ##mul-imm f 2 0 100 }
396     }
397 } [
398     V{
399         T{ ##peek f 0 D 0 }
400         T{ ##load-integer f 1 100 }
401         T{ ##mul f 2 0 1 }
402     } value-number-bb
403 ] unit-test
404
405 {
406     V{
407         T{ ##peek f 0 D 0 }
408         T{ ##load-integer f 1 100 }
409         T{ ##mul-imm f 2 0 100 }
410     }
411 } [
412     V{
413         T{ ##peek f 0 D 0 }
414         T{ ##load-integer f 1 100 }
415         T{ ##mul f 2 1 0 }
416     } value-number-bb
417 ] unit-test
418
419 {
420     V{
421         T{ ##peek f 1 D 0 }
422         T{ ##shl-imm f 2 1 3 }
423     }
424 } [
425     V{
426         T{ ##peek f 1 D 0 }
427         T{ ##mul-imm f 2 1 8 }
428     } value-number-bb
429 ] unit-test
430
431 {
432     V{
433         T{ ##peek f 0 D 0 }
434         T{ ##load-integer f 1 -1 }
435         T{ ##neg f 2 0 }
436     }
437 } [
438     V{
439         T{ ##peek f 0 D 0 }
440         T{ ##load-integer f 1 -1 }
441         T{ ##mul f 2 0 1 }
442     } value-number-bb
443 ] unit-test
444
445 {
446     V{
447         T{ ##peek f 0 D 0 }
448         T{ ##load-integer f 1 -1 }
449         T{ ##neg f 2 0 }
450     }
451 } [
452     V{
453         T{ ##peek f 0 D 0 }
454         T{ ##load-integer f 1 -1 }
455         T{ ##mul f 2 1 0 }
456     } value-number-bb
457 ] unit-test
458
459 {
460     V{
461         T{ ##peek f 0 D 0 }
462         T{ ##load-integer f 1 0 }
463         T{ ##neg f 2 0 }
464     }
465 } [
466     V{
467         T{ ##peek f 0 D 0 }
468         T{ ##load-integer f 1 0 }
469         T{ ##sub f 2 1 0 }
470     } value-number-bb
471 ] unit-test
472
473 {
474     V{
475         T{ ##peek f 0 D 0 }
476         T{ ##load-integer f 1 0 }
477         T{ ##neg f 2 0 }
478         T{ ##copy f 3 0 any-rep }
479     }
480 } [
481     V{
482         T{ ##peek f 0 D 0 }
483         T{ ##load-integer f 1 0 }
484         T{ ##sub f 2 1 0 }
485         T{ ##sub f 3 1 2 }
486     } value-number-bb
487 ] unit-test
488
489 {
490     V{
491         T{ ##peek f 0 D 0 }
492         T{ ##neg f 1 0 }
493         T{ ##copy f 2 0 any-rep }
494     }
495 } [
496     V{
497         T{ ##peek f 0 D 0 }
498         T{ ##neg f 1 0 }
499         T{ ##neg f 2 1 }
500     } value-number-bb
501 ] unit-test
502
503 {
504     V{
505         T{ ##peek f 0 D 0 }
506         T{ ##not f 1 0 }
507         T{ ##copy f 2 0 any-rep }
508     }
509 } [
510     V{
511         T{ ##peek f 0 D 0 }
512         T{ ##not f 1 0 }
513         T{ ##not f 2 1 }
514     } value-number-bb
515 ] unit-test
516
517 {
518     V{
519         T{ ##peek f 0 D 0 }
520         T{ ##load-integer f 1 100 }
521         T{ ##and-imm f 2 0 100 }
522     }
523 } [
524     V{
525         T{ ##peek f 0 D 0 }
526         T{ ##load-integer f 1 100 }
527         T{ ##and f 2 0 1 }
528     } value-number-bb
529 ] unit-test
530
531 {
532     V{
533         T{ ##peek f 0 D 0 }
534         T{ ##load-integer f 1 100 }
535         T{ ##and-imm f 2 0 100 }
536     }
537 } [
538     V{
539         T{ ##peek f 0 D 0 }
540         T{ ##load-integer f 1 100 }
541         T{ ##and f 2 1 0 }
542     } value-number-bb
543 ] unit-test
544
545 {
546     V{
547         T{ ##peek f 0 D 0 }
548         T{ ##load-integer f 1 100 }
549         T{ ##or-imm f 2 0 100 }
550     }
551 } [
552     V{
553         T{ ##peek f 0 D 0 }
554         T{ ##load-integer f 1 100 }
555         T{ ##or f 2 0 1 }
556     } value-number-bb
557 ] unit-test
558
559 {
560     V{
561         T{ ##peek f 0 D 0 }
562         T{ ##load-integer f 1 100 }
563         T{ ##or-imm f 2 0 100 }
564     }
565 } [
566     V{
567         T{ ##peek f 0 D 0 }
568         T{ ##load-integer f 1 100 }
569         T{ ##or f 2 1 0 }
570     } value-number-bb
571 ] unit-test
572
573 {
574     V{
575         T{ ##peek f 0 D 0 }
576         T{ ##load-integer f 1 100 }
577         T{ ##xor-imm f 2 0 100 }
578     }
579 } [
580     V{
581         T{ ##peek f 0 D 0 }
582         T{ ##load-integer f 1 100 }
583         T{ ##xor f 2 0 1 }
584     } value-number-bb
585 ] unit-test
586
587 {
588     V{
589         T{ ##peek f 0 D 0 }
590         T{ ##load-integer f 1 100 }
591         T{ ##xor-imm f 2 0 100 }
592     }
593 } [
594     V{
595         T{ ##peek f 0 D 0 }
596         T{ ##load-integer f 1 100 }
597         T{ ##xor f 2 1 0 }
598     } value-number-bb
599 ] unit-test
600
601 {
602     V{
603         T{ ##peek f 0 D 0 }
604         T{ ##load-integer f 1 100 }
605         T{ ##compare-imm f 2 0 100 cc= }
606     }
607 } [
608     V{
609         T{ ##peek f 0 D 0 }
610         T{ ##load-integer f 1 100 }
611         T{ ##compare f 2 0 1 cc= }
612     } value-number-bb trim-temps
613 ] unit-test
614
615 {
616     V{
617         T{ ##peek f 0 D 0 }
618         T{ ##load-integer f 1 100 }
619         T{ ##compare-integer-imm f 2 0 100 cc<= }
620     }
621 } [
622     V{
623         T{ ##peek f 0 D 0 }
624         T{ ##load-integer f 1 100 }
625         T{ ##compare-integer f 2 0 1 cc<= }
626     } value-number-bb trim-temps
627 ] unit-test
628
629 cpu x86.32? [
630     [
631         V{
632             T{ ##peek f 0 D 0 }
633             T{ ##load-reference f 1 + }
634             T{ ##compare-imm f 2 0 + cc= }
635         }
636     ] [
637         V{
638             T{ ##peek f 0 D 0 }
639             T{ ##load-reference f 1 + }
640             T{ ##compare f 2 0 1 cc= }
641         } value-number-bb trim-temps
642     ] unit-test
643
644     [
645         V{
646             T{ ##peek f 0 D 0 }
647             T{ ##load-reference f 1 + }
648             T{ ##compare-imm-branch f 0 + cc= }
649         }
650     ] [
651         V{
652             T{ ##peek f 0 D 0 }
653             T{ ##load-reference f 1 + }
654             T{ ##compare-branch f 0 1 cc= }
655         } value-number-bb trim-temps
656     ] unit-test
657 ] when
658
659 cpu x86.32? [
660     [
661         V{
662             T{ ##peek f 0 D 0 }
663             T{ ##load-reference f 1 3.5 }
664             T{ ##compare f 2 0 1 cc= }
665         }
666     ] [
667         V{
668             T{ ##peek f 0 D 0 }
669             T{ ##load-reference f 1 3.5 }
670             T{ ##compare f 2 0 1 cc= }
671         } value-number-bb trim-temps
672     ] unit-test
673
674     [
675         V{
676             T{ ##peek f 0 D 0 }
677             T{ ##load-reference f 1 3.5 }
678             T{ ##compare-branch f 0 1 cc= }
679         }
680     ] [
681         V{
682             T{ ##peek f 0 D 0 }
683             T{ ##load-reference f 1 3.5 }
684             T{ ##compare-branch f 0 1 cc= }
685         } value-number-bb trim-temps
686     ] unit-test
687 ] unless
688
689 {
690     V{
691         T{ ##peek f 0 D 0 }
692         T{ ##load-integer f 1 100 }
693         T{ ##compare-integer-imm f 2 0 100 cc>= }
694     }
695 } [
696     V{
697         T{ ##peek f 0 D 0 }
698         T{ ##load-integer f 1 100 }
699         T{ ##compare-integer f 2 1 0 cc<= }
700     } value-number-bb trim-temps
701 ] unit-test
702
703 {
704     V{
705         T{ ##peek f 0 D 0 }
706         T{ ##load-integer f 1 100 }
707         T{ ##compare-integer-imm-branch f 0 100 cc<= }
708     }
709 } [
710     V{
711         T{ ##peek f 0 D 0 }
712         T{ ##load-integer f 1 100 }
713         T{ ##compare-integer-branch f 0 1 cc<= }
714     } value-number-bb
715 ] unit-test
716
717 {
718     V{
719         T{ ##peek f 0 D 0 }
720         T{ ##load-integer f 1 100 }
721         T{ ##compare-integer-imm-branch f 0 100 cc>= }
722     }
723 } [
724     V{
725         T{ ##peek f 0 D 0 }
726         T{ ##load-integer f 1 100 }
727         T{ ##compare-integer-branch f 1 0 cc<= }
728     } value-number-bb trim-temps
729 ] unit-test
730
731 ! Compare folding
732 {
733     V{
734         T{ ##load-integer f 1 100 }
735         T{ ##load-integer f 2 200 }
736         T{ ##load-reference f 3 t }
737     }
738 } [
739     V{
740         T{ ##load-integer f 1 100 }
741         T{ ##load-integer f 2 200 }
742         T{ ##compare-integer f 3 1 2 cc<= }
743     } value-number-bb trim-temps
744 ] unit-test
745
746 {
747     V{
748         T{ ##load-integer f 1 100 }
749         T{ ##load-integer f 2 200 }
750         T{ ##load-reference f 3 f }
751     }
752 } [
753     V{
754         T{ ##load-integer f 1 100 }
755         T{ ##load-integer f 2 200 }
756         T{ ##compare-integer f 3 1 2 cc= }
757     } value-number-bb trim-temps
758 ] unit-test
759
760 {
761     V{
762         T{ ##load-integer f 1 100 }
763         T{ ##load-reference f 2 f }
764     }
765 } [
766     V{
767         T{ ##load-integer f 1 100 }
768         T{ ##compare-integer-imm f 2 1 123 cc= }
769     } value-number-bb trim-temps
770 ] unit-test
771
772 {
773     V{
774         T{ ##load-integer f 1 10 }
775         T{ ##load-integer f 2 20 }
776         T{ ##load-reference f 3 f }
777     }
778 } [
779     V{
780         T{ ##load-integer f 1 10 }
781         T{ ##load-integer f 2 20 }
782         T{ ##compare-integer f 3 1 2 cc= }
783     } value-number-bb
784 ] unit-test
785
786 {
787     V{
788         T{ ##load-integer f 1 1 }
789         T{ ##load-integer f 2 2 }
790         T{ ##load-reference f 3 t }
791     }
792 } [
793     V{
794         T{ ##load-integer f 1 1 }
795         T{ ##load-integer f 2 2 }
796         T{ ##compare-integer f 3 1 2 cc/= }
797     } value-number-bb
798 ] unit-test
799
800 {
801     V{
802         T{ ##load-integer f 1 1 }
803         T{ ##load-integer f 2 2 }
804         T{ ##load-reference f 3 t }
805     }
806 } [
807     V{
808         T{ ##load-integer f 1 1 }
809         T{ ##load-integer f 2 2 }
810         T{ ##compare-integer f 3 1 2 cc< }
811     } value-number-bb
812 ] unit-test
813
814 {
815     V{
816         T{ ##load-integer f 1 10 }
817         T{ ##load-integer f 2 20 }
818         T{ ##load-reference f 3 f }
819     }
820 } [
821     V{
822         T{ ##load-integer f 1 10 }
823         T{ ##load-integer f 2 20 }
824         T{ ##compare-integer f 3 2 1 cc< }
825     } value-number-bb
826 ] unit-test
827
828 {
829     V{
830         T{ ##peek f 0 D 0 }
831         T{ ##load-reference f 1 f }
832     }
833 } [
834     V{
835         T{ ##peek f 0 D 0 }
836         T{ ##compare-integer f 1 0 0 cc< }
837     } value-number-bb
838 ] unit-test
839
840 {
841     V{
842         T{ ##peek f 0 D 0 }
843         T{ ##copy f 1 0 any-rep }
844         T{ ##load-reference f 2 f }
845     }
846 } [
847     V{
848         T{ ##peek f 0 D 0 }
849         T{ ##copy f 1 0 any-rep }
850         T{ ##compare-integer f 2 0 1 cc< }
851     } value-number-bb
852 ] unit-test
853
854 {
855     V{
856         T{ ##peek f 0 D 0 }
857         T{ ##load-reference f 1 t }
858     }
859 } [
860     V{
861         T{ ##peek f 0 D 0 }
862         T{ ##compare-integer f 1 0 0 cc<= }
863     } value-number-bb
864 ] unit-test
865
866 {
867     V{
868         T{ ##peek f 0 D 0 }
869         T{ ##load-reference f 1 f }
870     }
871 } [
872     V{
873         T{ ##peek f 0 D 0 }
874         T{ ##compare-integer f 1 0 0 cc> }
875     } value-number-bb
876 ] unit-test
877
878 {
879     V{
880         T{ ##peek f 0 D 0 }
881         T{ ##load-reference f 1 t }
882     }
883 } [
884     V{
885         T{ ##peek f 0 D 0 }
886         T{ ##compare-integer f 1 0 0 cc>= }
887     } value-number-bb
888 ] unit-test
889
890 {
891     V{
892         T{ ##peek f 0 D 0 }
893         T{ ##load-reference f 1 f }
894     }
895 } [
896     V{
897         T{ ##peek f 0 D 0 }
898         T{ ##compare-integer f 1 0 0 cc/= }
899     } value-number-bb
900 ] unit-test
901
902 {
903     V{
904         T{ ##peek f 0 D 0 }
905         T{ ##load-reference f 1 t }
906     }
907 } [
908     V{
909         T{ ##peek f 0 D 0 }
910         T{ ##compare-integer f 1 0 0 cc= }
911     } value-number-bb
912 ] unit-test
913
914 {
915     V{
916         T{ ##load-integer f 1 10 }
917         T{ ##load-reference f 2 t }
918     }
919 } [
920     V{
921         T{ ##load-integer f 1 10 }
922         T{ ##compare-imm f 2 1 10 cc= }
923     } value-number-bb
924 ] unit-test
925
926 {
927     V{
928         T{ ##load-integer f 1 10 }
929         T{ ##load-reference f 2 f }
930     }
931 } [
932     V{
933         T{ ##load-integer f 1 10 }
934         T{ ##compare-imm f 2 1 20 cc= }
935     } value-number-bb
936 ] unit-test
937
938 {
939     V{
940         T{ ##load-integer f 1 10 }
941         T{ ##load-reference f 2 t }
942     }
943 } [
944     V{
945         T{ ##load-integer f 1 10 }
946         T{ ##compare-imm f 2 1 100 cc/= }
947     } value-number-bb
948 ] unit-test
949
950 {
951     V{
952         T{ ##load-integer f 1 10 }
953         T{ ##load-reference f 2 f }
954     }
955 } [
956     V{
957         T{ ##load-integer f 1 10 }
958         T{ ##compare-imm f 2 1 10 cc/= }
959     } value-number-bb
960 ] unit-test
961
962 cpu x86.32? [
963     [
964         V{
965             T{ ##load-reference f 1 + }
966             T{ ##load-reference f 2 f }
967         }
968     ] [
969         V{
970             T{ ##load-reference f 1 + }
971             T{ ##compare-imm f 2 1 + cc/= }
972         } value-number-bb
973     ] unit-test
974
975     [
976         V{
977             T{ ##load-reference f 1 + }
978             T{ ##load-reference f 2 t }
979         }
980     ] [
981         V{
982             T{ ##load-reference f 1 + }
983             T{ ##compare-imm f 2 1 * cc/= }
984         } value-number-bb
985     ] unit-test
986
987     [
988         V{
989             T{ ##load-reference f 1 + }
990             T{ ##load-reference f 2 t }
991         }
992     ] [
993         V{
994             T{ ##load-reference f 1 + }
995             T{ ##compare-imm f 2 1 + cc= }
996         } value-number-bb
997     ] unit-test
998
999     [
1000         V{
1001             T{ ##load-reference f 1 + }
1002             T{ ##load-reference f 2 f }
1003         }
1004     ] [
1005         V{
1006             T{ ##load-reference f 1 + }
1007             T{ ##compare-imm f 2 1 * cc= }
1008         } value-number-bb
1009     ] unit-test
1010 ] when
1011
1012 {
1013     V{
1014         T{ ##peek f 0 D 0 }
1015         T{ ##load-reference f 1 t }
1016     }
1017 } [
1018     V{
1019         T{ ##peek f 0 D 0 }
1020         T{ ##compare f 1 0 0 cc= }
1021     } value-number-bb
1022 ] unit-test
1023
1024 {
1025     V{
1026         T{ ##peek f 0 D 0 }
1027         T{ ##load-reference f 1 f }
1028     }
1029 } [
1030     V{
1031         T{ ##peek f 0 D 0 }
1032         T{ ##compare f 1 0 0 cc/= }
1033     } value-number-bb
1034 ] unit-test
1035
1036 {
1037     V{
1038         T{ ##load-integer f 1 12 }
1039         T{ ##load-reference f 3 t }
1040     }
1041 } [
1042     V{
1043         T{ ##load-integer f 1 12 }
1044         T{ ##test-imm f 3 1 13 cc/= }
1045     } value-number-bb
1046 ] unit-test
1047
1048 {
1049     V{
1050         T{ ##load-integer f 1 15 }
1051         T{ ##load-reference f 3 f }
1052     }
1053 } [
1054     V{
1055         T{ ##load-integer f 1 15 }
1056         T{ ##test-imm f 3 1 16 cc/= }
1057     } value-number-bb
1058 ] unit-test
1059
1060 {
1061     V{
1062         T{ ##load-integer f 1 12 }
1063         T{ ##load-reference f 3 f }
1064     }
1065 } [
1066     V{
1067         T{ ##load-integer f 1 12 }
1068         T{ ##test-imm f 3 1 13 cc= }
1069     } value-number-bb
1070 ] unit-test
1071
1072 {
1073     V{
1074         T{ ##load-integer f 1 15 }
1075         T{ ##load-reference f 3 t }
1076     }
1077 } [
1078     V{
1079         T{ ##load-integer f 1 15 }
1080         T{ ##test-imm f 3 1 16 cc= }
1081     } value-number-bb
1082 ] unit-test
1083
1084 ! Rewriting a ##test of an ##and into a ##test
1085 {
1086     V{
1087         T{ ##peek f 0 D 0 }
1088         T{ ##peek f 1 D 1 }
1089         T{ ##and f 2 0 1 }
1090         T{ ##test f 3 0 1 cc= }
1091     }
1092 } [
1093     V{
1094         T{ ##peek f 0 D 0 }
1095         T{ ##peek f 1 D 1 }
1096         T{ ##and f 2 0 1 }
1097         T{ ##test f 3 2 2 cc= }
1098     } value-number-bb
1099 ] unit-test
1100
1101 {
1102     V{
1103         T{ ##peek f 0 D 0 }
1104         T{ ##and-imm f 2 0 12 }
1105         T{ ##test-imm f 3 0 12 cc= }
1106     }
1107 } [
1108     V{
1109         T{ ##peek f 0 D 0 }
1110         T{ ##and-imm f 2 0 12 }
1111         T{ ##test f 3 2 2 cc= }
1112     } value-number-bb
1113 ] unit-test
1114
1115 ! Rewriting ##test into ##test-imm
1116 {
1117     V{
1118         T{ ##peek f 0 D 0 }
1119         T{ ##load-integer f 1 10 }
1120         T{ ##test-imm f 2 0 10 cc= }
1121     }
1122 } [
1123     V{
1124         T{ ##peek f 0 D 0 }
1125         T{ ##load-integer f 1 10 }
1126         T{ ##test f 2 0 1 cc= }
1127     } value-number-bb trim-temps
1128 ] unit-test
1129
1130 {
1131     V{
1132         T{ ##peek f 0 D 0 }
1133         T{ ##load-integer f 1 10 }
1134         T{ ##test-imm f 2 0 10 cc= }
1135     }
1136 } [
1137     V{
1138         T{ ##peek f 0 D 0 }
1139         T{ ##load-integer f 1 10 }
1140         T{ ##test f 2 1 0 cc= }
1141     } value-number-bb trim-temps
1142 ] unit-test
1143
1144 {
1145     V{
1146         T{ ##peek f 0 D 0 }
1147         T{ ##load-integer f 1 10 }
1148         T{ ##test-imm-branch f 0 10 cc= }
1149     }
1150 } [
1151     V{
1152         T{ ##peek f 0 D 0 }
1153         T{ ##load-integer f 1 10 }
1154         T{ ##test-branch f 0 1 cc= }
1155     } value-number-bb
1156 ] unit-test
1157
1158 {
1159     V{
1160         T{ ##peek f 0 D 0 }
1161         T{ ##load-integer f 1 10 }
1162         T{ ##test-imm-branch f 0 10 cc= }
1163     }
1164 } [
1165     V{
1166         T{ ##peek f 0 D 0 }
1167         T{ ##load-integer f 1 10 }
1168         T{ ##test-branch f 1 0 cc= }
1169     } value-number-bb
1170 ] unit-test
1171
1172 {
1173     V{
1174         T{ ##peek f 0 D 0 }
1175         T{ ##load-integer f 1 10 }
1176         T{ ##test-imm-branch f 0 10 cc= }
1177     }
1178 } [
1179     V{
1180         T{ ##peek f 0 D 0 }
1181         T{ ##load-integer f 1 10 }
1182         T{ ##test-branch f 1 0 cc= }
1183     } value-number-bb
1184 ] unit-test
1185
1186 ! Make sure the immediate fits
1187 cpu x86.64? [
1188     [
1189         V{
1190             T{ ##peek f 0 D 0 }
1191             T{ ##load-integer f 1 100000000000 }
1192             T{ ##test f 2 1 0 cc= }
1193         }
1194     ] [
1195         V{
1196             T{ ##peek f 0 D 0 }
1197             T{ ##load-integer f 1 100000000000 }
1198             T{ ##test f 2 1 0 cc= }
1199         } value-number-bb
1200     ] unit-test
1201
1202     [
1203         V{
1204             T{ ##peek f 0 D 0 }
1205             T{ ##load-integer f 1 100000000000 }
1206             T{ ##test-branch f 1 0 cc= }
1207         }
1208     ] [
1209         V{
1210             T{ ##peek f 0 D 0 }
1211             T{ ##load-integer f 1 100000000000 }
1212             T{ ##test-branch f 1 0 cc= }
1213         } value-number-bb
1214     ] unit-test
1215 ] when
1216
1217 ! Rewriting ##compare into ##test
1218 cpu x86? [
1219     [
1220         V{
1221             T{ ##peek f 0 D 0 }
1222             T{ ##test f 1 0 0 cc= }
1223         }
1224     ] [
1225         V{
1226             T{ ##peek f 0 D 0 }
1227             T{ ##compare-integer-imm f 1 0 0 cc= }
1228         } value-number-bb
1229     ] unit-test
1230
1231     [
1232         V{
1233             T{ ##peek f 0 D 0 }
1234             T{ ##test f 1 0 0 cc/= }
1235         }
1236     ] [
1237         V{
1238             T{ ##peek f 0 D 0 }
1239             T{ ##compare-integer-imm f 1 0 0 cc/= }
1240         } value-number-bb
1241     ] unit-test
1242
1243     [
1244         V{
1245             T{ ##peek f 0 D 0 }
1246             T{ ##compare-integer-imm f 1 0 0 cc<= }
1247         }
1248     ] [
1249         V{
1250             T{ ##peek f 0 D 0 }
1251             T{ ##compare-integer-imm f 1 0 0 cc<= }
1252         } value-number-bb
1253     ] unit-test
1254
1255     [
1256         V{
1257             T{ ##peek f 0 D 0 }
1258             T{ ##test-branch f 0 0 cc= }
1259         }
1260     ] [
1261         V{
1262             T{ ##peek f 0 D 0 }
1263             T{ ##compare-integer-imm-branch f 0 0 cc= }
1264         } value-number-bb
1265     ] unit-test
1266
1267     [
1268         V{
1269             T{ ##peek f 0 D 0 }
1270             T{ ##test-branch f 0 0 cc/= }
1271         }
1272     ] [
1273         V{
1274             T{ ##peek f 0 D 0 }
1275             T{ ##compare-integer-imm-branch f 0 0 cc/= }
1276         } value-number-bb
1277     ] unit-test
1278
1279     [
1280         V{
1281             T{ ##peek f 0 D 0 }
1282             T{ ##compare-integer-imm-branch f 0 0 cc<= }
1283         }
1284     ] [
1285         V{
1286             T{ ##peek f 0 D 0 }
1287             T{ ##compare-integer-imm-branch f 0 0 cc<= }
1288         } value-number-bb
1289     ] unit-test
1290 ] when
1291
1292 ! Reassociation
1293 {
1294     V{
1295         T{ ##peek f 0 D 0 }
1296         T{ ##load-integer f 1 100 }
1297         T{ ##add-imm f 2 0 100 }
1298         T{ ##load-integer f 3 50 }
1299         T{ ##add-imm f 4 0 150 }
1300     }
1301 } [
1302     V{
1303         T{ ##peek f 0 D 0 }
1304         T{ ##load-integer f 1 100 }
1305         T{ ##add f 2 0 1 }
1306         T{ ##load-integer f 3 50 }
1307         T{ ##add f 4 2 3 }
1308     } value-number-bb
1309 ] unit-test
1310
1311 {
1312     V{
1313         T{ ##peek f 0 D 0 }
1314         T{ ##load-integer f 1 100 }
1315         T{ ##add-imm f 2 0 100 }
1316         T{ ##load-integer f 3 50 }
1317         T{ ##add-imm f 4 0 150 }
1318     }
1319 } [
1320     V{
1321         T{ ##peek f 0 D 0 }
1322         T{ ##load-integer f 1 100 }
1323         T{ ##add f 2 1 0 }
1324         T{ ##load-integer f 3 50 }
1325         T{ ##add f 4 3 2 }
1326     } value-number-bb
1327 ] unit-test
1328
1329 {
1330     V{
1331         T{ ##peek f 0 D 0 }
1332         T{ ##load-integer f 1 100 }
1333         T{ ##add-imm f 2 0 100 }
1334         T{ ##load-integer f 3 50 }
1335         T{ ##add-imm f 4 0 50 }
1336     }
1337 } [
1338     V{
1339         T{ ##peek f 0 D 0 }
1340         T{ ##load-integer f 1 100 }
1341         T{ ##add f 2 0 1 }
1342         T{ ##load-integer f 3 50 }
1343         T{ ##sub f 4 2 3 }
1344     } value-number-bb
1345 ] unit-test
1346
1347 {
1348     V{
1349         T{ ##peek f 0 D 0 }
1350         T{ ##load-integer f 1 100 }
1351         T{ ##add-imm f 2 0 -100 }
1352         T{ ##load-integer f 3 50 }
1353         T{ ##add-imm f 4 0 -150 }
1354     }
1355 } [
1356     V{
1357         T{ ##peek f 0 D 0 }
1358         T{ ##load-integer f 1 100 }
1359         T{ ##sub f 2 0 1 }
1360         T{ ##load-integer f 3 50 }
1361         T{ ##sub f 4 2 3 }
1362     } value-number-bb
1363 ] unit-test
1364
1365 {
1366     V{
1367         T{ ##peek f 0 D 0 }
1368         T{ ##load-integer f 1 100 }
1369         T{ ##mul-imm f 2 0 100 }
1370         T{ ##load-integer f 3 50 }
1371         T{ ##mul-imm f 4 0 5000 }
1372     }
1373 } [
1374     V{
1375         T{ ##peek f 0 D 0 }
1376         T{ ##load-integer f 1 100 }
1377         T{ ##mul f 2 0 1 }
1378         T{ ##load-integer f 3 50 }
1379         T{ ##mul f 4 2 3 }
1380     } value-number-bb
1381 ] unit-test
1382
1383 {
1384     V{
1385         T{ ##peek f 0 D 0 }
1386         T{ ##load-integer f 1 100 }
1387         T{ ##mul-imm f 2 0 100 }
1388         T{ ##load-integer f 3 50 }
1389         T{ ##mul-imm f 4 0 5000 }
1390     }
1391 } [
1392     V{
1393         T{ ##peek f 0 D 0 }
1394         T{ ##load-integer f 1 100 }
1395         T{ ##mul f 2 1 0 }
1396         T{ ##load-integer f 3 50 }
1397         T{ ##mul f 4 3 2 }
1398     } value-number-bb
1399 ] unit-test
1400
1401 {
1402     V{
1403         T{ ##peek f 0 D 0 }
1404         T{ ##load-integer f 1 100 }
1405         T{ ##and-imm f 2 0 100 }
1406         T{ ##load-integer f 3 50 }
1407         T{ ##and-imm f 4 0 32 }
1408     }
1409 } [
1410     V{
1411         T{ ##peek f 0 D 0 }
1412         T{ ##load-integer f 1 100 }
1413         T{ ##and f 2 0 1 }
1414         T{ ##load-integer f 3 50 }
1415         T{ ##and f 4 2 3 }
1416     } value-number-bb
1417 ] unit-test
1418
1419 {
1420     V{
1421         T{ ##peek f 0 D 0 }
1422         T{ ##load-integer f 1 100 }
1423         T{ ##and-imm f 2 0 100 }
1424         T{ ##load-integer f 3 50 }
1425         T{ ##and-imm f 4 0 32 }
1426     }
1427 } [
1428     V{
1429         T{ ##peek f 0 D 0 }
1430         T{ ##load-integer f 1 100 }
1431         T{ ##and f 2 1 0 }
1432         T{ ##load-integer f 3 50 }
1433         T{ ##and f 4 3 2 }
1434     } value-number-bb
1435 ] unit-test
1436
1437 {
1438     V{
1439         T{ ##peek f 0 D 0 }
1440         T{ ##load-integer f 1 100 }
1441         T{ ##or-imm f 2 0 100 }
1442         T{ ##load-integer f 3 50 }
1443         T{ ##or-imm f 4 0 118 }
1444     }
1445 } [
1446     V{
1447         T{ ##peek f 0 D 0 }
1448         T{ ##load-integer f 1 100 }
1449         T{ ##or f 2 0 1 }
1450         T{ ##load-integer f 3 50 }
1451         T{ ##or f 4 2 3 }
1452     } value-number-bb
1453 ] unit-test
1454
1455 {
1456     V{
1457         T{ ##peek f 0 D 0 }
1458         T{ ##load-integer f 1 100 }
1459         T{ ##or-imm f 2 0 100 }
1460         T{ ##load-integer f 3 50 }
1461         T{ ##or-imm f 4 0 118 }
1462     }
1463 } [
1464     V{
1465         T{ ##peek f 0 D 0 }
1466         T{ ##load-integer f 1 100 }
1467         T{ ##or f 2 1 0 }
1468         T{ ##load-integer f 3 50 }
1469         T{ ##or f 4 3 2 }
1470     } value-number-bb
1471 ] unit-test
1472
1473 {
1474     V{
1475         T{ ##peek f 0 D 0 }
1476         T{ ##load-integer f 1 100 }
1477         T{ ##xor-imm f 2 0 100 }
1478         T{ ##load-integer f 3 50 }
1479         T{ ##xor-imm f 4 0 86 }
1480     }
1481 } [
1482     V{
1483         T{ ##peek f 0 D 0 }
1484         T{ ##load-integer f 1 100 }
1485         T{ ##xor f 2 0 1 }
1486         T{ ##load-integer f 3 50 }
1487         T{ ##xor f 4 2 3 }
1488     } value-number-bb
1489 ] unit-test
1490
1491 {
1492     V{
1493         T{ ##peek f 0 D 0 }
1494         T{ ##load-integer f 1 100 }
1495         T{ ##xor-imm f 2 0 100 }
1496         T{ ##load-integer f 3 50 }
1497         T{ ##xor-imm f 4 0 86 }
1498     }
1499 } [
1500     V{
1501         T{ ##peek f 0 D 0 }
1502         T{ ##load-integer f 1 100 }
1503         T{ ##xor f 2 1 0 }
1504         T{ ##load-integer f 3 50 }
1505         T{ ##xor f 4 3 2 }
1506     } value-number-bb
1507 ] unit-test
1508
1509 {
1510     V{
1511         T{ ##peek f 0 D 0 }
1512         T{ ##shl-imm f 1 0 10 }
1513         T{ ##shl-imm f 2 0 21 }
1514         T{ ##replace f 2 D 0 }
1515     }
1516 } [
1517     V{
1518         T{ ##peek f 0 D 0 }
1519         T{ ##shl-imm f 1 0 10 }
1520         T{ ##shl-imm f 2 1 11 }
1521         T{ ##replace f 2 D 0 }
1522     } value-number-bb
1523 ] unit-test
1524
1525 {
1526     V{
1527         T{ ##peek f 0 D 0 }
1528         T{ ##shl-imm f 1 0 10 }
1529         T{ ##shl-imm f 2 1 $[ cell-bits 1 - ] }
1530         T{ ##replace f 2 D 0 }
1531     }
1532 } [
1533     V{
1534         T{ ##peek f 0 D 0 }
1535         T{ ##shl-imm f 1 0 10 }
1536         T{ ##shl-imm f 2 1 $[ cell-bits 1 - ] }
1537         T{ ##replace f 2 D 0 }
1538     } value-number-bb
1539 ] unit-test
1540
1541 {
1542     V{
1543         T{ ##peek f 0 D 0 }
1544         T{ ##sar-imm f 1 0 10 }
1545         T{ ##sar-imm f 2 0 21 }
1546         T{ ##replace f 2 D 0 }
1547     }
1548 } [
1549     V{
1550         T{ ##peek f 0 D 0 }
1551         T{ ##sar-imm f 1 0 10 }
1552         T{ ##sar-imm f 2 1 11 }
1553         T{ ##replace f 2 D 0 }
1554     } value-number-bb
1555 ] unit-test
1556
1557 {
1558     V{
1559         T{ ##peek f 0 D 0 }
1560         T{ ##sar-imm f 1 0 10 }
1561         T{ ##sar-imm f 2 1 $[ cell-bits 1 - ] }
1562         T{ ##replace f 2 D 0 }
1563     }
1564 } [
1565     V{
1566         T{ ##peek f 0 D 0 }
1567         T{ ##sar-imm f 1 0 10 }
1568         T{ ##sar-imm f 2 1 $[ cell-bits 1 - ] }
1569         T{ ##replace f 2 D 0 }
1570     } value-number-bb
1571 ] unit-test
1572
1573 {
1574     V{
1575         T{ ##peek f 0 D 0 }
1576         T{ ##shr-imm f 1 0 10 }
1577         T{ ##shr-imm f 2 0 21 }
1578         T{ ##replace f 2 D 0 }
1579     }
1580 } [
1581     V{
1582         T{ ##peek f 0 D 0 }
1583         T{ ##shr-imm f 1 0 10 }
1584         T{ ##shr-imm f 2 1 11 }
1585         T{ ##replace f 2 D 0 }
1586     } value-number-bb
1587 ] unit-test
1588
1589 {
1590     V{
1591         T{ ##peek f 0 D 0 }
1592         T{ ##shr-imm f 1 0 10 }
1593         T{ ##shr-imm f 2 1 $[ cell-bits 1 - ] }
1594         T{ ##replace f 2 D 0 }
1595     }
1596 } [
1597     V{
1598         T{ ##peek f 0 D 0 }
1599         T{ ##shr-imm f 1 0 10 }
1600         T{ ##shr-imm f 2 1 $[ cell-bits 1 - ] }
1601         T{ ##replace f 2 D 0 }
1602     } value-number-bb
1603 ] unit-test
1604
1605 {
1606     V{
1607         T{ ##peek f 0 D 0 }
1608         T{ ##shr-imm f 1 0 10 }
1609         T{ ##sar-imm f 2 1 11 }
1610         T{ ##replace f 2 D 0 }
1611     }
1612 } [
1613     V{
1614         T{ ##peek f 0 D 0 }
1615         T{ ##shr-imm f 1 0 10 }
1616         T{ ##sar-imm f 2 1 11 }
1617         T{ ##replace f 2 D 0 }
1618     } value-number-bb
1619 ] unit-test
1620
1621 ! Distributive law
1622 2 \ vreg-counter set-global
1623
1624 {
1625     V{
1626         T{ ##peek f 0 D 0 }
1627         T{ ##add-imm f 1 0 10 }
1628         T{ ##shl-imm f 3 0 2 }
1629         T{ ##add-imm f 2 3 40 }
1630         T{ ##replace f 2 D 0 }
1631     }
1632 } [
1633     V{
1634         T{ ##peek f 0 D 0 }
1635         T{ ##add-imm f 1 0 10 }
1636         T{ ##shl-imm f 2 1 2 }
1637         T{ ##replace f 2 D 0 }
1638     } value-number-bb
1639 ] unit-test
1640
1641 {
1642     V{
1643         T{ ##peek f 0 D 0 }
1644         T{ ##add-imm f 1 0 10 }
1645         T{ ##mul-imm f 4 0 3 }
1646         T{ ##add-imm f 2 4 30 }
1647         T{ ##replace f 2 D 0 }
1648     }
1649 } [
1650     V{
1651         T{ ##peek f 0 D 0 }
1652         T{ ##add-imm f 1 0 10 }
1653         T{ ##mul-imm f 2 1 3 }
1654         T{ ##replace f 2 D 0 }
1655     } value-number-bb
1656 ] unit-test
1657
1658 {
1659     V{
1660         T{ ##peek f 0 D 0 }
1661         T{ ##add-imm f 1 0 -10 }
1662         T{ ##shl-imm f 5 0 2 }
1663         T{ ##add-imm f 2 5 -40 }
1664         T{ ##replace f 2 D 0 }
1665     }
1666 } [
1667     V{
1668         T{ ##peek f 0 D 0 }
1669         T{ ##sub-imm f 1 0 10 }
1670         T{ ##shl-imm f 2 1 2 }
1671         T{ ##replace f 2 D 0 }
1672     } value-number-bb
1673 ] unit-test
1674
1675 {
1676     V{
1677         T{ ##peek f 0 D 0 }
1678         T{ ##add-imm f 1 0 -10 }
1679         T{ ##mul-imm f 6 0 3 }
1680         T{ ##add-imm f 2 6 -30 }
1681         T{ ##replace f 2 D 0 }
1682     }
1683 } [
1684     V{
1685         T{ ##peek f 0 D 0 }
1686         T{ ##sub-imm f 1 0 10 }
1687         T{ ##mul-imm f 2 1 3 }
1688         T{ ##replace f 2 D 0 }
1689     } value-number-bb
1690 ] unit-test
1691
1692 ! Simplification
1693 {
1694     V{
1695         T{ ##peek f 0 D 0 }
1696         T{ ##peek f 1 D 1 }
1697         T{ ##copy f 3 0 any-rep }
1698         T{ ##replace f 0 D 0 }
1699     }
1700 } [
1701     V{
1702         T{ ##peek f 0 D 0 }
1703         T{ ##peek f 1 D 1 }
1704         T{ ##add-imm f 3 0 0 }
1705         T{ ##replace f 3 D 0 }
1706     } value-number-bb
1707 ] unit-test
1708
1709 {
1710     V{
1711         T{ ##peek f 0 D 0 }
1712         T{ ##peek f 1 D 1 }
1713         T{ ##copy f 3 0 any-rep }
1714         T{ ##replace f 0 D 0 }
1715     }
1716 } [
1717     V{
1718         T{ ##peek f 0 D 0 }
1719         T{ ##peek f 1 D 1 }
1720         T{ ##or-imm f 3 0 0 }
1721         T{ ##replace f 3 D 0 }
1722     } value-number-bb
1723 ] unit-test
1724
1725 {
1726     V{
1727         T{ ##peek f 0 D 0 }
1728         T{ ##peek f 1 D 1 }
1729         T{ ##copy f 3 0 any-rep }
1730         T{ ##replace f 0 D 0 }
1731     }
1732 } [
1733     V{
1734         T{ ##peek f 0 D 0 }
1735         T{ ##peek f 1 D 1 }
1736         T{ ##xor-imm f 3 0 0 }
1737         T{ ##replace f 3 D 0 }
1738     } value-number-bb
1739 ] unit-test
1740
1741 {
1742     V{
1743         T{ ##peek f 0 D 0 }
1744         T{ ##load-integer f 1 0 }
1745     }
1746 } [
1747     V{
1748         T{ ##peek f 0 D 0 }
1749         T{ ##and-imm f 1 0 0 }
1750     } value-number-bb
1751 ] unit-test
1752
1753 {
1754     V{
1755         T{ ##peek f 0 D 0 }
1756         T{ ##copy f 1 0 any-rep }
1757         T{ ##replace f 0 D 0 }
1758     }
1759 } [
1760     V{
1761         T{ ##peek f 0 D 0 }
1762         T{ ##and-imm f 1 0 -1 }
1763         T{ ##replace f 1 D 0 }
1764     } value-number-bb
1765 ] unit-test
1766
1767 {
1768     V{
1769         T{ ##peek f 0 D 0 }
1770         T{ ##copy f 1 0 any-rep }
1771         T{ ##replace f 0 D 0 }
1772     }
1773 } [
1774     V{
1775         T{ ##peek f 0 D 0 }
1776         T{ ##and f 1 0 0 }
1777         T{ ##replace f 1 D 0 }
1778     } value-number-bb
1779 ] unit-test
1780
1781 {
1782     V{
1783         T{ ##peek f 0 D 0 }
1784         T{ ##copy f 1 0 any-rep }
1785         T{ ##replace f 0 D 0 }
1786     }
1787 } [
1788     V{
1789         T{ ##peek f 0 D 0 }
1790         T{ ##or-imm f 1 0 0 }
1791         T{ ##replace f 1 D 0 }
1792     } value-number-bb
1793 ] unit-test
1794
1795 {
1796     V{
1797         T{ ##peek f 0 D 0 }
1798         T{ ##load-integer f 1 -1 }
1799     }
1800 } [
1801     V{
1802         T{ ##peek f 0 D 0 }
1803         T{ ##or-imm f 1 0 -1 }
1804     } value-number-bb
1805 ] unit-test
1806
1807 {
1808     V{
1809         T{ ##peek f 0 D 0 }
1810         T{ ##copy f 1 0 any-rep }
1811         T{ ##replace f 0 D 0 }
1812     }
1813 } [
1814     V{
1815         T{ ##peek f 0 D 0 }
1816         T{ ##or f 1 0 0 }
1817         T{ ##replace f 1 D 0 }
1818     } value-number-bb
1819 ] unit-test
1820
1821 {
1822     V{
1823         T{ ##peek f 0 D 0 }
1824         T{ ##copy f 1 0 any-rep }
1825         T{ ##replace f 0 D 0 }
1826     }
1827 } [
1828     V{
1829         T{ ##peek f 0 D 0 }
1830         T{ ##xor-imm f 1 0 0 }
1831         T{ ##replace f 1 D 0 }
1832     } value-number-bb
1833 ] unit-test
1834
1835 {
1836     V{
1837         T{ ##peek f 0 D 0 }
1838         T{ ##not f 1 0 }
1839         T{ ##replace f 1 D 0 }
1840     }
1841 } [
1842     V{
1843         T{ ##peek f 0 D 0 }
1844         T{ ##xor-imm f 1 0 -1 }
1845         T{ ##replace f 1 D 0 }
1846     } value-number-bb
1847 ] unit-test
1848
1849 {
1850     V{
1851         T{ ##peek f 0 D 0 }
1852         T{ ##load-integer f 1 0 }
1853     }
1854 } [
1855     V{
1856         T{ ##peek f 0 D 0 }
1857         T{ ##xor f 1 0 0 }
1858     } value-number-bb
1859 ] unit-test
1860
1861 {
1862     V{
1863         T{ ##peek f 0 D 0 }
1864         T{ ##copy f 2 0 any-rep }
1865         T{ ##replace f 0 D 0 }
1866     }
1867 } [
1868     V{
1869         T{ ##peek f 0 D 0 }
1870         T{ ##mul-imm f 2 0 1 }
1871         T{ ##replace f 2 D 0 }
1872     } value-number-bb
1873 ] unit-test
1874
1875 {
1876     V{
1877         T{ ##peek f 0 D 0 }
1878         T{ ##copy f 2 0 any-rep }
1879         T{ ##replace f 0 D 0 }
1880     }
1881 } [
1882     V{
1883         T{ ##peek f 0 D 0 }
1884         T{ ##shl-imm f 2 0 0 }
1885         T{ ##replace f 2 D 0 }
1886     } value-number-bb
1887 ] unit-test
1888
1889 {
1890     V{
1891         T{ ##peek f 0 D 0 }
1892         T{ ##copy f 2 0 any-rep }
1893         T{ ##replace f 0 D 0 }
1894     }
1895 } [
1896     V{
1897         T{ ##peek f 0 D 0 }
1898         T{ ##shr-imm f 2 0 0 }
1899         T{ ##replace f 2 D 0 }
1900     } value-number-bb
1901 ] unit-test
1902
1903 {
1904     V{
1905         T{ ##peek f 0 D 0 }
1906         T{ ##copy f 2 0 any-rep }
1907         T{ ##replace f 0 D 0 }
1908     }
1909 } [
1910     V{
1911         T{ ##peek f 0 D 0 }
1912         T{ ##sar-imm f 2 0 0 }
1913         T{ ##replace f 2 D 0 }
1914     } value-number-bb
1915 ] unit-test
1916
1917 ! Constant folding
1918 {
1919     V{
1920         T{ ##peek f 0 D 0 }
1921         T{ ##load-integer f 1 1 }
1922         T{ ##load-integer f 2 3 }
1923         T{ ##load-integer f 3 4 }
1924     }
1925 } [
1926     V{
1927         T{ ##peek f 0 D 0 }
1928         T{ ##load-integer f 1 1 }
1929         T{ ##load-integer f 2 3 }
1930         T{ ##add f 3 1 2 }
1931     } value-number-bb
1932 ] unit-test
1933
1934 {
1935     V{
1936         T{ ##peek f 0 D 0 }
1937         T{ ##load-integer f 1 1 }
1938         T{ ##load-integer f 2 3 }
1939         T{ ##load-integer f 3 -2 }
1940     }
1941 } [
1942     V{
1943         T{ ##peek f 0 D 0 }
1944         T{ ##load-integer f 1 1 }
1945         T{ ##load-integer f 2 3 }
1946         T{ ##sub f 3 1 2 }
1947     } value-number-bb
1948 ] unit-test
1949
1950 {
1951     V{
1952         T{ ##peek f 0 D 0 }
1953         T{ ##load-integer f 1 2 }
1954         T{ ##load-integer f 2 3 }
1955         T{ ##load-integer f 3 6 }
1956     }
1957 } [
1958     V{
1959         T{ ##peek f 0 D 0 }
1960         T{ ##load-integer f 1 2 }
1961         T{ ##load-integer f 2 3 }
1962         T{ ##mul f 3 1 2 }
1963     } value-number-bb
1964 ] unit-test
1965
1966 {
1967     V{
1968         T{ ##peek f 0 D 0 }
1969         T{ ##load-integer f 1 2 }
1970         T{ ##load-integer f 2 1 }
1971         T{ ##load-integer f 3 0 }
1972     }
1973 } [
1974     V{
1975         T{ ##peek f 0 D 0 }
1976         T{ ##load-integer f 1 2 }
1977         T{ ##load-integer f 2 1 }
1978         T{ ##and f 3 1 2 }
1979     } value-number-bb
1980 ] unit-test
1981
1982 {
1983     V{
1984         T{ ##peek f 0 D 0 }
1985         T{ ##load-integer f 1 2 }
1986         T{ ##load-integer f 2 1 }
1987         T{ ##load-integer f 3 3 }
1988     }
1989 } [
1990     V{
1991         T{ ##peek f 0 D 0 }
1992         T{ ##load-integer f 1 2 }
1993         T{ ##load-integer f 2 1 }
1994         T{ ##or f 3 1 2 }
1995     } value-number-bb
1996 ] unit-test
1997
1998 {
1999     V{
2000         T{ ##peek f 0 D 0 }
2001         T{ ##load-integer f 1 2 }
2002         T{ ##load-integer f 2 3 }
2003         T{ ##load-integer f 3 1 }
2004     }
2005 } [
2006     V{
2007         T{ ##peek f 0 D 0 }
2008         T{ ##load-integer f 1 2 }
2009         T{ ##load-integer f 2 3 }
2010         T{ ##xor f 3 1 2 }
2011     } value-number-bb
2012 ] unit-test
2013
2014 {
2015     V{
2016         T{ ##peek f 0 D 0 }
2017         T{ ##load-integer f 1 1 }
2018         T{ ##load-integer f 3 8 }
2019     }
2020 } [
2021     V{
2022         T{ ##peek f 0 D 0 }
2023         T{ ##load-integer f 1 1 }
2024         T{ ##shl-imm f 3 1 3 }
2025     } value-number-bb
2026 ] unit-test
2027
2028 cell 8 = [
2029     [
2030         V{
2031             T{ ##peek f 0 D 0 }
2032             T{ ##load-integer f 1 -1 }
2033             T{ ##load-integer f 3 0xffffffffffff }
2034         }
2035     ] [
2036         V{
2037             T{ ##peek f 0 D 0 }
2038             T{ ##load-integer f 1 -1 }
2039             T{ ##shr-imm f 3 1 16 }
2040         } value-number-bb
2041     ] unit-test
2042 ] when
2043
2044 {
2045     V{
2046         T{ ##peek f 0 D 0 }
2047         T{ ##load-integer f 1 -8 }
2048         T{ ##load-integer f 3 -4 }
2049     }
2050 } [
2051     V{
2052         T{ ##peek f 0 D 0 }
2053         T{ ##load-integer f 1 -8 }
2054         T{ ##sar-imm f 3 1 1 }
2055     } value-number-bb
2056 ] unit-test
2057
2058 cell 8 = [
2059     [
2060         V{
2061             T{ ##peek f 0 D 0 }
2062             T{ ##load-integer f 1 65536 }
2063             T{ ##load-integer f 2 140737488355328 }
2064             T{ ##add f 3 0 2 }
2065         }
2066     ] [
2067         V{
2068             T{ ##peek f 0 D 0 }
2069             T{ ##load-integer f 1 65536 }
2070             T{ ##shl-imm f 2 1 31 }
2071             T{ ##add f 3 0 2 }
2072         } value-number-bb
2073     ] unit-test
2074
2075     [
2076         V{
2077             T{ ##peek f 0 D 0 }
2078             T{ ##load-integer f 2 140737488355328 }
2079             T{ ##add f 3 0 2 }
2080         }
2081     ] [
2082         V{
2083             T{ ##peek f 0 D 0 }
2084             T{ ##load-integer f 2 140737488355328 }
2085             T{ ##add f 3 0 2 }
2086         } value-number-bb
2087     ] unit-test
2088
2089     ! PPC ADDI can't hold immediates this big.
2090     cpu ppc? [
2091         [
2092             V{
2093                 T{ ##peek f 0 D 0 }
2094                 T{ ##load-integer f 2 2147483647 }
2095                 T{ ##add-imm f 3 0 2147483647 }
2096                 T{ ##add-imm f 4 3 2147483647 }
2097             }
2098         ] [
2099             V{
2100                 T{ ##peek f 0 D 0 }
2101                 T{ ##load-integer f 2 2147483647 }
2102                 T{ ##add f 3 0 2 }
2103                 T{ ##add f 4 3 2 }
2104             } value-number-bb
2105         ] unit-test
2106     ] unless
2107 ] when
2108
2109 {
2110     V{
2111         T{ ##peek f 0 D 0 }
2112         T{ ##load-integer f 1 1 }
2113         T{ ##load-integer f 2 -1 }
2114     }
2115 } [
2116     V{
2117         T{ ##peek f 0 D 0 }
2118         T{ ##load-integer f 1 1 }
2119         T{ ##neg f 2 1 }
2120     } value-number-bb
2121 ] unit-test
2122
2123 {
2124     V{
2125         T{ ##peek f 0 D 0 }
2126         T{ ##load-integer f 1 1 }
2127         T{ ##load-integer f 2 -2 }
2128     }
2129 } [
2130     V{
2131         T{ ##peek f 0 D 0 }
2132         T{ ##load-integer f 1 1 }
2133         T{ ##not f 2 1 }
2134     } value-number-bb
2135 ] unit-test
2136
2137 ! ##tagged>integer constant folding
2138 {
2139     V{
2140         T{ ##load-reference f 1 f }
2141         T{ ##load-integer f 2 $[ \ f type-number ] }
2142         T{ ##copy f 3 2 any-rep }
2143     }
2144 } [
2145     V{
2146         T{ ##load-reference f 1 f }
2147         T{ ##tagged>integer f 2 1 }
2148         T{ ##and-imm f 3 2 15 }
2149     } value-number-bb
2150 ] unit-test
2151
2152 {
2153     V{
2154         T{ ##load-integer f 1 100 }
2155         T{ ##load-integer f 2 $[ 100 tag-fixnum ] }
2156         T{ ##load-integer f 3 $[ 100 tag-fixnum 1 + ] }
2157     }
2158 } [
2159     V{
2160         T{ ##load-integer f 1 100 }
2161         T{ ##tagged>integer f 2 1 }
2162         T{ ##add-imm f 3 2 1 }
2163     } value-number-bb
2164 ] unit-test
2165
2166 ! Alien boxing and unboxing
2167 {
2168     V{
2169         T{ ##peek f 0 D 0 }
2170         T{ ##box-alien f 1 0 }
2171         T{ ##copy f 2 0 any-rep }
2172         T{ ##replace f 0 D 0 }
2173     }
2174 } [
2175     V{
2176         T{ ##peek f 0 D 0 }
2177         T{ ##box-alien f 1 0 }
2178         T{ ##unbox-alien f 2 1 }
2179         T{ ##replace f 2 D 0 }
2180     } value-number-bb
2181 ] unit-test
2182
2183 {
2184     V{
2185         T{ ##peek f 0 D 0 }
2186         T{ ##box-alien f 1 0 }
2187         T{ ##copy f 2 0 any-rep }
2188         T{ ##replace f 0 D 0 }
2189     }
2190 } [
2191     V{
2192         T{ ##peek f 0 D 0 }
2193         T{ ##box-alien f 1 0 }
2194         T{ ##unbox-any-c-ptr f 2 1 }
2195         T{ ##replace f 2 D 0 }
2196     } value-number-bb
2197 ] unit-test
2198
2199 {
2200     V{
2201         T{ ##peek f 0 D 0 }
2202         T{ ##load-integer f 2 0 }
2203         T{ ##copy f 1 0 any-rep }
2204         T{ ##replace f 0 D 0 }
2205     }
2206 } [
2207     V{
2208         T{ ##peek f 0 D 0 }
2209         T{ ##load-integer f 2 0 }
2210         T{ ##box-displaced-alien f 1 2 0 c-ptr }
2211         T{ ##replace f 1 D 0 }
2212     } value-number-bb
2213 ] unit-test
2214
2215 3 vreg-counter set-global
2216
2217 {
2218     V{
2219         T{ ##peek f 0 D 0 }
2220         T{ ##load-integer f 2 16 }
2221         T{ ##box-displaced-alien f 1 2 0 c-ptr }
2222         T{ ##unbox-any-c-ptr f 4 0 }
2223         T{ ##add-imm f 3 4 16 }
2224     }
2225 } [
2226     V{
2227         T{ ##peek f 0 D 0 }
2228         T{ ##load-integer f 2 16 }
2229         T{ ##box-displaced-alien f 1 2 0 c-ptr }
2230         T{ ##unbox-any-c-ptr f 3 1 }
2231     } value-number-bb
2232 ] unit-test
2233
2234 4 vreg-counter set-global
2235
2236 {
2237     V{
2238         T{ ##peek f 1 D 0 }
2239         T{ ##box-alien f 0 1 }
2240         T{ ##load-integer f 2 16 }
2241         T{ ##box-displaced-alien f 3 2 0 c-ptr }
2242         T{ ##copy f 5 1 any-rep }
2243         T{ ##add-imm f 4 5 16 }
2244     }
2245 } [
2246     V{
2247         T{ ##peek f 1 D 0 }
2248         T{ ##box-alien f 0 1 }
2249         T{ ##load-integer f 2 16 }
2250         T{ ##box-displaced-alien f 3 2 0 c-ptr }
2251         T{ ##unbox-any-c-ptr f 4 3 }
2252     } value-number-bb
2253 ] unit-test
2254
2255 3 vreg-counter set-global
2256
2257 {
2258     V{
2259         T{ ##peek f 0 D 0 }
2260         T{ ##load-integer f 2 0 }
2261         T{ ##copy f 3 0 any-rep }
2262         T{ ##replace f 0 D 1 }
2263     }
2264 } [
2265     V{
2266         T{ ##peek f 0 D 0 }
2267         T{ ##load-integer f 2 0 }
2268         T{ ##box-displaced-alien f 3 2 0 c-ptr }
2269         T{ ##replace f 3 D 1 }
2270     } value-number-bb
2271 ] unit-test
2272
2273 ! Various SIMD simplifications
2274 {
2275     V{
2276         T{ ##peek f 0 D 0 }
2277         T{ ##vector>scalar f 1 0 float-4-rep }
2278         T{ ##copy f 2 0 any-rep }
2279     }
2280 } [
2281     V{
2282         T{ ##peek f 0 D 0 }
2283         T{ ##vector>scalar f 1 0 float-4-rep }
2284         T{ ##scalar>vector f 2 1 float-4-rep }
2285     } value-number-bb
2286 ] unit-test
2287
2288 {
2289     V{
2290         T{ ##copy f 1 0 any-rep }
2291     }
2292 } [
2293     V{
2294         T{ ##shuffle-vector-imm f 1 0 { 0 1 2 3 } float-4-rep }
2295     } value-number-bb
2296 ] unit-test
2297
2298 {
2299     V{
2300         T{ ##peek f 0 D 0 }
2301         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2302         T{ ##shuffle-vector-imm f 2 0 { 0 2 3 1 } float-4-rep }
2303     }
2304 } [
2305     V{
2306         T{ ##peek f 0 D 0 }
2307         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2308         T{ ##shuffle-vector-imm f 2 1 { 3 1 2 0 } float-4-rep }
2309     } value-number-bb
2310 ] unit-test
2311
2312 {
2313     V{
2314         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2315         T{ ##shuffle-vector-imm f 2 1 { 1 0 } double-2-rep }
2316     }
2317 } [
2318     V{
2319         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2320         T{ ##shuffle-vector-imm f 2 1 { 1 0 } double-2-rep }
2321     } value-number-bb
2322 ] unit-test
2323
2324 {
2325     V{
2326         T{ ##load-integer f 0 55 }
2327         T{ ##load-reference f 1 B{ 55 0 0 0  55 0 0 0  55 0 0 0  55 0 0 0 } }
2328         T{ ##load-reference f 2 B{ 55 0 0 0  55 0 0 0  55 0 0 0  55 0 0 0 } }
2329     }
2330 } [
2331     V{
2332         T{ ##load-integer f 0 55 }
2333         T{ ##scalar>vector f 1 0 int-4-rep }
2334         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2335     } value-number-bb
2336 ] unit-test
2337
2338 {
2339     V{
2340         T{ ##load-reference f 0 1.25 }
2341         T{ ##load-reference f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2342         T{ ##load-reference f 2 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2343     }
2344 } [
2345     V{
2346         T{ ##load-reference f 0 1.25 }
2347         T{ ##scalar>vector f 1 0 float-4-rep }
2348         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2349     } value-number-bb
2350 ] unit-test
2351
2352 {
2353     V{
2354         T{ ##load-reference f 0 1.25 }
2355         T{ ##load-reference f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2356         T{ ##load-reference f 2 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2357     }
2358 } [
2359     V{
2360         T{ ##load-reference f 0 1.25 }
2361         T{ ##scalar>vector f 1 0 float-4-rep }
2362         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2363     } value-number-bb
2364 ] unit-test
2365
2366 {
2367     V{
2368         T{ ##load-integer f 0 55 }
2369         T{ ##load-reference f 1 B{ 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 } }
2370         T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
2371         T{ ##load-reference f 3 B{ 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 } }
2372     }
2373 } [
2374     V{
2375         T{ ##load-integer f 0 55 }
2376         T{ ##scalar>vector f 1 0 short-8-rep }
2377         T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
2378         T{ ##shuffle-vector f 3 1 2 float-4-rep }
2379     } value-number-bb
2380 ] unit-test
2381
2382 {
2383     V{
2384         T{ ##load-reference f 0 1.25 }
2385         T{ ##load-reference f 2 3.75 }
2386         T{ ##load-reference f 4 B{ 0 0 0 0 0 0 244 63 0 0 0 0 0 0 14 64 } }
2387     }
2388 } [
2389     V{
2390         T{ ##load-reference f 0 1.25 }
2391         T{ ##load-reference f 2 3.75 }
2392         T{ ##gather-vector-2 f 4 0 2 double-2-rep }
2393     } value-number-bb
2394 ] unit-test
2395
2396 {
2397     V{
2398         T{ ##load-integer f 0 125 }
2399         T{ ##load-integer f 2 375 }
2400         T{ ##load-reference f 4 B{ 125 0 0 0 0 0 0 0 119 1 0 0 0 0 0 0 } }
2401     }
2402 } [
2403     V{
2404         T{ ##load-integer f 0 125 }
2405         T{ ##load-integer f 2 375 }
2406         T{ ##gather-vector-2 f 4 0 2 longlong-2-rep }
2407     } value-number-bb
2408 ] unit-test
2409
2410 {
2411     V{
2412         T{ ##load-reference f 0 1.25 }
2413         T{ ##load-reference f 1 2.50 }
2414         T{ ##load-reference f 2 3.75 }
2415         T{ ##load-reference f 3 5.00 }
2416         T{ ##load-reference f 4 B{ 0 0 160 63 0 0 32 64 0 0 112 64 0 0 160 64 } }
2417     }
2418 } [
2419     V{
2420         T{ ##load-reference f 0 1.25 }
2421         T{ ##load-reference f 1 2.50 }
2422         T{ ##load-reference f 2 3.75 }
2423         T{ ##load-reference f 3 5.00 }
2424         T{ ##gather-vector-4 f 4 0 1 2 3 float-4-rep }
2425     } value-number-bb
2426 ] unit-test
2427
2428 {
2429     V{
2430         T{ ##load-integer f 0 125 }
2431         T{ ##load-integer f 1 250 }
2432         T{ ##load-integer f 2 375 }
2433         T{ ##load-integer f 3 500 }
2434         T{ ##load-reference f 4 B{ 125 0 0 0 250 0 0 0 119 1 0 0 244 1 0 0 } }
2435     }
2436 } [
2437     V{
2438         T{ ##load-integer f 0 125 }
2439         T{ ##load-integer f 1 250 }
2440         T{ ##load-integer f 2 375 }
2441         T{ ##load-integer f 3 500 }
2442         T{ ##gather-vector-4 f 4 0 1 2 3 int-4-rep }
2443     } value-number-bb
2444 ] unit-test
2445
2446 {
2447     V{
2448         T{ ##zero-vector f 2 float-4-rep }
2449     }
2450 } [
2451     V{
2452         T{ ##xor-vector f 2 1 1 float-4-rep }
2453     } value-number-bb
2454 ] unit-test
2455
2456 ! NOT x AND y => x ANDN y
2457
2458 {
2459     V{
2460         T{ ##peek f 0 D 0 }
2461         T{ ##peek f 1 D 1 }
2462         T{ ##fill-vector f 3 float-4-rep }
2463         T{ ##xor-vector  f 4 0 3 float-4-rep }
2464         T{ ##andn-vector f 5 0 1 float-4-rep }
2465     }
2466 } [
2467     V{
2468         T{ ##peek f 0 D 0 }
2469         T{ ##peek f 1 D 1 }
2470         T{ ##fill-vector f 3 float-4-rep }
2471         T{ ##xor-vector  f 4 0 3 float-4-rep }
2472         T{ ##and-vector  f 5 4 1 float-4-rep }
2473     } value-number-bb
2474 ] unit-test
2475
2476 {
2477     V{
2478         T{ ##peek f 0 D 0 }
2479         T{ ##peek f 1 D 1 }
2480         T{ ##not-vector  f 4 0 float-4-rep }
2481         T{ ##andn-vector f 5 0 1 float-4-rep }
2482     }
2483 } [
2484     V{
2485         T{ ##peek f 0 D 0 }
2486         T{ ##peek f 1 D 1 }
2487         T{ ##not-vector  f 4 0 float-4-rep }
2488         T{ ##and-vector  f 5 4 1 float-4-rep }
2489     } value-number-bb
2490 ] unit-test
2491
2492 ! x AND NOT y => y ANDN x
2493
2494 {
2495     V{
2496         T{ ##peek f 0 D 0 }
2497         T{ ##peek f 1 D 1 }
2498         T{ ##fill-vector f 3 float-4-rep }
2499         T{ ##xor-vector  f 4 0 3 float-4-rep }
2500         T{ ##andn-vector f 5 0 1 float-4-rep }
2501     }
2502 } [
2503     V{
2504         T{ ##peek f 0 D 0 }
2505         T{ ##peek f 1 D 1 }
2506         T{ ##fill-vector f 3 float-4-rep }
2507         T{ ##xor-vector  f 4 0 3 float-4-rep }
2508         T{ ##and-vector  f 5 1 4 float-4-rep }
2509     } value-number-bb
2510 ] unit-test
2511
2512 {
2513     V{
2514         T{ ##peek f 0 D 0 }
2515         T{ ##peek f 1 D 1 }
2516         T{ ##not-vector  f 4 0 float-4-rep }
2517         T{ ##andn-vector f 5 0 1 float-4-rep }
2518     }
2519 } [
2520     V{
2521         T{ ##peek f 0 D 0 }
2522         T{ ##peek f 1 D 1 }
2523         T{ ##not-vector  f 4 0 float-4-rep }
2524         T{ ##and-vector  f 5 1 4 float-4-rep }
2525     } value-number-bb
2526 ] unit-test
2527
2528 ! NOT x ANDN y => x AND y
2529
2530 {
2531     V{
2532         T{ ##peek f 0 D 0 }
2533         T{ ##peek f 1 D 1 }
2534         T{ ##fill-vector f 3 float-4-rep }
2535         T{ ##xor-vector  f 4 0 3 float-4-rep }
2536         T{ ##and-vector  f 5 0 1 float-4-rep }
2537     }
2538 } [
2539     V{
2540         T{ ##peek f 0 D 0 }
2541         T{ ##peek f 1 D 1 }
2542         T{ ##fill-vector f 3 float-4-rep }
2543         T{ ##xor-vector  f 4 0 3 float-4-rep }
2544         T{ ##andn-vector f 5 4 1 float-4-rep }
2545     } value-number-bb
2546 ] unit-test
2547
2548 {
2549     V{
2550         T{ ##peek f 0 D 0 }
2551         T{ ##peek f 1 D 1 }
2552         T{ ##not-vector  f 4 0 float-4-rep }
2553         T{ ##and-vector  f 5 0 1 float-4-rep }
2554     }
2555 } [
2556     V{
2557         T{ ##peek f 0 D 0 }
2558         T{ ##peek f 1 D 1 }
2559         T{ ##not-vector  f 4 0 float-4-rep }
2560         T{ ##andn-vector f 5 4 1 float-4-rep }
2561     } value-number-bb
2562 ] unit-test
2563
2564 ! AND <=> ANDN
2565
2566 {
2567     V{
2568         T{ ##peek f 0 D 0 }
2569         T{ ##peek f 1 D 1 }
2570         T{ ##peek f 2 D 2 }
2571         T{ ##fill-vector f 3 float-4-rep }
2572         T{ ##xor-vector  f 4 0 3 float-4-rep }
2573         T{ ##andn-vector f 5 0 1 float-4-rep }
2574         T{ ##and-vector  f 6 0 2 float-4-rep }
2575         T{ ##or-vector   f 7 5 6 float-4-rep }
2576     }
2577 } [
2578     V{
2579         T{ ##peek f 0 D 0 }
2580         T{ ##peek f 1 D 1 }
2581         T{ ##peek f 2 D 2 }
2582         T{ ##fill-vector f 3 float-4-rep }
2583         T{ ##xor-vector  f 4 0 3 float-4-rep }
2584         T{ ##and-vector  f 5 4 1 float-4-rep }
2585         T{ ##andn-vector f 6 4 2 float-4-rep }
2586         T{ ##or-vector   f 7 5 6 float-4-rep }
2587     } value-number-bb
2588 ] unit-test
2589
2590 {
2591     V{
2592         T{ ##peek f 0 D 0 }
2593         T{ ##peek f 1 D 1 }
2594         T{ ##peek f 2 D 2 }
2595         T{ ##not-vector  f 4 0   float-4-rep }
2596         T{ ##andn-vector f 5 0 1 float-4-rep }
2597         T{ ##and-vector  f 6 0 2 float-4-rep }
2598         T{ ##or-vector   f 7 5 6 float-4-rep }
2599     }
2600 } [
2601     V{
2602         T{ ##peek f 0 D 0 }
2603         T{ ##peek f 1 D 1 }
2604         T{ ##peek f 2 D 2 }
2605         T{ ##not-vector  f 4 0   float-4-rep }
2606         T{ ##and-vector  f 5 4 1 float-4-rep }
2607         T{ ##andn-vector f 6 4 2 float-4-rep }
2608         T{ ##or-vector   f 7 5 6 float-4-rep }
2609     } value-number-bb
2610 ] unit-test
2611
2612 ! Branch folding
2613 : test-branch-folding ( insns -- insns' n )
2614     0 test-bb
2615     V{ } 1 test-bb
2616     V{ } 2 test-bb
2617     0 { 1 2 } edges
2618     0 get block>cfg
2619     value-numbering
2620     0 get [ instructions>> ] [ successors>> first number>> 1 - ] bi ;
2621
2622 {
2623     V{
2624         T{ ##load-integer f 1 1 }
2625         T{ ##load-integer f 2 2 }
2626         T{ ##branch }
2627     }
2628     1
2629 } [
2630     V{
2631         T{ ##load-integer f 1 1 }
2632         T{ ##load-integer f 2 2 }
2633         T{ ##compare-branch f 1 2 cc= }
2634     } test-branch-folding
2635 ] unit-test
2636
2637 {
2638     V{
2639         T{ ##load-integer f 1 1 }
2640         T{ ##load-integer f 2 2 }
2641         T{ ##branch }
2642     }
2643     0
2644 } [
2645     V{
2646         T{ ##load-integer f 1 1 }
2647         T{ ##load-integer f 2 2 }
2648         T{ ##compare-branch f 1 2 cc/= }
2649     } test-branch-folding
2650 ] unit-test
2651
2652 {
2653     V{
2654         T{ ##load-integer f 1 1 }
2655         T{ ##load-integer f 2 2 }
2656         T{ ##branch }
2657     }
2658     0
2659 } [
2660     V{
2661         T{ ##load-integer f 1 1 }
2662         T{ ##load-integer f 2 2 }
2663         T{ ##compare-integer-branch f 1 2 cc< }
2664     } test-branch-folding
2665 ] unit-test
2666
2667 {
2668     V{
2669         T{ ##load-integer f 1 1 }
2670         T{ ##load-integer f 2 2 }
2671         T{ ##branch }
2672     }
2673     1
2674 } [
2675     V{
2676         T{ ##load-integer f 1 1 }
2677         T{ ##load-integer f 2 2 }
2678         T{ ##compare-integer-branch f 2 1 cc< }
2679     } test-branch-folding
2680 ] unit-test
2681
2682 {
2683     V{
2684         T{ ##peek f 0 D 0 }
2685         T{ ##branch }
2686     }
2687     1
2688 } [
2689     V{
2690         T{ ##peek f 0 D 0 }
2691         T{ ##compare-integer-branch f 0 0 cc< }
2692     } test-branch-folding
2693 ] unit-test
2694
2695 {
2696     V{
2697         T{ ##peek f 0 D 0 }
2698         T{ ##branch }
2699     }
2700     0
2701 } [
2702     V{
2703         T{ ##peek f 0 D 0 }
2704         T{ ##compare-integer-branch f 0 0 cc<= }
2705     } test-branch-folding
2706 ] unit-test
2707
2708 {
2709     V{
2710         T{ ##peek f 0 D 0 }
2711         T{ ##branch }
2712     }
2713     1
2714 } [
2715     V{
2716         T{ ##peek f 0 D 0 }
2717         T{ ##compare-integer-branch f 0 0 cc> }
2718     } test-branch-folding
2719 ] unit-test
2720
2721 {
2722     V{
2723         T{ ##peek f 0 D 0 }
2724         T{ ##branch }
2725     }
2726     0
2727 } [
2728     V{
2729         T{ ##peek f 0 D 0 }
2730         T{ ##compare-integer-branch f 0 0 cc>= }
2731     } test-branch-folding
2732 ] unit-test
2733
2734 {
2735     V{
2736         T{ ##peek f 0 D 0 }
2737         T{ ##branch }
2738     }
2739     0
2740 } [
2741     V{
2742         T{ ##peek f 0 D 0 }
2743         T{ ##compare-integer-branch f 0 0 cc= }
2744     } test-branch-folding
2745 ] unit-test
2746
2747 {
2748     V{
2749         T{ ##peek f 0 D 0 }
2750         T{ ##branch }
2751     }
2752     1
2753 } [
2754     V{
2755         T{ ##peek f 0 D 0 }
2756         T{ ##compare-integer-branch f 0 0 cc/= }
2757     } test-branch-folding
2758 ] unit-test
2759
2760 {
2761     V{
2762         T{ ##peek f 0 D 0 }
2763         T{ ##load-reference f 1 t }
2764         T{ ##branch }
2765     }
2766     0
2767 } [
2768     V{
2769         T{ ##peek f 0 D 0 }
2770         T{ ##compare f 1 0 0 cc<= }
2771         T{ ##compare-imm-branch f 1 f cc/= }
2772     } test-branch-folding
2773 ] unit-test
2774
2775 ! More branch folding tests
2776 V{ T{ ##branch } } 0 test-bb
2777
2778 V{
2779     T{ ##peek f 0 D 0 }
2780     T{ ##compare-integer-branch f 0 0 cc< }
2781 } 1 test-bb
2782
2783 V{
2784     T{ ##load-integer f 1 1 }
2785     T{ ##branch }
2786 } 2 test-bb
2787
2788 V{
2789     T{ ##load-integer f 2 2 }
2790     T{ ##branch }
2791 } 3 test-bb
2792
2793 V{
2794     T{ ##phi f 3 H{ { 2 1 } { 3 2 } } }
2795     T{ ##replace f 3 D 0 }
2796     T{ ##return }
2797 } 4 test-bb
2798
2799 test-diamond
2800
2801 { } [
2802     0 get block>cfg {
2803         [ cfg set ]
2804         [ value-numbering ]
2805         [ select-representations ]
2806         [ destruct-ssa ]
2807     } cleave
2808 ] unit-test
2809
2810 { 1 } [ 1 get successors>> length ] unit-test
2811
2812 { t } [ 1 get successors>> first 3 get eq? ] unit-test
2813
2814 { 2 } [ 4 get instructions>> length ] unit-test
2815
2816 V{
2817     T{ ##peek f 0 D 0 }
2818     T{ ##branch }
2819 } 0 test-bb
2820
2821 V{
2822     T{ ##peek f 1 D 1 }
2823     T{ ##compare-integer-branch f 1 1 cc< }
2824 } 1 test-bb
2825
2826 V{
2827     T{ ##copy f 2 0 any-rep }
2828     T{ ##branch }
2829 } 2 test-bb
2830
2831 V{
2832     T{ ##phi f 3 H{ { 1 1 } { 2 0 } } }
2833     T{ ##branch }
2834 } 3 test-bb
2835
2836 V{
2837     T{ ##replace f 3 D 0 }
2838     T{ ##return }
2839 } 4 test-bb
2840
2841 test-diamond
2842
2843 { } [ 0 get block>cfg value-numbering ] unit-test
2844
2845 { t } [ 1 get successors>> first 3 get eq? ] unit-test
2846
2847 { t } [ 3 get instructions>> first ##copy? ] unit-test
2848
2849 V{ T{ ##prologue } T{ ##branch } } 0 test-bb
2850
2851 V{
2852     T{ ##peek { dst 15 } { loc D 0 } }
2853     T{ ##copy { dst 16 } { src 15 } { rep any-rep } }
2854     T{ ##copy { dst 17 } { src 15 } { rep any-rep } }
2855     T{ ##copy { dst 18 } { src 15 } { rep any-rep } }
2856     T{ ##copy { dst 19 } { src 15 } { rep any-rep } }
2857     T{ ##compare
2858         { dst 20 }
2859         { src1 18 }
2860         { src2 19 }
2861         { cc cc= }
2862         { temp 22 }
2863     }
2864     T{ ##copy { dst 21 } { src 20 } { rep any-rep } }
2865     T{ ##compare-imm-branch
2866         { src1 21 }
2867         { src2 f }
2868         { cc cc/= }
2869     }
2870 } 1 test-bb
2871
2872 V{
2873     T{ ##copy { dst 23 } { src 15 } { rep any-rep } }
2874     T{ ##copy { dst 24 } { src 15 } { rep any-rep } }
2875     T{ ##load-reference { dst 25 } { obj t } }
2876     T{ ##branch }
2877 } 2 test-bb
2878
2879 V{
2880     T{ ##replace { src 25 } { loc D 0 } }
2881     T{ ##epilogue }
2882     T{ ##return }
2883 } 3 test-bb
2884
2885 V{
2886     T{ ##copy { dst 26 } { src 15 } { rep any-rep } }
2887     T{ ##copy { dst 27 } { src 15 } { rep any-rep } }
2888     T{ ##add
2889         { dst 28 }
2890         { src1 26 }
2891         { src2 27 }
2892     }
2893     T{ ##branch }
2894 } 4 test-bb
2895
2896 V{
2897     T{ ##replace { src 28 } { loc D 0 } }
2898     T{ ##epilogue }
2899     T{ ##return }
2900 } 5 test-bb
2901
2902 0 1 edge
2903 1 { 2 4 } edges
2904 2 3 edge
2905 4 5 edge
2906
2907 { } [
2908     0 get block>cfg
2909     dup value-numbering eliminate-dead-code
2910 ] unit-test
2911
2912 { f } [ 1 get instructions>> [ ##peek? ] any? ] unit-test
2913
2914 ! Slot addressing optimization
2915 cpu x86? [
2916     [
2917         V{
2918             T{ ##peek f 0 D 0 }
2919             T{ ##peek f 1 D 1 }
2920             T{ ##add-imm f 2 1 2 }
2921             T{ ##slot f 3 0 1 $[ cell log2 ] $[ 7 2 cells - ] }
2922         }
2923     ] [
2924         V{
2925             T{ ##peek f 0 D 0 }
2926             T{ ##peek f 1 D 1 }
2927             T{ ##add-imm f 2 1 2 }
2928             T{ ##slot f 3 0 2 $[ cell log2 ] 7 }
2929         } value-number-bb
2930     ] unit-test
2931 ] when
2932
2933 ! Alien addressing optimization
2934
2935 ! Base offset fusion on ##load/store-memory-imm
2936 {
2937     V{
2938         T{ ##peek f 1 D 0 }
2939         T{ ##tagged>integer f 2 1 }
2940         T{ ##add-imm f 3 2 10 }
2941         T{ ##load-memory-imm f 4 2 10 int-rep c:uchar }
2942     }
2943 } [
2944     V{
2945         T{ ##peek f 1 D 0 }
2946         T{ ##tagged>integer f 2 1 }
2947         T{ ##add-imm f 3 2 10 }
2948         T{ ##load-memory-imm f 4 3 0 int-rep c:uchar }
2949     } value-number-bb
2950 ] unit-test
2951
2952 {
2953     V{
2954         T{ ##peek f 0 D 0 }
2955         T{ ##peek f 1 D 1 }
2956         T{ ##tagged>integer f 2 0 }
2957         T{ ##tagged>integer f 3 1 }
2958         T{ ##add-imm f 4 3 10 }
2959         T{ ##store-memory-imm f 2 3 10 int-rep c:uchar }
2960     }
2961 } [
2962     V{
2963         T{ ##peek f 0 D 0 }
2964         T{ ##peek f 1 D 1 }
2965         T{ ##tagged>integer f 2 0 }
2966         T{ ##tagged>integer f 3 1 }
2967         T{ ##add-imm f 4 3 10 }
2968         T{ ##store-memory-imm f 2 4 0 int-rep c:uchar }
2969     } value-number-bb
2970 ] unit-test
2971
2972 ! Displacement fusion on ##load/store-memory-imm
2973 {
2974     V{
2975         T{ ##peek f 0 D 0 }
2976         T{ ##peek f 1 D 1 }
2977         T{ ##tagged>integer f 2 0 }
2978         T{ ##tagged>integer f 3 1 }
2979         T{ ##add f 4 2 3 }
2980         T{ ##load-memory f 5 2 3 0 0 int-rep c:uchar }
2981     }
2982 } [
2983     V{
2984         T{ ##peek f 0 D 0 }
2985         T{ ##peek f 1 D 1 }
2986         T{ ##tagged>integer f 2 0 }
2987         T{ ##tagged>integer f 3 1 }
2988         T{ ##add f 4 2 3 }
2989         T{ ##load-memory-imm f 5 4 0 int-rep c:uchar }
2990     } value-number-bb
2991 ] unit-test
2992
2993 {
2994     V{
2995         T{ ##peek f 0 D 0 }
2996         T{ ##peek f 1 D 1 }
2997         T{ ##tagged>integer f 2 0 }
2998         T{ ##tagged>integer f 3 1 }
2999         T{ ##add f 4 2 3 }
3000         T{ ##store-memory f 5 2 3 0 0 int-rep c:uchar }
3001     }
3002 } [
3003     V{
3004         T{ ##peek f 0 D 0 }
3005         T{ ##peek f 1 D 1 }
3006         T{ ##tagged>integer f 2 0 }
3007         T{ ##tagged>integer f 3 1 }
3008         T{ ##add f 4 2 3 }
3009         T{ ##store-memory-imm f 5 4 0 int-rep c:uchar }
3010     } value-number-bb
3011 ] unit-test
3012
3013 ! Base offset fusion on ##load/store-memory -- only on x86
3014 cpu x86?
3015 [
3016     V{
3017         T{ ##peek f 0 D 0 }
3018         T{ ##peek f 1 D 1 }
3019         T{ ##tagged>integer f 2 0 }
3020         T{ ##tagged>integer f 3 1 }
3021         T{ ##add-imm f 4 2 31337 }
3022         T{ ##load-memory f 5 2 3 0 31337 int-rep c:uchar }
3023     }
3024 ]
3025 [
3026     V{
3027         T{ ##peek f 0 D 0 }
3028         T{ ##peek f 1 D 1 }
3029         T{ ##tagged>integer f 2 0 }
3030         T{ ##tagged>integer f 3 1 }
3031         T{ ##add-imm f 4 2 31337 }
3032         T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
3033     }
3034 ] }
3035 [
3036     V{
3037         T{ ##peek f 0 D 0 }
3038         T{ ##peek f 1 D 1 }
3039         T{ ##tagged>integer f 2 0 }
3040         T{ ##tagged>integer f 3 1 }
3041         T{ ##add-imm f 4 2 31337 }
3042         T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
3043     } value-number-bb
3044 ] unit-test
3045
3046 ! Displacement offset fusion on ##load/store-memory -- only on x86
3047 cpu x86?
3048 [
3049     V{
3050         T{ ##peek f 0 D 0 }
3051         T{ ##peek f 1 D 1 }
3052         T{ ##tagged>integer f 2 0 }
3053         T{ ##tagged>integer f 3 1 }
3054         T{ ##add-imm f 4 3 31337 }
3055         T{ ##load-memory f 5 2 3 0 31338 int-rep c:uchar }
3056     }
3057 ]
3058 [
3059     V{
3060         T{ ##peek f 0 D 0 }
3061         T{ ##peek f 1 D 1 }
3062         T{ ##tagged>integer f 2 0 }
3063         T{ ##tagged>integer f 3 1 }
3064         T{ ##add-imm f 4 3 31337 }
3065         T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
3066     }
3067 ] }
3068 [
3069     V{
3070         T{ ##peek f 0 D 0 }
3071         T{ ##peek f 1 D 1 }
3072         T{ ##tagged>integer f 2 0 }
3073         T{ ##tagged>integer f 3 1 }
3074         T{ ##add-imm f 4 3 31337 }
3075         T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
3076     } value-number-bb
3077 ] unit-test
3078
3079 ! Displacement offset fusion should not occur on
3080 ! ##load/store-memory with non-zero scale
3081 { } [
3082     V{
3083         T{ ##peek f 0 D 0 }
3084         T{ ##peek f 1 D 1 }
3085         T{ ##tagged>integer f 2 0 }
3086         T{ ##tagged>integer f 3 1 }
3087         T{ ##add-imm f 4 3 10 }
3088         T{ ##load-memory f 5 2 4 1 1 int-rep c:uchar }
3089     } dup value-number-bb assert=
3090 ] unit-test
3091
3092 ! Scale fusion on ##load/store-memory
3093 cpu x86?
3094 [
3095     V{
3096         T{ ##peek f 0 D 0 }
3097         T{ ##peek f 1 D 1 }
3098         T{ ##tagged>integer f 2 0 }
3099         T{ ##tagged>integer f 3 1 }
3100         T{ ##shl-imm f 4 3 2 }
3101         T{ ##load-memory f 5 2 3 2 0 int-rep c:uchar }
3102     }
3103 ]
3104 [
3105     V{
3106         T{ ##peek f 0 D 0 }
3107         T{ ##peek f 1 D 1 }
3108         T{ ##tagged>integer f 2 0 }
3109         T{ ##tagged>integer f 3 1 }
3110         T{ ##shl-imm f 4 3 2 }
3111         T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3112     }
3113 ] }
3114 [
3115     V{
3116         T{ ##peek f 0 D 0 }
3117         T{ ##peek f 1 D 1 }
3118         T{ ##tagged>integer f 2 0 }
3119         T{ ##tagged>integer f 3 1 }
3120         T{ ##shl-imm f 4 3 2 }
3121         T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3122     } value-number-bb
3123 ] unit-test
3124
3125 cpu x86? [
3126     ! Don't do scale fusion if there's already a scale
3127     [ ] [
3128         V{
3129             T{ ##peek f 0 D 0 }
3130             T{ ##peek f 1 D 1 }
3131             T{ ##tagged>integer f 2 0 }
3132             T{ ##tagged>integer f 3 1 }
3133             T{ ##shl-imm f 4 3 2 }
3134             T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
3135         } dup value-number-bb assert=
3136     ] unit-test
3137
3138     ! Don't do scale fusion if the scale factor is out of range
3139     [ ] [
3140         V{
3141             T{ ##peek f 0 D 0 }
3142             T{ ##peek f 1 D 1 }
3143             T{ ##tagged>integer f 2 0 }
3144             T{ ##tagged>integer f 3 1 }
3145             T{ ##shl-imm f 4 3 4 }
3146             T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3147         } dup value-number-bb assert=
3148     ] unit-test
3149 ] when
3150
3151 ! Make sure to search for available registers that compute the
3152 ! same value number, instead of just relying on the
3153 ! availability of the canonical leader.
3154
3155 V{ T{ ##branch } } 0 test-bb
3156
3157 V{
3158     T{ ##inc { loc D -1 } }
3159     T{ ##peek { dst 1 } { loc D -1 } }
3160     T{ ##compare-imm-branch { src1 1 } { src2 f } { cc cc/= } }
3161 } 1 test-bb
3162
3163 V{
3164     T{ ##inc { loc D 1 } }
3165     T{ ##load-integer { dst 2 } { val 100 } }
3166     T{ ##branch }
3167 } 2 test-bb
3168
3169 V{
3170     T{ ##inc { loc D 1 } }
3171     T{ ##load-integer { dst 3 } { val 200 } }
3172     T{ ##branch }
3173 } 3 test-bb
3174
3175 V{
3176     T{ ##load-integer { dst 4 } { val 100 } }
3177     T{ ##load-integer { dst 5 } { val 100 } }
3178     T{ ##load-integer { dst 6 } { val 100 } }
3179 } 4 test-bb
3180
3181 test-diamond
3182
3183 { } [ 0 get block>cfg value-numbering ] unit-test
3184
3185 ! First ##load-integer cannot be turned into a ##copy because
3186 ! the canonical leader for the value 100 is unavailable, but
3187 ! the rest should still be redundant.
3188 { t } [ 4 get instructions>> first ##load-integer? ] unit-test
3189 { 1 } [ 4 get instructions>> [ ##load-integer? ] count ] unit-test
3190
3191 ! Global optimization
3192 V{ T{ ##prologue } T{ ##branch } } 0 test-bb
3193
3194 V{
3195     T{ ##inc f D 3 }
3196     T{ ##load-integer f 21 0 }
3197     T{ ##load-integer f 22 100 }
3198     T{ ##load-integer f 23 0 }
3199     T{ ##copy f 24 22 any-rep }
3200     T{ ##copy f 25 21 any-rep }
3201     T{ ##copy f 26 24 any-rep }
3202     T{ ##copy f 27 23 any-rep }
3203     T{ ##branch }
3204 } 1 test-bb
3205
3206 ! Need to define bb 3 before the ##phi in bb 2 can be resolved
3207 V{
3208     T{ ##load-integer f 35 1 }
3209     T{ ##add f 36 29 35 }
3210     T{ ##load-integer f 37 1 }
3211     T{ ##add f 38 30 37 }
3212     T{ ##copy f 39 30 any-rep }
3213     T{ ##copy f 40 26 any-rep }
3214     T{ ##copy f 41 36 any-rep }
3215     T{ ##copy f 42 38 any-rep }
3216     T{ ##branch }
3217 } 3 test-bb
3218
3219 V{
3220     T{ ##phi f 29 H{ { 1 25 } { 3 41 } } }
3221     T{ ##phi f 30 H{ { 1 27 } { 3 42 } } }
3222     T{ ##compare-integer f 31 30 26 cc< 9 }
3223     T{ ##copy f 32 31 any-rep }
3224     T{ ##copy f 33 26 any-rep }
3225     T{ ##copy f 34 31 any-rep }
3226     T{ ##compare-imm-branch f 32 f cc/= }
3227 } 2 test-bb
3228
3229 V{
3230     T{ ##inc f D -2 }
3231     T{ ##replace f 29 D 0 }
3232     T{ ##branch }
3233 } 4 test-bb
3234
3235 V{ T{ ##epilogue } T{ ##return } } 5 test-bb
3236
3237 0 1 edge
3238 1 2 edge
3239 2 { 3 4 } edges
3240 3 2 edge
3241 4 5 edge
3242
3243 { } [ 0 get block>cfg dup value-numbering eliminate-dead-code ] unit-test
3244
3245 { 1 } [ 1 get instructions>> [ ##load-integer? ] count ] unit-test
3246 { 1 } [ 2 get instructions>> [ ##phi? ] count ] unit-test
3247 { t } [ 2 get instructions>> last ##compare-integer-imm-branch? ] unit-test
3248 { f } [ 3 get instructions>> [ ##load-integer? ] any? ] unit-test
3249 { 1 } [ 3 get instructions>> [ ##add-imm? ] count ] unit-test