2 % (c) The AQUA Project, Glasgow University, 1996-1998
4 \section[AssembleInfo]{Machine-specific info used for assembly}
6 The (machine-independent) assembler itself is in @AsmAssemble@.
9 #include "nativeGen/NCG.h"
11 module AssembleInfo ( assembleInstr ) where
13 #include "HsVersions.h"
16 import CLabel ( CLabel )
18 import Foreign ( Word8, Ptr )
21 %************************************************************************
23 \subsection{@assembleInstr@; generate bytes for an insn}
25 %************************************************************************
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
39 assembleInstr :: Ptr Word8 -> Maybe (CLabel -> Ptr Word8) -> Instr -> [Word8]
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)"
48 #endif {- sparc_TARGET_ARCH -}
49 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
51 assembleInstr base_addr label_map instr = case instr of
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) []
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]
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) []
89 GLDZ dst -> mkRU [] [dst]
90 GLD1 dst -> mkRU [] [dst]
92 GFTOD src dst -> mkRU [src] [dst]
93 GFTOI src dst -> mkRU [src] [dst]
95 GDTOF src dst -> mkRU [src] [dst]
96 GDTOI src dst -> mkRU [src] [dst]
98 GITOF src dst -> mkRU [src] [dst]
99 GITOD src dst -> mkRU [src] [dst]
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]
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]
120 _ -> pprPanic "regUsage(x86)" empty
123 #endif {- i386_TARGET_ARCH -}
124 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -