98bb637
commit c29bf984dd20431cd4344e8a5c444d7a5be08389
98bb637
Author: Colin Watson <cjwatson@debian.org>
98bb637
Date:   Mon Apr 21 22:26:56 2014 -0500
06bebb5
Bug: https://ghc.haskell.org/trac/ghc/ticket/7942
06bebb5
98bb637
    ghc: initial AArch64 patches
98bb637
    
98bb637
    Signed-off-by: Austin Seipp <austin@well-typed.com>
98bb637
98bb637
Index: ghc-7.8.3/aclocal.m4
06bebb5
===================================================================
98bb637
--- ghc-7.8.3.orig/aclocal.m4	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/aclocal.m4	2014-07-10 10:16:42.529187516 +0200
98bb637
@@ -197,6 +197,9 @@
06bebb5
             GET_ARM_ISA()
06bebb5
             test -z "[$]2" || eval "[$]2=\"ArchARM {armISA = \$ARM_ISA, armISAExt = \$ARM_ISA_EXT, armABI = \$ARM_ABI}\""
06bebb5
             ;;
98bb637
+        aarch64)
98bb637
+            test -z "[$]2" || eval "[$]2=ArchARM64"
98bb637
+            ;;
98bb637
         alpha)
98bb637
             test -z "[$]2" || eval "[$]2=ArchAlpha"
06bebb5
             ;;
98bb637
@@ -1862,6 +1865,9 @@
06bebb5
 # converts cpu from gnu to ghc naming, and assigns the result to $target_var
06bebb5
 AC_DEFUN([GHC_CONVERT_CPU],[
06bebb5
 case "$1" in
06bebb5
+  aarch64*)
06bebb5
+    $2="aarch64"
06bebb5
+    ;;
06bebb5
   alpha*)
06bebb5
     $2="alpha"
06bebb5
     ;;
98bb637
Index: ghc-7.8.3/compiler/nativeGen/AsmCodeGen.lhs
6066ff4
===================================================================
98bb637
--- ghc-7.8.3.orig/compiler/nativeGen/AsmCodeGen.lhs	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/compiler/nativeGen/AsmCodeGen.lhs	2014-07-10 10:16:42.529187516 +0200
98bb637
@@ -166,6 +166,7 @@
98bb637
       ArchPPC     -> nCG' (ppcNcgImpl    dflags)
98bb637
       ArchSPARC   -> nCG' (sparcNcgImpl  dflags)
98bb637
       ArchARM {}  -> panic "nativeCodeGen: No NCG for ARM"
98bb637
+      ArchARM64   -> panic "nativeCodeGen: No NCG for ARM64"
98bb637
       ArchPPC_64  -> panic "nativeCodeGen: No NCG for PPC 64"
98bb637
       ArchAlpha   -> panic "nativeCodeGen: No NCG for Alpha"
98bb637
       ArchMipseb  -> panic "nativeCodeGen: No NCG for mipseb"
98bb637
Index: ghc-7.8.3/compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs
98bb637
===================================================================
98bb637
--- ghc-7.8.3.orig/compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs	2014-07-10 10:16:42.529187516 +0200
98bb637
@@ -113,6 +113,7 @@
98bb637
                             ArchSPARC     -> 14
98bb637
                             ArchPPC_64    -> panic "trivColorable ArchPPC_64"
98bb637
                             ArchARM _ _ _ -> panic "trivColorable ArchARM"
98bb637
+                            ArchARM64     -> panic "trivColorable ArchARM64"
98bb637
                             ArchAlpha     -> panic "trivColorable ArchAlpha"
98bb637
                             ArchMipseb    -> panic "trivColorable ArchMipseb"
98bb637
                             ArchMipsel    -> panic "trivColorable ArchMipsel"
98bb637
@@ -137,6 +138,7 @@
98bb637
                             ArchSPARC     -> 22
98bb637
                             ArchPPC_64    -> panic "trivColorable ArchPPC_64"
98bb637
                             ArchARM _ _ _ -> panic "trivColorable ArchARM"
98bb637
+                            ArchARM64     -> panic "trivColorable ArchARM64"
98bb637
                             ArchAlpha     -> panic "trivColorable ArchAlpha"
98bb637
                             ArchMipseb    -> panic "trivColorable ArchMipseb"
98bb637
                             ArchMipsel    -> panic "trivColorable ArchMipsel"
98bb637
@@ -161,6 +163,7 @@
98bb637
                             ArchSPARC     -> 11
98bb637
                             ArchPPC_64    -> panic "trivColorable ArchPPC_64"
98bb637
                             ArchARM _ _ _ -> panic "trivColorable ArchARM"
98bb637
+                            ArchARM64     -> panic "trivColorable ArchARM64"
98bb637
                             ArchAlpha     -> panic "trivColorable ArchAlpha"
98bb637
                             ArchMipseb    -> panic "trivColorable ArchMipseb"
98bb637
                             ArchMipsel    -> panic "trivColorable ArchMipsel"
98bb637
@@ -185,6 +188,7 @@
98bb637
                             ArchSPARC     -> 0
98bb637
                             ArchPPC_64    -> panic "trivColorable ArchPPC_64"
98bb637
                             ArchARM _ _ _ -> panic "trivColorable ArchARM"
98bb637
+                            ArchARM64     -> panic "trivColorable ArchARM64"
98bb637
                             ArchAlpha     -> panic "trivColorable ArchAlpha"
98bb637
                             ArchMipseb    -> panic "trivColorable ArchMipseb"
98bb637
                             ArchMipsel    -> panic "trivColorable ArchMipsel"
98bb637
Index: ghc-7.8.3/compiler/nativeGen/RegAlloc/Linear/FreeRegs.hs
98bb637
===================================================================
98bb637
--- ghc-7.8.3.orig/compiler/nativeGen/RegAlloc/Linear/FreeRegs.hs	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/compiler/nativeGen/RegAlloc/Linear/FreeRegs.hs	2014-07-10 10:16:42.529187516 +0200
98bb637
@@ -74,6 +74,7 @@
98bb637
                 ArchPPC       -> PPC.Instr.maxSpillSlots dflags
98bb637
                 ArchSPARC     -> SPARC.Instr.maxSpillSlots dflags
98bb637
                 ArchARM _ _ _ -> panic "maxSpillSlots ArchARM"
98bb637
+                ArchARM64     -> panic "maxSpillSlots ArchARM64"
98bb637
                 ArchPPC_64    -> panic "maxSpillSlots ArchPPC_64"
98bb637
                 ArchAlpha     -> panic "maxSpillSlots ArchAlpha"
98bb637
                 ArchMipseb    -> panic "maxSpillSlots ArchMipseb"
37dd51b
Index: ghc-7.8.4/compiler/nativeGen/RegAlloc/Linear/Main.hs
98bb637
===================================================================
37dd51b
--- ghc-7.8.4/compiler/nativeGen/RegAlloc/Linear/Main.hs.orig	2015-02-07 18:19:27.364827776 +0100
37dd51b
+++ ghc-7.8.4/compiler/nativeGen/RegAlloc/Linear/Main.hs	2015-02-07 18:20:46.813771354 +0100
98bb637
@@ -207,6 +207,7 @@
37dd51b
       ArchSPARC     -> linearRegAlloc' dflags (frInitFreeRegs platform :: SPARC.FreeRegs)  entry_ids block_live sccs
37dd51b
       ArchPPC       -> linearRegAlloc' dflags (frInitFreeRegs platform :: PPC.FreeRegs)    entry_ids block_live sccs
98bb637
       ArchARM _ _ _ -> panic "linearRegAlloc ArchARM"
98bb637
+      ArchARM64     -> panic "linearRegAlloc ArchARM64"
98bb637
       ArchPPC_64    -> panic "linearRegAlloc ArchPPC_64"
98bb637
       ArchAlpha     -> panic "linearRegAlloc ArchAlpha"
98bb637
       ArchMipseb    -> panic "linearRegAlloc ArchMipseb"
98bb637
Index: ghc-7.8.3/compiler/nativeGen/TargetReg.hs
98bb637
===================================================================
98bb637
--- ghc-7.8.3.orig/compiler/nativeGen/TargetReg.hs	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/compiler/nativeGen/TargetReg.hs	2014-07-10 10:16:42.529187516 +0200
98bb637
@@ -54,6 +54,7 @@
98bb637
       ArchSPARC     -> SPARC.virtualRegSqueeze
98bb637
       ArchPPC_64    -> panic "targetVirtualRegSqueeze ArchPPC_64"
98bb637
       ArchARM _ _ _ -> panic "targetVirtualRegSqueeze ArchARM"
98bb637
+      ArchARM64     -> panic "targetVirtualRegSqueeze ArchARM64"
98bb637
       ArchAlpha     -> panic "targetVirtualRegSqueeze ArchAlpha"
98bb637
       ArchMipseb    -> panic "targetVirtualRegSqueeze ArchMipseb"
98bb637
       ArchMipsel    -> panic "targetVirtualRegSqueeze ArchMipsel"
98bb637
@@ -70,6 +71,7 @@
98bb637
       ArchSPARC     -> SPARC.realRegSqueeze
98bb637
       ArchPPC_64    -> panic "targetRealRegSqueeze ArchPPC_64"
98bb637
       ArchARM _ _ _ -> panic "targetRealRegSqueeze ArchARM"
98bb637
+      ArchARM64     -> panic "targetRealRegSqueeze ArchARM64"
98bb637
       ArchAlpha     -> panic "targetRealRegSqueeze ArchAlpha"
98bb637
       ArchMipseb    -> panic "targetRealRegSqueeze ArchMipseb"
98bb637
       ArchMipsel    -> panic "targetRealRegSqueeze ArchMipsel"
98bb637
@@ -85,6 +87,7 @@
98bb637
       ArchSPARC     -> SPARC.classOfRealReg
98bb637
       ArchPPC_64    -> panic "targetClassOfRealReg ArchPPC_64"
98bb637
       ArchARM _ _ _ -> panic "targetClassOfRealReg ArchARM"
98bb637
+      ArchARM64     -> panic "targetClassOfRealReg ArchARM64"
98bb637
       ArchAlpha     -> panic "targetClassOfRealReg ArchAlpha"
98bb637
       ArchMipseb    -> panic "targetClassOfRealReg ArchMipseb"
98bb637
       ArchMipsel    -> panic "targetClassOfRealReg ArchMipsel"
98bb637
@@ -100,6 +103,7 @@
98bb637
       ArchSPARC     -> SPARC.mkVirtualReg
98bb637
       ArchPPC_64    -> panic "targetMkVirtualReg ArchPPC_64"
98bb637
       ArchARM _ _ _ -> panic "targetMkVirtualReg ArchARM"
98bb637
+      ArchARM64     -> panic "targetMkVirtualReg ArchARM64"
98bb637
       ArchAlpha     -> panic "targetMkVirtualReg ArchAlpha"
98bb637
       ArchMipseb    -> panic "targetMkVirtualReg ArchMipseb"
98bb637
       ArchMipsel    -> panic "targetMkVirtualReg ArchMipsel"
98bb637
@@ -115,6 +119,7 @@
98bb637
       ArchSPARC     -> SPARC.regDotColor
98bb637
       ArchPPC_64    -> panic "targetRegDotColor ArchPPC_64"
98bb637
       ArchARM _ _ _ -> panic "targetRegDotColor ArchARM"
98bb637
+      ArchARM64     -> panic "targetRegDotColor ArchARM64"
98bb637
       ArchAlpha     -> panic "targetRegDotColor ArchAlpha"
98bb637
       ArchMipseb    -> panic "targetRegDotColor ArchMipseb"
98bb637
       ArchMipsel    -> panic "targetRegDotColor ArchMipsel"
98bb637
Index: ghc-7.8.3/compiler/utils/Platform.hs
98bb637
===================================================================
98bb637
--- ghc-7.8.3.orig/compiler/utils/Platform.hs	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/compiler/utils/Platform.hs	2014-07-10 10:16:42.529187516 +0200
98bb637
@@ -52,6 +52,7 @@
98bb637
           , armISAExt :: [ArmISAExt]
98bb637
           , armABI    :: ArmABI
98bb637
           }
98bb637
+        | ArchARM64
98bb637
         | ArchAlpha
98bb637
         | ArchMipseb
98bb637
         | ArchMipsel
