Commit 70d68b08 authored by sewardj's avatar sewardj
Browse files

[project @ 2002-02-06 11:13:47 by sewardj]

Clean up the AbsC -> AbsC translation of array operations.

* MachOps MO_ReadOSBI and MO_WriteOSBI, which previously did
  array indexing, are gone.  We translate now just to plain
  memory references and explicit address computations.  This
  has the happy side effect that all MachOps now return exactly
  one result (previously it was 0 or 1), cleaning up various
  bits of code.

  As a result the Abstract C structure now contains an unneccessary
  restriction, which is that the result of a MachOp can only be
  assigned to a temporary.  This made sense when MachOps had variable
  numbers of results (0, 1 or 2, originally), but is no longer needed.
  MachOps applied to args could now be allowed to appear as
  arbitrary nodes in expression trees, but so far they are not.

* Get rid of CAddrMode constructor CMem, since it is a special case of
  CVal with a RegRelative of CIndex.

AbstractC is inconsistent and non-orthogonal.  The StixStmt + StixExpr
combination expresses a large part of what AbstractC does in a cleaner
and simpler way, IMO.
parent 49fe2112
%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
% $Id: AbsCSyn.lhs,v 1.44 2002/01/02 12:32:19 simonmar Exp $
% $Id: AbsCSyn.lhs,v 1.45 2002/02/06 11:13:47 sewardj Exp $
%
\section[AbstractC]{Abstract C: the last stop before machine code}
......@@ -122,7 +122,7 @@ stored in a mixed type location.)
-- NEW CASES FOR EXPANDED PRIMOPS
| CMachOpStmt -- Machine-level operation
(Maybe CAddrMode) -- 0 or 1 results
CAddrMode -- result
MachOp
[CAddrMode] -- Arguments
(Maybe [MagicId]) -- list of regs which need to be preserved
......@@ -338,6 +338,10 @@ data CAddrMode
-- which gives the magic location itself
-- (NB: superceded by CReg)
-- JRS 2002-02-05: CAddr is really scummy and should be fixed.
-- The effect is that the semantics of CAddr depend on what the
-- contained RegRelative is; it is decidely non-orthogonal.
| CReg MagicId -- To replace (CAddr MagicId 0)
| CTemp !Unique !PrimRep -- Temporary locations
......@@ -370,9 +374,6 @@ data CAddrMode
CExprMacro -- the macro to generate a value
[CAddrMode] -- and its arguments
| CMem PrimRep -- A value :: PrimRep, in memory, at the
CAddrMode -- specified address
| CBytesPerWord -- Word size, in bytes, on this platform
-- required for: half-word loads (used in fishing tags
-- out of info tables), and sizeofByteArray#.
......
This diff is collapsed.
......@@ -3,7 +3,7 @@ module MachOp ( MachOp(..), pprMachOp,
isDefinitelyInlineMachOp,
isCommutableMachOp,
isComparisonMachOp,
resultRepsOfMachOp
resultRepOfMachOp
)
where
......@@ -162,12 +162,6 @@ data MachOp
| MO_8U_to_32U -- zero extend
| MO_32U_to_8U -- mask out all but lowest byte
-- Reading/writing arrays
| MO_ReadOSBI Int PrimRep -- args: [base_ptr, index_value]
| MO_WriteOSBI Int PrimRep -- args: [base_ptr, index_value, value_to_write]
-- Read/write a value :: the PrimRep
-- at byte address
-- sizeof(machine_word)*Int + base_ptr + sizeof(PrimRep)*index_value
deriving Eq
......@@ -300,11 +294,6 @@ pprMachOp MO_32U_to_NatU = text "MO_32U_to_NatU"
pprMachOp MO_8U_to_32U = text "MO_8U_to_32U"
pprMachOp MO_32U_to_8U = text "MO_32U_to_8U"
pprMachOp (MO_ReadOSBI offset rep)
= text "MO_ReadOSBI" <> parens (int offset <> comma <> ppr rep)
pprMachOp (MO_WriteOSBI offset rep)
= text "MO_WriteOSBI" <> parens (int offset <> comma <> ppr rep)
-- Non-exported helper enumeration:
......@@ -338,137 +327,134 @@ isCommutableMachOp mop = comm `elem` snd (machOpProps mop)
isComparisonMachOp :: MachOp -> Bool
isComparisonMachOp mop = comp `elem` snd (machOpProps mop)
-- Find the PrimReps for the returned value(s) of the MachOp.
resultRepsOfMachOp :: MachOp -> Maybe PrimRep
resultRepsOfMachOp mop = fst (machOpProps mop)
-- Find the PrimRep for the returned value of the MachOp.
resultRepOfMachOp :: MachOp -> PrimRep
resultRepOfMachOp mop = fst (machOpProps mop)
-- This bit does the real work.
machOpProps :: MachOp -> (Maybe PrimRep, [MO_Prop])
machOpProps MO_Nat_Add = (Just IntRep, [inline, comm])
machOpProps MO_Nat_Sub = (Just IntRep, [inline])
machOpProps MO_Nat_Eq = (Just IntRep, [inline, comp, comm])
machOpProps MO_Nat_Ne = (Just IntRep, [inline, comp, comm])
machOpProps MO_NatS_Ge = (Just IntRep, [inline, comp])
machOpProps MO_NatS_Le = (Just IntRep, [inline, comp])
machOpProps MO_NatS_Gt = (Just IntRep, [inline, comp])
machOpProps MO_NatS_Lt = (Just IntRep, [inline, comp])
machOpProps MO_NatU_Ge = (Just IntRep, [inline, comp])
machOpProps MO_NatU_Le = (Just IntRep, [inline, comp])
machOpProps MO_NatU_Gt = (Just IntRep, [inline, comp])
machOpProps MO_NatU_Lt = (Just IntRep, [inline, comp])
machOpProps MO_NatS_Mul = (Just IntRep, [inline, comm])
machOpProps MO_NatS_MulMayOflo = (Just IntRep, [inline, comm])
machOpProps MO_NatS_Quot = (Just IntRep, [inline])
machOpProps MO_NatS_Rem = (Just IntRep, [inline])
machOpProps MO_NatS_Neg = (Just IntRep, [inline])
machOpProps MO_NatU_Mul = (Just WordRep, [inline, comm])
machOpProps MO_NatU_Quot = (Just WordRep, [inline])
machOpProps MO_NatU_Rem = (Just WordRep, [inline])
machOpProps MO_Nat_And = (Just IntRep, [inline, comm])
machOpProps MO_Nat_Or = (Just IntRep, [inline, comm])
machOpProps MO_Nat_Xor = (Just IntRep, [inline, comm])
machOpProps MO_Nat_Not = (Just IntRep, [inline])
machOpProps MO_Nat_Shl = (Just IntRep, [inline])
machOpProps MO_Nat_Shr = (Just IntRep, [inline])
machOpProps MO_Nat_Sar = (Just IntRep, [inline])
machOpProps MO_32U_Eq = (Just IntRep, [inline, comp, comm])
machOpProps MO_32U_Ne = (Just IntRep, [inline, comp, comm])
machOpProps MO_32U_Ge = (Just IntRep, [inline, comp])
machOpProps MO_32U_Le = (Just IntRep, [inline, comp])
machOpProps MO_32U_Gt = (Just IntRep, [inline, comp])
machOpProps MO_32U_Lt = (Just IntRep, [inline, comp])
machOpProps MO_Dbl_Eq = (Just IntRep, [inline, comp, comm])
machOpProps MO_Dbl_Ne = (Just IntRep, [inline, comp, comm])
machOpProps MO_Dbl_Ge = (Just IntRep, [inline, comp])
machOpProps MO_Dbl_Le = (Just IntRep, [inline, comp])
machOpProps MO_Dbl_Gt = (Just IntRep, [inline, comp])
machOpProps MO_Dbl_Lt = (Just IntRep, [inline, comp])
machOpProps MO_Dbl_Add = (Just DoubleRep, [inline, comm])
machOpProps MO_Dbl_Sub = (Just DoubleRep, [inline])
machOpProps MO_Dbl_Mul = (Just DoubleRep, [inline, comm])
machOpProps MO_Dbl_Div = (Just DoubleRep, [inline])
machOpProps MO_Dbl_Pwr = (Just DoubleRep, [])
machOpProps MO_Dbl_Sin = (Just DoubleRep, [])
machOpProps MO_Dbl_Cos = (Just DoubleRep, [])
machOpProps MO_Dbl_Tan = (Just DoubleRep, [])
machOpProps MO_Dbl_Sinh = (Just DoubleRep, [])
machOpProps MO_Dbl_Cosh = (Just DoubleRep, [])
machOpProps MO_Dbl_Tanh = (Just DoubleRep, [])
machOpProps MO_Dbl_Asin = (Just DoubleRep, [])
machOpProps MO_Dbl_Acos = (Just DoubleRep, [])
machOpProps MO_Dbl_Atan = (Just DoubleRep, [])
machOpProps MO_Dbl_Log = (Just DoubleRep, [])
machOpProps MO_Dbl_Exp = (Just DoubleRep, [])
machOpProps MO_Dbl_Sqrt = (Just DoubleRep, [])
machOpProps MO_Dbl_Neg = (Just DoubleRep, [inline])
machOpProps MO_Flt_Add = (Just FloatRep, [inline, comm])
machOpProps MO_Flt_Sub = (Just FloatRep, [inline])
machOpProps MO_Flt_Mul = (Just FloatRep, [inline, comm])
machOpProps MO_Flt_Div = (Just FloatRep, [inline])
machOpProps MO_Flt_Pwr = (Just FloatRep, [])
machOpProps MO_Flt_Eq = (Just IntRep, [inline, comp, comm])
machOpProps MO_Flt_Ne = (Just IntRep, [inline, comp, comm])
machOpProps MO_Flt_Ge = (Just IntRep, [inline, comp])
machOpProps MO_Flt_Le = (Just IntRep, [inline, comp])
machOpProps MO_Flt_Gt = (Just IntRep, [inline, comp])
machOpProps MO_Flt_Lt = (Just IntRep, [inline, comp])
machOpProps MO_Flt_Sin = (Just FloatRep, [])
machOpProps MO_Flt_Cos = (Just FloatRep, [])
machOpProps MO_Flt_Tan = (Just FloatRep, [])
machOpProps MO_Flt_Sinh = (Just FloatRep, [])
machOpProps MO_Flt_Cosh = (Just FloatRep, [])
machOpProps MO_Flt_Tanh = (Just FloatRep, [])
machOpProps MO_Flt_Asin = (Just FloatRep, [])
machOpProps MO_Flt_Acos = (Just FloatRep, [])
machOpProps MO_Flt_Atan = (Just FloatRep, [])
machOpProps MO_Flt_Log = (Just FloatRep, [])
machOpProps MO_Flt_Exp = (Just FloatRep, [])
machOpProps MO_Flt_Sqrt = (Just FloatRep, [])
machOpProps MO_Flt_Neg = (Just FloatRep, [inline])
machOpProps MO_32U_to_NatS = (Just IntRep, [inline])
machOpProps MO_NatS_to_32U = (Just Word32Rep, [inline])
machOpProps MO_NatS_to_Dbl = (Just DoubleRep, [inline])
machOpProps MO_Dbl_to_NatS = (Just IntRep, [inline])
machOpProps MO_NatS_to_Flt = (Just FloatRep, [inline])
machOpProps MO_Flt_to_NatS = (Just IntRep, [inline])
machOpProps MO_NatS_to_NatU = (Just WordRep, [inline])
machOpProps MO_NatU_to_NatS = (Just IntRep, [inline])
machOpProps MO_NatS_to_NatP = (Just PtrRep, [inline])
machOpProps MO_NatP_to_NatS = (Just IntRep, [inline])
machOpProps MO_NatU_to_NatP = (Just PtrRep, [inline])
machOpProps MO_NatP_to_NatU = (Just WordRep, [inline])
machOpProps MO_Dbl_to_Flt = (Just FloatRep, [inline])
machOpProps MO_Flt_to_Dbl = (Just DoubleRep, [inline])
machOpProps MO_8S_to_NatS = (Just IntRep, [inline])
machOpProps MO_16S_to_NatS = (Just IntRep, [inline])
machOpProps MO_32S_to_NatS = (Just IntRep, [inline])
machOpProps MO_8U_to_NatU = (Just WordRep, [inline])
machOpProps MO_16U_to_NatU = (Just WordRep, [inline])
machOpProps MO_32U_to_NatU = (Just WordRep, [inline])
machOpProps MO_8U_to_32U = (Just Word32Rep, [inline])
machOpProps MO_32U_to_8U = (Just Word8Rep, [inline])
machOpProps (MO_ReadOSBI offset rep) = (Just rep, [inline])
machOpProps (MO_WriteOSBI offset rep) = (Nothing, [inline])
machOpProps :: MachOp -> (PrimRep, [MO_Prop])
machOpProps MO_Nat_Add = (IntRep, [inline, comm])
machOpProps MO_Nat_Sub = (IntRep, [inline])
machOpProps MO_Nat_Eq = (IntRep, [inline, comp, comm])
machOpProps MO_Nat_Ne = (IntRep, [inline, comp, comm])
machOpProps MO_NatS_Ge = (IntRep, [inline, comp])
machOpProps MO_NatS_Le = (IntRep, [inline, comp])
machOpProps MO_NatS_Gt = (IntRep, [inline, comp])
machOpProps MO_NatS_Lt = (IntRep, [inline, comp])
machOpProps MO_NatU_Ge = (IntRep, [inline, comp])
machOpProps MO_NatU_Le = (IntRep, [inline, comp])
machOpProps MO_NatU_Gt = (IntRep, [inline, comp])
machOpProps MO_NatU_Lt = (IntRep, [inline, comp])
machOpProps MO_NatS_Mul = (IntRep, [inline, comm])
machOpProps MO_NatS_MulMayOflo = (IntRep, [inline, comm])
machOpProps MO_NatS_Quot = (IntRep, [inline])
machOpProps MO_NatS_Rem = (IntRep, [inline])
machOpProps MO_NatS_Neg = (IntRep, [inline])
machOpProps MO_NatU_Mul = (WordRep, [inline, comm])
machOpProps MO_NatU_Quot = (WordRep, [inline])
machOpProps MO_NatU_Rem = (WordRep, [inline])
machOpProps MO_Nat_And = (IntRep, [inline, comm])
machOpProps MO_Nat_Or = (IntRep, [inline, comm])
machOpProps MO_Nat_Xor = (IntRep, [inline, comm])
machOpProps MO_Nat_Not = (IntRep, [inline])
machOpProps MO_Nat_Shl = (IntRep, [inline])
machOpProps MO_Nat_Shr = (IntRep, [inline])
machOpProps MO_Nat_Sar = (IntRep, [inline])
machOpProps MO_32U_Eq = (IntRep, [inline, comp, comm])
machOpProps MO_32U_Ne = (IntRep, [inline, comp, comm])
machOpProps MO_32U_Ge = (IntRep, [inline, comp])
machOpProps MO_32U_Le = (IntRep, [inline, comp])
machOpProps MO_32U_Gt = (IntRep, [inline, comp])
machOpProps MO_32U_Lt = (IntRep, [inline, comp])
machOpProps MO_Dbl_Eq = (IntRep, [inline, comp, comm])
machOpProps MO_Dbl_Ne = (IntRep, [inline, comp, comm])
machOpProps MO_Dbl_Ge = (IntRep, [inline, comp])
machOpProps MO_Dbl_Le = (IntRep, [inline, comp])
machOpProps MO_Dbl_Gt = (IntRep, [inline, comp])
machOpProps MO_Dbl_Lt = (IntRep, [inline, comp])
machOpProps MO_Dbl_Add = (DoubleRep, [inline, comm])
machOpProps MO_Dbl_Sub = (DoubleRep, [inline])
machOpProps MO_Dbl_Mul = (DoubleRep, [inline, comm])
machOpProps MO_Dbl_Div = (DoubleRep, [inline])
machOpProps MO_Dbl_Pwr = (DoubleRep, [])
machOpProps MO_Dbl_Sin = (DoubleRep, [])
machOpProps MO_Dbl_Cos = (DoubleRep, [])
machOpProps MO_Dbl_Tan = (DoubleRep, [])
machOpProps MO_Dbl_Sinh = (DoubleRep, [])
machOpProps MO_Dbl_Cosh = (DoubleRep, [])
machOpProps MO_Dbl_Tanh = (DoubleRep, [])
machOpProps MO_Dbl_Asin = (DoubleRep, [])
machOpProps MO_Dbl_Acos = (DoubleRep, [])
machOpProps MO_Dbl_Atan = (DoubleRep, [])
machOpProps MO_Dbl_Log = (DoubleRep, [])
machOpProps MO_Dbl_Exp = (DoubleRep, [])
machOpProps MO_Dbl_Sqrt = (DoubleRep, [])
machOpProps MO_Dbl_Neg = (DoubleRep, [inline])
machOpProps MO_Flt_Add = (FloatRep, [inline, comm])
machOpProps MO_Flt_Sub = (FloatRep, [inline])
machOpProps MO_Flt_Mul = (FloatRep, [inline, comm])
machOpProps MO_Flt_Div = (FloatRep, [inline])
machOpProps MO_Flt_Pwr = (FloatRep, [])
machOpProps MO_Flt_Eq = (IntRep, [inline, comp, comm])
machOpProps MO_Flt_Ne = (IntRep, [inline, comp, comm])
machOpProps MO_Flt_Ge = (IntRep, [inline, comp])
machOpProps MO_Flt_Le = (IntRep, [inline, comp])
machOpProps MO_Flt_Gt = (IntRep, [inline, comp])
machOpProps MO_Flt_Lt = (IntRep, [inline, comp])
machOpProps MO_Flt_Sin = (FloatRep, [])
machOpProps MO_Flt_Cos = (FloatRep, [])
machOpProps MO_Flt_Tan = (FloatRep, [])
machOpProps MO_Flt_Sinh = (FloatRep, [])
machOpProps MO_Flt_Cosh = (FloatRep, [])
machOpProps MO_Flt_Tanh = (FloatRep, [])
machOpProps MO_Flt_Asin = (FloatRep, [])
machOpProps MO_Flt_Acos = (FloatRep, [])
machOpProps MO_Flt_Atan = (FloatRep, [])
machOpProps MO_Flt_Log = (FloatRep, [])
machOpProps MO_Flt_Exp = (FloatRep, [])
machOpProps MO_Flt_Sqrt = (FloatRep, [])
machOpProps MO_Flt_Neg = (FloatRep, [inline])
machOpProps MO_32U_to_NatS = (IntRep, [inline])
machOpProps MO_NatS_to_32U = (Word32Rep, [inline])
machOpProps MO_NatS_to_Dbl = (DoubleRep, [inline])
machOpProps MO_Dbl_to_NatS = (IntRep, [inline])
machOpProps MO_NatS_to_Flt = (FloatRep, [inline])
machOpProps MO_Flt_to_NatS = (IntRep, [inline])
machOpProps MO_NatS_to_NatU = (WordRep, [inline])
machOpProps MO_NatU_to_NatS = (IntRep, [inline])
machOpProps MO_NatS_to_NatP = (PtrRep, [inline])
machOpProps MO_NatP_to_NatS = (IntRep, [inline])
machOpProps MO_NatU_to_NatP = (PtrRep, [inline])
machOpProps MO_NatP_to_NatU = (WordRep, [inline])
machOpProps MO_Dbl_to_Flt = (FloatRep, [inline])
machOpProps MO_Flt_to_Dbl = (DoubleRep, [inline])
machOpProps MO_8S_to_NatS = (IntRep, [inline])
machOpProps MO_16S_to_NatS = (IntRep, [inline])
machOpProps MO_32S_to_NatS = (IntRep, [inline])
machOpProps MO_8U_to_NatU = (WordRep, [inline])
machOpProps MO_16U_to_NatU = (WordRep, [inline])
machOpProps MO_32U_to_NatU = (WordRep, [inline])
machOpProps MO_8U_to_32U = (Word32Rep, [inline])
machOpProps MO_32U_to_8U = (Word8Rep, [inline])
......@@ -253,32 +253,7 @@ pprAbsC stmt@(COpStmt results (StgPrimOp op) args vol_regs) _
-- NEW CASES FOR EXPANDED PRIMOPS
-- We have to deal with some of these specially
pprAbsC (CMachOpStmt (Just res) (MO_ReadOSBI offw scaleRep)
[baseAmode, indexAmode] maybe_vols)
_
| isNothing maybe_vols
= hcat [ -- text " /* ReadOSBI */ ",
ppr_amode res, equals,
ppr_array_expression offw scaleRep baseAmode indexAmode,
semi ]
| otherwise
= panic "pprAbsC:MO_ReadOSBI -- out-of-line array indexing ?!?!"
pprAbsC (CMachOpStmt Nothing (MO_WriteOSBI offw scaleRep)
[baseAmode, indexAmode, vAmode] maybe_vols)
_
| isNothing maybe_vols
= hcat [ -- text " /* WriteOSBI */ ",
ppr_array_expression offw scaleRep baseAmode indexAmode,
equals, pprAmode vAmode,
semi ]
| otherwise
= panic "pprAbsC:MO_WriteOSBI -- out-of-line array indexing ?!?!"
-- The rest generically.
pprAbsC stmt@(CMachOpStmt (Just res) mop [arg1,arg2] maybe_vols) _
pprAbsC stmt@(CMachOpStmt res mop [arg1,arg2] maybe_vols) _
= let prefix_fn = mop `elem` [MO_Dbl_Pwr, MO_Flt_Pwr, MO_NatS_MulMayOflo]
in
case ppr_maybe_vol_regs maybe_vols of {(saves,restores) ->
......@@ -293,7 +268,7 @@ pprAbsC stmt@(CMachOpStmt (Just res) mop [arg1,arg2] maybe_vols) _
$$ restores
}
pprAbsC stmt@(CMachOpStmt (Just res) mop [arg1] maybe_vols) _
pprAbsC stmt@(CMachOpStmt res mop [arg1] maybe_vols) _
= case ppr_maybe_vol_regs maybe_vols of {(saves,restores) ->
saves $$
hcat [ppr_amode res, equals,
......@@ -754,24 +729,6 @@ pprMachOp_for_C MO_32U_to_NatU = text "(StgWord32)(StgWord)"
pprMachOp_for_C MO_8U_to_32U = text "(StgWord32)"
pprMachOp_for_C MO_32U_to_8U = text "(StgWord8)"
pprMachOp_for_C (MO_ReadOSBI _ _) = panic "pprMachOp_for_C:MO_ReadOSBI"
pprMachOp_for_C (MO_WriteOSBI _ _) = panic "pprMachOp_for_C:MO_WriteOSBI"
-- Helper for printing array expressions.
ppr_array_expression offw scaleRep baseAmode indexAmode
-- create:
-- * (scaleRep*) (
-- ((char*)baseAmode) + offw*bytes_per_word + indexAmode*bytes_per_scaleRep
-- )
= let offb = parens (int offw <> char '*' <> text "sizeof(void*)")
indb = parens (parens (pprAmode indexAmode)
<> char '*' <> int (getPrimRepArrayElemSize scaleRep))
baseb = text "(char*)" <> parens (pprAmode baseAmode)
addr = parens baseb <+> char '+' <+> offb <+> char '+' <+> indb
in
char '*' <> parens (ppr scaleRep <> char '*') <> parens addr
ppLocalness lbl
= if (externallyVisibleCLabel lbl)
......@@ -1178,15 +1135,15 @@ Special treatment for floats and doubles, to avoid unwanted conversions.
\begin{code}
pprAssign FloatRep dest@(CVal reg_rel _) src
= hcat [ ptext SLIT("ASSIGN_FLT"),char '(', ppr_amode (CAddr reg_rel), comma, pprAmode src, pp_paren_semi ]
= hcat [ ptext SLIT("ASSIGN_FLT((W_*)"), parens (ppr_amode (CAddr reg_rel)), comma, pprAmode src, pp_paren_semi ]
pprAssign DoubleRep dest@(CVal reg_rel _) src
= hcat [ ptext SLIT("ASSIGN_DBL"),char '(', ppr_amode (CAddr reg_rel), comma, pprAmode src, pp_paren_semi ]
= hcat [ ptext SLIT("ASSIGN_DBL((W_*)"), parens (ppr_amode (CAddr reg_rel)), comma, pprAmode src, pp_paren_semi ]
pprAssign Int64Rep dest@(CVal reg_rel _) src
= hcat [ ptext SLIT("ASSIGN_Int64"),char '(', ppr_amode (CAddr reg_rel), comma, pprAmode src, pp_paren_semi ]
= hcat [ ptext SLIT("ASSIGN_Int64((W_*)"), parens (ppr_amode (CAddr reg_rel)), comma, pprAmode src, pp_paren_semi ]
pprAssign Word64Rep dest@(CVal reg_rel _) src
= hcat [ ptext SLIT("ASSIGN_Word64"),char '(', ppr_amode (CAddr reg_rel), comma, pprAmode src, pp_paren_semi ]
= hcat [ ptext SLIT("ASSIGN_Word64((W_*)"), parens (ppr_amode (CAddr reg_rel)), comma, pprAmode src, pp_paren_semi ]
\end{code}
Lastly, the question is: will the C compiler think the types of the
......@@ -1255,13 +1212,13 @@ question.)
\begin{code}
pprAmode (CVal reg_rel FloatRep)
= hcat [ text "PK_FLT(", ppr_amode (CAddr reg_rel), rparen ]
= hcat [ text "PK_FLT((W_*)", parens (ppr_amode (CAddr reg_rel)), rparen ]
pprAmode (CVal reg_rel DoubleRep)
= hcat [ text "PK_DBL(", ppr_amode (CAddr reg_rel), rparen ]
= hcat [ text "PK_DBL((W_*)", parens (ppr_amode (CAddr reg_rel)), rparen ]
pprAmode (CVal reg_rel Int64Rep)
= hcat [ text "PK_Int64(", ppr_amode (CAddr reg_rel), rparen ]
= hcat [ text "PK_Int64((W_*)", parens (ppr_amode (CAddr reg_rel)), rparen ]
pprAmode (CVal reg_rel Word64Rep)
= hcat [ text "PK_Word64(", ppr_amode (CAddr reg_rel), rparen ]
= hcat [ text "PK_Word64((W_*)", parens (ppr_amode (CAddr reg_rel)), rparen ]
\end{code}
Next comes the case where there is some other cast need, and the
......@@ -1294,10 +1251,6 @@ amode has kind2.
ppr_amode CBytesPerWord
= text "(sizeof(void*))"
ppr_amode (CMem rep addr)
= let txt_rep = pprPrimKind rep
in hcat [ char '*', parens (txt_rep <> char '*'), parens (ppr_amode addr) ]
ppr_amode (CVal reg_rel@(CIndex _ _ _) kind)
= case (pprRegRelative False{-no sign wanted-} reg_rel) of
(pp_reg, Nothing) -> panic "ppr_amode: CIndex"
......@@ -1701,7 +1654,7 @@ ppr_decls_AbsC (CInitHdr cl_info reg_rel cost_centre _)
where
info_lbl = infoTableLabelFromCI cl_info
ppr_decls_AbsC (CMachOpStmt res _ args _) = ppr_decls_Amodes (maybeToList res ++ args)
ppr_decls_AbsC (CMachOpStmt res _ args _) = ppr_decls_Amodes (res : args)
ppr_decls_AbsC (COpStmt results _ args _) = ppr_decls_Amodes (results ++ args)
ppr_decls_AbsC (CSimultaneous abc) = ppr_decls_AbsC abc
......
......@@ -31,7 +31,7 @@ import ClosureInfo ( infoTableLabelFromCI, entryLabelFromCI,
import Literal ( Literal(..), word2IntLit )
import Maybes ( maybeToBool )
import StgSyn ( StgOp(..) )
import MachOp ( MachOp(..), resultRepsOfMachOp )
import MachOp ( MachOp(..), resultRepOfMachOp )
import PrimRep ( isFloatingRep, is64BitRep,
PrimRep(..), getPrimRepArrayElemSize )
import StixInfo ( genCodeInfoTable, genBitmapInfoTable,
......@@ -392,39 +392,10 @@ Now the PrimOps, some of which may need caller-saves register wrappers.
gencode (COpStmt results (StgPrimOp op) args vols)
= panic "AbsCStixGen.gencode: un-translated PrimOp"
-- Translate out array indexing primops right here, so that
-- individual targets don't have to deal with them
gencode (CMachOpStmt (Just r1) (MO_ReadOSBI off_w rep) [base,index] vols)
= returnUs (\xs ->
mkStAssign
rep
(a2stix r1)
(StInd rep (StMachOp MO_Nat_Add
[StIndex rep (a2stix base) (a2stix index),
StInt (toInteger (off_w * wORD_SIZE))]))
: xs
)
-- Ordinary MachOps are passed through unchanged.
gencode (CMachOpStmt Nothing (MO_WriteOSBI off_w rep) [base,index,val] vols)
= returnUs (\xs ->
StAssignMem
rep
(StMachOp MO_Nat_Add
[StIndex rep (a2stix base) (a2stix index),
StInt (toInteger (off_w * wORD_SIZE))])
(a2stix val)
: xs
)
gencode (CMachOpStmt (Just r1) mop args vols)
= case resultRepsOfMachOp mop of
Just rep
-> returnUs (\xs ->
mkStAssign rep (a2stix r1)
(StMachOp mop (map a2stix args))
: xs
gencode (CMachOpStmt res mop args vols)
= returnUs (\xs -> mkStAssign (resultRepOfMachOp mop) (a2stix res)
(StMachOp mop (map a2stix args))
: xs
)
\end{code}
......
......@@ -41,7 +41,7 @@ import AbsCUtils ( magicIdPrimRep )
import ForeignCall ( CCallConv )
import CLabel ( mkAsmTempLabel, CLabel, pprCLabel )
import PrimRep ( PrimRep(..) )
import MachOp ( MachOp(..), pprMachOp, resultRepsOfMachOp )
import MachOp ( MachOp(..), pprMachOp, resultRepOfMachOp )
import Unique ( Unique )
import SMRep ( fixedHdrSize, arrWordsHdrSize, arrPtrsHdrSize )
import UniqSupply ( UniqSupply, splitUniqSupply, uniqFromSupply,
......@@ -165,10 +165,7 @@ repOfStixExpr (StReg reg) = repOfStixReg reg
repOfStixExpr (StIndex _ _ _) = PtrRep
repOfStixExpr (StInd rep _) = rep
repOfStixExpr (StCall target conv retrep args) = retrep
repOfStixExpr (StMachOp mop args)
= case resultRepsOfMachOp mop of
Just rep -> rep
Nothing -> pprPanic "repOfStixExpr:StMachOp" (pprMachOp mop)
repOfStixExpr (StMachOp mop args) = resultRepOfMachOp mop
-- used by insnFuture in RegAllocInfo.lhs
......
......@@ -147,8 +147,6 @@ amodeToStix (CVal rr pk) = StInd pk (amodeToStix (CAddr rr))
amodeToStix CBytesPerWord
= StInt (toInteger wORD_SIZE)
amodeToStix (CMem pk addr) = StInd pk (amodeToStix addr)
amodeToStix (CAddr (SpRel off))
= StIndex PtrRep (StReg stgSp) (StInt (toInteger (iBox off)))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment