From f0ee8b7265e07c735539d47ea646ca0cf0634d05 Mon Sep 17 00:00:00 2001 From: sewardj <unknown> Date: Tue, 18 Jan 2000 15:59:53 +0000 Subject: [PATCH] [project @ 2000-01-18 15:59:53 by sewardj] genCCall for x86 assumed that all args were 4 bytes long :-(. Now works with doubles too. --- ghc/compiler/nativeGen/MachCode.lhs | 56 ++++++++++++----------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/ghc/compiler/nativeGen/MachCode.lhs b/ghc/compiler/nativeGen/MachCode.lhs index 17922ee4bd01..8bd1d231105d 100644 --- a/ghc/compiler/nativeGen/MachCode.lhs +++ b/ghc/compiler/nativeGen/MachCode.lhs @@ -2284,48 +2284,27 @@ genCCall fn cconv kind args genCCall fn cconv kind [StInt i] | fn == SLIT ("PerformGC_wrapper") - = let - call = [MOV L (OpImm (ImmInt (fromInteger i))) (OpReg eax), - CALL (ImmLit (ptext (if underscorePrefix then (SLIT ("_PerformGC_wrapper")) else (SLIT ("PerformGC_wrapper")))))] + = let call = [MOV L (OpImm (ImmInt (fromInteger i))) (OpReg eax), + CALL (ImmLit (ptext (if underscorePrefix + then (SLIT ("_PerformGC_wrapper")) + else (SLIT ("PerformGC_wrapper")))))] in returnInstrs call -{- OLD: - = getUniqLabelNCG `thenUs` \ lbl -> - let - call = [MOV L (OpImm (ImmInt (fromInteger i))) (OpReg eax), - MOV L (OpImm (ImmCLbl lbl)) - -- this is hardwired - (OpAddr (AddrBaseIndex (Just ebx) Nothing (ImmInt 104))), - JMP (OpImm (ImmLit (ptext (if underscorePrefix then (SLIT ("_PerformGC_wrapper")) else (SLIT ("PerformGC_wrapper")))))), - LABEL lbl] - in - returnInstrs call --} genCCall fn cconv kind args - = mapUs get_call_arg args `thenUs` \ argCode -> + = mapUs get_call_arg args `thenUs` \ sizes_and_argCodes -> let - nargs = length args + (sizes, argCode) = unzip sizes_and_argCodes + tot_arg_size = sum (map (\sz -> case sz of DF -> 8; _ -> 4) sizes) -{- OLD: Since there's no attempt at stealing %esp at the moment, - restoring %esp from MainRegTable.rCstkptr is not done. -- SOF 97/09 - (ditto for saving away old-esp in MainRegTable.Hp (!!) ) - code1 = asmParThen [asmSeq [ -- MOV L (OpReg esp) (OpAddr (AddrBaseIndex (Just ebx) Nothing (ImmInt 80))), - MOV L (OpAddr (AddrBaseIndex (Just ebx) Nothing (ImmInt 100))) (OpReg esp) - ] - ] --} code2 = asmParThen (map ($ asmVoid) (reverse argCode)) call = [CALL fn__2 , - -- pop args; all args word sized? - ADD L (OpImm (ImmInt (nargs * 4))) (OpReg esp) --, - - -- Don't restore %esp (see above) - -- MOV L (OpAddr (AddrBaseIndex (Just ebx) Nothing (ImmInt 80))) (OpReg esp) - ] + ADD L (OpImm (ImmInt tot_arg_size)) (OpReg esp) + ] in returnSeq (code2) call + where -- function names that begin with '.' are assumed to be special -- internally generated names like '.mul,' which don't get an @@ -2336,11 +2315,22 @@ genCCall fn cconv kind args _ -> ImmLab (ptext fn) ------------ - get_call_arg :: StixTree{-current argument-} -> UniqSM InstrBlock -- code + get_call_arg :: StixTree{-current argument-} + -> UniqSM (Size, InstrBlock) -- arg size, code get_call_arg arg = get_op arg `thenUs` \ (code, op, sz) -> - returnUs (code . mkSeqInstr (PUSH sz op)) + case sz of + DF -> returnUs (sz, + code . + mkSeqInstr (FLD L op) . + mkSeqInstr (SUB L (OpImm (ImmInt 8)) (OpReg esp)) . + mkSeqInstr (FSTP DF (OpAddr (AddrBaseIndex + (Just esp) + Nothing (ImmInt 0)))) + ) + _ -> returnUs (sz, + code . mkSeqInstr (PUSH sz op)) ------------ get_op -- GitLab