Sophie

Sophie

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

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>cmm/CmmExpr.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-keyword'>module</span> <span class='hs-conid'>CmmExpr</span>
<a name="line-3"></a>    <span class='hs-layout'>(</span> <span class='hs-conid'>CmmType</span>	<span class='hs-comment'>-- Abstract </span>
<a name="line-4"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>b8</span><span class='hs-layout'>,</span> <span class='hs-varid'>b16</span><span class='hs-layout'>,</span> <span class='hs-varid'>b32</span><span class='hs-layout'>,</span> <span class='hs-varid'>b64</span><span class='hs-layout'>,</span> <span class='hs-varid'>f32</span><span class='hs-layout'>,</span> <span class='hs-varid'>f64</span><span class='hs-layout'>,</span> <span class='hs-varid'>bWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>bHalfWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>gcWord</span>
<a name="line-5"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>cInt</span><span class='hs-layout'>,</span> <span class='hs-varid'>cLong</span>
<a name="line-6"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>cmmBits</span><span class='hs-layout'>,</span> <span class='hs-varid'>cmmFloat</span>
<a name="line-7"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>typeWidth</span><span class='hs-layout'>,</span> <span class='hs-varid'>cmmEqType</span><span class='hs-layout'>,</span> <span class='hs-varid'>cmmEqType_ignoring_ptrhood</span>
<a name="line-8"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>isFloatType</span><span class='hs-layout'>,</span> <span class='hs-varid'>isGcPtrType</span><span class='hs-layout'>,</span> <span class='hs-varid'>isWord32</span><span class='hs-layout'>,</span> <span class='hs-varid'>isWord64</span><span class='hs-layout'>,</span> <span class='hs-varid'>isFloat64</span><span class='hs-layout'>,</span> <span class='hs-varid'>isFloat32</span>
<a name="line-9"></a> 
<a name="line-10"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Width</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-11"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>widthInBits</span><span class='hs-layout'>,</span> <span class='hs-varid'>widthInBytes</span><span class='hs-layout'>,</span> <span class='hs-varid'>widthInLog</span><span class='hs-layout'>,</span> <span class='hs-varid'>widthFromBytes</span>
<a name="line-12"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>wordWidth</span><span class='hs-layout'>,</span> <span class='hs-varid'>halfWordWidth</span><span class='hs-layout'>,</span> <span class='hs-varid'>cIntWidth</span><span class='hs-layout'>,</span> <span class='hs-varid'>cLongWidth</span>
<a name="line-13"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>narrowU</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrowS</span>
<a name="line-14"></a> 
<a name="line-15"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>CmmExpr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>cmmExprType</span><span class='hs-layout'>,</span> <span class='hs-varid'>cmmExprWidth</span><span class='hs-layout'>,</span> <span class='hs-varid'>maybeInvertCmmExpr</span>
<a name="line-16"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>CmmReg</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>cmmRegType</span>
<a name="line-17"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>CmmLit</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>cmmLitType</span>
<a name="line-18"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>LocalReg</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>localRegType</span>
<a name="line-19"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>GlobalReg</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>globalRegType</span><span class='hs-layout'>,</span> <span class='hs-varid'>spReg</span><span class='hs-layout'>,</span> <span class='hs-varid'>hpReg</span><span class='hs-layout'>,</span> <span class='hs-varid'>spLimReg</span><span class='hs-layout'>,</span> <span class='hs-varid'>nodeReg</span><span class='hs-layout'>,</span> <span class='hs-varid'>node</span>
<a name="line-20"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>VGcPtr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>vgcFlag</span> 	<span class='hs-comment'>-- Temporary!</span>
<a name="line-21"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>DefinerOfLocalRegs</span><span class='hs-layout'>,</span> <span class='hs-conid'>UserOfLocalRegs</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldRegsDefd</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldRegsUsed</span><span class='hs-layout'>,</span> <span class='hs-varid'>filterRegsUsed</span>
<a name="line-22"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>DefinerOfSlots</span><span class='hs-layout'>,</span> <span class='hs-conid'>UserOfSlots</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldSlotsDefd</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldSlotsUsed</span>
<a name="line-23"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>RegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyRegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>elemRegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendRegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>deleteFromRegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkRegSet</span>
<a name="line-24"></a>            <span class='hs-layout'>,</span> <span class='hs-varid'>plusRegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>minusRegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>timesRegSet</span>
<a name="line-25"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Area</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>AreaId</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>SubArea</span><span class='hs-layout'>,</span> <span class='hs-conid'>SubAreaSet</span><span class='hs-layout'>,</span> <span class='hs-conid'>AreaMap</span><span class='hs-layout'>,</span> <span class='hs-varid'>isStackSlotOf</span>
<a name="line-26"></a> 
<a name="line-27"></a>   <span class='hs-comment'>-- MachOp</span>
<a name="line-28"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>MachOp</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> 
<a name="line-29"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>pprMachOp</span><span class='hs-layout'>,</span> <span class='hs-varid'>isCommutableMachOp</span><span class='hs-layout'>,</span> <span class='hs-varid'>isAssociativeMachOp</span>
<a name="line-30"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>isComparisonMachOp</span><span class='hs-layout'>,</span> <span class='hs-varid'>machOpResultType</span>
<a name="line-31"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>machOpArgReps</span><span class='hs-layout'>,</span> <span class='hs-varid'>maybeInvertComparison</span>
<a name="line-32"></a> 
<a name="line-33"></a>   <span class='hs-comment'>-- MachOp builders</span>
<a name="line-34"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordAdd</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSub</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordEq</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordNe</span><span class='hs-layout'>,</span><span class='hs-varid'>mo_wordMul</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSQuot</span>
<a name="line-35"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSRem</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSNeg</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordUQuot</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordURem</span>
<a name="line-36"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSGe</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSLe</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSGt</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSLt</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordUGe</span> 
<a name="line-37"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordULe</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordUGt</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordULt</span>
<a name="line-38"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordAnd</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordOr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordXor</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordNot</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordShl</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSShr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordUShr</span>
<a name="line-39"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_8To32</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_8To32</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_16To32</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_16To32</span>
<a name="line-40"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_8ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_8ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_16ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_16ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_32ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_32ToWord</span>
<a name="line-41"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_32To8</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_32To16</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_WordTo8</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_WordTo16</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_WordTo32</span>
<a name="line-42"></a>   <span class='hs-layout'>)</span>
<a name="line-43"></a><span class='hs-keyword'>where</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-46"></a>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BlockId</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CLabel</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Constants</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FiniteMap</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unique</span>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSet</span>
<a name="line-55"></a>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Word</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Int</span>
<a name="line-58"></a>
<a name="line-59"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-60"></a><span class='hs-comment'>--		CmmExpr</span>
<a name="line-61"></a><span class='hs-comment'>-- An expression.  Expressions have no side effects.</span>
<a name="line-62"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-63"></a>
<a name="line-64"></a><a name="CmmExpr"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CmmExpr</span>
<a name="line-65"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmLit</span> <span class='hs-conid'>CmmLit</span>               <span class='hs-comment'>-- Literal</span>
<a name="line-66"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmLoad</span> <span class='hs-conid'>CmmExpr</span> <span class='hs-conid'>CmmType</span>     <span class='hs-comment'>-- Read memory location</span>
<a name="line-67"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmReg</span> <span class='hs-conid'>CmmReg</span>		<span class='hs-comment'>-- Contents of register</span>
<a name="line-68"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmMachOp</span> <span class='hs-conid'>MachOp</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CmmExpr</span><span class='hs-keyglyph'>]</span>  <span class='hs-comment'>-- Machine operation (+, -, *, etc.)</span>
<a name="line-69"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmStackSlot</span> <span class='hs-conid'>Area</span> <span class='hs-conid'>Int</span>       <span class='hs-comment'>-- addressing expression of a stack slot</span>
<a name="line-70"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmRegOff</span> <span class='hs-conid'>CmmReg</span> <span class='hs-conid'>Int</span>	
<a name="line-71"></a>	<span class='hs-comment'>-- CmmRegOff reg i</span>
<a name="line-72"></a>	<span class='hs-comment'>--        ** is shorthand only, meaning **</span>
<a name="line-73"></a>	<span class='hs-comment'>-- CmmMachOp (MO_S_Add rep (CmmReg reg) (CmmLit (CmmInt i rep)))</span>
<a name="line-74"></a>	<span class='hs-comment'>--	where rep = cmmRegType reg</span>
<a name="line-75"></a>
<a name="line-76"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>CmmExpr</span> <span class='hs-keyword'>where</span>	<span class='hs-comment'>-- Equality ignores the types</span>
<a name="line-77"></a>  <span class='hs-conid'>CmmLit</span> <span class='hs-varid'>l1</span>    	    <span class='hs-varop'>==</span> <span class='hs-conid'>CmmLit</span> <span class='hs-varid'>l2</span>    	 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l1</span><span class='hs-varop'>==</span><span class='hs-varid'>l2</span>
<a name="line-78"></a>  <span class='hs-conid'>CmmLoad</span> <span class='hs-varid'>e1</span> <span class='hs-keyword'>_</span> 	    <span class='hs-varop'>==</span> <span class='hs-conid'>CmmLoad</span> <span class='hs-varid'>e2</span> <span class='hs-keyword'>_</span> 	 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>e1</span><span class='hs-varop'>==</span><span class='hs-varid'>e2</span>
<a name="line-79"></a>  <span class='hs-conid'>CmmReg</span> <span class='hs-varid'>r1</span>    	    <span class='hs-varop'>==</span> <span class='hs-conid'>CmmReg</span> <span class='hs-varid'>r2</span>    	 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r1</span><span class='hs-varop'>==</span><span class='hs-varid'>r2</span>
<a name="line-80"></a>  <span class='hs-conid'>CmmRegOff</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>i1</span>   <span class='hs-varop'>==</span> <span class='hs-conid'>CmmRegOff</span> <span class='hs-varid'>r2</span> <span class='hs-varid'>i2</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r1</span><span class='hs-varop'>==</span><span class='hs-varid'>r2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>i1</span><span class='hs-varop'>==</span><span class='hs-varid'>i2</span>
<a name="line-81"></a>  <span class='hs-conid'>CmmMachOp</span> <span class='hs-varid'>op1</span> <span class='hs-varid'>es1</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CmmMachOp</span> <span class='hs-varid'>op2</span> <span class='hs-varid'>es2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>op1</span><span class='hs-varop'>==</span><span class='hs-varid'>op2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>es1</span><span class='hs-varop'>==</span><span class='hs-varid'>es2</span>
<a name="line-82"></a>  <span class='hs-conid'>CmmStackSlot</span> <span class='hs-varid'>a1</span> <span class='hs-varid'>i1</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CmmStackSlot</span> <span class='hs-varid'>a2</span> <span class='hs-varid'>i2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a1</span><span class='hs-varop'>==</span><span class='hs-varid'>a2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>i1</span><span class='hs-varop'>==</span><span class='hs-varid'>i2</span>
<a name="line-83"></a>  <span class='hs-sel'>_e1</span>               <span class='hs-varop'>==</span> <span class='hs-sel'>_e2</span>               <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-84"></a>
<a name="line-85"></a><a name="CmmReg"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CmmReg</span> 
<a name="line-86"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmLocal</span>  <span class='hs-conid'>LocalReg</span>
<a name="line-87"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmGlobal</span> <span class='hs-conid'>GlobalReg</span>
<a name="line-88"></a>  <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-layout'>)</span>
<a name="line-89"></a>
<a name="line-90"></a><a name="Area"></a><span class='hs-comment'>-- | A stack area is either the stack slot where a variable is spilled</span>
<a name="line-91"></a><a name="Area"></a><span class='hs-comment'>-- or the stack space where function arguments and results are passed.</span>
<a name="line-92"></a><a name="Area"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Area</span>
<a name="line-93"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RegSlot</span>  <span class='hs-conid'>LocalReg</span>
<a name="line-94"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CallArea</span> <span class='hs-conid'>AreaId</span>
<a name="line-95"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>)</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="AreaId"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>AreaId</span>
<a name="line-98"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Old</span>            <span class='hs-comment'>-- See Note [Old Area]</span>
<a name="line-99"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Young</span> <span class='hs-conid'>BlockId</span>
<a name="line-100"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>)</span>
<a name="line-101"></a>
<a name="line-102"></a><span class='hs-comment'>{- Note [Old Area] 
<a name="line-103"></a>~~~~~~~~~~~~~~~~~~
<a name="line-104"></a>There is a single call area 'Old', allocated at the extreme old
<a name="line-105"></a>end of the stack frame (ie just younger than the return address)
<a name="line-106"></a>which holds:
<a name="line-107"></a>  * incoming (overflow) parameters, 
<a name="line-108"></a>  * outgoing (overflow) parameter to tail calls,
<a name="line-109"></a>  * outgoing (overflow) result values 
<a name="line-110"></a>  * the update frame (if any)
<a name="line-111"></a>
<a name="line-112"></a>Its size is the max of all these requirements.  On entry, the stack
<a name="line-113"></a>pointer will point to the youngest incoming parameter, which is not
<a name="line-114"></a>necessarily at the young end of the Old area.
<a name="line-115"></a>
<a name="line-116"></a>End of note -}</span>
<a name="line-117"></a>
<a name="line-118"></a><a name="SubArea"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SubArea</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Area</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- area, offset, width</span>
<a name="line-119"></a><a name="SubAreaSet"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SubAreaSet</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FiniteMap</span> <span class='hs-conid'>Area</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>SubArea</span><span class='hs-keyglyph'>]</span>
<a name="line-120"></a>
<a name="line-121"></a><a name="AreaMap"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>AreaMap</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FiniteMap</span> <span class='hs-conid'>Area</span> <span class='hs-conid'>Int</span>
<a name="line-122"></a>     <span class='hs-comment'>-- Byte offset of the oldest byte of the Area, </span>
<a name="line-123"></a>     <span class='hs-comment'>-- relative to the oldest byte of the Old Area</span>
<a name="line-124"></a>
<a name="line-125"></a><a name="CmmLit"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CmmLit</span>
<a name="line-126"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmInt</span> <span class='hs-conid'>Integer</span>  <span class='hs-conid'>Width</span>
<a name="line-127"></a>	<span class='hs-comment'>-- Interpretation: the 2's complement representation of the value</span>
<a name="line-128"></a>	<span class='hs-comment'>-- is truncated to the specified size.  This is easier than trying</span>
<a name="line-129"></a>	<span class='hs-comment'>-- to keep the value within range, because we don't know whether</span>
<a name="line-130"></a> 	<span class='hs-comment'>-- it will be used as a signed or unsigned value (the CmmType doesn't</span>
<a name="line-131"></a>	<span class='hs-comment'>-- distinguish between signed &amp; unsigned).</span>
<a name="line-132"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmFloat</span>  <span class='hs-conid'>Rational</span> <span class='hs-conid'>Width</span>
<a name="line-133"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmLabel</span>    <span class='hs-conid'>CLabel</span>			<span class='hs-comment'>-- Address of label</span>
<a name="line-134"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmLabelOff</span> <span class='hs-conid'>CLabel</span> <span class='hs-conid'>Int</span>		<span class='hs-comment'>-- Address of label + byte offset</span>
<a name="line-135"></a>  
<a name="line-136"></a>        <span class='hs-comment'>-- Due to limitations in the C backend, the following</span>
<a name="line-137"></a>        <span class='hs-comment'>-- MUST ONLY be used inside the info table indicated by label2</span>
<a name="line-138"></a>        <span class='hs-comment'>-- (label2 must be the info label), and label1 must be an</span>
<a name="line-139"></a>        <span class='hs-comment'>-- SRT, a slow entrypoint or a large bitmap (see the Mangler)</span>
<a name="line-140"></a>        <span class='hs-comment'>-- Don't use it at all unless tablesNextToCode.</span>
<a name="line-141"></a>        <span class='hs-comment'>-- It is also used inside the NCG during when generating</span>
<a name="line-142"></a>        <span class='hs-comment'>-- position-independent code. </span>
<a name="line-143"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmLabelDiffOff</span> <span class='hs-conid'>CLabel</span> <span class='hs-conid'>CLabel</span> <span class='hs-conid'>Int</span>   <span class='hs-comment'>-- label1 - label2 + offset</span>
<a name="line-144"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmBlock</span> <span class='hs-conid'>BlockId</span>			<span class='hs-comment'>-- Code label</span>
<a name="line-145"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmHighStackMark</span> <span class='hs-comment'>-- stands for the max stack space used during a procedure</span>
<a name="line-146"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Eq</span>
<a name="line-147"></a>
<a name="line-148"></a><a name="cmmExprType"></a><span class='hs-definition'>cmmExprType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span>
<a name="line-149"></a><span class='hs-definition'>cmmExprType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLit</span> <span class='hs-varid'>lit</span><span class='hs-layout'>)</span>      	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmLitType</span> <span class='hs-varid'>lit</span>
<a name="line-150"></a><span class='hs-definition'>cmmExprType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLoad</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>rep</span><span class='hs-layout'>)</span>   	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>rep</span>
<a name="line-151"></a><span class='hs-definition'>cmmExprType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmReg</span> <span class='hs-varid'>reg</span><span class='hs-layout'>)</span>      	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmRegType</span> <span class='hs-varid'>reg</span>
<a name="line-152"></a><span class='hs-definition'>cmmExprType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmMachOp</span> <span class='hs-varid'>op</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>machOpResultType</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>cmmExprType</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-153"></a><span class='hs-definition'>cmmExprType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmRegOff</span> <span class='hs-varid'>reg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmRegType</span> <span class='hs-varid'>reg</span>
<a name="line-154"></a><span class='hs-definition'>cmmExprType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmStackSlot</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bWord</span> <span class='hs-comment'>-- an address</span>
<a name="line-155"></a>
<a name="line-156"></a><a name="cmmLitType"></a><span class='hs-definition'>cmmLitType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmLit</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span>
<a name="line-157"></a><span class='hs-definition'>cmmLitType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmInt</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>width</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span>  <span class='hs-varid'>width</span>
<a name="line-158"></a><span class='hs-definition'>cmmLitType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmFloat</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>width</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-varid'>width</span>
<a name="line-159"></a><span class='hs-definition'>cmmLitType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLabel</span> <span class='hs-varid'>lbl</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmLabelType</span> <span class='hs-varid'>lbl</span>
<a name="line-160"></a><span class='hs-definition'>cmmLitType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLabelOff</span> <span class='hs-varid'>lbl</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmLabelType</span> <span class='hs-varid'>lbl</span>
<a name="line-161"></a><span class='hs-definition'>cmmLitType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLabelDiffOff</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bWord</span>
<a name="line-162"></a><span class='hs-definition'>cmmLitType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmBlock</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>bWord</span>
<a name="line-163"></a><span class='hs-definition'>cmmLitType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmHighStackMark</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bWord</span>
<a name="line-164"></a>
<a name="line-165"></a><a name="cmmLabelType"></a><span class='hs-definition'>cmmLabelType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CLabel</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span>
<a name="line-166"></a><span class='hs-definition'>cmmLabelType</span> <span class='hs-varid'>lbl</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isGcPtrLabel</span> <span class='hs-varid'>lbl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>gcWord</span>
<a name="line-167"></a>		 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> 	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bWord</span>
<a name="line-168"></a>
<a name="line-169"></a><a name="cmmExprWidth"></a><span class='hs-definition'>cmmExprWidth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Width</span>
<a name="line-170"></a><span class='hs-definition'>cmmExprWidth</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>typeWidth</span> <span class='hs-layout'>(</span><span class='hs-varid'>cmmExprType</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-171"></a>
<a name="line-172"></a><span class='hs-comment'>--------</span>
<a name="line-173"></a><span class='hs-comment'>--- Negation for conditional branches</span>
<a name="line-174"></a>
<a name="line-175"></a><a name="maybeInvertCmmExpr"></a><span class='hs-definition'>maybeInvertCmmExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>CmmExpr</span>
<a name="line-176"></a><span class='hs-definition'>maybeInvertCmmExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmMachOp</span> <span class='hs-varid'>op</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>op'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>maybeInvertComparison</span> <span class='hs-varid'>op</span>
<a name="line-177"></a>                                            <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmMachOp</span> <span class='hs-varid'>op'</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-178"></a><span class='hs-definition'>maybeInvertCmmExpr</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-179"></a>
<a name="line-180"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-181"></a><span class='hs-comment'>--		Local registers</span>
<a name="line-182"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-183"></a>
<a name="line-184"></a><a name="LocalReg"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>LocalReg</span>
<a name="line-185"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LocalReg</span> <span class='hs-varop'>!</span><span class='hs-conid'>Unique</span> <span class='hs-conid'>CmmType</span>
<a name="line-186"></a>    <span class='hs-comment'>-- ^ Parameters:</span>
<a name="line-187"></a>    <span class='hs-comment'>--   1. Identifier</span>
<a name="line-188"></a>    <span class='hs-comment'>--   2. Type</span>
<a name="line-189"></a>
<a name="line-190"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyword'>where</span>
<a name="line-191"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>LocalReg</span> <span class='hs-varid'>u1</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-conid'>LocalReg</span> <span class='hs-varid'>u2</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>u1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>u2</span>
<a name="line-192"></a>
<a name="line-193"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Ord</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyword'>where</span>
<a name="line-194"></a>  <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>LocalReg</span> <span class='hs-varid'>u1</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>LocalReg</span> <span class='hs-varid'>u2</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>u1</span> <span class='hs-varid'>u2</span>
<a name="line-195"></a>
<a name="line-196"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Uniquable</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyword'>where</span>
<a name="line-197"></a>  <span class='hs-varid'>getUnique</span> <span class='hs-layout'>(</span><span class='hs-conid'>LocalReg</span> <span class='hs-varid'>uniq</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uniq</span>
<a name="line-198"></a>
<a name="line-199"></a><a name="cmmRegType"></a><span class='hs-definition'>cmmRegType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span>
<a name="line-200"></a><span class='hs-definition'>cmmRegType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLocal</span>  <span class='hs-varid'>reg</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>localRegType</span> <span class='hs-varid'>reg</span>
<a name="line-201"></a><span class='hs-definition'>cmmRegType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmGlobal</span> <span class='hs-varid'>reg</span><span class='hs-layout'>)</span>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>globalRegType</span> <span class='hs-varid'>reg</span>
<a name="line-202"></a>
<a name="line-203"></a><a name="localRegType"></a><span class='hs-definition'>localRegType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span>
<a name="line-204"></a><span class='hs-definition'>localRegType</span> <span class='hs-layout'>(</span><span class='hs-conid'>LocalReg</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>rep</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rep</span>
<a name="line-205"></a>
<a name="line-206"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-207"></a><span class='hs-comment'>--    Register-use information for expressions and other types </span>
<a name="line-208"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-209"></a>
<a name="line-210"></a><a name="RegSet"></a><span class='hs-comment'>-- | Sets of local registers</span>
<a name="line-211"></a><a name="RegSet"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>RegSet</span>              <span class='hs-keyglyph'>=</span>  <span class='hs-conid'>UniqSet</span> <span class='hs-conid'>LocalReg</span>
<a name="line-212"></a><a name="emptyRegSet"></a><span class='hs-definition'>emptyRegSet</span>             <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RegSet</span>
<a name="line-213"></a><a name="elemRegSet"></a><span class='hs-definition'>elemRegSet</span>              <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RegSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-214"></a><a name="extendRegSet"></a><span class='hs-definition'>extendRegSet</span>            <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RegSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RegSet</span>
<a name="line-215"></a><a name="deleteFromRegSet"></a><span class='hs-definition'>deleteFromRegSet</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RegSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RegSet</span>
<a name="line-216"></a><a name="mkRegSet"></a><span class='hs-definition'>mkRegSet</span>                <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LocalReg</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RegSet</span>
<a name="line-217"></a><a name="minusRegSet"></a><span class='hs-definition'>minusRegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusRegSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>timesRegSet</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RegSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RegSet</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RegSet</span>
<a name="line-218"></a>
<a name="line-219"></a><span class='hs-definition'>emptyRegSet</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyUniqSet</span>
<a name="line-220"></a><span class='hs-definition'>elemRegSet</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>elementOfUniqSet</span>
<a name="line-221"></a><span class='hs-definition'>extendRegSet</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addOneToUniqSet</span>
<a name="line-222"></a><span class='hs-definition'>deleteFromRegSet</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>delOneFromUniqSet</span>
<a name="line-223"></a><span class='hs-definition'>mkRegSet</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkUniqSet</span>
<a name="line-224"></a><span class='hs-definition'>minusRegSet</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>minusUniqSet</span>
<a name="line-225"></a><a name="plusRegSet"></a><span class='hs-definition'>plusRegSet</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionUniqSets</span>
<a name="line-226"></a><a name="timesRegSet"></a><span class='hs-definition'>timesRegSet</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectUniqSets</span>
<a name="line-227"></a>
<a name="line-228"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>UserOfLocalRegs</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-229"></a>  <span class='hs-varid'>foldRegsUsed</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-230"></a>
<a name="line-231"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>DefinerOfLocalRegs</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-232"></a>  <span class='hs-varid'>foldRegsDefd</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-233"></a>
<a name="line-234"></a><a name="filterRegsUsed"></a><span class='hs-definition'>filterRegsUsed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UserOfLocalRegs</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>LocalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RegSet</span>
<a name="line-235"></a><span class='hs-definition'>filterRegsUsed</span> <span class='hs-varid'>p</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span>
<a name="line-236"></a>    <span class='hs-varid'>foldRegsUsed</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>regs</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>p</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>extendRegSet</span> <span class='hs-varid'>regs</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>regs</span><span class='hs-layout'>)</span>
<a name="line-237"></a>                 <span class='hs-varid'>emptyRegSet</span> <span class='hs-varid'>e</span>
<a name="line-238"></a>
<a name="line-239"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>UserOfLocalRegs</span> <span class='hs-conid'>CmmReg</span> <span class='hs-keyword'>where</span>
<a name="line-240"></a>    <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLocal</span> <span class='hs-varid'>reg</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>reg</span>
<a name="line-241"></a>    <span class='hs-varid'>foldRegsUsed</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmGlobal</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-242"></a>
<a name="line-243"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>DefinerOfLocalRegs</span> <span class='hs-conid'>CmmReg</span> <span class='hs-keyword'>where</span>
<a name="line-244"></a>    <span class='hs-varid'>foldRegsDefd</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLocal</span> <span class='hs-varid'>reg</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>reg</span>
<a name="line-245"></a>    <span class='hs-varid'>foldRegsDefd</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmGlobal</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-246"></a>
<a name="line-247"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>UserOfLocalRegs</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyword'>where</span>
<a name="line-248"></a>    <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>r</span>
<a name="line-249"></a>
<a name="line-250"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>DefinerOfLocalRegs</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyword'>where</span>
<a name="line-251"></a>    <span class='hs-varid'>foldRegsDefd</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>r</span>
<a name="line-252"></a>
<a name="line-253"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>UserOfLocalRegs</span> <span class='hs-conid'>RegSet</span> <span class='hs-keyword'>where</span>
<a name="line-254"></a>    <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldUniqSet</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-255"></a>
<a name="line-256"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>UserOfLocalRegs</span> <span class='hs-conid'>CmmExpr</span> <span class='hs-keyword'>where</span>
<a name="line-257"></a>  <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-varid'>e</span>
<a name="line-258"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLit</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-259"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLoad</span> <span class='hs-varid'>addr</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>addr</span>
<a name="line-260"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmReg</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>r</span>
<a name="line-261"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmMachOp</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>exprs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>exprs</span>
<a name="line-262"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmRegOff</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>r</span>
<a name="line-263"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmStackSlot</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-264"></a>
<a name="line-265"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>UserOfLocalRegs</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>UserOfLocalRegs</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>where</span>
<a name="line-266"></a>  <span class='hs-varid'>foldRegsUsed</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>set</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>set</span>
<a name="line-267"></a>  <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>set</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldRegsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>set</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span>
<a name="line-268"></a>
<a name="line-269"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>DefinerOfLocalRegs</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>DefinerOfLocalRegs</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>where</span>
<a name="line-270"></a>  <span class='hs-varid'>foldRegsDefd</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>set</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>set</span>
<a name="line-271"></a>  <span class='hs-varid'>foldRegsDefd</span> <span class='hs-varid'>f</span> <span class='hs-varid'>set</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldRegsDefd</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldRegsDefd</span> <span class='hs-varid'>f</span> <span class='hs-varid'>set</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span>
<a name="line-272"></a>
<a name="line-273"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>DefinerOfLocalRegs</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>DefinerOfLocalRegs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-274"></a>  <span class='hs-varid'>foldRegsDefd</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>set</span> <span class='hs-conid'>Nothing</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>set</span>
<a name="line-275"></a>  <span class='hs-varid'>foldRegsDefd</span> <span class='hs-varid'>f</span> <span class='hs-varid'>set</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldRegsDefd</span> <span class='hs-varid'>f</span> <span class='hs-varid'>set</span> <span class='hs-varid'>x</span>
<a name="line-276"></a>
<a name="line-277"></a>
<a name="line-278"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-279"></a><span class='hs-comment'>--    Stack slots</span>
<a name="line-280"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-281"></a>
<a name="line-282"></a><a name="isStackSlotOf"></a><span class='hs-definition'>isStackSlotOf</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmExpr</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LocalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-283"></a><span class='hs-definition'>isStackSlotOf</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmStackSlot</span> <span class='hs-layout'>(</span><span class='hs-conid'>RegSlot</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>r'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-varid'>r'</span>
<a name="line-284"></a><span class='hs-definition'>isStackSlotOf</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-285"></a>
<a name="line-286"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-287"></a><span class='hs-comment'>--    Stack slot use information for expressions and other types [_$_]</span>
<a name="line-288"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-289"></a>
<a name="line-290"></a><a name="UserOfSlots"></a><span class='hs-comment'>-- Fold over the area, the offset into the area, and the width of the subarea.</span>
<a name="line-291"></a><a name="UserOfSlots"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>UserOfSlots</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-292"></a>  <span class='hs-varid'>foldSlotsUsed</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SubArea</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-293"></a>
<a name="line-294"></a><a name="DefinerOfSlots"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>DefinerOfSlots</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-295"></a>  <span class='hs-varid'>foldSlotsDefd</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SubArea</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-296"></a>
<a name="line-297"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>UserOfSlots</span> <span class='hs-conid'>CmmExpr</span> <span class='hs-keyword'>where</span>
<a name="line-298"></a>  <span class='hs-varid'>foldSlotsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-varid'>e</span>
<a name="line-299"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLit</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-300"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLoad</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmStackSlot</span> <span class='hs-varid'>a</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>widthInBytes</span> <span class='hs-varop'>$</span> <span class='hs-varid'>typeWidth</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-301"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmLoad</span> <span class='hs-varid'>addr</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldSlotsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>addr</span>
<a name="line-302"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-303"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmMachOp</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>exprs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldSlotsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>exprs</span>
<a name="line-304"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmRegOff</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-305"></a>          <span class='hs-varid'>expr</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmStackSlot</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-306"></a>
<a name="line-307"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>UserOfSlots</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>UserOfSlots</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>where</span>
<a name="line-308"></a>  <span class='hs-varid'>foldSlotsUsed</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>set</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>set</span>
<a name="line-309"></a>  <span class='hs-varid'>foldSlotsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>set</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldSlotsUsed</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldSlotsUsed</span> <span class='hs-varid'>f</span> <span class='hs-varid'>set</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span>
<a name="line-310"></a>
<a name="line-311"></a>
<a name="line-312"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-313"></a><span class='hs-comment'>--		Global STG registers</span>
<a name="line-314"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-315"></a>
<a name="line-316"></a><a name="VGcPtr"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>VGcPtr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VGcPtr</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>VNonGcPtr</span> <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>)</span>
<a name="line-317"></a>	<span class='hs-comment'>-- TEMPORARY!!!</span>
<a name="line-318"></a>
<a name="line-319"></a><a name="vgcFlag"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-320"></a><span class='hs-comment'>--		Global STG registers</span>
<a name="line-321"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-322"></a><span class='hs-definition'>vgcFlag</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VGcPtr</span>
<a name="line-323"></a><span class='hs-definition'>vgcFlag</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isGcPtrType</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VGcPtr</span>
<a name="line-324"></a>	   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VNonGcPtr</span>
<a name="line-325"></a>
<a name="line-326"></a><a name="GlobalReg"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>GlobalReg</span>
<a name="line-327"></a>  <span class='hs-comment'>-- Argument and return registers</span>
<a name="line-328"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VanillaReg</span>			<span class='hs-comment'>-- pointers, unboxed ints and chars</span>
<a name="line-329"></a>	<span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>	<span class='hs-comment'>-- its number</span>
<a name="line-330"></a> 	<span class='hs-conid'>VGcPtr</span>
<a name="line-331"></a>
<a name="line-332"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FloatReg</span>		<span class='hs-comment'>-- single-precision floating-point registers</span>
<a name="line-333"></a>	<span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>	<span class='hs-comment'>-- its number</span>
<a name="line-334"></a>
<a name="line-335"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DoubleReg</span>		<span class='hs-comment'>-- double-precision floating-point registers</span>
<a name="line-336"></a>	<span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>	<span class='hs-comment'>-- its number</span>
<a name="line-337"></a>
<a name="line-338"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>LongReg</span>	        <span class='hs-comment'>-- long int registers (64-bit, really)</span>
<a name="line-339"></a>	<span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>	<span class='hs-comment'>-- its number</span>
<a name="line-340"></a>
<a name="line-341"></a>  <span class='hs-comment'>-- STG registers</span>
<a name="line-342"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Sp</span>			<span class='hs-comment'>-- Stack ptr; points to last occupied stack location.</span>
<a name="line-343"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SpLim</span>		<span class='hs-comment'>-- Stack limit</span>
<a name="line-344"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Hp</span>			<span class='hs-comment'>-- Heap ptr; points to last occupied heap location.</span>
<a name="line-345"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HpLim</span>		<span class='hs-comment'>-- Heap limit register</span>
<a name="line-346"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CurrentTSO</span>		<span class='hs-comment'>-- pointer to current thread's TSO</span>
<a name="line-347"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CurrentNursery</span>	<span class='hs-comment'>-- pointer to allocation area</span>
<a name="line-348"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HpAlloc</span>		<span class='hs-comment'>-- allocation count for heap check failure</span>
<a name="line-349"></a>
<a name="line-350"></a>		<span class='hs-comment'>-- We keep the address of some commonly-called </span>
<a name="line-351"></a>		<span class='hs-comment'>-- functions in the register table, to keep code</span>
<a name="line-352"></a>		<span class='hs-comment'>-- size down:</span>
<a name="line-353"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>EagerBlackholeInfo</span>  <span class='hs-comment'>-- stg_EAGER_BLACKHOLE_info</span>
<a name="line-354"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>GCEnter1</span>		<span class='hs-comment'>-- stg_gc_enter_1</span>
<a name="line-355"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>GCFun</span>		<span class='hs-comment'>-- stg_gc_fun</span>
<a name="line-356"></a>
<a name="line-357"></a>  <span class='hs-comment'>-- Base offset for the register table, used for accessing registers</span>
<a name="line-358"></a>  <span class='hs-comment'>-- which do not have real registers assigned to them.  This register</span>
<a name="line-359"></a>  <span class='hs-comment'>-- will only appear after we have expanded GlobalReg into memory accesses</span>
<a name="line-360"></a>  <span class='hs-comment'>-- (where necessary) in the native code generator.</span>
<a name="line-361"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BaseReg</span>
<a name="line-362"></a>
<a name="line-363"></a>  <span class='hs-comment'>-- Base Register for PIC (position-independent code) calculations</span>
<a name="line-364"></a>  <span class='hs-comment'>-- Only used inside the native code generator. It's exact meaning differs</span>
<a name="line-365"></a>  <span class='hs-comment'>-- from platform to platform (see module PositionIndependentCode).</span>
<a name="line-366"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PicBaseReg</span>
<a name="line-367"></a>
<a name="line-368"></a>  <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>)</span>
<a name="line-369"></a>
<a name="line-370"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>GlobalReg</span> <span class='hs-keyword'>where</span>
<a name="line-371"></a>   <span class='hs-conid'>VanillaReg</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span> <span class='hs-varop'>==</span> <span class='hs-conid'>VanillaReg</span> <span class='hs-varid'>j</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-varop'>==</span><span class='hs-varid'>j</span>	<span class='hs-comment'>-- Ignore type when seeking clashes</span>
<a name="line-372"></a>   <span class='hs-conid'>FloatReg</span> <span class='hs-varid'>i</span> <span class='hs-varop'>==</span> <span class='hs-conid'>FloatReg</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-varop'>==</span><span class='hs-varid'>j</span>
<a name="line-373"></a>   <span class='hs-conid'>DoubleReg</span> <span class='hs-varid'>i</span> <span class='hs-varop'>==</span> <span class='hs-conid'>DoubleReg</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-varop'>==</span><span class='hs-varid'>j</span>
<a name="line-374"></a>   <span class='hs-conid'>LongReg</span> <span class='hs-varid'>i</span> <span class='hs-varop'>==</span> <span class='hs-conid'>LongReg</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span><span class='hs-varop'>==</span><span class='hs-varid'>j</span>
<a name="line-375"></a>   <span class='hs-conid'>Sp</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Sp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-376"></a>   <span class='hs-conid'>SpLim</span> <span class='hs-varop'>==</span> <span class='hs-conid'>SpLim</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-377"></a>   <span class='hs-conid'>Hp</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Hp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-378"></a>   <span class='hs-conid'>HpLim</span> <span class='hs-varop'>==</span> <span class='hs-conid'>HpLim</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-379"></a>   <span class='hs-conid'>CurrentTSO</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CurrentTSO</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-380"></a>   <span class='hs-conid'>CurrentNursery</span> <span class='hs-varop'>==</span> <span class='hs-conid'>CurrentNursery</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-381"></a>   <span class='hs-conid'>HpAlloc</span> <span class='hs-varop'>==</span> <span class='hs-conid'>HpAlloc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-382"></a>   <span class='hs-conid'>GCEnter1</span> <span class='hs-varop'>==</span> <span class='hs-conid'>GCEnter1</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-383"></a>   <span class='hs-conid'>GCFun</span> <span class='hs-varop'>==</span> <span class='hs-conid'>GCFun</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-384"></a>   <span class='hs-conid'>BaseReg</span> <span class='hs-varop'>==</span> <span class='hs-conid'>BaseReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-385"></a>   <span class='hs-conid'>PicBaseReg</span> <span class='hs-varop'>==</span> <span class='hs-conid'>PicBaseReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-386"></a>   <span class='hs-sel'>_r1</span> <span class='hs-varop'>==</span> <span class='hs-sel'>_r2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-387"></a>
<a name="line-388"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Ord</span> <span class='hs-conid'>GlobalReg</span> <span class='hs-keyword'>where</span>
<a name="line-389"></a>   <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>VanillaReg</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>VanillaReg</span> <span class='hs-varid'>j</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span>
<a name="line-390"></a>     <span class='hs-comment'>-- Ignore type when seeking clashes</span>
<a name="line-391"></a>   <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>FloatReg</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>  <span class='hs-layout'>(</span><span class='hs-conid'>FloatReg</span>  <span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span>
<a name="line-392"></a>   <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>DoubleReg</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>DoubleReg</span> <span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span>
<a name="line-393"></a>   <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>LongReg</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>LongReg</span>   <span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span>
<a name="line-394"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>Sp</span> <span class='hs-conid'>Sp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-395"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>SpLim</span> <span class='hs-conid'>SpLim</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-396"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>Hp</span> <span class='hs-conid'>Hp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-397"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>HpLim</span> <span class='hs-conid'>HpLim</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-398"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>CurrentTSO</span> <span class='hs-conid'>CurrentTSO</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-399"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>CurrentNursery</span> <span class='hs-conid'>CurrentNursery</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-400"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>HpAlloc</span> <span class='hs-conid'>HpAlloc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-401"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>EagerBlackholeInfo</span> <span class='hs-conid'>EagerBlackholeInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-402"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>GCEnter1</span> <span class='hs-conid'>GCEnter1</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-403"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>GCFun</span> <span class='hs-conid'>GCFun</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-404"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>BaseReg</span> <span class='hs-conid'>BaseReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-405"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>PicBaseReg</span> <span class='hs-conid'>PicBaseReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-406"></a>   <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>VanillaReg</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-407"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>VanillaReg</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-408"></a>   <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>FloatReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-409"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>FloatReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-410"></a>   <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>DoubleReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-411"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>DoubleReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-412"></a>   <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-conid'>LongReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-413"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>LongReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-414"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>Sp</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-415"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Sp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-416"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>SpLim</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-417"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>SpLim</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-418"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>Hp</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-419"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Hp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-420"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>HpLim</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-421"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>HpLim</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-422"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>CurrentTSO</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-423"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>CurrentTSO</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-424"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>CurrentNursery</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-425"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>CurrentNursery</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-426"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>HpAlloc</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-427"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>HpAlloc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-428"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>GCEnter1</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-429"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>GCEnter1</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-430"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>GCFun</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-431"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>GCFun</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-432"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>BaseReg</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-433"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>BaseReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-434"></a>   <span class='hs-varid'>compare</span> <span class='hs-conid'>EagerBlackholeInfo</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-435"></a>   <span class='hs-varid'>compare</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>EagerBlackholeInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-436"></a>
<a name="line-437"></a><a name="spReg"></a><span class='hs-comment'>-- convenient aliases</span>
<a name="line-438"></a><span class='hs-definition'>spReg</span><span class='hs-layout'>,</span> <span class='hs-varid'>hpReg</span><span class='hs-layout'>,</span> <span class='hs-varid'>spLimReg</span><span class='hs-layout'>,</span> <span class='hs-varid'>nodeReg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmReg</span>
<a name="line-439"></a><span class='hs-definition'>spReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmGlobal</span> <span class='hs-conid'>Sp</span>
<a name="line-440"></a><a name="hpReg"></a><span class='hs-definition'>hpReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmGlobal</span> <span class='hs-conid'>Hp</span>
<a name="line-441"></a><a name="spLimReg"></a><span class='hs-definition'>spLimReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmGlobal</span> <span class='hs-conid'>SpLim</span>
<a name="line-442"></a><a name="nodeReg"></a><span class='hs-definition'>nodeReg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmGlobal</span> <span class='hs-varid'>node</span>
<a name="line-443"></a>
<a name="line-444"></a><a name="node"></a><span class='hs-definition'>node</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GlobalReg</span>
<a name="line-445"></a><span class='hs-definition'>node</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VanillaReg</span> <span class='hs-num'>1</span> <span class='hs-conid'>VGcPtr</span>
<a name="line-446"></a>
<a name="line-447"></a><a name="globalRegType"></a><span class='hs-definition'>globalRegType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GlobalReg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span>
<a name="line-448"></a><span class='hs-definition'>globalRegType</span> <span class='hs-layout'>(</span><span class='hs-conid'>VanillaReg</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>VGcPtr</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>gcWord</span>
<a name="line-449"></a><span class='hs-definition'>globalRegType</span> <span class='hs-layout'>(</span><span class='hs-conid'>VanillaReg</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>VNonGcPtr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bWord</span>
<a name="line-450"></a><span class='hs-definition'>globalRegType</span> <span class='hs-layout'>(</span><span class='hs-conid'>FloatReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-conid'>W32</span>
<a name="line-451"></a><span class='hs-definition'>globalRegType</span> <span class='hs-layout'>(</span><span class='hs-conid'>DoubleReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-conid'>W64</span>
<a name="line-452"></a><span class='hs-definition'>globalRegType</span> <span class='hs-layout'>(</span><span class='hs-conid'>LongReg</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-conid'>W64</span>
<a name="line-453"></a><span class='hs-definition'>globalRegType</span> <span class='hs-conid'>Hp</span>		<span class='hs-keyglyph'>=</span> <span class='hs-varid'>gcWord</span>	<span class='hs-comment'>-- The initialiser for all </span>
<a name="line-454"></a>					    	<span class='hs-comment'>-- dynamically allocated closures</span>
<a name="line-455"></a><span class='hs-definition'>globalRegType</span> <span class='hs-keyword'>_</span>			<span class='hs-keyglyph'>=</span> <span class='hs-varid'>bWord</span>
<a name="line-456"></a>
<a name="line-457"></a>
<a name="line-458"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-459"></a><span class='hs-comment'>--    		CmmType</span>
<a name="line-460"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-461"></a>
<a name="line-462"></a>  <span class='hs-comment'>-- NOTE: CmmType is an abstract type, not exported from this</span>
<a name="line-463"></a>  <span class='hs-comment'>--	   module so you can easily change its representation</span>
<a name="line-464"></a>  <span class='hs-comment'>--</span>
<a name="line-465"></a>  <span class='hs-comment'>-- However Width is exported in a concrete way, </span>
<a name="line-466"></a>  <span class='hs-comment'>-- and is used extensively in pattern-matching</span>
<a name="line-467"></a>
<a name="line-468"></a><a name="CmmType"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CmmType</span> 	<span class='hs-comment'>-- The important one!</span>
<a name="line-469"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmType</span> <span class='hs-conid'>CmmCat</span> <span class='hs-conid'>Width</span> 
<a name="line-470"></a>
<a name="line-471"></a><a name="CmmCat"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CmmCat</span>	<span class='hs-comment'>-- "Category" (not exported)</span>
<a name="line-472"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GcPtrCat</span>	<span class='hs-comment'>-- GC pointer</span>
<a name="line-473"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BitsCat</span> 	<span class='hs-comment'>-- Non-pointer</span>
<a name="line-474"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FloatCat</span>	<span class='hs-comment'>-- Float</span>
<a name="line-475"></a>   <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-476"></a>	<span class='hs-comment'>-- See Note [Signed vs unsigned] at the end</span>
<a name="line-477"></a>
<a name="line-478"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyword'>where</span>
<a name="line-479"></a>  <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-varid'>cat</span> <span class='hs-varid'>wid</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>cat</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>widthInBits</span> <span class='hs-varid'>wid</span><span class='hs-layout'>)</span>
<a name="line-480"></a>
<a name="line-481"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>CmmCat</span> <span class='hs-keyword'>where</span>
<a name="line-482"></a>  <span class='hs-varid'>ppr</span> <span class='hs-conid'>FloatCat</span>	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-varop'>$</span> <span class='hs-varid'>sLit</span><span class='hs-layout'>(</span><span class='hs-str'>"F"</span><span class='hs-layout'>)</span>
<a name="line-483"></a>  <span class='hs-varid'>ppr</span> <span class='hs-keyword'>_</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-varop'>$</span> <span class='hs-varid'>sLit</span><span class='hs-layout'>(</span><span class='hs-str'>"I"</span><span class='hs-layout'>)</span>
<a name="line-484"></a><span class='hs-comment'>-- Temp Jan 08</span>
<a name="line-485"></a><span class='hs-comment'>--  ppr FloatCat	= ptext $ sLit("float")</span>
<a name="line-486"></a><span class='hs-comment'>--  ppr BitsCat   = ptext $ sLit("bits")</span>
<a name="line-487"></a><span class='hs-comment'>--  ppr GcPtrCat  = ptext $ sLit("gcptr")</span>
<a name="line-488"></a>
<a name="line-489"></a><span class='hs-comment'>-- Why is CmmType stratified?  For native code generation, </span>
<a name="line-490"></a><span class='hs-comment'>-- most of the time you just want to know what sort of register</span>
<a name="line-491"></a><span class='hs-comment'>-- to put the thing in, and for this you need to know how</span>
<a name="line-492"></a><span class='hs-comment'>-- many bits thing has and whether it goes in a floating-point</span>
<a name="line-493"></a><span class='hs-comment'>-- register.  By contrast, the distinction between GcPtr and</span>
<a name="line-494"></a><span class='hs-comment'>-- GcNonPtr is of interest to only a few parts of the code generator.</span>
<a name="line-495"></a>
<a name="line-496"></a><a name="cmmEqType"></a><span class='hs-comment'>-------- Equality on CmmType --------------</span>
<a name="line-497"></a><span class='hs-comment'>-- CmmType is *not* an instance of Eq; sometimes we care about the</span>
<a name="line-498"></a><span class='hs-comment'>-- Gc/NonGc distinction, and sometimes we don't</span>
<a name="line-499"></a><span class='hs-comment'>-- So we use an explicit function to force you to think about it</span>
<a name="line-500"></a><span class='hs-definition'>cmmEqType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>	<span class='hs-comment'>-- Exact equality</span>
<a name="line-501"></a><span class='hs-definition'>cmmEqType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-varid'>c1</span> <span class='hs-varid'>w1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-varid'>c2</span> <span class='hs-varid'>w2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c1</span><span class='hs-varop'>==</span><span class='hs-varid'>c2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>w1</span><span class='hs-varop'>==</span><span class='hs-varid'>w2</span>
<a name="line-502"></a>
<a name="line-503"></a><a name="cmmEqType_ignoring_ptrhood"></a><span class='hs-definition'>cmmEqType_ignoring_ptrhood</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-504"></a>  <span class='hs-comment'>-- This equality is temporary; used in CmmLint</span>
<a name="line-505"></a>  <span class='hs-comment'>-- but the RTS files are not yet well-typed wrt pointers</span>
<a name="line-506"></a><span class='hs-definition'>cmmEqType_ignoring_ptrhood</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-varid'>c1</span> <span class='hs-varid'>w1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-varid'>c2</span> <span class='hs-varid'>w2</span><span class='hs-layout'>)</span>
<a name="line-507"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c1</span> <span class='hs-varop'>`weak_eq`</span> <span class='hs-varid'>c2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>w1</span><span class='hs-varop'>==</span><span class='hs-varid'>w2</span>
<a name="line-508"></a>   <span class='hs-keyword'>where</span>
<a name="line-509"></a>      <span class='hs-conid'>FloatCat</span> <span class='hs-varop'>`weak_eq`</span> <span class='hs-conid'>FloatCat</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> 
<a name="line-510"></a>      <span class='hs-conid'>FloatCat</span> <span class='hs-varop'>`weak_eq`</span> <span class='hs-sel'>_other</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-511"></a>      <span class='hs-sel'>_other</span>   <span class='hs-varop'>`weak_eq`</span> <span class='hs-conid'>FloatCat</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-512"></a>      <span class='hs-sel'>_word1</span>   <span class='hs-varop'>`weak_eq`</span> <span class='hs-sel'>_word2</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>	<span class='hs-comment'>-- Ignores GcPtr</span>
<a name="line-513"></a>
<a name="line-514"></a><a name="typeWidth"></a><span class='hs-comment'>--- Simple operations on CmmType -----</span>
<a name="line-515"></a><span class='hs-definition'>typeWidth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Width</span>
<a name="line-516"></a><span class='hs-definition'>typeWidth</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>w</span>
<a name="line-517"></a>
<a name="line-518"></a><a name="cmmBits"></a><span class='hs-definition'>cmmBits</span><span class='hs-layout'>,</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span>
<a name="line-519"></a><span class='hs-definition'>cmmBits</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmType</span> <span class='hs-conid'>BitsCat</span>
<a name="line-520"></a><a name="cmmFloat"></a><span class='hs-definition'>cmmFloat</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmType</span> <span class='hs-conid'>FloatCat</span>
<a name="line-521"></a>
<a name="line-522"></a><a name="b8"></a><span class='hs-comment'>-------- Common CmmTypes ------------</span>
<a name="line-523"></a><span class='hs-comment'>-- Floats and words of specific widths</span>
<a name="line-524"></a><span class='hs-definition'>b8</span><span class='hs-layout'>,</span> <span class='hs-varid'>b16</span><span class='hs-layout'>,</span> <span class='hs-varid'>b32</span><span class='hs-layout'>,</span> <span class='hs-varid'>b64</span><span class='hs-layout'>,</span> <span class='hs-varid'>f32</span><span class='hs-layout'>,</span> <span class='hs-varid'>f64</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span>
<a name="line-525"></a><span class='hs-definition'>b8</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-conid'>W8</span>
<a name="line-526"></a><a name="b16"></a><span class='hs-definition'>b16</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-conid'>W16</span>
<a name="line-527"></a><a name="b32"></a><span class='hs-definition'>b32</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-conid'>W32</span>
<a name="line-528"></a><a name="b64"></a><span class='hs-definition'>b64</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-conid'>W64</span>
<a name="line-529"></a><a name="f32"></a><span class='hs-definition'>f32</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-conid'>W32</span>
<a name="line-530"></a><a name="f64"></a><span class='hs-definition'>f64</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-conid'>W64</span>
<a name="line-531"></a>
<a name="line-532"></a><a name="bWord"></a><span class='hs-comment'>-- CmmTypes of native word widths</span>
<a name="line-533"></a><span class='hs-definition'>bWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>bHalfWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>gcWord</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span>
<a name="line-534"></a><span class='hs-definition'>bWord</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>wordWidth</span>
<a name="line-535"></a><a name="bHalfWord"></a><span class='hs-definition'>bHalfWord</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>halfWordWidth</span>
<a name="line-536"></a><a name="gcWord"></a><span class='hs-definition'>gcWord</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmType</span> <span class='hs-conid'>GcPtrCat</span> <span class='hs-varid'>wordWidth</span>
<a name="line-537"></a>
<a name="line-538"></a><a name="cInt"></a><span class='hs-definition'>cInt</span><span class='hs-layout'>,</span> <span class='hs-varid'>cLong</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span>
<a name="line-539"></a><span class='hs-definition'>cInt</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>cIntWidth</span>
<a name="line-540"></a><a name="cLong"></a><span class='hs-definition'>cLong</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>cLongWidth</span>
<a name="line-541"></a>
<a name="line-542"></a>
<a name="line-543"></a><a name="isFloatType"></a><span class='hs-comment'>------------ Predicates ----------------</span>
<a name="line-544"></a><span class='hs-definition'>isFloatType</span><span class='hs-layout'>,</span> <span class='hs-varid'>isGcPtrType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-545"></a><span class='hs-definition'>isFloatType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-conid'>FloatCat</span>    <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-546"></a><span class='hs-definition'>isFloatType</span> <span class='hs-sel'>_other</span>		    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-547"></a>
<a name="line-548"></a><a name="isGcPtrType"></a><span class='hs-definition'>isGcPtrType</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-conid'>GcPtrCat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-549"></a><span class='hs-definition'>isGcPtrType</span> <span class='hs-sel'>_other</span>		 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-550"></a>
<a name="line-551"></a><a name="isWord32"></a><span class='hs-definition'>isWord32</span><span class='hs-layout'>,</span> <span class='hs-varid'>isWord64</span><span class='hs-layout'>,</span> <span class='hs-varid'>isFloat32</span><span class='hs-layout'>,</span> <span class='hs-varid'>isFloat64</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-552"></a><span class='hs-comment'>-- isWord64 is true of 64-bit non-floats (both gc-ptrs and otherwise)</span>
<a name="line-553"></a><span class='hs-comment'>-- isFloat32 and 64 are obvious</span>
<a name="line-554"></a>
<a name="line-555"></a><a name="isWord64"></a><span class='hs-definition'>isWord64</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-conid'>BitsCat</span>  <span class='hs-conid'>W64</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-556"></a><span class='hs-definition'>isWord64</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-conid'>GcPtrCat</span> <span class='hs-conid'>W64</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-557"></a><span class='hs-definition'>isWord64</span> <span class='hs-sel'>_other</span>			<span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-558"></a>
<a name="line-559"></a><span class='hs-definition'>isWord32</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-conid'>BitsCat</span>  <span class='hs-conid'>W32</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-560"></a><span class='hs-definition'>isWord32</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-conid'>GcPtrCat</span> <span class='hs-conid'>W32</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-561"></a><span class='hs-definition'>isWord32</span> <span class='hs-sel'>_other</span>			<span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-562"></a>
<a name="line-563"></a><a name="isFloat32"></a><span class='hs-definition'>isFloat32</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-conid'>FloatCat</span> <span class='hs-conid'>W32</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-564"></a><span class='hs-definition'>isFloat32</span> <span class='hs-sel'>_other</span>		 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-565"></a>
<a name="line-566"></a><a name="isFloat64"></a><span class='hs-definition'>isFloat64</span> <span class='hs-layout'>(</span><span class='hs-conid'>CmmType</span> <span class='hs-conid'>FloatCat</span> <span class='hs-conid'>W64</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-567"></a><span class='hs-definition'>isFloat64</span> <span class='hs-sel'>_other</span>		 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-568"></a>
<a name="line-569"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-570"></a><span class='hs-comment'>--    		Width</span>
<a name="line-571"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-572"></a>
<a name="line-573"></a><a name="Width"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Width</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W8</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>W16</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>W32</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>W64</span> 
<a name="line-574"></a>	     <span class='hs-keyglyph'>|</span> <span class='hs-conid'>W80</span>	<span class='hs-comment'>-- Extended double-precision float, </span>
<a name="line-575"></a>			<span class='hs-comment'>-- used in x86 native codegen only.</span>
<a name="line-576"></a>			<span class='hs-comment'>-- (we use Ord, so it'd better be in this order)</span>
<a name="line-577"></a>	     <span class='hs-keyglyph'>|</span> <span class='hs-conid'>W128</span>
<a name="line-578"></a>	     <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-579"></a>
<a name="line-580"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Width</span> <span class='hs-keyword'>where</span>
<a name="line-581"></a>   <span class='hs-varid'>ppr</span> <span class='hs-varid'>rep</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>mrStr</span> <span class='hs-varid'>rep</span><span class='hs-layout'>)</span>
<a name="line-582"></a>
<a name="line-583"></a><a name="mrStr"></a><span class='hs-definition'>mrStr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LitString</span>
<a name="line-584"></a><span class='hs-definition'>mrStr</span> <span class='hs-conid'>W8</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sLit</span><span class='hs-layout'>(</span><span class='hs-str'>"W8"</span><span class='hs-layout'>)</span>
<a name="line-585"></a><span class='hs-definition'>mrStr</span> <span class='hs-conid'>W16</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sLit</span><span class='hs-layout'>(</span><span class='hs-str'>"W16"</span><span class='hs-layout'>)</span>
<a name="line-586"></a><span class='hs-definition'>mrStr</span> <span class='hs-conid'>W32</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sLit</span><span class='hs-layout'>(</span><span class='hs-str'>"W32"</span><span class='hs-layout'>)</span>
<a name="line-587"></a><span class='hs-definition'>mrStr</span> <span class='hs-conid'>W64</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sLit</span><span class='hs-layout'>(</span><span class='hs-str'>"W64"</span><span class='hs-layout'>)</span>
<a name="line-588"></a><span class='hs-definition'>mrStr</span> <span class='hs-conid'>W128</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sLit</span><span class='hs-layout'>(</span><span class='hs-str'>"W128"</span><span class='hs-layout'>)</span>
<a name="line-589"></a><span class='hs-definition'>mrStr</span> <span class='hs-conid'>W80</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sLit</span><span class='hs-layout'>(</span><span class='hs-str'>"W80"</span><span class='hs-layout'>)</span>
<a name="line-590"></a>
<a name="line-591"></a>
<a name="line-592"></a><a name="wordWidth"></a><span class='hs-comment'>-------- Common Widths  ------------</span>
<a name="line-593"></a><span class='hs-definition'>wordWidth</span><span class='hs-layout'>,</span> <span class='hs-varid'>halfWordWidth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span>
<a name="line-594"></a><span class='hs-definition'>wordWidth</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wORD_SIZE</span> <span class='hs-varop'>==</span> <span class='hs-num'>4</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W32</span>
<a name="line-595"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wORD_SIZE</span> <span class='hs-varop'>==</span> <span class='hs-num'>8</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W64</span>
<a name="line-596"></a>	  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"MachOp.wordRep: Unknown word size"</span>
<a name="line-597"></a>
<a name="line-598"></a><a name="halfWordWidth"></a><span class='hs-definition'>halfWordWidth</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wORD_SIZE</span> <span class='hs-varop'>==</span> <span class='hs-num'>4</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W16</span>
<a name="line-599"></a>	      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wORD_SIZE</span> <span class='hs-varop'>==</span> <span class='hs-num'>8</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W32</span>
<a name="line-600"></a>	      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"MachOp.halfWordRep: Unknown word size"</span>
<a name="line-601"></a>
<a name="line-602"></a><a name="cIntWidth"></a><span class='hs-comment'>-- cIntRep is the Width for a C-language 'int'</span>
<a name="line-603"></a><span class='hs-definition'>cIntWidth</span><span class='hs-layout'>,</span> <span class='hs-varid'>cLongWidth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span>
<a name="line-604"></a><span class='hs-cpp'>#if SIZEOF_INT == 4</span>
<a name="line-605"></a><span class='hs-definition'>cIntWidth</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W32</span>
<a name="line-606"></a><span class='hs-cpp'>#elif  SIZEOF_INT == 8</span>
<a name="line-607"></a><span class='hs-definition'>cIntWidth</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W64</span>
<a name="line-608"></a><span class='hs-cpp'>#endif</span>
<a name="line-609"></a>
<a name="line-610"></a><span class='hs-cpp'>#if SIZEOF_LONG == 4</span>
<a name="line-611"></a><a name="cLongWidth"></a><span class='hs-definition'>cLongWidth</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W32</span>
<a name="line-612"></a><span class='hs-cpp'>#elif  SIZEOF_LONG == 8</span>
<a name="line-613"></a><span class='hs-definition'>cLongWidth</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W64</span>
<a name="line-614"></a><span class='hs-cpp'>#endif</span>
<a name="line-615"></a>
<a name="line-616"></a><a name="widthInBits"></a><span class='hs-definition'>widthInBits</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-617"></a><span class='hs-definition'>widthInBits</span> <span class='hs-conid'>W8</span>   <span class='hs-keyglyph'>=</span> <span class='hs-num'>8</span>
<a name="line-618"></a><span class='hs-definition'>widthInBits</span> <span class='hs-conid'>W16</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>16</span>
<a name="line-619"></a><span class='hs-definition'>widthInBits</span> <span class='hs-conid'>W32</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>32</span>
<a name="line-620"></a><span class='hs-definition'>widthInBits</span> <span class='hs-conid'>W64</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>64</span>
<a name="line-621"></a><span class='hs-definition'>widthInBits</span> <span class='hs-conid'>W128</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>128</span>
<a name="line-622"></a><span class='hs-definition'>widthInBits</span> <span class='hs-conid'>W80</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>80</span>
<a name="line-623"></a>
<a name="line-624"></a><a name="widthInBytes"></a><span class='hs-definition'>widthInBytes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-625"></a><span class='hs-definition'>widthInBytes</span> <span class='hs-conid'>W8</span>   <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span>
<a name="line-626"></a><span class='hs-definition'>widthInBytes</span> <span class='hs-conid'>W16</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span>
<a name="line-627"></a><span class='hs-definition'>widthInBytes</span> <span class='hs-conid'>W32</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>4</span>
<a name="line-628"></a><span class='hs-definition'>widthInBytes</span> <span class='hs-conid'>W64</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>8</span>
<a name="line-629"></a><span class='hs-definition'>widthInBytes</span> <span class='hs-conid'>W128</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>16</span>
<a name="line-630"></a><span class='hs-definition'>widthInBytes</span> <span class='hs-conid'>W80</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>10</span>
<a name="line-631"></a>
<a name="line-632"></a><a name="widthFromBytes"></a><span class='hs-definition'>widthFromBytes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Width</span>
<a name="line-633"></a><span class='hs-definition'>widthFromBytes</span> <span class='hs-num'>1</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W8</span>
<a name="line-634"></a><span class='hs-definition'>widthFromBytes</span> <span class='hs-num'>2</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W16</span>
<a name="line-635"></a><span class='hs-definition'>widthFromBytes</span> <span class='hs-num'>4</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W32</span>
<a name="line-636"></a><span class='hs-definition'>widthFromBytes</span> <span class='hs-num'>8</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W64</span>
<a name="line-637"></a><span class='hs-definition'>widthFromBytes</span> <span class='hs-num'>16</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W128</span>
<a name="line-638"></a><span class='hs-definition'>widthFromBytes</span> <span class='hs-num'>10</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>W80</span>
<a name="line-639"></a><span class='hs-definition'>widthFromBytes</span> <span class='hs-varid'>n</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"no width for given number of bytes"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-640"></a>
<a name="line-641"></a><a name="widthInLog"></a><span class='hs-comment'>-- log_2 of the width in bytes, useful for generating shifts.</span>
<a name="line-642"></a><span class='hs-definition'>widthInLog</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-643"></a><span class='hs-definition'>widthInLog</span> <span class='hs-conid'>W8</span>   <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-644"></a><span class='hs-definition'>widthInLog</span> <span class='hs-conid'>W16</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span>
<a name="line-645"></a><span class='hs-definition'>widthInLog</span> <span class='hs-conid'>W32</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span>
<a name="line-646"></a><span class='hs-definition'>widthInLog</span> <span class='hs-conid'>W64</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>3</span>
<a name="line-647"></a><span class='hs-definition'>widthInLog</span> <span class='hs-conid'>W128</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>4</span>
<a name="line-648"></a><span class='hs-definition'>widthInLog</span> <span class='hs-conid'>W80</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"widthInLog: F80"</span>
<a name="line-649"></a>
<a name="line-650"></a><span class='hs-comment'>-- widening / narrowing</span>
<a name="line-651"></a>
<a name="line-652"></a><a name="narrowU"></a><span class='hs-definition'>narrowU</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span>
<a name="line-653"></a><span class='hs-definition'>narrowU</span> <span class='hs-conid'>W8</span>  <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word8</span><span class='hs-layout'>)</span>
<a name="line-654"></a><span class='hs-definition'>narrowU</span> <span class='hs-conid'>W16</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word16</span><span class='hs-layout'>)</span>
<a name="line-655"></a><span class='hs-definition'>narrowU</span> <span class='hs-conid'>W32</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span>
<a name="line-656"></a><span class='hs-definition'>narrowU</span> <span class='hs-conid'>W64</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word64</span><span class='hs-layout'>)</span>
<a name="line-657"></a><span class='hs-definition'>narrowU</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"narrowTo"</span>
<a name="line-658"></a>
<a name="line-659"></a><a name="narrowS"></a><span class='hs-definition'>narrowS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Width</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span>
<a name="line-660"></a><span class='hs-definition'>narrowS</span> <span class='hs-conid'>W8</span>  <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int8</span><span class='hs-layout'>)</span>
<a name="line-661"></a><span class='hs-definition'>narrowS</span> <span class='hs-conid'>W16</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int16</span><span class='hs-layout'>)</span>
<a name="line-662"></a><span class='hs-definition'>narrowS</span> <span class='hs-conid'>W32</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int32</span><span class='hs-layout'>)</span>
<a name="line-663"></a><span class='hs-definition'>narrowS</span> <span class='hs-conid'>W64</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int64</span><span class='hs-layout'>)</span>
<a name="line-664"></a><span class='hs-definition'>narrowS</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"narrowTo"</span>
<a name="line-665"></a>
<a name="line-666"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-667"></a><span class='hs-comment'>--    		MachOp</span>
<a name="line-668"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-669"></a>
<a name="line-670"></a><span class='hs-comment'>{- 
<a name="line-671"></a>Implementation notes:
<a name="line-672"></a>
<a name="line-673"></a>It might suffice to keep just a width, without distinguishing between
<a name="line-674"></a>floating and integer types.  However, keeping the distinction will
<a name="line-675"></a>help the native code generator to assign registers more easily.
<a name="line-676"></a>-}</span>
<a name="line-677"></a>
<a name="line-678"></a>
<a name="line-679"></a><span class='hs-comment'>{- |
<a name="line-680"></a>Machine-level primops; ones which we can reasonably delegate to the
<a name="line-681"></a>native code generators to handle.  Basically contains C's primops
<a name="line-682"></a>and no others.
<a name="line-683"></a>
<a name="line-684"></a>Nomenclature: all ops indicate width and signedness, where
<a name="line-685"></a>appropriate.  Widths: 8\/16\/32\/64 means the given size, obviously.
<a name="line-686"></a>Nat means the operation works on STG word sized objects.
<a name="line-687"></a>Signedness: S means signed, U means unsigned.  For operations where
<a name="line-688"></a>signedness is irrelevant or makes no difference (for example
<a name="line-689"></a>integer add), the signedness component is omitted.
<a name="line-690"></a>
<a name="line-691"></a>An exception: NatP is a ptr-typed native word.  From the point of
<a name="line-692"></a>view of the native code generators this distinction is irrelevant,
<a name="line-693"></a>but the C code generator sometimes needs this info to emit the
<a name="line-694"></a>right casts.  
<a name="line-695"></a>-}</span>
<a name="line-696"></a>
<a name="line-697"></a><a name="MachOp"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>MachOp</span>
<a name="line-698"></a>  <span class='hs-comment'>-- Integer operations (insensitive to signed/unsigned)</span>
<a name="line-699"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Add</span> <span class='hs-conid'>Width</span>
<a name="line-700"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_Sub</span> <span class='hs-conid'>Width</span>
<a name="line-701"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_Eq</span>  <span class='hs-conid'>Width</span>
<a name="line-702"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_Ne</span>  <span class='hs-conid'>Width</span>
<a name="line-703"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_Mul</span> <span class='hs-conid'>Width</span>		<span class='hs-comment'>-- low word of multiply</span>
<a name="line-704"></a>
<a name="line-705"></a>  <span class='hs-comment'>-- Signed multiply/divide</span>
<a name="line-706"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_MulMayOflo</span> <span class='hs-conid'>Width</span> 	<span class='hs-comment'>-- nonzero if signed multiply overflows</span>
<a name="line-707"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_Quot</span> <span class='hs-conid'>Width</span>		<span class='hs-comment'>-- signed / (same semantics as IntQuotOp)</span>
<a name="line-708"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_Rem</span>  <span class='hs-conid'>Width</span>		<span class='hs-comment'>-- signed % (same semantics as IntRemOp)</span>
<a name="line-709"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_Neg</span>  <span class='hs-conid'>Width</span>		<span class='hs-comment'>-- unary -</span>
<a name="line-710"></a>
<a name="line-711"></a>  <span class='hs-comment'>-- Unsigned multiply/divide</span>
<a name="line-712"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_U_MulMayOflo</span> <span class='hs-conid'>Width</span>	<span class='hs-comment'>-- nonzero if unsigned multiply overflows</span>
<a name="line-713"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_U_Quot</span> <span class='hs-conid'>Width</span>		<span class='hs-comment'>-- unsigned / (same semantics as WordQuotOp)</span>
<a name="line-714"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_U_Rem</span>  <span class='hs-conid'>Width</span>		<span class='hs-comment'>-- unsigned % (same semantics as WordRemOp)</span>
<a name="line-715"></a>
<a name="line-716"></a>  <span class='hs-comment'>-- Signed comparisons</span>
<a name="line-717"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_Ge</span> <span class='hs-conid'>Width</span>
<a name="line-718"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_Le</span> <span class='hs-conid'>Width</span>
<a name="line-719"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_Gt</span> <span class='hs-conid'>Width</span>
<a name="line-720"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_Lt</span> <span class='hs-conid'>Width</span>
<a name="line-721"></a>
<a name="line-722"></a>  <span class='hs-comment'>-- Unsigned comparisons</span>
<a name="line-723"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_U_Ge</span> <span class='hs-conid'>Width</span>
<a name="line-724"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_U_Le</span> <span class='hs-conid'>Width</span>
<a name="line-725"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_U_Gt</span> <span class='hs-conid'>Width</span>
<a name="line-726"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_U_Lt</span> <span class='hs-conid'>Width</span>
<a name="line-727"></a>
<a name="line-728"></a>  <span class='hs-comment'>-- Floating point arithmetic</span>
<a name="line-729"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Add</span>  <span class='hs-conid'>Width</span>
<a name="line-730"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Sub</span>  <span class='hs-conid'>Width</span>
<a name="line-731"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Neg</span>  <span class='hs-conid'>Width</span>		<span class='hs-comment'>-- unary -</span>
<a name="line-732"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Mul</span>  <span class='hs-conid'>Width</span>
<a name="line-733"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Quot</span> <span class='hs-conid'>Width</span>
<a name="line-734"></a>
<a name="line-735"></a>  <span class='hs-comment'>-- Floating point comparison</span>
<a name="line-736"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Eq</span> <span class='hs-conid'>Width</span>
<a name="line-737"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Ne</span> <span class='hs-conid'>Width</span>
<a name="line-738"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Ge</span> <span class='hs-conid'>Width</span>
<a name="line-739"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Le</span> <span class='hs-conid'>Width</span>
<a name="line-740"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Gt</span> <span class='hs-conid'>Width</span>
<a name="line-741"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_F_Lt</span> <span class='hs-conid'>Width</span>
<a name="line-742"></a>
<a name="line-743"></a>  <span class='hs-comment'>-- Bitwise operations.  Not all of these may be supported </span>
<a name="line-744"></a>  <span class='hs-comment'>-- at all sizes, and only integral Widths are valid.</span>
<a name="line-745"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_And</span>   <span class='hs-conid'>Width</span>
<a name="line-746"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_Or</span>    <span class='hs-conid'>Width</span>
<a name="line-747"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_Xor</span>   <span class='hs-conid'>Width</span>
<a name="line-748"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_Not</span>   <span class='hs-conid'>Width</span>
<a name="line-749"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_Shl</span>   <span class='hs-conid'>Width</span>
<a name="line-750"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_U_Shr</span> <span class='hs-conid'>Width</span>	<span class='hs-comment'>-- unsigned shift right</span>
<a name="line-751"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_S_Shr</span> <span class='hs-conid'>Width</span>	<span class='hs-comment'>-- signed shift right</span>
<a name="line-752"></a>
<a name="line-753"></a>  <span class='hs-comment'>-- Conversions.  Some of these will be NOPs.</span>
<a name="line-754"></a>  <span class='hs-comment'>-- Floating-point conversions use the signed variant.</span>
<a name="line-755"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_SF_Conv</span> <span class='hs-conid'>Width</span> <span class='hs-conid'>Width</span> 	<span class='hs-comment'>-- Signed int -&gt; Float</span>
<a name="line-756"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_FS_Conv</span> <span class='hs-conid'>Width</span> <span class='hs-conid'>Width</span> 	<span class='hs-comment'>-- Float -&gt; Signed int</span>
<a name="line-757"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_SS_Conv</span> <span class='hs-conid'>Width</span> <span class='hs-conid'>Width</span> 	<span class='hs-comment'>-- Signed int -&gt; Signed int</span>
<a name="line-758"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-conid'>Width</span> <span class='hs-conid'>Width</span> 	<span class='hs-comment'>-- unsigned int -&gt; unsigned int</span>
<a name="line-759"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MO_FF_Conv</span> <span class='hs-conid'>Width</span> <span class='hs-conid'>Width</span> 	<span class='hs-comment'>-- Float -&gt; Float</span>
<a name="line-760"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-761"></a>
<a name="line-762"></a><a name="pprMachOp"></a><span class='hs-definition'>pprMachOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MachOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-763"></a><span class='hs-definition'>pprMachOp</span> <span class='hs-varid'>mo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>mo</span><span class='hs-layout'>)</span>
<a name="line-764"></a>
<a name="line-765"></a>
<a name="line-766"></a>
<a name="line-767"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-768"></a><span class='hs-comment'>-- Some common MachReps</span>
<a name="line-769"></a>
<a name="line-770"></a><span class='hs-comment'>-- A 'wordRep' is a machine word on the target architecture</span>
<a name="line-771"></a><span class='hs-comment'>-- Specifically, it is the size of an Int#, Word#, Addr# </span>
<a name="line-772"></a><span class='hs-comment'>-- and the unit of allocation on the stack and the heap</span>
<a name="line-773"></a><span class='hs-comment'>-- Any pointer is also guaranteed to be a wordRep.</span>
<a name="line-774"></a>
<a name="line-775"></a><a name="mo_wordAdd"></a><span class='hs-definition'>mo_wordAdd</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSub</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordEq</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordNe</span><span class='hs-layout'>,</span><span class='hs-varid'>mo_wordMul</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSQuot</span>
<a name="line-776"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSRem</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSNeg</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordUQuot</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordURem</span>
<a name="line-777"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSGe</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSLe</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSGt</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSLt</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordUGe</span> 
<a name="line-778"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordULe</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordUGt</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordULt</span>
<a name="line-779"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordAnd</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordOr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordXor</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordNot</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordShl</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordSShr</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_wordUShr</span>
<a name="line-780"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_8To32</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_8To32</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_16To32</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_16To32</span>
<a name="line-781"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_8ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_8ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_16ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_16ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_u_32ToWord</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_s_32ToWord</span>
<a name="line-782"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mo_32To8</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_32To16</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_WordTo8</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_WordTo16</span><span class='hs-layout'>,</span> <span class='hs-varid'>mo_WordTo32</span>
<a name="line-783"></a>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MachOp</span>
<a name="line-784"></a>
<a name="line-785"></a><span class='hs-definition'>mo_wordAdd</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Add</span> <span class='hs-varid'>wordWidth</span>
<a name="line-786"></a><a name="mo_wordSub"></a><span class='hs-definition'>mo_wordSub</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Sub</span> <span class='hs-varid'>wordWidth</span>
<a name="line-787"></a><a name="mo_wordEq"></a><span class='hs-definition'>mo_wordEq</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Eq</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-788"></a><a name="mo_wordNe"></a><span class='hs-definition'>mo_wordNe</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Ne</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-789"></a><a name="mo_wordMul"></a><span class='hs-definition'>mo_wordMul</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Mul</span> <span class='hs-varid'>wordWidth</span>
<a name="line-790"></a><a name="mo_wordSQuot"></a><span class='hs-definition'>mo_wordSQuot</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_S_Quot</span> <span class='hs-varid'>wordWidth</span>
<a name="line-791"></a><a name="mo_wordSRem"></a><span class='hs-definition'>mo_wordSRem</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_S_Rem</span> <span class='hs-varid'>wordWidth</span>
<a name="line-792"></a><a name="mo_wordSNeg"></a><span class='hs-definition'>mo_wordSNeg</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_S_Neg</span> <span class='hs-varid'>wordWidth</span>
<a name="line-793"></a><a name="mo_wordUQuot"></a><span class='hs-definition'>mo_wordUQuot</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_U_Quot</span> <span class='hs-varid'>wordWidth</span>
<a name="line-794"></a><a name="mo_wordURem"></a><span class='hs-definition'>mo_wordURem</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_U_Rem</span> <span class='hs-varid'>wordWidth</span>
<a name="line-795"></a>
<a name="line-796"></a><a name="mo_wordSGe"></a><span class='hs-definition'>mo_wordSGe</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_S_Ge</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-797"></a><a name="mo_wordSLe"></a><span class='hs-definition'>mo_wordSLe</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_S_Le</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-798"></a><a name="mo_wordSGt"></a><span class='hs-definition'>mo_wordSGt</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_S_Gt</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-799"></a><a name="mo_wordSLt"></a><span class='hs-definition'>mo_wordSLt</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_S_Lt</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-800"></a>
<a name="line-801"></a><a name="mo_wordUGe"></a><span class='hs-definition'>mo_wordUGe</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_U_Ge</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-802"></a><a name="mo_wordULe"></a><span class='hs-definition'>mo_wordULe</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_U_Le</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-803"></a><a name="mo_wordUGt"></a><span class='hs-definition'>mo_wordUGt</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_U_Gt</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-804"></a><a name="mo_wordULt"></a><span class='hs-definition'>mo_wordULt</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_U_Lt</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-805"></a>
<a name="line-806"></a><a name="mo_wordAnd"></a><span class='hs-definition'>mo_wordAnd</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_And</span> <span class='hs-varid'>wordWidth</span>
<a name="line-807"></a><a name="mo_wordOr"></a><span class='hs-definition'>mo_wordOr</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Or</span>	 <span class='hs-varid'>wordWidth</span>
<a name="line-808"></a><a name="mo_wordXor"></a><span class='hs-definition'>mo_wordXor</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Xor</span> <span class='hs-varid'>wordWidth</span>
<a name="line-809"></a><a name="mo_wordNot"></a><span class='hs-definition'>mo_wordNot</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Not</span> <span class='hs-varid'>wordWidth</span>
<a name="line-810"></a><a name="mo_wordShl"></a><span class='hs-definition'>mo_wordShl</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_Shl</span> <span class='hs-varid'>wordWidth</span>
<a name="line-811"></a><a name="mo_wordSShr"></a><span class='hs-definition'>mo_wordSShr</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_S_Shr</span> <span class='hs-varid'>wordWidth</span> 
<a name="line-812"></a><a name="mo_wordUShr"></a><span class='hs-definition'>mo_wordUShr</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_U_Shr</span> <span class='hs-varid'>wordWidth</span> 
<a name="line-813"></a>
<a name="line-814"></a><a name="mo_u_8To32"></a><span class='hs-definition'>mo_u_8To32</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-conid'>W8</span> <span class='hs-conid'>W32</span>
<a name="line-815"></a><a name="mo_s_8To32"></a><span class='hs-definition'>mo_s_8To32</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_SS_Conv</span> <span class='hs-conid'>W8</span> <span class='hs-conid'>W32</span>
<a name="line-816"></a><a name="mo_u_16To32"></a><span class='hs-definition'>mo_u_16To32</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-conid'>W16</span> <span class='hs-conid'>W32</span>
<a name="line-817"></a><a name="mo_s_16To32"></a><span class='hs-definition'>mo_s_16To32</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_SS_Conv</span> <span class='hs-conid'>W16</span> <span class='hs-conid'>W32</span>
<a name="line-818"></a>
<a name="line-819"></a><a name="mo_u_8ToWord"></a><span class='hs-definition'>mo_u_8ToWord</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-conid'>W8</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-820"></a><a name="mo_s_8ToWord"></a><span class='hs-definition'>mo_s_8ToWord</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_SS_Conv</span> <span class='hs-conid'>W8</span>  <span class='hs-varid'>wordWidth</span>
<a name="line-821"></a><a name="mo_u_16ToWord"></a><span class='hs-definition'>mo_u_16ToWord</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-conid'>W16</span> <span class='hs-varid'>wordWidth</span>
<a name="line-822"></a><a name="mo_s_16ToWord"></a><span class='hs-definition'>mo_s_16ToWord</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_SS_Conv</span> <span class='hs-conid'>W16</span> <span class='hs-varid'>wordWidth</span>
<a name="line-823"></a><a name="mo_s_32ToWord"></a><span class='hs-definition'>mo_s_32ToWord</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_SS_Conv</span> <span class='hs-conid'>W32</span> <span class='hs-varid'>wordWidth</span>
<a name="line-824"></a><a name="mo_u_32ToWord"></a><span class='hs-definition'>mo_u_32ToWord</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-conid'>W32</span> <span class='hs-varid'>wordWidth</span>
<a name="line-825"></a>
<a name="line-826"></a><a name="mo_WordTo8"></a><span class='hs-definition'>mo_WordTo8</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-varid'>wordWidth</span> <span class='hs-conid'>W8</span>
<a name="line-827"></a><a name="mo_WordTo16"></a><span class='hs-definition'>mo_WordTo16</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-varid'>wordWidth</span> <span class='hs-conid'>W16</span>
<a name="line-828"></a><a name="mo_WordTo32"></a><span class='hs-definition'>mo_WordTo32</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-varid'>wordWidth</span> <span class='hs-conid'>W32</span>
<a name="line-829"></a>
<a name="line-830"></a><a name="mo_32To8"></a><span class='hs-definition'>mo_32To8</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-conid'>W32</span> <span class='hs-conid'>W8</span>
<a name="line-831"></a><a name="mo_32To16"></a><span class='hs-definition'>mo_32To16</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-conid'>W32</span> <span class='hs-conid'>W16</span>
<a name="line-832"></a>
<a name="line-833"></a>
<a name="line-834"></a><span class='hs-comment'>-- ----------------------------------------------------------------------------</span>
<a name="line-835"></a><span class='hs-comment'>-- isCommutableMachOp</span>
<a name="line-836"></a>
<a name="line-837"></a><a name="isCommutableMachOp"></a><span class='hs-comment'>{- |
<a name="line-838"></a>Returns 'True' if the MachOp has commutable arguments.  This is used
<a name="line-839"></a>in the platform-independent Cmm optimisations.
<a name="line-840"></a>
<a name="line-841"></a>If in doubt, return 'False'.  This generates worse code on the
<a name="line-842"></a>native routes, but is otherwise harmless.
<a name="line-843"></a>-}</span>
<a name="line-844"></a><span class='hs-definition'>isCommutableMachOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MachOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-845"></a><span class='hs-definition'>isCommutableMachOp</span> <span class='hs-varid'>mop</span> <span class='hs-keyglyph'>=</span> 
<a name="line-846"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>mop</span> <span class='hs-keyword'>of</span>
<a name="line-847"></a>	<span class='hs-conid'>MO_Add</span> <span class='hs-keyword'>_</span> 		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-848"></a>	<span class='hs-conid'>MO_Eq</span> <span class='hs-keyword'>_</span>			<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-849"></a>	<span class='hs-conid'>MO_Ne</span> <span class='hs-keyword'>_</span>			<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-850"></a>	<span class='hs-conid'>MO_Mul</span> <span class='hs-keyword'>_</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-851"></a>	<span class='hs-conid'>MO_S_MulMayOflo</span> <span class='hs-keyword'>_</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-852"></a>	<span class='hs-conid'>MO_U_MulMayOflo</span> <span class='hs-keyword'>_</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-853"></a>	<span class='hs-conid'>MO_And</span> <span class='hs-keyword'>_</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-854"></a>	<span class='hs-conid'>MO_Or</span> <span class='hs-keyword'>_</span>			<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-855"></a>	<span class='hs-conid'>MO_Xor</span> <span class='hs-keyword'>_</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-856"></a>	<span class='hs-sel'>_other</span>			<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-857"></a>
<a name="line-858"></a><span class='hs-comment'>-- ----------------------------------------------------------------------------</span>
<a name="line-859"></a><span class='hs-comment'>-- isAssociativeMachOp</span>
<a name="line-860"></a>
<a name="line-861"></a><a name="isAssociativeMachOp"></a><span class='hs-comment'>{- |
<a name="line-862"></a>Returns 'True' if the MachOp is associative (i.e. @(x+y)+z == x+(y+z)@)
<a name="line-863"></a>This is used in the platform-independent Cmm optimisations.
<a name="line-864"></a>
<a name="line-865"></a>If in doubt, return 'False'.  This generates worse code on the
<a name="line-866"></a>native routes, but is otherwise harmless.
<a name="line-867"></a>-}</span>
<a name="line-868"></a><span class='hs-definition'>isAssociativeMachOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MachOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-869"></a><span class='hs-definition'>isAssociativeMachOp</span> <span class='hs-varid'>mop</span> <span class='hs-keyglyph'>=</span> 
<a name="line-870"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>mop</span> <span class='hs-keyword'>of</span>
<a name="line-871"></a>	<span class='hs-conid'>MO_Add</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>	<span class='hs-comment'>-- NB: does not include</span>
<a name="line-872"></a>	<span class='hs-conid'>MO_Mul</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span> <span class='hs-comment'>--     floatint point!</span>
<a name="line-873"></a>	<span class='hs-conid'>MO_And</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-874"></a>	<span class='hs-conid'>MO_Or</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-875"></a>	<span class='hs-conid'>MO_Xor</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-876"></a>	<span class='hs-sel'>_other</span>	  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-877"></a>
<a name="line-878"></a><span class='hs-comment'>-- ----------------------------------------------------------------------------</span>
<a name="line-879"></a><span class='hs-comment'>-- isComparisonMachOp</span>
<a name="line-880"></a>
<a name="line-881"></a><a name="isComparisonMachOp"></a><span class='hs-comment'>{- | 
<a name="line-882"></a>Returns 'True' if the MachOp is a comparison.
<a name="line-883"></a>
<a name="line-884"></a>If in doubt, return False.  This generates worse code on the
<a name="line-885"></a>native routes, but is otherwise harmless.
<a name="line-886"></a>-}</span>
<a name="line-887"></a><span class='hs-definition'>isComparisonMachOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MachOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-888"></a><span class='hs-definition'>isComparisonMachOp</span> <span class='hs-varid'>mop</span> <span class='hs-keyglyph'>=</span> 
<a name="line-889"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>mop</span> <span class='hs-keyword'>of</span>
<a name="line-890"></a>    <span class='hs-conid'>MO_Eq</span>   <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-891"></a>    <span class='hs-conid'>MO_Ne</span>   <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-892"></a>    <span class='hs-conid'>MO_S_Ge</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-893"></a>    <span class='hs-conid'>MO_S_Le</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-894"></a>    <span class='hs-conid'>MO_S_Gt</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-895"></a>    <span class='hs-conid'>MO_S_Lt</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-896"></a>    <span class='hs-conid'>MO_U_Ge</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-897"></a>    <span class='hs-conid'>MO_U_Le</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-898"></a>    <span class='hs-conid'>MO_U_Gt</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-899"></a>    <span class='hs-conid'>MO_U_Lt</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-900"></a>    <span class='hs-conid'>MO_F_Eq</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-901"></a>    <span class='hs-conid'>MO_F_Ne</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-902"></a>    <span class='hs-conid'>MO_F_Ge</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-903"></a>    <span class='hs-conid'>MO_F_Le</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-904"></a>    <span class='hs-conid'>MO_F_Gt</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-905"></a>    <span class='hs-conid'>MO_F_Lt</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-906"></a>    <span class='hs-sel'>_other</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-907"></a>
<a name="line-908"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-909"></a><span class='hs-comment'>-- Inverting conditions</span>
<a name="line-910"></a>
<a name="line-911"></a><span class='hs-comment'>-- Sometimes it's useful to be able to invert the sense of a</span>
<a name="line-912"></a><span class='hs-comment'>-- condition.  Not all conditional tests are invertible: in</span>
<a name="line-913"></a><span class='hs-comment'>-- particular, floating point conditionals cannot be inverted, because</span>
<a name="line-914"></a><span class='hs-comment'>-- there exist floating-point values which return False for both senses</span>
<a name="line-915"></a><span class='hs-comment'>-- of a condition (eg. !(NaN &gt; NaN) &amp;&amp; !(NaN /&lt;= NaN)).</span>
<a name="line-916"></a>
<a name="line-917"></a><a name="maybeInvertComparison"></a><span class='hs-definition'>maybeInvertComparison</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MachOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>MachOp</span>
<a name="line-918"></a><span class='hs-definition'>maybeInvertComparison</span> <span class='hs-varid'>op</span>
<a name="line-919"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>op</span> <span class='hs-keyword'>of</span>	<span class='hs-comment'>-- None of these Just cases include floating point</span>
<a name="line-920"></a>	<span class='hs-conid'>MO_Eq</span> <span class='hs-varid'>r</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_Ne</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-921"></a>	<span class='hs-conid'>MO_Ne</span> <span class='hs-varid'>r</span>	  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_Eq</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-922"></a>	<span class='hs-conid'>MO_U_Lt</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_U_Ge</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-923"></a>	<span class='hs-conid'>MO_U_Gt</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_U_Le</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-924"></a>	<span class='hs-conid'>MO_U_Le</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_U_Gt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-925"></a>	<span class='hs-conid'>MO_U_Ge</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_U_Lt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-926"></a>	<span class='hs-conid'>MO_S_Lt</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_S_Ge</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-927"></a>	<span class='hs-conid'>MO_S_Gt</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_S_Le</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-928"></a>	<span class='hs-conid'>MO_S_Le</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_S_Gt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-929"></a>	<span class='hs-conid'>MO_S_Ge</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_S_Lt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-930"></a>    	<span class='hs-conid'>MO_F_Eq</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_F_Ne</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-931"></a>    	<span class='hs-conid'>MO_F_Ne</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_F_Eq</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-932"></a>    	<span class='hs-conid'>MO_F_Ge</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_F_Le</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-933"></a>    	<span class='hs-conid'>MO_F_Le</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_F_Ge</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>	
<a name="line-934"></a>    	<span class='hs-conid'>MO_F_Gt</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_F_Lt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>	
<a name="line-935"></a>    	<span class='hs-conid'>MO_F_Lt</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>MO_F_Gt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>	
<a name="line-936"></a>	<span class='hs-sel'>_other</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-937"></a>
<a name="line-938"></a><span class='hs-comment'>-- ----------------------------------------------------------------------------</span>
<a name="line-939"></a><span class='hs-comment'>-- machOpResultType</span>
<a name="line-940"></a>
<a name="line-941"></a><a name="machOpResultType"></a><span class='hs-comment'>{- |
<a name="line-942"></a>Returns the MachRep of the result of a MachOp.
<a name="line-943"></a>-}</span>
<a name="line-944"></a><span class='hs-definition'>machOpResultType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MachOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CmmType</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CmmType</span>
<a name="line-945"></a><span class='hs-definition'>machOpResultType</span> <span class='hs-varid'>mop</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span>
<a name="line-946"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>mop</span> <span class='hs-keyword'>of</span>
<a name="line-947"></a>    <span class='hs-conid'>MO_Add</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ty1</span>	<span class='hs-comment'>-- Preserve GC-ptr-hood</span>
<a name="line-948"></a>    <span class='hs-conid'>MO_Sub</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> 		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ty1</span>	<span class='hs-comment'>-- of first arg</span>
<a name="line-949"></a>    <span class='hs-conid'>MO_Mul</span>    <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-950"></a>    <span class='hs-conid'>MO_S_MulMayOflo</span> <span class='hs-varid'>r</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-951"></a>    <span class='hs-conid'>MO_S_Quot</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-952"></a>    <span class='hs-conid'>MO_S_Rem</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-953"></a>    <span class='hs-conid'>MO_S_Neg</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-954"></a>    <span class='hs-conid'>MO_U_MulMayOflo</span> <span class='hs-varid'>r</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-955"></a>    <span class='hs-conid'>MO_U_Quot</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-956"></a>    <span class='hs-conid'>MO_U_Rem</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-957"></a>
<a name="line-958"></a>    <span class='hs-conid'>MO_Eq</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-959"></a>    <span class='hs-conid'>MO_Ne</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-960"></a>    <span class='hs-conid'>MO_S_Ge</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-961"></a>    <span class='hs-conid'>MO_S_Le</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-962"></a>    <span class='hs-conid'>MO_S_Gt</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-963"></a>    <span class='hs-conid'>MO_S_Lt</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-964"></a>
<a name="line-965"></a>    <span class='hs-conid'>MO_U_Ge</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-966"></a>    <span class='hs-conid'>MO_U_Le</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-967"></a>    <span class='hs-conid'>MO_U_Gt</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-968"></a>    <span class='hs-conid'>MO_U_Lt</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-969"></a>
<a name="line-970"></a>    <span class='hs-conid'>MO_F_Add</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-varid'>r</span>
<a name="line-971"></a>    <span class='hs-conid'>MO_F_Sub</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-varid'>r</span>
<a name="line-972"></a>    <span class='hs-conid'>MO_F_Mul</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-varid'>r</span>
<a name="line-973"></a>    <span class='hs-conid'>MO_F_Quot</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-varid'>r</span>
<a name="line-974"></a>    <span class='hs-conid'>MO_F_Neg</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-varid'>r</span>
<a name="line-975"></a>    <span class='hs-conid'>MO_F_Eq</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-976"></a>    <span class='hs-conid'>MO_F_Ne</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-977"></a>    <span class='hs-conid'>MO_F_Ge</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-978"></a>    <span class='hs-conid'>MO_F_Le</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-979"></a>    <span class='hs-conid'>MO_F_Gt</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-980"></a>    <span class='hs-conid'>MO_F_Lt</span>  <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>comparisonResultRep</span>
<a name="line-981"></a>
<a name="line-982"></a>    <span class='hs-conid'>MO_And</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ty1</span>	<span class='hs-comment'>-- Used for pointer masking</span>
<a name="line-983"></a>    <span class='hs-conid'>MO_Or</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ty1</span>
<a name="line-984"></a>    <span class='hs-conid'>MO_Xor</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ty1</span>
<a name="line-985"></a>    <span class='hs-conid'>MO_Not</span>   <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-986"></a>    <span class='hs-conid'>MO_Shl</span>   <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-987"></a>    <span class='hs-conid'>MO_U_Shr</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-988"></a>    <span class='hs-conid'>MO_S_Shr</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>r</span>
<a name="line-989"></a>
<a name="line-990"></a>    <span class='hs-conid'>MO_SS_Conv</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>to</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>to</span>
<a name="line-991"></a>    <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>to</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>to</span>
<a name="line-992"></a>    <span class='hs-conid'>MO_FS_Conv</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>to</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmBits</span> <span class='hs-varid'>to</span>
<a name="line-993"></a>    <span class='hs-conid'>MO_SF_Conv</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>to</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-varid'>to</span>
<a name="line-994"></a>    <span class='hs-conid'>MO_FF_Conv</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>to</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cmmFloat</span> <span class='hs-varid'>to</span>
<a name="line-995"></a>  <span class='hs-keyword'>where</span>
<a name="line-996"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>ty1</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tys</span>
<a name="line-997"></a>
<a name="line-998"></a><a name="comparisonResultRep"></a><span class='hs-definition'>comparisonResultRep</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CmmType</span>
<a name="line-999"></a><span class='hs-definition'>comparisonResultRep</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bWord</span>  <span class='hs-comment'>-- is it?</span>
<a name="line-1000"></a>
<a name="line-1001"></a>
<a name="line-1002"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-1003"></a><span class='hs-comment'>-- machOpArgReps</span>
<a name="line-1004"></a>
<a name="line-1005"></a><span class='hs-comment'>-- | This function is used for debugging only: we can check whether an</span>
<a name="line-1006"></a><span class='hs-comment'>-- application of a MachOp is "type-correct" by checking that the MachReps of</span>
<a name="line-1007"></a><span class='hs-comment'>-- its arguments are the same as the MachOp expects.  This is used when </span>
<a name="line-1008"></a><span class='hs-comment'>-- linting a CmmExpr.</span>
<a name="line-1009"></a>
<a name="line-1010"></a><a name="machOpArgReps"></a><span class='hs-definition'>machOpArgReps</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MachOp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Width</span><span class='hs-keyglyph'>]</span>
<a name="line-1011"></a><span class='hs-definition'>machOpArgReps</span> <span class='hs-varid'>op</span> <span class='hs-keyglyph'>=</span> 
<a name="line-1012"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>op</span> <span class='hs-keyword'>of</span>
<a name="line-1013"></a>    <span class='hs-conid'>MO_Add</span>    <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1014"></a>    <span class='hs-conid'>MO_Sub</span>    <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1015"></a>    <span class='hs-conid'>MO_Eq</span>     <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1016"></a>    <span class='hs-conid'>MO_Ne</span>     <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1017"></a>    <span class='hs-conid'>MO_Mul</span>    <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1018"></a>    <span class='hs-conid'>MO_S_MulMayOflo</span> <span class='hs-varid'>r</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1019"></a>    <span class='hs-conid'>MO_S_Quot</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1020"></a>    <span class='hs-conid'>MO_S_Rem</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1021"></a>    <span class='hs-conid'>MO_S_Neg</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1022"></a>    <span class='hs-conid'>MO_U_MulMayOflo</span> <span class='hs-varid'>r</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1023"></a>    <span class='hs-conid'>MO_U_Quot</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1024"></a>    <span class='hs-conid'>MO_U_Rem</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1025"></a>
<a name="line-1026"></a>    <span class='hs-conid'>MO_S_Ge</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1027"></a>    <span class='hs-conid'>MO_S_Le</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1028"></a>    <span class='hs-conid'>MO_S_Gt</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1029"></a>    <span class='hs-conid'>MO_S_Lt</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1030"></a>
<a name="line-1031"></a>    <span class='hs-conid'>MO_U_Ge</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1032"></a>    <span class='hs-conid'>MO_U_Le</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1033"></a>    <span class='hs-conid'>MO_U_Gt</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1034"></a>    <span class='hs-conid'>MO_U_Lt</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1035"></a>
<a name="line-1036"></a>    <span class='hs-conid'>MO_F_Add</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1037"></a>    <span class='hs-conid'>MO_F_Sub</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1038"></a>    <span class='hs-conid'>MO_F_Mul</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1039"></a>    <span class='hs-conid'>MO_F_Quot</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1040"></a>    <span class='hs-conid'>MO_F_Neg</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1041"></a>    <span class='hs-conid'>MO_F_Eq</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1042"></a>    <span class='hs-conid'>MO_F_Ne</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1043"></a>    <span class='hs-conid'>MO_F_Ge</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1044"></a>    <span class='hs-conid'>MO_F_Le</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1045"></a>    <span class='hs-conid'>MO_F_Gt</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1046"></a>    <span class='hs-conid'>MO_F_Lt</span>  <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1047"></a>
<a name="line-1048"></a>    <span class='hs-conid'>MO_And</span>   <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1049"></a>    <span class='hs-conid'>MO_Or</span>    <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1050"></a>    <span class='hs-conid'>MO_Xor</span>   <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1051"></a>    <span class='hs-conid'>MO_Not</span>   <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-keyglyph'>]</span>
<a name="line-1052"></a>    <span class='hs-conid'>MO_Shl</span>   <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>wordWidth</span><span class='hs-keyglyph'>]</span>
<a name="line-1053"></a>    <span class='hs-conid'>MO_U_Shr</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>wordWidth</span><span class='hs-keyglyph'>]</span>
<a name="line-1054"></a>    <span class='hs-conid'>MO_S_Shr</span> <span class='hs-varid'>r</span>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>wordWidth</span><span class='hs-keyglyph'>]</span>
<a name="line-1055"></a>
<a name="line-1056"></a>    <span class='hs-conid'>MO_SS_Conv</span> <span class='hs-varid'>from</span> <span class='hs-keyword'>_</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>from</span><span class='hs-keyglyph'>]</span>
<a name="line-1057"></a>    <span class='hs-conid'>MO_UU_Conv</span> <span class='hs-varid'>from</span> <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>from</span><span class='hs-keyglyph'>]</span>
<a name="line-1058"></a>    <span class='hs-conid'>MO_SF_Conv</span> <span class='hs-varid'>from</span> <span class='hs-keyword'>_</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>from</span><span class='hs-keyglyph'>]</span>
<a name="line-1059"></a>    <span class='hs-conid'>MO_FS_Conv</span> <span class='hs-varid'>from</span> <span class='hs-keyword'>_</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>from</span><span class='hs-keyglyph'>]</span>
<a name="line-1060"></a>    <span class='hs-conid'>MO_FF_Conv</span> <span class='hs-varid'>from</span> <span class='hs-keyword'>_</span>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>from</span><span class='hs-keyglyph'>]</span>
<a name="line-1061"></a>
<a name="line-1062"></a>
<a name="line-1063"></a><span class='hs-comment'>-------------------------------------------------------------------------</span>
<a name="line-1064"></a><span class='hs-comment'>{-	Note [Signed vs unsigned]
<a name="line-1065"></a>	~~~~~~~~~~~~~~~~~~~~~~~~~
<a name="line-1066"></a>Should a CmmType include a signed vs. unsigned distinction?
<a name="line-1067"></a>
<a name="line-1068"></a>This is very much like a "hint" in C-- terminology: it isn't necessary
<a name="line-1069"></a>in order to generate correct code, but it might be useful in that the
<a name="line-1070"></a>compiler can generate better code if it has access to higher-level
<a name="line-1071"></a>hints about data.  This is important at call boundaries, because the
<a name="line-1072"></a>definition of a function is not visible at all of its call sites, so
<a name="line-1073"></a>the compiler cannot infer the hints.
<a name="line-1074"></a>
<a name="line-1075"></a>Here in Cmm, we're taking a slightly different approach.  We include
<a name="line-1076"></a>the int vs. float hint in the MachRep, because (a) the majority of
<a name="line-1077"></a>platforms have a strong distinction between float and int registers,
<a name="line-1078"></a>and (b) we don't want to do any heavyweight hint-inference in the
<a name="line-1079"></a>native code backend in order to get good code.  We're treating the
<a name="line-1080"></a>hint more like a type: our Cmm is always completely consistent with
<a name="line-1081"></a>respect to hints.  All coercions between float and int are explicit.
<a name="line-1082"></a>
<a name="line-1083"></a>What about the signed vs. unsigned hint?  This information might be
<a name="line-1084"></a>useful if we want to keep sub-word-sized values in word-size
<a name="line-1085"></a>registers, which we must do if we only have word-sized registers.
<a name="line-1086"></a>
<a name="line-1087"></a>On such a system, there are two straightforward conventions for
<a name="line-1088"></a>representing sub-word-sized values:
<a name="line-1089"></a>
<a name="line-1090"></a>(a) Leave the upper bits undefined.  Comparison operations must
<a name="line-1091"></a>    sign- or zero-extend both operands before comparing them,
<a name="line-1092"></a>    depending on whether the comparison is signed or unsigned.
<a name="line-1093"></a>
<a name="line-1094"></a>(b) Always keep the values sign- or zero-extended as appropriate.
<a name="line-1095"></a>    Arithmetic operations must narrow the result to the appropriate
<a name="line-1096"></a>    size.
<a name="line-1097"></a>
<a name="line-1098"></a>A clever compiler might not use either (a) or (b) exclusively, instead
<a name="line-1099"></a>it would attempt to minimize the coercions by analysis: the same kind
<a name="line-1100"></a>of analysis that propagates hints around.  In Cmm we don't want to
<a name="line-1101"></a>have to do this, so we plump for having richer types and keeping the
<a name="line-1102"></a>type information consistent.
<a name="line-1103"></a>
<a name="line-1104"></a>If signed/unsigned hints are missing from MachRep, then the only
<a name="line-1105"></a>choice we have is (a), because we don't know whether the result of an
<a name="line-1106"></a>operation should be sign- or zero-extended.
<a name="line-1107"></a>
<a name="line-1108"></a>Many architectures have extending load operations, which work well
<a name="line-1109"></a>with (b).  To make use of them with (a), you need to know whether the
<a name="line-1110"></a>value is going to be sign- or zero-extended by an enclosing comparison
<a name="line-1111"></a>(for example), which involves knowing above the context.  This is
<a name="line-1112"></a>doable but more complex.
<a name="line-1113"></a>
<a name="line-1114"></a>Further complicating the issue is foreign calls: a foreign calling
<a name="line-1115"></a>convention can specify that signed 8-bit quantities are passed as
<a name="line-1116"></a>sign-extended 32 bit quantities, for example (this is the case on the
<a name="line-1117"></a>PowerPC).  So we *do* need sign information on foreign call arguments.
<a name="line-1118"></a>
<a name="line-1119"></a>Pros for adding signed vs. unsigned to MachRep:
<a name="line-1120"></a>
<a name="line-1121"></a>  - It would let us use convention (b) above, and get easier
<a name="line-1122"></a>    code generation for extending loads.
<a name="line-1123"></a>
<a name="line-1124"></a>  - Less information required on foreign calls.
<a name="line-1125"></a>  
<a name="line-1126"></a>  - MachOp type would be simpler
<a name="line-1127"></a>
<a name="line-1128"></a>Cons:
<a name="line-1129"></a>
<a name="line-1130"></a>  - More complexity
<a name="line-1131"></a>
<a name="line-1132"></a>  - What is the MachRep for a VanillaReg?  Currently it is
<a name="line-1133"></a>    always wordRep, but now we have to decide whether it is
<a name="line-1134"></a>    signed or unsigned.  The same VanillaReg can thus have
<a name="line-1135"></a>    different MachReps in different parts of the program.
<a name="line-1136"></a>
<a name="line-1137"></a>  - Extra coercions cluttering up expressions.
<a name="line-1138"></a>
<a name="line-1139"></a>Currently for GHC, the foreign call point is moot, because we do our
<a name="line-1140"></a>own promotion of sub-word-sized values to word-sized values.  The Int8
<a name="line-1141"></a>type is represnted by an Int# which is kept sign-extended at all times
<a name="line-1142"></a>(this is slightly naughty, because we're making assumptions about the
<a name="line-1143"></a>C calling convention rather early on in the compiler).  However, given
<a name="line-1144"></a>this, the cons outweigh the pros.
<a name="line-1145"></a>
<a name="line-1146"></a>-}</span>
<a name="line-1147"></a>
</pre></body>
</html>