98bb637
Index: ghc-7.8.3/includes/stg/HaskellMachRegs.h
98bb637
===================================================================
98bb637
--- ghc-7.8.3.orig/includes/stg/HaskellMachRegs.h	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/includes/stg/HaskellMachRegs.h	2014-07-10 10:16:42.533187516 +0200
98bb637
@@ -38,6 +38,7 @@
98bb637
 #define MACHREGS_powerpc  (powerpc_TARGET_ARCH || powerpc64_TARGET_ARCH || rs6000_TARGET_ARCH)
98bb637
 #define MACHREGS_sparc    sparc_TARGET_ARCH
98bb637
 #define MACHREGS_arm      arm_TARGET_ARCH
98bb637
+#define MACHREGS_aarch64  aarch64_TARGET_ARCH
98bb637
 #define MACHREGS_darwin   darwin_TARGET_OS
083d826
 
98bb637
 #endif
98bb637
Index: ghc-7.8.3/includes/stg/MachRegs.h
98bb637
===================================================================
98bb637
--- ghc-7.8.3.orig/includes/stg/MachRegs.h	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/includes/stg/MachRegs.h	2014-07-10 10:16:42.533187516 +0200
98bb637
@@ -1,6 +1,6 @@
98bb637
 /* -----------------------------------------------------------------------------
98bb637
  *
98bb637
- * (c) The GHC Team, 1998-2011
98bb637
+ * (c) The GHC Team, 1998-2014
98bb637
  *
98bb637
  * Registers used in STG code.  Might or might not correspond to
98bb637
  * actual machine registers.
98bb637
@@ -531,6 +531,61 @@
98bb637
 #define REG_D2    d11
98bb637
 #endif
083d826
 
06bebb5
+/* -----------------------------------------------------------------------------
06bebb5
+   The ARMv8/AArch64 ABI register mapping
06bebb5
+
06bebb5
+   The AArch64 provides 31 64-bit general purpose registers
06bebb5
+   and 32 128-bit SIMD/floating point registers.
06bebb5
+
06bebb5
+   General purpose registers (see Chapter 5.1.1 in ARM IHI 0055B)
06bebb5
+
06bebb5
+   Register | Special | Role in the procedure call standard
06bebb5
+   ---------+---------+------------------------------------
06bebb5
+     SP     |         | The Stack Pointer
06bebb5
+     r30    |  LR     | The Link Register
06bebb5
+     r29    |  FP     | The Frame Pointer
06bebb5
+   r19-r28  |         | Callee-saved registers
06bebb5
+     r18    |         | The Platform Register, if needed; 
06bebb5
+            |         | or temporary register
06bebb5
+     r17    |  IP1    | The second intra-procedure-call temporary register
06bebb5
+     r16    |  IP0    | The first intra-procedure-call scratch register
06bebb5
+    r9-r15  |         | Temporary registers
06bebb5
+     r8     |         | Indirect result location register
06bebb5
+    r0-r7   |         | Parameter/result registers
06bebb5
+
06bebb5
+
06bebb5
+   FPU/SIMD registers
06bebb5
+
06bebb5
+   s/d/q/v0-v7    Argument / result/ scratch registers
06bebb5
+   s/d/q/v8-v15   callee-saved registers (must be preserved across subrutine calls,
06bebb5
+                  but only bottom 64-bit value needs to be preserved)
06bebb5
+   s/d/q/v16-v31  temporary registers
06bebb5
+
06bebb5
+   ----------------------------------------------------------------------------- */
06bebb5
+
98bb637
+#elif MACHREGS_aarch64
06bebb5
+
06bebb5
+#define REG(x) __asm__(#x)
06bebb5
+
06bebb5
+#define REG_Base        r19
06bebb5
+#define REG_Sp          r20
06bebb5
+#define REG_Hp          r21
06bebb5
+#define REG_R1          r22
06bebb5
+#define REG_R2          r23
06bebb5
+#define REG_R3          r24
06bebb5
+#define REG_R4          r25
06bebb5
+#define REG_R5          r26
06bebb5
+#define REG_R6          r27
06bebb5
+#define REG_SpLim       r28
06bebb5
+
06bebb5
+#define REG_F1          s8
06bebb5
+#define REG_F2          s9
06bebb5
+#define REG_F3          s10
06bebb5
+#define REG_F4          s11
06bebb5
+
06bebb5
+#define REG_D1          d12
06bebb5
+#define REG_D2          d13
06bebb5
+
98bb637
 #else
06bebb5
 
98bb637
 #error Cannot find platform to give register info for
98bb637
Index: ghc-7.8.3/rts/StgCRun.c
06bebb5
===================================================================
98bb637
--- ghc-7.8.3.orig/rts/StgCRun.c	2014-07-10 10:16:42.533187516 +0200
98bb637
+++ ghc-7.8.3/rts/StgCRun.c	2014-07-10 10:16:42.533187516 +0200
98bb637
@@ -748,4 +748,70 @@
06bebb5
 }
06bebb5
 #endif
06bebb5
 
06bebb5
+#ifdef aarch64_HOST_ARCH
06bebb5
+
06bebb5
+StgRegTable *
06bebb5
+StgRun(StgFunPtr f, StgRegTable *basereg) {
06bebb5
+    StgRegTable * r;
06bebb5
+    __asm__ volatile (
06bebb5
+        /*
06bebb5
+         * save callee-saves registers on behalf of the STG code.
06bebb5
+         */
06bebb5
+        "stp x19, x20, [sp, #-16]!\n\t"
06bebb5
+        "stp x21, x22, [sp, #-16]!\n\t"
06bebb5
+        "stp x23, x24, [sp, #-16]!\n\t"
06bebb5
+        "stp x25, x26, [sp, #-16]!\n\t"
06bebb5
+        "stp x27, x28, [sp, #-16]!\n\t" 
06bebb5
+        "stp ip0, ip1, [sp, #-16]!\n\t"
06bebb5
+        "str lr, [sp, #-8]!\n\t"
06bebb5
+
06bebb5
+        /*
06bebb5
+         * allocate some space for Stg machine's temporary storage.
06bebb5
+         * Note: RESERVER_C_STACK_BYTES has to be a round number here or
06bebb5
+         * the assembler can't assemble it.
06bebb5
+         */
06bebb5
+        "str lr, [sp, %3]"
06bebb5
+        /* "sub sp, sp, %3\n\t" */
06bebb5
+        /*
06bebb5
+         * Set BaseReg
06bebb5
+         */
06bebb5
+        "mov x19, %2\n\t"
06bebb5
+        /*
06bebb5
+         * Jump to function argument.
06bebb5
+         */
06bebb5
+        "bx %1\n\t"
06bebb5
+
06bebb5
+        ".globl " STG_RETURN "\n\t"
06bebb5
+        ".type " STG_RETURN ", %%function\n"
06bebb5
+        STG_RETURN ":\n\t"
06bebb5
+        /*
06bebb5
+         * Free the space we allocated
06bebb5
+         */
06bebb5
+        "ldr lr, [sp], %3\n\t"
06bebb5
+        /* "add sp, sp, %3\n\t" */
06bebb5
+        /*
06bebb5
+         * Return the new register table, taking it from Stg's R1 (ARM64's R22).
06bebb5
+         */
06bebb5
+        "mov %0, x22\n\t"
06bebb5
+        /*
06bebb5
+         * restore callee-saves registers.
06bebb5
+         */
06bebb5
+        "ldr lr, [sp], #8\n\t"
06bebb5
+        "ldp ip0, ip1, [sp], #16\n\t"
06bebb5
+        "ldp x27, x28, [sp], #16\n\t"
06bebb5
+        "ldp x25, x26, [sp], #16\n\t"
06bebb5
+        "ldp x23, x24, [sp], #16\n\t"
06bebb5
+        "ldp x21, x22, [sp], #16\n\t"
06bebb5
+        "ldp x19, x20, [sp], #16\n\t"
06bebb5
+
06bebb5
+      : "=r" (r)
06bebb5
+      : "r" (f), "r" (basereg), "i" (RESERVED_C_STACK_BYTES)
06bebb5
+        : "%x19", "%x20", "%x21", "%x22", "%x23", "%x24", "%x25", "%x26", "%x27", "%x28",
06bebb5
+          "%ip0", "%ip1", "%lr"
06bebb5
+    );
06bebb5
+    return r;
06bebb5
+}
06bebb5
+
06bebb5
+#endif
06bebb5
+
06bebb5
 #endif /* !USE_MINIINTERPRETER */