... |
... |
@@ -138,21 +138,6 @@ regUsageOfInstr platform instr = case instr of |
138
|
138
|
usage (regOp op1 ++ regOp op2 ++ regOp op3, regOp op1)
|
139
|
139
|
_ -> panic $ "regUsageOfInstr: " ++ instrCon instr
|
140
|
140
|
where
|
141
|
|
- -- filtering the usage is necessary, otherwise the register
|
142
|
|
- -- allocator will try to allocate pre-defined fixed stg
|
143
|
|
- -- registers as well, as they show up.
|
144
|
|
- usage :: ([(Reg, Format)], [(Reg, Format)]) -> RegUsage
|
145
|
|
- usage (srcRegs, dstRegs) =
|
146
|
|
- RU
|
147
|
|
- (map mkFmt $ filter (interesting platform) srcRegs)
|
148
|
|
- (map mkFmt $ filter (interesting platform) dstRegs)
|
149
|
|
-
|
150
|
|
- mkFmt (r, fmt) = RegWithFormat r fmt
|
151
|
|
-
|
152
|
|
- regAddr :: AddrMode -> [(Reg, Format)]
|
153
|
|
- regAddr (AddrRegImm r1 _imm) = [(r1, II64)]
|
154
|
|
- regAddr (AddrReg r1) = [(r1, II64)]
|
155
|
|
-
|
156
|
141
|
regOp :: Operand -> [(Reg, Format)]
|
157
|
142
|
regOp (OpReg fmt r1) = [(r1, fmt)]
|
158
|
143
|
regOp (OpAddr a) = regAddr a
|
... |
... |
@@ -162,10 +147,25 @@ regUsageOfInstr platform instr = case instr of |
162
|
147
|
regTarget (TBlock _bid) = []
|
163
|
148
|
regTarget (TReg r1) = [(r1, II64)]
|
164
|
149
|
|
165
|
|
- -- Is this register interesting for the register allocator?
|
166
|
|
- interesting :: Platform -> (Reg, Format) -> Bool
|
167
|
|
- interesting _ ((RegVirtual _), _) = True
|
168
|
|
- interesting platform ((RegReal (RealRegSingle i)), _) = freeReg platform i
|
|
150
|
+ regAddr :: AddrMode -> [(Reg, Format)]
|
|
151
|
+ regAddr (AddrRegImm r1 _imm) = [(r1, II64)]
|
|
152
|
+ regAddr (AddrReg r1) = [(r1, II64)]
|
|
153
|
+
|
|
154
|
+ -- filtering the usage is necessary, otherwise the register
|
|
155
|
+ -- allocator will try to allocate pre-defined fixed stg
|
|
156
|
+ -- registers as well, as they show up.
|
|
157
|
+ usage :: ([(Reg, Format)], [(Reg, Format)]) -> RegUsage
|
|
158
|
+ usage (srcRegs, dstRegs) =
|
|
159
|
+ RU
|
|
160
|
+ (map mkFmt $ filter (interesting platform) srcRegs)
|
|
161
|
+ (map mkFmt $ filter (interesting platform) dstRegs)
|
|
162
|
+ where
|
|
163
|
+ mkFmt (r, fmt) = RegWithFormat r fmt
|
|
164
|
+
|
|
165
|
+ -- Is this register interesting for the register allocator?
|
|
166
|
+ interesting :: Platform -> (Reg, Format) -> Bool
|
|
167
|
+ interesting _ ((RegVirtual _), _) = True
|
|
168
|
+ interesting platform ((RegReal (RealRegSingle i)), _) = freeReg platform i
|
169
|
169
|
|
170
|
170
|
-- | Caller-saved registers (according to calling convention)
|
171
|
171
|
--
|
... |
... |
@@ -240,7 +240,7 @@ patchRegsOfInstr instr env = case instr of |
240
|
240
|
VSUB o1 o2 o3 -> VSUB (patchOp o1) (patchOp o2) (patchOp o3)
|
241
|
241
|
VMUL o1 o2 o3 -> VMUL (patchOp o1) (patchOp o2) (patchOp o3)
|
242
|
242
|
VQUOT mbS o1 o2 o3 -> VQUOT mbS (patchOp o1) (patchOp o2) (patchOp o3)
|
243
|
|
- VREM s o1 o2 o3 -> VREM s (patchOp o1) (patchOp o2) (patchOp o3)
|
|
243
|
+ VREM s o1 o2 o3 -> VREM s (patchOp o1) (patchOp o2) (patchOp o3)
|
244
|
244
|
VSMIN o1 o2 o3 -> VSMIN (patchOp o1) (patchOp o2) (patchOp o3)
|
245
|
245
|
VSMAX o1 o2 o3 -> VSMAX (patchOp o1) (patchOp o2) (patchOp o3)
|
246
|
246
|
VUMIN o1 o2 o3 -> VUMIN (patchOp o1) (patchOp o2) (patchOp o3)
|
... |
... |
@@ -452,7 +452,7 @@ mkRegRegMoveInstr :: Format -> Reg -> Reg -> Instr |
452
|
452
|
mkRegRegMoveInstr fmt src dst = ANN desc instr
|
453
|
453
|
where
|
454
|
454
|
desc = text "Reg->Reg Move: " <> ppr src <> text " -> " <> ppr dst
|
455
|
|
- instr = MOV (operandFromReg fmt dst) (operandFromReg fmt src)
|
|
455
|
+ instr = MOV (OpReg fmt dst) (OpReg fmt src)
|
456
|
456
|
|
457
|
457
|
-- | Take the source and destination from this (potential) reg -> reg move instruction
|
458
|
458
|
--
|
... |
... |
@@ -678,8 +678,7 @@ data Instr |
678
|
678
|
-- - fmsub : d = - r1 * r2 + r3
|
679
|
679
|
-- - fnmadd: d = - r1 * r2 - r3
|
680
|
680
|
FMA FMASign Operand Operand Operand Operand
|
681
|
|
- | -- TODO: Care about the variants (<instr>.x.y) -> sum type
|
682
|
|
- VMV Operand Operand
|
|
681
|
+ | VMV Operand Operand
|
683
|
682
|
| VID Operand
|
684
|
683
|
| VMSEQ Operand Operand Operand
|
685
|
684
|
| VMERGE Operand Operand Operand Operand
|
... |
... |
@@ -816,21 +815,17 @@ data Operand |
816
|
815
|
OpAddr AddrMode
|
817
|
816
|
deriving (Eq, Show)
|
818
|
817
|
|
819
|
|
--- TODO: This just wraps a constructor... Inline?
|
820
|
|
-operandFromReg :: Format -> Reg -> Operand
|
821
|
|
-operandFromReg = OpReg
|
822
|
|
-
|
823
|
818
|
operandFromRegNo :: Format -> RegNo -> Operand
|
824
|
|
-operandFromRegNo fmt = operandFromReg fmt . regSingle
|
|
819
|
+operandFromRegNo fmt = OpReg fmt . regSingle
|
825
|
820
|
|
826
|
821
|
zero, ra, sp, gp, tp, fp, tmp :: Operand
|
827
|
|
-zero = operandFromReg II64 zeroReg
|
828
|
|
-ra = operandFromReg II64 raReg
|
829
|
|
-sp = operandFromReg II64 spMachReg
|
|
822
|
+zero = OpReg II64 zeroReg
|
|
823
|
+ra = OpReg II64 raReg
|
|
824
|
+sp = OpReg II64 spMachReg
|
830
|
825
|
gp = operandFromRegNo II64 3
|
831
|
826
|
tp = operandFromRegNo II64 4
|
832
|
827
|
fp = operandFromRegNo II64 8
|
833
|
|
-tmp = operandFromReg II64 tmpReg
|
|
828
|
+tmp = OpReg II64 tmpReg
|
834
|
829
|
|
835
|
830
|
x0, x1, x2, x3, x4, x5, x6, x7 :: Operand
|
836
|
831
|
x8, x9, x10, x11, x12, x13, x14, x15 :: Operand
|
... |
... |
@@ -844,13 +839,9 @@ x4 = operandFromRegNo II64 4 |
844
|
839
|
x5 = operandFromRegNo II64 x5RegNo
|
845
|
840
|
x6 = operandFromRegNo II64 6
|
846
|
841
|
x7 = operandFromRegNo II64 x7RegNo
|
847
|
|
-
|
848
|
842
|
x8 = operandFromRegNo II64 8
|
849
|
|
-
|
850
|
843
|
x9 = operandFromRegNo II64 9
|
851
|
|
-
|
852
|
844
|
x10 = operandFromRegNo II64 x10RegNo
|
853
|
|
-
|
854
|
845
|
x11 = operandFromRegNo II64 11
|
855
|
846
|
x12 = operandFromRegNo II64 12
|
856
|
847
|
x13 = operandFromRegNo II64 13
|
... |
... |
@@ -885,53 +876,29 @@ d4 = operandFromRegNo FF64 36 |
885
|
876
|
d5 = operandFromRegNo FF64 37
|
886
|
877
|
d6 = operandFromRegNo FF64 38
|
887
|
878
|
d7 = operandFromRegNo FF64 d7RegNo
|
888
|
|
-
|
889
|
879
|
d8 = operandFromRegNo FF64 40
|
890
|
|
-
|
891
|
880
|
d9 = operandFromRegNo FF64 41
|
892
|
|
-
|
893
|
881
|
d10 = operandFromRegNo FF64 d10RegNo
|
894
|
|
-
|
895
|
882
|
d11 = operandFromRegNo FF64 43
|
896
|
|
-
|
897
|
883
|
d12 = operandFromRegNo FF64 44
|
898
|
|
-
|
899
|
884
|
d13 = operandFromRegNo FF64 45
|
900
|
|
-
|
901
|
885
|
d14 = operandFromRegNo FF64 46
|
902
|
|
-
|
903
|
886
|
d15 = operandFromRegNo FF64 47
|
904
|
|
-
|
905
|
887
|
d16 = operandFromRegNo FF64 48
|
906
|
|
-
|
907
|
888
|
d17 = operandFromRegNo FF64 d17RegNo
|
908
|
|
-
|
909
|
889
|
d18 = operandFromRegNo FF64 50
|
910
|
|
-
|
911
|
890
|
d19 = operandFromRegNo FF64 51
|
912
|
|
-
|
913
|
891
|
d20 = operandFromRegNo FF64 52
|
914
|
|
-
|
915
|
892
|
d21 = operandFromRegNo FF64 53
|
916
|
|
-
|
917
|
893
|
d22 = operandFromRegNo FF64 54
|
918
|
|
-
|
919
|
894
|
d23 = operandFromRegNo FF64 55
|
920
|
|
-
|
921
|
895
|
d24 = operandFromRegNo FF64 56
|
922
|
|
-
|
923
|
896
|
d25 = operandFromRegNo FF64 57
|
924
|
|
-
|
925
|
897
|
d26 = operandFromRegNo FF64 58
|
926
|
|
-
|
927
|
898
|
d27 = operandFromRegNo FF64 59
|
928
|
|
-
|
929
|
899
|
d28 = operandFromRegNo FF64 60
|
930
|
|
-
|
931
|
900
|
d29 = operandFromRegNo FF64 61
|
932
|
|
-
|
933
|
901
|
d30 = operandFromRegNo FF64 62
|
934
|
|
-
|
935
|
902
|
d31 = operandFromRegNo FF64 d31RegNo
|
936
|
903
|
|
937
|
904
|
fitsIn12bitImm :: (Num a, Ord a, Bits a) => a -> Bool
|