[project @ 2000-11-22 16:58:31 by sewardj]
[ghc-hetmet.git] / ghc / compiler / nativeGen / AssembleInfo.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1996-1998
3 %
4 \section[AssembleInfo]{Machine-specific info used for assembly}
5
6 The (machine-independent) assembler itself is in @AsmAssemble@.
7
8 \begin{code}
9 #include "nativeGen/NCG.h"
10
11 module AssembleInfo ( assembleInstr ) where
12
13 #include "HsVersions.h"
14
15 import MachMisc
16 import CLabel           ( CLabel )
17 import Outputable
18 import Foreign          ( Word8, Ptr )
19 \end{code}
20
21 %************************************************************************
22 %*                                                                      *
23 \subsection{@assembleInstr@; generate bytes for an insn}
24 %*                                                                      *
25 %************************************************************************
26
27 @assembleInstr@ returns the bytes (Word8's) for a given instruction.
28 It takes the address where the instruction is to be placed, and an
29 environment mapping C labels to addresses.  The latter two are needed
30 for calculating address offsets in call, jump, etc, instructions.
31 The mapping can be a Nothing, indicating that the caller doesn't care
32 what the resulting offsets are.  If that's so, @assembleInstr@ is 
33 being called as the first pass of 2-pass assembly.  For the final
34 pass, the correct mapping (and base address) must of course be
35 supplied.
36
37 \begin{code}
38
39 assembleInstr :: Ptr Word8 -> Maybe (CLabel -> Ptr Word8) -> Instr -> [Word8]
40
41 #if alpha_TARGET_ARCH
42 assembleInstr base_addr label_map instr
43    = panic "assembleInstr(Alpha)"
44 #endif {- alpha_TARGET_ARCH -}
45 assembleInstr base_addr label_map instr
46    = panic "assembleInstr(Alpha)"
47 #if sparc_TARGET_ARCH
48 #endif {- sparc_TARGET_ARCH -}
49 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
50 #if i386_TARGET_ARCH
51 assembleInstr base_addr label_map instr = case instr of
52     _ -> []
53
54 #if 0
55     MOV    sz src dst   -> usageRW src dst
56     MOVZxL sz src dst   -> usageRW src dst
57     MOVSxL sz src dst   -> usageRW src dst
58     LEA    sz src dst   -> usageRW src dst
59     ADD    sz src dst   -> usageRM src dst
60     SUB    sz src dst   -> usageRM src dst
61     IMUL   sz src dst   -> usageRM src dst
62     IQUOT  sz src dst   -> usageRM src dst
63     IREM   sz src dst   -> usageRM src dst
64     AND    sz src dst   -> usageRM src dst
65     OR     sz src dst   -> usageRM src dst
66     XOR    sz src dst   -> usageRM src dst
67     NOT    sz op        -> usageM op
68     NEGI   sz op        -> usageM op
69     SHL    sz imm dst   -> usageM dst
70     SAR    sz imm dst   -> usageM dst
71     SHR    sz imm dst   -> usageM dst
72     BT     sz imm src   -> mkRU (use_R src) []
73
74     PUSH   sz op        -> mkRU (use_R op) []
75     POP    sz op        -> mkRU [] (def_W op)
76     TEST   sz src dst   -> mkRU (use_R src ++ use_R dst) []
77     CMP    sz src dst   -> mkRU (use_R src ++ use_R dst) []
78     SETCC  cond op      -> mkRU [] (def_W op)
79     JXX    cond lbl     -> mkRU [] []
80     JMP    dsts op      -> mkRU (use_R op) []
81     CALL   imm          -> mkRU [] callClobberedRegs
82     CLTD                -> mkRU [eax] [edx]
83     NOP                 -> mkRU [] []
84
85     GMOV   src dst      -> mkRU [src] [dst]
86     GLD    sz src dst   -> mkRU (use_EA src) [dst]
87     GST    sz src dst   -> mkRU (src : use_EA dst) []
88
89     GLDZ   dst          -> mkRU [] [dst]
90     GLD1   dst          -> mkRU [] [dst]
91
92     GFTOD  src dst      -> mkRU [src] [dst]
93     GFTOI  src dst      -> mkRU [src] [dst]
94
95     GDTOF  src dst      -> mkRU [src] [dst]
96     GDTOI  src dst      -> mkRU [src] [dst]
97
98     GITOF  src dst      -> mkRU [src] [dst]
99     GITOD  src dst      -> mkRU [src] [dst]
100
101     GADD   sz s1 s2 dst -> mkRU [s1,s2] [dst]
102     GSUB   sz s1 s2 dst -> mkRU [s1,s2] [dst]
103     GMUL   sz s1 s2 dst -> mkRU [s1,s2] [dst]
104     GDIV   sz s1 s2 dst -> mkRU [s1,s2] [dst]
105
106     GCMP   sz src1 src2 -> mkRU [src1,src2] []
107     GABS   sz src dst   -> mkRU [src] [dst]
108     GNEG   sz src dst   -> mkRU [src] [dst]
109     GSQRT  sz src dst   -> mkRU [src] [dst]
110     GSIN   sz src dst   -> mkRU [src] [dst]
111     GCOS   sz src dst   -> mkRU [src] [dst]
112     GTAN   sz src dst   -> mkRU [src] [dst]
113
114     COMMENT _           -> noUsage
115     SEGMENT _           -> noUsage
116     LABEL   _           -> noUsage
117     ASCII   _ _         -> noUsage
118     DATA    _ _         -> noUsage
119     DELTA   _           -> noUsage
120     _                   -> pprPanic "regUsage(x86)" empty
121 #endif
122
123 #endif {- i386_TARGET_ARCH -}
124 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
125 \end{code}