3 #if !(MACHREGS_i386 || MACHREGS_x86_64 || MACHREGS_sparc || MACHREGS_powerpc
)
8 #include
"ghcautoconf.h"
9 #include
"stg/MachRegs.h"
11 #if MACHREGS_i386 || MACHREGS_x86_64
101 -- Note: these are only needed for ARM/ARM64 because globalRegMaybe is now used in CmmSink.hs.
102 -- Since it's only used to check 'isJust', the actual values don't matter, thus
103 -- I'm not sure if these are the correct numberings.
104 -- Normally, the register names are just stringified as part of the REG() macro
106 #elif MACHREGS_powerpc || MACHREGS_arm || MACHREGS_aarch64
141 -- See note above. These aren't actually used for anything except satisfying the compiler for globalRegMaybe
142 -- so I'm unsure if they're the correct numberings, should they ever be attempted to be used in the NCG.
143 #if MACHREGS_aarch64 || MACHREGS_arm
352 callerSaves
:: GlobalReg
-> Bool
353 #ifdef CALLER_SAVES_Base
354 callerSaves BaseReg
= True
356 #ifdef CALLER_SAVES_R1
357 callerSaves
(VanillaReg
1 _
) = True
359 #ifdef CALLER_SAVES_R2
360 callerSaves
(VanillaReg
2 _
) = True
362 #ifdef CALLER_SAVES_R3
363 callerSaves
(VanillaReg
3 _
) = True
365 #ifdef CALLER_SAVES_R4
366 callerSaves
(VanillaReg
4 _
) = True
368 #ifdef CALLER_SAVES_R5
369 callerSaves
(VanillaReg
5 _
) = True
371 #ifdef CALLER_SAVES_R6
372 callerSaves
(VanillaReg
6 _
) = True
374 #ifdef CALLER_SAVES_R7
375 callerSaves
(VanillaReg
7 _
) = True
377 #ifdef CALLER_SAVES_R8
378 callerSaves
(VanillaReg
8 _
) = True
380 #ifdef CALLER_SAVES_R9
381 callerSaves
(VanillaReg
9 _
) = True
383 #ifdef CALLER_SAVES_R10
384 callerSaves
(VanillaReg
10 _
) = True
386 #ifdef CALLER_SAVES_F1
387 callerSaves
(FloatReg
1) = True
389 #ifdef CALLER_SAVES_F2
390 callerSaves
(FloatReg
2) = True
392 #ifdef CALLER_SAVES_F3
393 callerSaves
(FloatReg
3) = True
395 #ifdef CALLER_SAVES_F4
396 callerSaves
(FloatReg
4) = True
398 #ifdef CALLER_SAVES_F5
399 callerSaves
(FloatReg
5) = True
401 #ifdef CALLER_SAVES_F6
402 callerSaves
(FloatReg
6) = True
404 #ifdef CALLER_SAVES_D1
405 callerSaves
(DoubleReg
1) = True
407 #ifdef CALLER_SAVES_D2
408 callerSaves
(DoubleReg
2) = True
410 #ifdef CALLER_SAVES_D3
411 callerSaves
(DoubleReg
3) = True
413 #ifdef CALLER_SAVES_D4
414 callerSaves
(DoubleReg
4) = True
416 #ifdef CALLER_SAVES_D5
417 callerSaves
(DoubleReg
5) = True
419 #ifdef CALLER_SAVES_D6
420 callerSaves
(DoubleReg
6) = True
422 #ifdef CALLER_SAVES_L1
423 callerSaves
(LongReg
1) = True
425 #ifdef CALLER_SAVES_Sp
426 callerSaves Sp
= True
428 #ifdef CALLER_SAVES_SpLim
429 callerSaves SpLim
= True
431 #ifdef CALLER_SAVES_Hp
432 callerSaves Hp
= True
434 #ifdef CALLER_SAVES_HpLim
435 callerSaves HpLim
= True
437 #ifdef CALLER_SAVES_CCCS
438 callerSaves CCCS
= True
440 #ifdef CALLER_SAVES_CurrentTSO
441 callerSaves CurrentTSO
= True
443 #ifdef CALLER_SAVES_CurrentNursery
444 callerSaves CurrentNursery
= True
446 callerSaves _
= False
448 activeStgRegs
:: [GlobalReg
]
487 ,VanillaReg
10 VGcPtr
492 #if MAX_REAL_XMM_REG
!= 0
583 #else /* MAX_REAL_XMM_REG
== 0 */
620 #endif
/* MAX_REAL_XMM_REG
== 0 */
630 -- | Returns 'Nothing' if this global register is not stored
631 -- in a real machine register, otherwise returns @'Just' reg@, where
632 -- reg is the machine register it is stored in.
633 globalRegMaybe
:: GlobalReg
-> Maybe RealReg
634 #if MACHREGS_i386 || MACHREGS_x86_64 || MACHREGS_sparc || MACHREGS_powerpc || MACHREGS_arm || MACHREGS_aarch64
636 globalRegMaybe BaseReg
= Just
(RealRegSingle REG_Base
)
639 globalRegMaybe
(VanillaReg
1 _
) = Just
(RealRegSingle REG_R1
)
642 globalRegMaybe
(VanillaReg
2 _
) = Just
(RealRegSingle REG_R2
)
645 globalRegMaybe
(VanillaReg
3 _
) = Just
(RealRegSingle REG_R3
)
648 globalRegMaybe
(VanillaReg
4 _
) = Just
(RealRegSingle REG_R4
)
651 globalRegMaybe
(VanillaReg
5 _
) = Just
(RealRegSingle REG_R5
)
654 globalRegMaybe
(VanillaReg
6 _
) = Just
(RealRegSingle REG_R6
)
657 globalRegMaybe
(VanillaReg
7 _
) = Just
(RealRegSingle REG_R7
)
660 globalRegMaybe
(VanillaReg
8 _
) = Just
(RealRegSingle REG_R8
)
663 globalRegMaybe
(VanillaReg
9 _
) = Just
(RealRegSingle REG_R9
)
666 globalRegMaybe
(VanillaReg
10 _
) = Just
(RealRegSingle REG_R10
)
669 globalRegMaybe
(FloatReg
1) = Just
(RealRegSingle REG_F1
)
672 globalRegMaybe
(FloatReg
2) = Just
(RealRegSingle REG_F2
)
675 globalRegMaybe
(FloatReg
3) = Just
(RealRegSingle REG_F3
)
678 globalRegMaybe
(FloatReg
4) = Just
(RealRegSingle REG_F4
)
681 globalRegMaybe
(FloatReg
5) = Just
(RealRegSingle REG_F5
)
684 globalRegMaybe
(FloatReg
6) = Just
(RealRegSingle REG_F6
)
687 globalRegMaybe
(DoubleReg
1) =
689 Just
(RealRegPair REG_D1
(REG_D1
+ 1))
691 Just
(RealRegSingle REG_D1
)
695 globalRegMaybe
(DoubleReg
2) =
697 Just
(RealRegPair REG_D2
(REG_D2
+ 1))
699 Just
(RealRegSingle REG_D2
)
703 globalRegMaybe
(DoubleReg
3) =
705 Just
(RealRegPair REG_D3
(REG_D3
+ 1))
707 Just
(RealRegSingle REG_D3
)
711 globalRegMaybe
(DoubleReg
4) =
713 Just
(RealRegPair REG_D4
(REG_D4
+ 1))
715 Just
(RealRegSingle REG_D4
)
719 globalRegMaybe
(DoubleReg
5) =
721 Just
(RealRegPair REG_D5
(REG_D5
+ 1))
723 Just
(RealRegSingle REG_D5
)
727 globalRegMaybe
(DoubleReg
6) =
729 Just
(RealRegPair REG_D6
(REG_D6
+ 1))
731 Just
(RealRegSingle REG_D6
)
734 # if MAX_REAL_XMM_REG
!= 0
736 globalRegMaybe
(XmmReg
1) = Just
(RealRegSingle REG_XMM1
)
739 globalRegMaybe
(XmmReg
2) = Just
(RealRegSingle REG_XMM2
)
742 globalRegMaybe
(XmmReg
3) = Just
(RealRegSingle REG_XMM3
)
745 globalRegMaybe
(XmmReg
4) = Just
(RealRegSingle REG_XMM4
)
748 globalRegMaybe
(XmmReg
5) = Just
(RealRegSingle REG_XMM5
)
751 globalRegMaybe
(XmmReg
6) = Just
(RealRegSingle REG_XMM6
)
754 # if MAX_REAL_YMM_REG
!= 0
756 globalRegMaybe
(YmmReg
1) = Just
(RealRegSingle REG_YMM1
)
759 globalRegMaybe
(YmmReg
2) = Just
(RealRegSingle REG_YMM2
)
762 globalRegMaybe
(YmmReg
3) = Just
(RealRegSingle REG_YMM3
)
765 globalRegMaybe
(YmmReg
4) = Just
(RealRegSingle REG_YMM4
)
768 globalRegMaybe
(YmmReg
5) = Just
(RealRegSingle REG_YMM5
)
771 globalRegMaybe
(YmmReg
6) = Just
(RealRegSingle REG_YMM6
)
774 # if MAX_REAL_ZMM_REG
!= 0
776 globalRegMaybe
(ZmmReg
1) = Just
(RealRegSingle REG_ZMM1
)
779 globalRegMaybe
(ZmmReg
2) = Just
(RealRegSingle REG_ZMM2
)
782 globalRegMaybe
(ZmmReg
3) = Just
(RealRegSingle REG_ZMM3
)
785 globalRegMaybe
(ZmmReg
4) = Just
(RealRegSingle REG_ZMM4
)
788 globalRegMaybe
(ZmmReg
5) = Just
(RealRegSingle REG_ZMM5
)
791 globalRegMaybe
(ZmmReg
6) = Just
(RealRegSingle REG_ZMM6
)
795 globalRegMaybe Sp
= Just
(RealRegSingle REG_Sp
)
798 globalRegMaybe
(LongReg
1) = Just
(RealRegSingle REG_Lng1
)
801 globalRegMaybe
(LongReg
2) = Just
(RealRegSingle REG_Lng2
)
804 globalRegMaybe SpLim
= Just
(RealRegSingle REG_SpLim
)
807 globalRegMaybe Hp
= Just
(RealRegSingle REG_Hp
)
810 globalRegMaybe HpLim
= Just
(RealRegSingle REG_HpLim
)
812 # ifdef REG_CurrentTSO
813 globalRegMaybe CurrentTSO
= Just
(RealRegSingle REG_CurrentTSO
)
815 # ifdef REG_CurrentNursery
816 globalRegMaybe CurrentNursery
= Just
(RealRegSingle REG_CurrentNursery
)
819 globalRegMaybe MachSp
= Just
(RealRegSingle REG_MachSp
)
821 globalRegMaybe _
= Nothing
822 #elif MACHREGS_NO_REGS
823 globalRegMaybe _
= Nothing
825 globalRegMaybe
= panic
"globalRegMaybe not defined for this platform"
828 freeReg
:: RegNo
-> Bool
830 #if MACHREGS_i386 || MACHREGS_x86_64
833 freeReg esp
= False -- %esp is the C stack pointer
834 freeReg esi
= False -- Note [esi/edi not allocatable]
838 freeReg rsp
= False -- %rsp is the C stack pointer
842 Note [esi/edi not allocatable]
844 %esi is mapped to R1, so %esi would normally be allocatable while it
845 is not being used for R1. However, %esi has no 8-bit version on x86,
846 and the linear register allocator is not sophisticated enough to
847 handle this irregularity (we need more RegClasses). The
848 graph-colouring allocator also cannot handle this - it was designed
849 with more flexibility in mind, but the current implementation is
850 restricted to the same set of classes as the linear allocator.
852 Hence, on x86 esi and edi are treated as not allocatable.
855 -- split patterns in two functions to prevent overlaps
856 freeReg r
= freeRegBase r
858 freeRegBase
:: RegNo
-> Bool
860 freeRegBase REG_Base
= False
863 freeRegBase REG_Sp
= False
866 freeRegBase REG_SpLim
= False
869 freeRegBase REG_Hp
= False
872 freeRegBase REG_HpLim
= False
874 -- All other regs are considered to be "free", because we can track
875 -- their liveness accurately.
878 #elif MACHREGS_powerpc
880 freeReg
0 = False -- Used by code setting the back chain pointer
881 -- in stack reallocations on Linux
882 -- r0 is not usable in all insns so also reserved
884 freeReg
1 = False -- The Stack Pointer
885 # if !MACHREGS_darwin
886 -- most non-darwin powerpc OSes use r2 as a TOC pointer or something like that
888 freeReg
13 = False -- reserved for system thread ID on 64 bit
889 -- at least linux in -fPIC relies on r30 in PLT stubs
891 {- TODO: reserve r13 on 64 bit systems only and r30 on 32 bit respectively.
892 For now we use r30 on 64 bit and r13 on 32 bit as a temporary register
893 in stack handling code. See compiler/nativeGen/PPC/Ppr.hs.
895 Later we might want to reserve r13 and r30 only where it is required.
896 Then use r12 as temporary register, which is also what the C ABI does.
901 freeReg REG_Base
= False
904 freeReg REG_R1
= False
907 freeReg REG_R2
= False
910 freeReg REG_R3
= False
913 freeReg REG_R4
= False
916 freeReg REG_R5
= False
919 freeReg REG_R6
= False
922 freeReg REG_R7
= False
925 freeReg REG_R8
= False
928 freeReg REG_R9
= False
931 freeReg REG_R10
= False
934 freeReg REG_F1
= False
937 freeReg REG_F2
= False
940 freeReg REG_F3
= False
943 freeReg REG_F4
= False
946 freeReg REG_F5
= False
949 freeReg REG_F6
= False
952 freeReg REG_D1
= False
955 freeReg REG_D2
= False
958 freeReg REG_D3
= False
961 freeReg REG_D4
= False
964 freeReg REG_D5
= False
967 freeReg REG_D6
= False
970 freeReg REG_Sp
= False
973 freeReg REG_Su
= False
976 freeReg REG_SpLim
= False
979 freeReg REG_Hp
= False
982 freeReg REG_HpLim
= False
988 -- SPARC regs used by the OS / ABI
989 -- %g0(r0) is always zero
993 -- are reserved for the OS
999 -- is the C stack pointer
1003 -- holds the C return address
1007 -- is the C frame pointer
1011 -- is used for C return addresses
1014 -- %f0(r32) - %f1(r32)
1015 -- are C floating point return regs
1021 -- don't release high half of double regs
1023 , regNo < NCG_FirstFloatReg
1024 , regNo `mod` 2 /= 0
1029 freeReg REG_Base
= False
1032 freeReg REG_R1
= False
1035 freeReg REG_R2
= False
1038 freeReg REG_R3
= False
1041 freeReg REG_R4
= False
1044 freeReg REG_R5
= False
1047 freeReg REG_R6
= False
1050 freeReg REG_R7
= False
1053 freeReg REG_R8
= False
1056 freeReg REG_R9
= False
1059 freeReg REG_R10
= False
1062 freeReg REG_F1
= False
1065 freeReg REG_F2
= False
1068 freeReg REG_F3
= False
1071 freeReg REG_F4
= False
1074 freeReg REG_F5
= False
1077 freeReg REG_F6
= False
1080 freeReg REG_D1
= False
1083 freeReg REG_D1_2
= False
1086 freeReg REG_D2
= False
1089 freeReg REG_D2_2
= False
1092 freeReg REG_D3
= False
1095 freeReg REG_D3_2
= False
1098 freeReg REG_D4
= False
1101 freeReg REG_D4_2
= False
1104 freeReg REG_D5
= False
1107 freeReg REG_D5_2
= False
1110 freeReg REG_D6
= False
1113 freeReg REG_D6_2
= False
1116 freeReg REG_Sp
= False
1119 freeReg REG_Su
= False
1122 freeReg REG_SpLim
= False
1125 freeReg REG_Hp
= False
1128 freeReg REG_HpLim
= False
1134 freeReg
= panic
"freeReg not defined for this platform"