diff options
author | Moritz Angermann <moritz.angermann@gmail.com> | 2020-10-22 12:08:34 +0800 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-06-05 10:29:57 -0400 |
commit | 3b1aa7dba7c006b473855a6b199b15fa3a3d77a0 (patch) | |
tree | 631816f4aef8d28ee596b51b70a0a0ba2df12230 /includes | |
parent | 8c90e6c758769b068aea2891b26cc17577b6d36a (diff) | |
download | haskell-3b1aa7dba7c006b473855a6b199b15fa3a3d77a0.tar.gz |
Adds AArch64 Native Code Generator
In which we add a new code generator to the Glasgow Haskell
Compiler. This codegen supports ELF and Mach-O targets, thus covering
Linux, macOS, and BSDs in principle. It was tested only on macOS and
Linux. The NCG follows a similar structure as the other native code
generators we already have, and should therfore be realtively easy to
follow.
It supports most of the features required for a proper native code
generator, but does not claim to be perfect or fully optimised. There
are still opportunities for optimisations.
Metric Decrease:
ManyAlternatives
ManyConstructors
MultiLayerModules
PmSeriesG
PmSeriesS
PmSeriesT
PmSeriesV
T10421
T10421a
T10858
T11195
T11276
T11303b
T11374
T11822
T12227
T12545
T12707
T13035
T13253
T13253-spj
T13379
T13701
T13719
T14683
T14697
T15164
T15630
T16577
T17096
T17516
T17836
T17836b
T17977
T17977b
T18140
T18282
T18304
T18478
T18698a
T18698b
T18923
T1969
T3064
T5030
T5321FD
T5321Fun
T5631
T5642
T5837
T783
T9198
T9233
T9630
T9872d
T9961
WWRec
Metric Increase:
T4801
Diffstat (limited to 'includes')
-rw-r--r-- | includes/CodeGen.Platform.hs | 95 | ||||
-rw-r--r-- | includes/rts/storage/GC.h | 1 | ||||
-rw-r--r-- | includes/stg/MachRegs.h | 2 |
3 files changed, 95 insertions, 3 deletions
diff --git a/includes/CodeGen.Platform.hs b/includes/CodeGen.Platform.hs index 8c942662e6..0dfac62a3f 100644 --- a/includes/CodeGen.Platform.hs +++ b/includes/CodeGen.Platform.hs @@ -1,7 +1,8 @@ import GHC.Cmm.Expr #if !(defined(MACHREGS_i386) || defined(MACHREGS_x86_64) \ - || defined(MACHREGS_sparc) || defined(MACHREGS_powerpc)) + || defined(MACHREGS_sparc) || defined(MACHREGS_powerpc) \ + || defined(MACHREGS_aarch64)) import GHC.Utils.Panic.Plain #endif import GHC.Platform.Reg @@ -1016,6 +1017,98 @@ freeReg REG_HpLim = False # endif freeReg _ = True +#elif defined(MACHREGS_aarch64) + +-- stack pointer / zero reg +freeReg 31 = False +-- link register +freeReg 30 = False +-- frame pointer +freeReg 29 = False +-- ip0 -- used for spill offset computations +freeReg 16 = False + +# if defined(REG_Base) +freeReg REG_Base = False +# endif +# if defined(REG_Sp) +freeReg REG_Sp = False +# endif +# if defined(REG_SpLim) +freeReg REG_SpLim = False +# endif +# if defined(REG_Hp) +freeReg REG_Hp = False +# endif +# if defined(REG_HpLim) +freeReg REG_HpLim = False +# endif + +# if defined(REG_R1) +freeReg REG_R1 = False +# endif +# if defined(REG_R2) +freeReg REG_R2 = False +# endif +# if defined(REG_R3) +freeReg REG_R3 = False +# endif +# if defined(REG_R4) +freeReg REG_R4 = False +# endif +# if defined(REG_R5) +freeReg REG_R5 = False +# endif +# if defined(REG_R6) +freeReg REG_R6 = False +# endif +# if defined(REG_R7) +freeReg REG_R7 = False +# endif +# if defined(REG_R8) +freeReg REG_R8 = False +# endif + +# if defined(REG_F1) +freeReg REG_F1 = False +# endif +# if defined(REG_F2) +freeReg REG_F2 = False +# endif +# if defined(REG_F3) +freeReg REG_F3 = False +# endif +# if defined(REG_F4) +freeReg REG_F4 = False +# endif +# if defined(REG_F5) +freeReg REG_F5 = False +# endif +# if defined(REG_F6) +freeReg REG_F6 = False +# endif + +# if defined(REG_D1) +freeReg REG_D1 = False +# endif +# if defined(REG_D2) +freeReg REG_D2 = False +# endif +# if defined(REG_D3) +freeReg REG_D3 = False +# endif +# if defined(REG_D4) +freeReg REG_D4 = False +# endif +# if defined(REG_D5) +freeReg REG_D5 = False +# endif +# if defined(REG_D6) +freeReg REG_D6 = False +# endif + +freeReg _ = True + #elif defined(MACHREGS_sparc) -- SPARC regs used by the OS / ABI diff --git a/includes/rts/storage/GC.h b/includes/rts/storage/GC.h index 12f0e32f0f..0258811728 100644 --- a/includes/rts/storage/GC.h +++ b/includes/rts/storage/GC.h @@ -208,7 +208,6 @@ void flushExec(W_ len, AdjustorExecutable exec_addr); #if defined(darwin_HOST_OS) AdjustorWritable execToWritable(AdjustorExecutable exec); #endif - #if RTS_LINKER_USE_MMAP AdjustorWritable allocateWrite(W_ bytes); void markExec(W_ bytes, AdjustorWritable writ); diff --git a/includes/stg/MachRegs.h b/includes/stg/MachRegs.h index 4b0991891e..d50969b66a 100644 --- a/includes/stg/MachRegs.h +++ b/includes/stg/MachRegs.h @@ -548,7 +548,7 @@ the stack. See Note [Overlapping global registers] for implications. r30 | LR | The Link Register r29 | FP | The Frame Pointer r19-r28 | | Callee-saved registers - r18 | | The Platform Register, if needed; + r18 | | The Platform Register, if needed; | | or temporary register r17 | IP1 | The second intra-procedure-call temporary register r16 | IP0 | The first intra-procedure-call scratch register |