| ... |
... |
@@ -565,111 +565,118 @@ comparisonResultRep = bWord -- is it? |
|
565
|
565
|
-- application of a MachOp is "type-correct" by checking that the MachReps of
|
|
566
|
566
|
-- its arguments are the same as the MachOp expects. This is used when
|
|
567
|
567
|
-- linting a CmmExpr.
|
|
|
568
|
+-- We also check if the given width is supported at all. But there might be
|
|
|
569
|
+-- false positives.
|
|
568
|
570
|
|
|
569
|
|
-machOpArgReps :: Platform -> MachOp -> [Width]
|
|
|
571
|
+machOpArgReps :: Platform -> MachOp -> Maybe [Width]
|
|
570
|
572
|
machOpArgReps platform op =
|
|
571
|
573
|
case op of
|
|
572
|
|
- MO_Add w -> [w,w]
|
|
573
|
|
- MO_Sub w -> [w,w]
|
|
574
|
|
- MO_Eq w -> [w,w]
|
|
575
|
|
- MO_Ne w -> [w,w]
|
|
576
|
|
- MO_Mul w -> [w,w]
|
|
577
|
|
- MO_S_MulMayOflo w -> [w,w]
|
|
578
|
|
- MO_S_Quot w -> [w,w]
|
|
579
|
|
- MO_S_Rem w -> [w,w]
|
|
580
|
|
- MO_S_Neg w -> [w]
|
|
581
|
|
- MO_U_Quot w -> [w,w]
|
|
582
|
|
- MO_U_Rem w -> [w,w]
|
|
583
|
|
-
|
|
584
|
|
- MO_S_Ge w -> [w,w]
|
|
585
|
|
- MO_S_Le w -> [w,w]
|
|
586
|
|
- MO_S_Gt w -> [w,w]
|
|
587
|
|
- MO_S_Lt w -> [w,w]
|
|
588
|
|
-
|
|
589
|
|
- MO_U_Ge w -> [w,w]
|
|
590
|
|
- MO_U_Le w -> [w,w]
|
|
591
|
|
- MO_U_Gt w -> [w,w]
|
|
592
|
|
- MO_U_Lt w -> [w,w]
|
|
593
|
|
-
|
|
594
|
|
- MO_F_Add w -> [w,w]
|
|
595
|
|
- MO_F_Sub w -> [w,w]
|
|
596
|
|
- MO_F_Mul w -> [w,w]
|
|
597
|
|
- MO_F_Quot w -> [w,w]
|
|
598
|
|
- MO_F_Neg w -> [w]
|
|
599
|
|
- MO_F_Min w -> [w,w]
|
|
600
|
|
- MO_F_Max w -> [w,w]
|
|
601
|
|
-
|
|
602
|
|
- MO_FMA _ l w -> [vecwidth l w, vecwidth l w, vecwidth l w]
|
|
603
|
|
-
|
|
604
|
|
- MO_F_Eq w -> [w,w]
|
|
605
|
|
- MO_F_Ne w -> [w,w]
|
|
606
|
|
- MO_F_Ge w -> [w,w]
|
|
607
|
|
- MO_F_Le w -> [w,w]
|
|
608
|
|
- MO_F_Gt w -> [w,w]
|
|
609
|
|
- MO_F_Lt w -> [w,w]
|
|
610
|
|
-
|
|
611
|
|
- MO_And w -> [w,w]
|
|
612
|
|
- MO_Or w -> [w,w]
|
|
613
|
|
- MO_Xor w -> [w,w]
|
|
614
|
|
- MO_Not w -> [w]
|
|
615
|
|
- MO_Shl w -> [w, wordWidth platform]
|
|
616
|
|
- MO_U_Shr w -> [w, wordWidth platform]
|
|
617
|
|
- MO_S_Shr w -> [w, wordWidth platform]
|
|
618
|
|
-
|
|
619
|
|
- MO_SS_Conv from _ -> [from]
|
|
620
|
|
- MO_UU_Conv from _ -> [from]
|
|
621
|
|
- MO_XX_Conv from _ -> [from]
|
|
622
|
|
- MO_SF_Round from _ -> [from]
|
|
623
|
|
- MO_FS_Truncate from _ -> [from]
|
|
624
|
|
- MO_FF_Conv from _ -> [from]
|
|
625
|
|
- MO_WF_Bitcast w -> [w]
|
|
626
|
|
- MO_FW_Bitcast w -> [w]
|
|
627
|
|
-
|
|
628
|
|
- MO_V_Shuffle l w _ -> [vecwidth l w, vecwidth l w]
|
|
629
|
|
- MO_VF_Shuffle l w _ -> [vecwidth l w, vecwidth l w]
|
|
630
|
|
-
|
|
631
|
|
- MO_V_Broadcast _ w -> [w]
|
|
632
|
|
- MO_V_Insert l w -> [vecwidth l w, w, W32]
|
|
633
|
|
- MO_V_Extract l w -> [vecwidth l w, W32]
|
|
634
|
|
- MO_VF_Broadcast _ w -> [w]
|
|
635
|
|
- MO_VF_Insert l w -> [vecwidth l w, w, W32]
|
|
636
|
|
- MO_VF_Extract l w -> [vecwidth l w, W32]
|
|
|
574
|
+ MO_Add w -> Just [w,w]
|
|
|
575
|
+ MO_Sub w -> Just [w,w]
|
|
|
576
|
+ MO_Eq w -> Just [w,w]
|
|
|
577
|
+ MO_Ne w -> Just [w,w]
|
|
|
578
|
+ MO_Mul w -> Just [w,w]
|
|
|
579
|
+ MO_S_MulMayOflo w -> Just [w,w]
|
|
|
580
|
+ MO_S_Quot w -> Just [w,w]
|
|
|
581
|
+ MO_S_Rem w -> Just [w,w]
|
|
|
582
|
+ MO_S_Neg w -> Just [w]
|
|
|
583
|
+ MO_U_Quot w -> Just [w,w]
|
|
|
584
|
+ MO_U_Rem w -> Just [w,w]
|
|
|
585
|
+
|
|
|
586
|
+ MO_S_Ge w -> Just [w,w]
|
|
|
587
|
+ MO_S_Le w -> Just [w,w]
|
|
|
588
|
+ MO_S_Gt w -> Just [w,w]
|
|
|
589
|
+ MO_S_Lt w -> Just [w,w]
|
|
|
590
|
+
|
|
|
591
|
+ MO_U_Ge w -> Just [w,w]
|
|
|
592
|
+ MO_U_Le w -> Just [w,w]
|
|
|
593
|
+ MO_U_Gt w -> Just [w,w]
|
|
|
594
|
+ MO_U_Lt w -> Just [w,w]
|
|
|
595
|
+
|
|
|
596
|
+ MO_F_Add w -> Just [w,w]
|
|
|
597
|
+ MO_F_Sub w -> Just [w,w]
|
|
|
598
|
+ MO_F_Mul w -> Just [w,w]
|
|
|
599
|
+ MO_F_Quot w -> Just [w,w]
|
|
|
600
|
+ MO_F_Neg w -> Just [w]
|
|
|
601
|
+ MO_F_Min w -> Just [w,w]
|
|
|
602
|
+ MO_F_Max w -> Just [w,w]
|
|
|
603
|
+
|
|
|
604
|
+ MO_FMA _ l w -> Just [vecwidth l w, vecwidth l w, vecwidth l w]
|
|
|
605
|
+
|
|
|
606
|
+ MO_F_Eq w -> Just [w,w]
|
|
|
607
|
+ MO_F_Ne w -> Just [w,w]
|
|
|
608
|
+ MO_F_Ge w -> Just [w,w]
|
|
|
609
|
+ MO_F_Le w -> Just [w,w]
|
|
|
610
|
+ MO_F_Gt w -> Just [w,w]
|
|
|
611
|
+ MO_F_Lt w -> Just [w,w]
|
|
|
612
|
+
|
|
|
613
|
+ MO_And w -> Just [w,w]
|
|
|
614
|
+ MO_Or w -> Just [w,w]
|
|
|
615
|
+ MO_Xor w -> Just [w,w]
|
|
|
616
|
+ MO_Not w -> Just [w]
|
|
|
617
|
+ MO_Shl w -> Just [w, wordWidth platform]
|
|
|
618
|
+ MO_U_Shr w -> Just [w, wordWidth platform]
|
|
|
619
|
+ MO_S_Shr w -> Just [w, wordWidth platform]
|
|
|
620
|
+
|
|
|
621
|
+ MO_SS_Conv from _ -> Just [from]
|
|
|
622
|
+ MO_UU_Conv from _ -> Just [from]
|
|
|
623
|
+ MO_XX_Conv from _ -> Just [from]
|
|
|
624
|
+ -- Only supports W32/W64
|
|
|
625
|
+ MO_SF_Round from _w -> onlyW32W64 from
|
|
|
626
|
+ MO_FS_Truncate from _ -> onlyW32W64 from
|
|
|
627
|
+ MO_FF_Conv from _ -> onlyW32W64 from
|
|
|
628
|
+ MO_WF_Bitcast w -> onlyW32W64 w
|
|
|
629
|
+ MO_FW_Bitcast w -> onlyW32W64 w
|
|
|
630
|
+
|
|
|
631
|
+ MO_V_Shuffle l w _ -> Just [vecwidth l w, vecwidth l w]
|
|
|
632
|
+ MO_VF_Shuffle l w _ -> Just [vecwidth l w, vecwidth l w]
|
|
|
633
|
+
|
|
|
634
|
+ MO_V_Broadcast _ w -> Just [w]
|
|
|
635
|
+ MO_V_Insert l w -> Just [vecwidth l w, w, W32]
|
|
|
636
|
+ MO_V_Extract l w -> Just [vecwidth l w, W32]
|
|
|
637
|
+ MO_VF_Broadcast _ w -> Just [w]
|
|
|
638
|
+ MO_VF_Insert l w -> Just [vecwidth l w, w, W32]
|
|
|
639
|
+ MO_VF_Extract l w -> Just [vecwidth l w, W32]
|
|
637
|
640
|
-- SIMD vector indices are always 32 bit
|
|
638
|
641
|
|
|
639
|
|
- MO_V_Add l w -> [vecwidth l w, vecwidth l w]
|
|
640
|
|
- MO_V_Sub l w -> [vecwidth l w, vecwidth l w]
|
|
641
|
|
- MO_V_Mul l w -> [vecwidth l w, vecwidth l w]
|
|
|
642
|
+ MO_V_Add l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
643
|
+ MO_V_Sub l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
644
|
+ MO_V_Mul l w -> Just [vecwidth l w, vecwidth l w]
|
|
642
|
645
|
|
|
643
|
|
- MO_VS_Neg l w -> [vecwidth l w]
|
|
644
|
|
- MO_VS_Abs l w -> [vecwidth l w]
|
|
645
|
|
- MO_VS_Min l w -> [vecwidth l w, vecwidth l w]
|
|
646
|
|
- MO_VS_Max l w -> [vecwidth l w, vecwidth l w]
|
|
|
646
|
+ MO_VS_Neg l w -> Just [vecwidth l w]
|
|
|
647
|
+ MO_VS_Abs l w -> Just [vecwidth l w]
|
|
|
648
|
+ MO_VS_Min l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
649
|
+ MO_VS_Max l w -> Just [vecwidth l w, vecwidth l w]
|
|
647
|
650
|
|
|
648
|
|
- MO_VU_Min l w -> [vecwidth l w, vecwidth l w]
|
|
649
|
|
- MO_VU_Max l w -> [vecwidth l w, vecwidth l w]
|
|
|
651
|
+ MO_VU_Min l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
652
|
+ MO_VU_Max l w -> Just [vecwidth l w, vecwidth l w]
|
|
650
|
653
|
|
|
651
|
654
|
-- NOTE: The below is owing to the fact that floats use the SSE registers
|
|
652
|
|
- MO_VF_Add l w -> [vecwidth l w, vecwidth l w]
|
|
653
|
|
- MO_VF_Sub l w -> [vecwidth l w, vecwidth l w]
|
|
654
|
|
- MO_VF_Mul l w -> [vecwidth l w, vecwidth l w]
|
|
655
|
|
- MO_VF_Quot l w -> [vecwidth l w, vecwidth l w]
|
|
656
|
|
- MO_VF_Neg l w -> [vecwidth l w]
|
|
657
|
|
- MO_VF_Abs l w -> [vecwidth l w]
|
|
658
|
|
- MO_VF_Sqrt l w -> [vecwidth l w]
|
|
659
|
|
- MO_VF_Min l w -> [vecwidth l w, vecwidth l w]
|
|
660
|
|
- MO_VF_Max l w -> [vecwidth l w, vecwidth l w]
|
|
661
|
|
-
|
|
662
|
|
- MO_V_And l w -> [vecwidth l w, vecwidth l w]
|
|
663
|
|
- MO_V_Or l w -> [vecwidth l w, vecwidth l w]
|
|
664
|
|
- MO_V_Xor l w -> [vecwidth l w, vecwidth l w]
|
|
665
|
|
- MO_VF_And l w -> [vecwidth l w, vecwidth l w]
|
|
666
|
|
- MO_VF_Or l w -> [vecwidth l w, vecwidth l w]
|
|
667
|
|
- MO_VF_Xor l w -> [vecwidth l w, vecwidth l w]
|
|
668
|
|
-
|
|
669
|
|
- MO_RelaxedRead _ -> [wordWidth platform]
|
|
670
|
|
- MO_AlignmentCheck _ w -> [w]
|
|
|
655
|
+ MO_VF_Add l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
656
|
+ MO_VF_Sub l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
657
|
+ MO_VF_Mul l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
658
|
+ MO_VF_Quot l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
659
|
+ MO_VF_Neg l w -> Just [vecwidth l w]
|
|
|
660
|
+ MO_VF_Abs l w -> Just [vecwidth l w]
|
|
|
661
|
+ MO_VF_Sqrt l w -> Just [vecwidth l w]
|
|
|
662
|
+ MO_VF_Min l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
663
|
+ MO_VF_Max l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
664
|
+
|
|
|
665
|
+ MO_V_And l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
666
|
+ MO_V_Or l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
667
|
+ MO_V_Xor l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
668
|
+ MO_VF_And l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
669
|
+ MO_VF_Or l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
670
|
+ MO_VF_Xor l w -> Just [vecwidth l w, vecwidth l w]
|
|
|
671
|
+
|
|
|
672
|
+ MO_RelaxedRead _ -> Just [wordWidth platform]
|
|
|
673
|
+ MO_AlignmentCheck _ w -> Just [w]
|
|
671
|
674
|
where
|
|
672
|
675
|
vecwidth l w = widthFromBytes (l * widthInBytes w)
|
|
|
676
|
+ onlyW32W64 w
|
|
|
677
|
+ | w == W64 = Just [w]
|
|
|
678
|
+ | w == W32 = Just [w]
|
|
|
679
|
+ | otherwise = Nothing
|
|
673
|
680
|
|
|
674
|
681
|
-----------------------------------------------------------------------------
|
|
675
|
682
|
-- CallishMachOp
|