Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
-
5ae43275
by Peng Fan at 2026-04-01T19:01:06-04:00
3 changed files:
- compiler/GHC/CmmToAsm/LA64/CodeGen.hs
- compiler/GHC/CmmToAsm/LA64/Instr.hs
- compiler/GHC/CmmToAsm/LA64/Ppr.hs
Changes:
| ... | ... | @@ -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
|
| ... | ... | @@ -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"
|
| ... | ... | @@ -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 ---------------------------------------------------
|