Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1599

ghc-ghc-devel-6.12.3-5.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>nativeGen/Alpha/RegInfo.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a>
<a name="line-2"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-3"></a><span class='hs-comment'>--</span>
<a name="line-4"></a><span class='hs-comment'>-- (c) The University of Glasgow 1996-2004</span>
<a name="line-5"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Alpha</span><span class='hs-varop'>.</span><span class='hs-conid'>RegInfo</span> <span class='hs-layout'>(</span>
<a name="line-9"></a><span class='hs-comment'>{-
<a name="line-10"></a>	RegUsage(..),
<a name="line-11"></a>	noUsage,
<a name="line-12"></a>	regUsage,
<a name="line-13"></a>	patchRegs,
<a name="line-14"></a>	jumpDests,
<a name="line-15"></a>	isJumpish,
<a name="line-16"></a>	patchJump,
<a name="line-17"></a>	isRegRegMove,
<a name="line-18"></a>
<a name="line-19"></a>        JumpDest, canShortcut, shortcutJump, shortcutStatic,
<a name="line-20"></a>
<a name="line-21"></a>	maxSpillSlots,
<a name="line-22"></a>	mkSpillInstr,
<a name="line-23"></a>	mkLoadInstr,
<a name="line-24"></a>	mkRegRegMoveInstr,
<a name="line-25"></a>	mkBranchInstr
<a name="line-26"></a>-}</span>
<a name="line-27"></a><span class='hs-layout'>)</span>
<a name="line-28"></a>
<a name="line-29"></a><span class='hs-keyword'>where</span>
<a name="line-30"></a>
<a name="line-31"></a><span class='hs-comment'>{-
<a name="line-32"></a>#include "nativeGen/NCG.h"
<a name="line-33"></a>#include "HsVersions.h"
<a name="line-34"></a>
<a name="line-35"></a>
<a name="line-36"></a>import BlockId
<a name="line-37"></a>import Cmm
<a name="line-38"></a>import CLabel
<a name="line-39"></a>import Instrs
<a name="line-40"></a>import Regs
<a name="line-41"></a>import Outputable
<a name="line-42"></a>import Constants	( rESERVED_C_STACK_BYTES )
<a name="line-43"></a>import FastBool
<a name="line-44"></a>
<a name="line-45"></a>data RegUsage = RU [Reg] [Reg]
<a name="line-46"></a>
<a name="line-47"></a>noUsage :: RegUsage
<a name="line-48"></a>noUsage  = RU [] []
<a name="line-49"></a>
<a name="line-50"></a>regUsage :: Instr -&gt; RegUsage
<a name="line-51"></a>
<a name="line-52"></a>regUsage instr = case instr of
<a name="line-53"></a>    SPILL  reg slot	-&gt; usage ([reg], [])
<a name="line-54"></a>    RELOAD slot reg	-&gt; usage ([], [reg])
<a name="line-55"></a>    LD B reg addr	-&gt; usage (regAddr addr, [reg, t9])
<a name="line-56"></a>    LD Bu reg addr	-&gt; usage (regAddr addr, [reg, t9])
<a name="line-57"></a>--  LD W reg addr	-&gt; usage (regAddr addr, [reg, t9]) : UNUSED
<a name="line-58"></a>--  LD Wu reg addr	-&gt; usage (regAddr addr, [reg, t9]) : UNUSED
<a name="line-59"></a>    LD sz reg addr	-&gt; usage (regAddr addr, [reg])
<a name="line-60"></a>    LDA reg addr	-&gt; usage (regAddr addr, [reg])
<a name="line-61"></a>    LDAH reg addr	-&gt; usage (regAddr addr, [reg])
<a name="line-62"></a>    LDGP reg addr	-&gt; usage (regAddr addr, [reg])
<a name="line-63"></a>    LDI sz reg imm	-&gt; usage ([], [reg])
<a name="line-64"></a>    ST B reg addr	-&gt; usage (reg : regAddr addr, [t9, t10])
<a name="line-65"></a>--  ST W reg addr	-&gt; usage (reg : regAddr addr, [t9, t10]) : UNUSED
<a name="line-66"></a>    ST sz reg addr	-&gt; usage (reg : regAddr addr, [])
<a name="line-67"></a>    CLR reg		-&gt; usage ([], [reg])
<a name="line-68"></a>    ABS sz ri reg	-&gt; usage (regRI ri, [reg])
<a name="line-69"></a>    NEG sz ov ri reg	-&gt; usage (regRI ri, [reg])
<a name="line-70"></a>    ADD sz ov r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-71"></a>    SADD sz sc r1 ar r2 -&gt; usage (r1 : regRI ar, [r2])
<a name="line-72"></a>    SUB sz ov r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-73"></a>    SSUB sz sc r1 ar r2 -&gt; usage (r1 : regRI ar, [r2])
<a name="line-74"></a>    MUL sz ov r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-75"></a>    DIV sz un r1 ar r2	-&gt; usage (r1 : regRI ar, [r2, t9, t10, t11, t12])
<a name="line-76"></a>    REM sz un r1 ar r2	-&gt; usage (r1 : regRI ar, [r2, t9, t10, t11, t12])
<a name="line-77"></a>    NOT ri reg		-&gt; usage (regRI ri, [reg])
<a name="line-78"></a>    AND r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-79"></a>    ANDNOT r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-80"></a>    OR r1 ar r2		-&gt; usage (r1 : regRI ar, [r2])
<a name="line-81"></a>    ORNOT r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-82"></a>    XOR r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-83"></a>    XORNOT r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-84"></a>    SLL r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-85"></a>    SRL r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-86"></a>    SRA r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-87"></a>    ZAP r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-88"></a>    ZAPNOT r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-89"></a>    CMP co r1 ar r2	-&gt; usage (r1 : regRI ar, [r2])
<a name="line-90"></a>    FCLR reg		-&gt; usage ([], [reg])
<a name="line-91"></a>    FABS r1 r2		-&gt; usage ([r1], [r2])
<a name="line-92"></a>    FNEG sz r1 r2	-&gt; usage ([r1], [r2])
<a name="line-93"></a>    FADD sz r1 r2 r3	-&gt; usage ([r1, r2], [r3])
<a name="line-94"></a>    FDIV sz r1 r2 r3	-&gt; usage ([r1, r2], [r3])
<a name="line-95"></a>    FMUL sz r1 r2 r3	-&gt; usage ([r1, r2], [r3])
<a name="line-96"></a>    FSUB sz r1 r2 r3	-&gt; usage ([r1, r2], [r3])
<a name="line-97"></a>    CVTxy sz1 sz2 r1 r2 -&gt; usage ([r1], [r2])
<a name="line-98"></a>    FCMP sz co r1 r2 r3 -&gt; usage ([r1, r2], [r3])
<a name="line-99"></a>    FMOV r1 r2		-&gt; usage ([r1], [r2])
<a name="line-100"></a>
<a name="line-101"></a>
<a name="line-102"></a>    -- We assume that all local jumps will be BI/BF/BR.	 JMP must be out-of-line.
<a name="line-103"></a>    BI cond reg lbl	-&gt; usage ([reg], [])
<a name="line-104"></a>    BF cond reg lbl	-&gt; usage ([reg], [])
<a name="line-105"></a>    JMP reg addr hint	-&gt; RU (mkRegSet (filter interesting (regAddr addr))) freeRegSet
<a name="line-106"></a>
<a name="line-107"></a>    BSR _ n		-&gt; RU (argRegSet n) callClobberedRegSet
<a name="line-108"></a>    JSR reg addr n	-&gt; RU (argRegSet n) callClobberedRegSet
<a name="line-109"></a>
<a name="line-110"></a>    _			-&gt; noUsage
<a name="line-111"></a>
<a name="line-112"></a>  where
<a name="line-113"></a>    usage (src, dst) = RU (mkRegSet (filter interesting src))
<a name="line-114"></a>			  (mkRegSet (filter interesting dst))
<a name="line-115"></a>
<a name="line-116"></a>    interesting (FixedReg _) = False
<a name="line-117"></a>    interesting _ = True
<a name="line-118"></a>
<a name="line-119"></a>    regAddr (AddrReg r1)      = [r1]
<a name="line-120"></a>    regAddr (AddrRegImm r1 _) = [r1]
<a name="line-121"></a>    regAddr (AddrImm _)	      = []
<a name="line-122"></a>
<a name="line-123"></a>    regRI (RIReg r) = [r]
<a name="line-124"></a>    regRI  _	= []
<a name="line-125"></a>
<a name="line-126"></a>
<a name="line-127"></a>patchRegs :: Instr -&gt; (Reg -&gt; Reg) -&gt; Instr
<a name="line-128"></a>patchRegs instr env = case instr of
<a name="line-129"></a>    SPILL  reg slot	-&gt; SPILL (env reg) slot
<a name="line-130"></a>    RELOAD slot reg	-&gt; RELOAD slot (env reg)
<a name="line-131"></a>    LD sz reg addr -&gt; LD sz (env reg) (fixAddr addr)
<a name="line-132"></a>    LDA reg addr -&gt; LDA (env reg) (fixAddr addr)
<a name="line-133"></a>    LDAH reg addr -&gt; LDAH (env reg) (fixAddr addr)
<a name="line-134"></a>    LDGP reg addr -&gt; LDGP (env reg) (fixAddr addr)
<a name="line-135"></a>    LDI sz reg imm -&gt; LDI sz (env reg) imm
<a name="line-136"></a>    ST sz reg addr -&gt; ST sz (env reg) (fixAddr addr)
<a name="line-137"></a>    CLR reg -&gt; CLR (env reg)
<a name="line-138"></a>    ABS sz ar reg -&gt; ABS sz (fixRI ar) (env reg)
<a name="line-139"></a>    NEG sz ov ar reg -&gt; NEG sz ov (fixRI ar) (env reg)
<a name="line-140"></a>    ADD sz ov r1 ar r2 -&gt; ADD sz ov (env r1) (fixRI ar) (env r2)
<a name="line-141"></a>    SADD sz sc r1 ar r2 -&gt; SADD sz sc (env r1) (fixRI ar) (env r2)
<a name="line-142"></a>    SUB sz ov r1 ar r2 -&gt; SUB sz ov (env r1) (fixRI ar) (env r2)
<a name="line-143"></a>    SSUB sz sc r1 ar r2 -&gt; SSUB sz sc (env r1) (fixRI ar) (env r2)
<a name="line-144"></a>    MUL sz ov r1 ar r2 -&gt; MUL sz ov (env r1) (fixRI ar) (env r2)
<a name="line-145"></a>    DIV sz un r1 ar r2 -&gt; DIV sz un (env r1) (fixRI ar) (env r2)
<a name="line-146"></a>    REM sz un r1 ar r2 -&gt; REM sz un (env r1) (fixRI ar) (env r2)
<a name="line-147"></a>    NOT ar reg -&gt; NOT (fixRI ar) (env reg)
<a name="line-148"></a>    AND r1 ar r2 -&gt; AND (env r1) (fixRI ar) (env r2)
<a name="line-149"></a>    ANDNOT r1 ar r2 -&gt; ANDNOT (env r1) (fixRI ar) (env r2)
<a name="line-150"></a>    OR r1 ar r2 -&gt; OR (env r1) (fixRI ar) (env r2)
<a name="line-151"></a>    ORNOT r1 ar r2 -&gt; ORNOT (env r1) (fixRI ar) (env r2)
<a name="line-152"></a>    XOR r1 ar r2 -&gt; XOR (env r1) (fixRI ar) (env r2)
<a name="line-153"></a>    XORNOT r1 ar r2 -&gt; XORNOT (env r1) (fixRI ar) (env r2)
<a name="line-154"></a>    SLL r1 ar r2 -&gt; SLL (env r1) (fixRI ar) (env r2)
<a name="line-155"></a>    SRL r1 ar r2 -&gt; SRL (env r1) (fixRI ar) (env r2)
<a name="line-156"></a>    SRA r1 ar r2 -&gt; SRA (env r1) (fixRI ar) (env r2)
<a name="line-157"></a>    ZAP r1 ar r2 -&gt; ZAP (env r1) (fixRI ar) (env r2)
<a name="line-158"></a>    ZAPNOT r1 ar r2 -&gt; ZAPNOT (env r1) (fixRI ar) (env r2)
<a name="line-159"></a>    CMP co r1 ar r2 -&gt; CMP co (env r1) (fixRI ar) (env r2)
<a name="line-160"></a>    FCLR reg -&gt; FCLR (env reg)
<a name="line-161"></a>    FABS r1 r2 -&gt; FABS (env r1) (env r2)
<a name="line-162"></a>    FNEG s r1 r2 -&gt; FNEG s (env r1) (env r2)
<a name="line-163"></a>    FADD s r1 r2 r3 -&gt; FADD s (env r1) (env r2) (env r3)
<a name="line-164"></a>    FDIV s r1 r2 r3 -&gt; FDIV s (env r1) (env r2) (env r3)
<a name="line-165"></a>    FMUL s r1 r2 r3 -&gt; FMUL s (env r1) (env r2) (env r3)
<a name="line-166"></a>    FSUB s r1 r2 r3 -&gt; FSUB s (env r1) (env r2) (env r3)
<a name="line-167"></a>    CVTxy s1 s2 r1 r2 -&gt; CVTxy s1 s2 (env r1) (env r2)
<a name="line-168"></a>    FCMP s co r1 r2 r3 -&gt; FCMP s co (env r1) (env r2) (env r3)
<a name="line-169"></a>    FMOV r1 r2 -&gt; FMOV (env r1) (env r2)
<a name="line-170"></a>    BI cond reg lbl -&gt; BI cond (env reg) lbl
<a name="line-171"></a>    BF cond reg lbl -&gt; BF cond (env reg) lbl
<a name="line-172"></a>    JMP reg addr hint -&gt; JMP (env reg) (fixAddr addr) hint
<a name="line-173"></a>    JSR reg addr i -&gt; JSR (env reg) (fixAddr addr) i
<a name="line-174"></a>    _ -&gt; instr
<a name="line-175"></a>  where
<a name="line-176"></a>    fixAddr (AddrReg r1)       = AddrReg (env r1)
<a name="line-177"></a>    fixAddr (AddrRegImm r1 i)  = AddrRegImm (env r1) i
<a name="line-178"></a>    fixAddr other	       = other
<a name="line-179"></a>
<a name="line-180"></a>    fixRI (RIReg r) = RIReg (env r)
<a name="line-181"></a>    fixRI other	= other
<a name="line-182"></a>
<a name="line-183"></a>
<a name="line-184"></a>mkSpillInstr
<a name="line-185"></a>   :: Reg		-- register to spill
<a name="line-186"></a>   -&gt; Int		-- current stack delta
<a name="line-187"></a>   -&gt; Int		-- spill slot to use
<a name="line-188"></a>   -&gt; Instr
<a name="line-189"></a>
<a name="line-190"></a>mkSpillInstr reg delta slot
<a name="line-191"></a>  = let	off     = spillSlotToOffset slot
<a name="line-192"></a>    in
<a name="line-193"></a>    -- Alpha: spill below the stack pointer (?)
<a name="line-194"></a>    ST sz dyn (spRel (- (off `div` 8)))
<a name="line-195"></a>
<a name="line-196"></a>
<a name="line-197"></a>mkLoadInstr
<a name="line-198"></a>   :: Reg		-- register to load
<a name="line-199"></a>   -&gt; Int		-- current stack delta
<a name="line-200"></a>   -&gt; Int		-- spill slot to use
<a name="line-201"></a>   -&gt; Instr
<a name="line-202"></a>mkLoadInstr reg delta slot
<a name="line-203"></a>  = let off     = spillSlotToOffset slot
<a name="line-204"></a>    in
<a name="line-205"></a>	 LD  sz dyn (spRel (- (off `div` 8)))
<a name="line-206"></a>
<a name="line-207"></a>
<a name="line-208"></a>mkBranchInstr
<a name="line-209"></a>    :: BlockId
<a name="line-210"></a>    -&gt; [Instr]
<a name="line-211"></a>
<a name="line-212"></a>mkBranchInstr id = [BR id]
<a name="line-213"></a>
<a name="line-214"></a>-}</span>
<a name="line-215"></a>
<a name="line-216"></a>
<a name="line-217"></a>
<a name="line-218"></a>
</pre></body>
</html>