Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC

Commits:

3 changed files:

Changes:

  • compiler/GHC/CmmToAsm/LA64/CodeGen.hs
    ... ... @@ -57,6 +57,12 @@ import Control.Monad
    57 57
     import GHC.Cmm.Dataflow.Label
    
    58 58
     import GHC.Types.Unique.DSM
    
    59 59
     import GHC.Types.Literal.Floating
    
    60
    +import GHC.Unit.Types ( ghcInternalUnitId )
    
    61
    +
    
    62
    +la664Enabled :: NatM Bool
    
    63
    +la664Enabled = do
    
    64
    +  config <- getConfig
    
    65
    +  return (ncgLa664Enabled config)
    
    60 66
     
    
    61 67
     -- [General layout of an NCG]
    
    62 68
     cmmTopCodeGen ::
    
    ... ... @@ -1651,6 +1657,10 @@ genPrim (MO_Prefetch_Data _n) [] [_] = return nilOL
    1651 1657
     genPrim (MO_AtomicRead w mo)  [dst]  [addr]         = genAtomicRead w mo dst addr
    
    1652 1658
     genPrim (MO_AtomicWrite w mo) []     [addr,val]     = genAtomicWrite w mo addr val
    
    1653 1659
     
    
    1660
    +genPrim (MO_AtomicRMW width amop)    [dst] [addr,n] = genLibCCall (atomicRMWLabel width amop) [dst] [addr,n]
    
    1661
    +genPrim (MO_Cmpxchg width)   [dst]   [addr,expe,new]  = genCmpxchg width dst addr expe new
    
    1662
    +genPrim (MO_Xchg width)      [dst]   [addr,value]     = genXchg width dst addr value
    
    1663
    +
    
    1654 1664
     genPrim mop@(MO_S_Mul2     _w) _         _          = unsupported mop
    
    1655 1665
     genPrim mop@(MO_S_QuotRem  _w) _         _          = unsupported mop
    
    1656 1666
     genPrim mop@(MO_U_QuotRem  _w) _         _          = unsupported mop
    
    ... ... @@ -1674,9 +1684,6 @@ genPrim (MO_PopCnt width) [dst] [src] = genLibCCall (popCntLabel w
    1674 1684
     genPrim (MO_Pdep width)      [dst]   [src,mask]     = genLibCCall (pdepLabel width) [dst] [src,mask]
    
    1675 1685
     genPrim (MO_Pext width)      [dst]   [src,mask]     = genLibCCall (pextLabel width) [dst] [src,mask]
    
    1676 1686
     genPrim (MO_UF_Conv width)   [dst]   [src]          = genLibCCall (word2FloatLabel width) [dst] [src]
    
    1677
    -genPrim (MO_AtomicRMW width amop)    [dst] [addr,n] = genLibCCall (atomicRMWLabel width amop) [dst] [addr,n]
    
    1678
    -genPrim (MO_Cmpxchg width)   [dst]   [addr,old,new] = genLibCCall (cmpxchgLabel width) [dst] [addr,old,new]
    
    1679
    -genPrim (MO_Xchg width)      [dst]   [addr,val]     = genLibCCall (xchgLabel width) [dst] [addr,val]
    
    1680 1687
     genPrim (MO_Memcpy _align)   []   [dst,src,n]       = genLibCCall (fsLit "memcpy")  [] [dst,src,n]
    
    1681 1688
     genPrim (MO_Memmove _align)  []   [dst,src,n]       = genLibCCall (fsLit "memmove") [] [dst,src,n]
    
    1682 1689
     genPrim (MO_Memcmp _align)   [rst]   [dst,src,n]    = genLibCCall (fsLit "memcmp")  [rst] [dst,src,n]
    
    ... ... @@ -1872,6 +1879,20 @@ genBitRev w dst src = do
    1872 1879
                  )
    
    1873 1880
         _ -> return ( code_x `snocOL` BITREV (OpReg w dst_reg) (OpReg w reg_x))
    
    1874 1881
     
    
    1882
    +genPrimCCall
    
    1883
    +  :: FastString
    
    1884
    +  -> [CmmFormal]
    
    1885
    +  -> [CmmActual]
    
    1886
    +  -> NatM InstrBlock
    
    1887
    +
    
    1888
    +genPrimCCall name dsts args = do
    
    1889
    +  config <- getConfig
    
    1890
    +  target <-
    
    1891
    +    cmmMakeDynamicReference config CallReference
    
    1892
    +      $ mkCmmCodeLabel ghcInternalUnitId name
    
    1893
    +  let cconv = ForeignConvention CCallConv [NoHint] [NoHint] CmmMayReturn
    
    1894
    +  genCCall target cconv dsts args
    
    1895
    +
    
    1875 1896
     -- Generate C call to the given function in libc
    
    1876 1897
     genLibCCall :: FastString -> [CmmFormal] -> [CmmActual] -> NatM InstrBlock
    
    1877 1898
     genLibCCall name dsts args = do
    
    ... ... @@ -1945,6 +1966,52 @@ genAtomicWrite w mo addr val = do
    1945 1966
                  )
    
    1946 1967
         _ ->  panic $ "Unexpected MemOrderAcquire on an AtomicWrite" ++ show mo
    
    1947 1968
     
    
    1969
    +genCmpxchg :: Width -> LocalReg -> CmmExpr -> CmmExpr -> CmmExpr -> NatM InstrBlock
    
    1970
    +genCmpxchg w dst addr expe new = do
    
    1971
    +  config <- getConfig
    
    1972
    +  let
    
    1973
    +    platform = ncgPlatform config
    
    1974
    +    format = intFormat w
    
    1975
    +
    
    1976
    +  la664Enabled >>= \case
    
    1977
    +
    
    1978
    +    True -> do
    
    1979
    +      (addr_reg, _, code_addr) <- getSomeReg addr
    
    1980
    +      (expe_reg, _, code_expe) <- getSomeReg expe
    
    1981
    +      (new_reg, _, code_new) <- getSomeReg new
    
    1982
    +      let dst_reg = getRegisterReg platform (CmmLocal dst)
    
    1983
    +      return $ code_addr `appOL` code_expe `appOL` code_new `appOL` toOL
    
    1984
    +        [
    
    1985
    +          -- Behave like the GCC builtin CAS operation
    
    1986
    +          AMCASDB format (OpReg w expe_reg) (OpReg w new_reg) (OpReg w addr_reg),
    
    1987
    +          MOV (OpReg w dst_reg) (OpReg w expe_reg)
    
    1988
    +        ]
    
    1989
    +
    
    1990
    +    False ->
    
    1991
    +      genPrimCCall (cmpxchgLabel w) [dst] [addr,expe,new]
    
    1992
    +
    
    1993
    +genXchg :: Width -> LocalReg -> CmmExpr -> CmmExpr -> NatM InstrBlock
    
    1994
    +genXchg w dst addr val = do
    
    1995
    +  config <- getConfig
    
    1996
    +  tmp <- getNewRegNat II64
    
    1997
    +  let
    
    1998
    +    platform = ncgPlatform config
    
    1999
    +    format = intFormat w
    
    2000
    +
    
    2001
    +  la664Enabled >>= \case
    
    2002
    +
    
    2003
    +    True -> do
    
    2004
    +      (addr_reg, _, code_addr) <- getSomeReg addr
    
    2005
    +      (val_reg, _, code_val) <- getSomeReg val
    
    2006
    +      let dst_reg = getRegisterReg platform (CmmLocal dst)
    
    2007
    +      return $ code_addr `appOL` code_val `appOL` toOL
    
    2008
    +        [
    
    2009
    +          AMSWAPDB format (OpReg w tmp) (OpReg w val_reg) (OpReg w addr_reg),
    
    2010
    +          MOV (OpReg W64 dst_reg) (OpReg W64 tmp)
    
    2011
    +        ]
    
    2012
    +    False ->
    
    2013
    +      genPrimCCall (xchgLabel w) [dst] [addr,val]
    
    2014
    +
    
    1948 2015
     -- -----------------------------------------------------------------------------
    
    1949 2016
     {-
    
    1950 2017
     Generating C calls
    
    ... ... @@ -1977,6 +2044,7 @@ member of a structure or union argument, or a vector/floating-point argument
    1977 2044
     wider than FRLEN may be passed in a GAR.
    
    1978 2045
     -}
    
    1979 2046
     
    
    2047
    +-- Generate C call to the given function in ghc-prim
    
    1980 2048
     genCCall
    
    1981 2049
       :: CmmExpr            -- address of func call
    
    1982 2050
       -> ForeignConvention  -- calling convention
    

  • compiler/GHC/CmmToAsm/LA64/Instr.hs
    ... ... @@ -150,10 +150,11 @@ regUsageOfInstr platform instr = case instr of
    150 150
       -- ranges, corresponding to 2 and 1 instruction implementations respectively.
    
    151 151
       --
    
    152 152
       -- BCOND1 is selected by default.
    
    153
    -  BCOND1 _ j d t           -> usage (regTarget t ++ regOp j ++ regOp d, [])
    
    154
    -  BCOND _ j d t            -> usage (regTarget t ++ regOp j ++ regOp d, [])
    
    155
    -  BEQZ j t                 -> usage (regTarget t ++ regOp j, [])
    
    156
    -  BNEZ j t                 -> usage (regTarget t ++ regOp j, [])
    
    153
    +  BCOND1 _ j d t        -> usage (regTarget t ++ regOp j ++ regOp d, [])
    
    154
    +  BCOND _ j d t         -> usage (regTarget t ++ regOp j ++ regOp d, [])
    
    155
    +  BEQZ1 o1 o2           -> usage (regOp o1 ++ regOp o2, [])
    
    156
    +  BEQZ j t              -> usage (regTarget t ++ regOp j, [])
    
    157
    +  BNEZ j t              -> usage (regTarget t ++ regOp j, [])
    
    157 158
       -- 5. Common Memory Access Instructions --------------------------------------
    
    158 159
       LD _ dst src             -> usage (regOp src, regOp dst)
    
    159 160
       LDU _ dst src            -> usage (regOp src, regOp dst)
    
    ... ... @@ -168,7 +169,17 @@ regUsageOfInstr platform instr = case instr of
    168 169
       -- LDCOND dst src1 src2     -> usage (regOp src1 ++ regOp src2, regOp dst)
    
    169 170
       -- STCOND dst src1 src2     -> usage (regOp src1 ++ regOp src2, regOp dst)
    
    170 171
       -- 7. Atomic Memory Access Instructions --------------------------------------
    
    172
    +  -- In LoongArch, if the AM* atomic memory access instruction has the same register number as rd and rj,
    
    173
    +  -- the execution will trigger an Instruction Non-defined Exception. Here should be avoided.
    
    171 174
       AMSWAPDB _ dst src1 src2 -> usage (regOp src1 ++ regOp src2, regOp dst)
    
    175
    +  AMADDDB  _ dst src1 src2 -> usage (regOp src1 ++ regOp src2, regOp dst)
    
    176
    +  AMANDDB  _ dst src1 src2 -> usage (regOp src1 ++ regOp src2, regOp dst)
    
    177
    +  AMORDB   _ dst src1 src2 -> usage (regOp src1 ++ regOp src2, regOp dst)
    
    178
    +  AMXORDB  _ dst src1 src2 -> usage (regOp src1 ++ regOp src2, regOp dst)
    
    179
    +  --AMCASDB  _ dst src1 src2 -> usage (regOp src1 ++ regOp src2, regOp src1 ++ regOp src2 ++ regOp dst)
    
    180
    +  AMCASDB  _ dst src1 src2 -> usage (regOp dst ++ regOp src1 ++ regOp src2, regOp dst)
    
    181
    +  LL  _ dst src1 _ -> usage (regOp src1, regOp dst)
    
    182
    +  SC  _ dst src1 _ -> usage (regOp src1, regOp dst)
    
    172 183
       -- 8. Barrier Instructions ---------------------------------------------------
    
    173 184
       DBAR _hint               -> usage ([], [])
    
    174 185
       IBAR _hint               -> usage ([], [])
    
    ... ... @@ -330,6 +341,7 @@ patchRegsOfInstr instr env = case instr of
    330 341
         TAIL36 r t     -> TAIL36 (patchOp r) (patchTarget t)
    
    331 342
         BCOND1 c j d t -> BCOND1 c (patchOp j) (patchOp d) (patchTarget t)
    
    332 343
         BCOND c j d t  -> BCOND c (patchOp j) (patchOp d) (patchTarget t)
    
    344
    +    BEQZ1 o1 o2    -> BEQZ1 (patchOp o1) (patchOp o2)
    
    333 345
         BEQZ j t       -> BEQZ (patchOp j) (patchTarget t)
    
    334 346
         BNEZ j t       -> BNEZ (patchOp j) (patchTarget t)
    
    335 347
         -- 5. Common Memory Access Instructions --------------------------------------
    
    ... ... @@ -348,6 +360,13 @@ patchRegsOfInstr instr env = case instr of
    348 360
         -- STCOND o1 o2 o3       -> STCOND  (patchOp o1)  (patchOp o2)  (patchOp o3)
    
    349 361
         -- 7. Atomic Memory Access Instructions --------------------------------------
    
    350 362
         AMSWAPDB f o1 o2 o3 -> AMSWAPDB f (patchOp o1) (patchOp o2) (patchOp o3)
    
    363
    +    AMADDDB f o1 o2 o3  -> AMADDDB f (patchOp o1) (patchOp o2) (patchOp o3)
    
    364
    +    AMANDDB f o1 o2 o3  -> AMANDDB f (patchOp o1) (patchOp o2) (patchOp o3)
    
    365
    +    AMORDB f o1 o2 o3   -> AMORDB f (patchOp o1) (patchOp o2) (patchOp o3)
    
    366
    +    AMXORDB f o1 o2 o3  -> AMXORDB f (patchOp o1) (patchOp o2) (patchOp o3)
    
    367
    +    AMCASDB f o1 o2 o3  -> AMCASDB f (patchOp o1) (patchOp o2) (patchOp o3)
    
    368
    +    LL f o1 o2 o3  -> LL f (patchOp o1) (patchOp o2) (patchOp o3)
    
    369
    +    SC f o1 o2 o3  -> SC f (patchOp o1) (patchOp o2) (patchOp o3)
    
    351 370
         -- 8. Barrier Instructions ---------------------------------------------------
    
    352 371
         DBAR o1             -> DBAR o1
    
    353 372
         IBAR o1             -> IBAR o1
    
    ... ... @@ -398,6 +417,7 @@ isJumpishInstr instr = case instr of
    398 417
       TAIL36 {} -> True
    
    399 418
       BCOND1 {} -> True
    
    400 419
       BCOND {} -> True
    
    420
    +  BEQZ1 {} -> True
    
    401 421
       BEQZ {} -> True
    
    402 422
       BNEZ {} -> True
    
    403 423
       _ -> False
    
    ... ... @@ -718,6 +738,7 @@ data Instr
    718 738
         | TAIL36 Operand Target
    
    719 739
         | BCOND1 Cond Operand Operand Target
    
    720 740
         | BCOND Cond Operand Operand Target
    
    741
    +    | BEQZ1 Operand Operand
    
    721 742
         | BEQZ Operand Target
    
    722 743
         | BNEZ Operand Target
    
    723 744
         -- 5. Common Memory Access Instructions --------------------------------------
    
    ... ... @@ -733,6 +754,13 @@ data Instr
    733 754
         -- 6. Bound Check Memory Access Instructions ---------------------------------
    
    734 755
         -- 7. Atomic Memory Access Instructions --------------------------------------
    
    735 756
         | AMSWAPDB Format Operand Operand Operand
    
    757
    +    | AMADDDB Format Operand Operand Operand
    
    758
    +    | AMANDDB Format Operand Operand Operand
    
    759
    +    | AMORDB Format Operand Operand Operand
    
    760
    +    | AMXORDB Format Operand Operand Operand
    
    761
    +    | AMCASDB Format Operand Operand Operand
    
    762
    +    | LL Format Operand Operand Operand
    
    763
    +    | SC Format Operand Operand Operand
    
    736 764
         -- 8. Barrier Instructions ---------------------------------------------------
    
    737 765
         | DBAR BarrierType
    
    738 766
         | IBAR BarrierType
    
    ... ... @@ -839,6 +867,7 @@ instrCon i =
    839 867
           TAIL36{} -> "TAIL36"
    
    840 868
           BCOND1{} -> "BCOND1"
    
    841 869
           BCOND{} -> "BCOND"
    
    870
    +      BEQZ1{} -> "BEQZ1"
    
    842 871
           BEQZ{} -> "BEQZ"
    
    843 872
           BNEZ{} -> "BNEZ"
    
    844 873
           LD{} -> "LD"
    
    ... ... @@ -851,6 +880,13 @@ instrCon i =
    851 880
           STPTR{} -> "STPTR"
    
    852 881
           PRELD{} -> "PRELD"
    
    853 882
           AMSWAPDB{} -> "AMSWAPDB"
    
    883
    +      AMADDDB{} -> "AMADDDB"
    
    884
    +      AMANDDB{} -> "AMANDDB"
    
    885
    +      AMORDB{} -> "AMORDB"
    
    886
    +      AMXORDB{} -> "AMXORDB"
    
    887
    +      AMCASDB{} -> "AMCASDB"
    
    888
    +      LL{} -> "LL"
    
    889
    +      SC{} -> "SC"
    
    854 890
           DBAR{} -> "DBAR"
    
    855 891
           IBAR{} -> "IBAR"
    
    856 892
           FCVT{} -> "FCVT"
    

  • compiler/GHC/CmmToAsm/LA64/Ppr.hs
    ... ... @@ -852,6 +852,7 @@ pprInstr platform instr = case instr of
    852 852
           line $ text "\tbgeu" <+> pprOp platform d <> comma <+> pprOp platform j <> comma <+> pprAsmLabel platform (mkLocalBlockLabel (getUnique bid))
    
    853 853
         UGT ->
    
    854 854
           line $ text "\tbltu" <+> pprOp platform d <> comma <+> pprOp platform j <> comma <+> pprAsmLabel platform (mkLocalBlockLabel (getUnique bid))
    
    855
    +
    
    855 856
         _ -> line $ text "\t" <> pprBcond c <+> pprOp platform j <> comma <+> pprOp platform d <> comma <+> pprAsmLabel platform (mkLocalBlockLabel (getUnique bid))
    
    856 857
     
    
    857 858
       BCOND1 _ _ _ (TLabel _) -> panic "LA64.ppr: BCOND1: No conditional branching to TLabel!"
    
    ... ... @@ -916,17 +917,18 @@ pprInstr platform instr = case instr of
    916 917
     
    
    917 918
       BCOND _ _ _ (TReg _) -> panic "LA64.ppr: BCOND: No conditional branching to registers!"
    
    918 919
     
    
    920
    +  BEQZ1 o1 o2 | isImmOp o2 -> op2 (text "\tbeqz") o1 o2
    
    919 921
       BEQZ j (TBlock bid) ->
    
    920 922
         line $ text "\tbeqz" <+> pprOp platform j <> comma <+> pprAsmLabel platform (mkLocalBlockLabel (getUnique bid))
    
    921 923
       BEQZ j (TLabel lbl) ->
    
    922 924
         line $ text "\tbeqz" <+> pprOp platform j <> comma <+> pprAsmLabel platform lbl
    
    923
    -  BEQZ _ (TReg _)     -> panic "LA64.ppr: BEQZ: No conditional branching to registers!"
    
    925
    +  BEQZ _ (TReg _) -> panic "LA64.ppr: BEQZ: No conditional branching to registers!"
    
    924 926
     
    
    925 927
       BNEZ j (TBlock bid) ->
    
    926 928
         line $ text "\tbnez" <+> pprOp platform j <> comma <+> pprAsmLabel platform (mkLocalBlockLabel (getUnique bid))
    
    927 929
       BNEZ j (TLabel lbl) ->
    
    928 930
         line $ text "\tbnez" <+> pprOp platform j <> comma <+> pprAsmLabel platform lbl
    
    929
    -  BNEZ _ (TReg _)     -> panic "LA64.ppr: BNEZ: No conditional branching to registers!"
    
    931
    +  BNEZ _ (TReg _) -> panic "LA64.ppr: BNEZ: No conditional branching to registers!"
    
    930 932
     
    
    931 933
       -- 5. Common Memory Access Instructions --------------------------------------
    
    932 934
         -- LD.{B[U]/H[U]/W[U]/D}, ST.{B/H/W/D}: AddrRegImm
    
    ... ... @@ -1020,8 +1022,29 @@ pprInstr platform instr = case instr of
    1020 1022
       AMSWAPDB II32 o1 o2 o3 -> op3 (text "\tamswap_db.w") o1 o2 o3
    
    1021 1023
       AMSWAPDB II64 o1 o2 o3 -> op3 (text "\tamswap_db.d") o1 o2 o3
    
    1022 1024
         -- AM.{SWAP/ADD}[_DB].{B/H}
    
    1025
    +  AMADDDB II8  o1 o2 o3 -> op3 (text "\tamadd_db.b") o1 o2 o3
    
    1026
    +  AMADDDB II16 o1 o2 o3 -> op3 (text "\tamadd_db.h") o1 o2 o3
    
    1027
    +  AMADDDB II32 o1 o2 o3 -> op3 (text "\tamadd_db.w") o1 o2 o3
    
    1028
    +  AMADDDB II64 o1 o2 o3 -> op3 (text "\tamadd_db.d") o1 o2 o3
    
    1029
    +
    
    1030
    +  AMANDDB II32 o1 o2 o3 -> op3 (text "\tamand_db.w") o1 o2 o3
    
    1031
    +  AMANDDB II64 o1 o2 o3 -> op3 (text "\tamand_db.d") o1 o2 o3
    
    1032
    +
    
    1033
    +  AMORDB II32 o1 o2 o3 -> op3 (text "\tamor_db.w") o1 o2 o3
    
    1034
    +  AMORDB II64 o1 o2 o3 -> op3 (text "\tamor_db.d") o1 o2 o3
    
    1035
    +
    
    1036
    +  AMXORDB II32 o1 o2 o3 -> op3 (text "\tamxor_db.w") o1 o2 o3
    
    1037
    +  AMXORDB II64 o1 o2 o3 -> op3 (text "\tamxor_db.d") o1 o2 o3
    
    1023 1038
         -- AMCAS[_DB].{B/H/W/D}
    
    1039
    +  AMCASDB II8  o1 o2 o3 -> op3 (text "\tamcas_db.b") o1 o2 o3
    
    1040
    +  AMCASDB II16 o1 o2 o3 -> op3 (text "\tamcas_db.h") o1 o2 o3
    
    1041
    +  AMCASDB II32 o1 o2 o3 -> op3 (text "\tamcas_db.w") o1 o2 o3
    
    1042
    +  AMCASDB II64 o1 o2 o3 -> op3 (text "\tamcas_db.d") o1 o2 o3
    
    1024 1043
         -- LL.{W/D}, SC.{W/D}
    
    1044
    +  LL II32 o1 o2 o3 -> op3 (text "\tll.w") o1 o2 o3
    
    1045
    +  SC II32 o1 o2 o3 -> op3 (text "\tsc.w") o1 o2 o3
    
    1046
    +  LL II64 o1 o2 o3 -> op3 (text "\tll.d") o1 o2 o3
    
    1047
    +  SC II64 o1 o2 o3 -> op3 (text "\tsc.d") o1 o2 o3
    
    1025 1048
         -- SC.Q
    
    1026 1049
         -- LL.ACQ.{W/D}, SC.REL.{W/D}
    
    1027 1050
       -- 8. Barrier Instructions ---------------------------------------------------