Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1768

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>basicTypes/Literal.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1998
%
\section[Literal]{@Literal@: Machine literals (unboxed, of course)}

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS -fno-warn-incomplete-patterns #-}</span>
<a name="line-2"></a><span class='hs-comment'>-- The above warning supression flag is a temporary kludge.</span>
<a name="line-3"></a><span class='hs-comment'>-- While working on this module you are encouraged to remove it and fix</span>
<a name="line-4"></a><span class='hs-comment'>-- any warnings in the module. See</span>
<a name="line-5"></a><span class='hs-comment'>--     <a href="http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings">http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings</a></span>
<a name="line-6"></a><span class='hs-comment'>-- for details</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Literal</span>
<a name="line-9"></a>	<span class='hs-layout'>(</span> 
<a name="line-10"></a>	<span class='hs-comment'>-- * Main data type</span>
<a name="line-11"></a>	  <span class='hs-conid'>Literal</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>		<span class='hs-comment'>-- Exported to ParseIface</span>
<a name="line-12"></a>	
<a name="line-13"></a>	<span class='hs-comment'>-- ** Creating Literals</span>
<a name="line-14"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>mkMachInt</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkMachWord</span>
<a name="line-15"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>mkMachInt64</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkMachWord64</span>
<a name="line-16"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>mkMachFloat</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkMachDouble</span>
<a name="line-17"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>mkMachChar</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkMachString</span>
<a name="line-18"></a>	
<a name="line-19"></a>	<span class='hs-comment'>-- ** Operations on Literals</span>
<a name="line-20"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>literalType</span>
<a name="line-21"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>hashLiteral</span>
<a name="line-22"></a>
<a name="line-23"></a>        <span class='hs-comment'>-- ** Predicates on Literals and their contents</span>
<a name="line-24"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>litIsDupable</span><span class='hs-layout'>,</span> <span class='hs-varid'>litIsTrivial</span>
<a name="line-25"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>inIntRange</span><span class='hs-layout'>,</span> <span class='hs-varid'>inWordRange</span><span class='hs-layout'>,</span> <span class='hs-varid'>tARGET_MAX_INT</span><span class='hs-layout'>,</span> <span class='hs-varid'>inCharRange</span>
<a name="line-26"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>isZeroLit</span>
<a name="line-27"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>litFitsInChar</span>
<a name="line-28"></a>
<a name="line-29"></a>        <span class='hs-comment'>-- ** Coercions</span>
<a name="line-30"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>word2IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>int2WordLit</span>
<a name="line-31"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>narrow8IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrow16IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrow32IntLit</span>
<a name="line-32"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>narrow8WordLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrow16WordLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrow32WordLit</span>
<a name="line-33"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>char2IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>int2CharLit</span>
<a name="line-34"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>float2IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>int2FloatLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>double2IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>int2DoubleLit</span>
<a name="line-35"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>nullAddrLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>float2DoubleLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>double2FloatLit</span>
<a name="line-36"></a>	<span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysPrim</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Type</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastTypes</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Binary</span>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Constants</span>
<a name="line-46"></a>
<a name="line-47"></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-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ratio</span>
<a name="line-49"></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-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Literals}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="Literal"></a><span class='hs-comment'>-- | So-called 'Literal's are one of:</span>
<a name="line-2"></a><a name="Literal"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><a name="Literal"></a><span class='hs-comment'>-- * An unboxed (/machine/) literal ('MachInt', 'MachFloat', etc.),</span>
<a name="line-4"></a><a name="Literal"></a><span class='hs-comment'>--   which is presumed to be surrounded by appropriate constructors</span>
<a name="line-5"></a><a name="Literal"></a><span class='hs-comment'>--   (@Int#@, etc.), so that the overall thing makes sense.</span>
<a name="line-6"></a><a name="Literal"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><a name="Literal"></a><span class='hs-comment'>-- * The literal derived from the label mentioned in a \"foreign label\" </span>
<a name="line-8"></a><a name="Literal"></a><span class='hs-comment'>--   declaration ('MachLabel')</span>
<a name="line-9"></a><a name="Literal"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Literal</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>=</span>	<span class='hs-comment'>------------------</span>
<a name="line-11"></a>	<span class='hs-comment'>-- First the primitive guys</span>
<a name="line-12"></a>    <span class='hs-conid'>MachChar</span>	<span class='hs-conid'>Char</span>            <span class='hs-comment'>-- ^ @Char#@ - at least 31 bits. Create with 'mkMachChar'</span>
<a name="line-13"></a>
<a name="line-14"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachStr</span>	<span class='hs-conid'>FastString</span>	<span class='hs-comment'>-- ^ A string-literal: stored and emitted</span>
<a name="line-15"></a>				<span class='hs-comment'>-- UTF-8 encoded, we'll arrange to decode it</span>
<a name="line-16"></a>				<span class='hs-comment'>-- at runtime.  Also emitted with a @'\0'@</span>
<a name="line-17"></a>				<span class='hs-comment'>-- terminator. Create with 'mkMachString'</span>
<a name="line-18"></a>
<a name="line-19"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachNullAddr</span>                <span class='hs-comment'>-- ^ The @NULL@ pointer, the only pointer value</span>
<a name="line-20"></a>                                <span class='hs-comment'>-- that can be represented as a Literal. Create </span>
<a name="line-21"></a>                                <span class='hs-comment'>-- with 'nullAddrLit'</span>
<a name="line-22"></a>
<a name="line-23"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachInt</span>	<span class='hs-conid'>Integer</span>		<span class='hs-comment'>-- ^ @Int#@ - at least @WORD_SIZE_IN_BITS@ bits. Create with 'mkMachInt'</span>
<a name="line-24"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachInt64</span>	<span class='hs-conid'>Integer</span>		<span class='hs-comment'>-- ^ @Int64#@ - at least 64 bits. Create with 'mkMachInt64'</span>
<a name="line-25"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachWord</span>	<span class='hs-conid'>Integer</span>		<span class='hs-comment'>-- ^ @Word#@ - at least @WORD_SIZE_IN_BITS@ bits. Create with 'mkMachWord'</span>
<a name="line-26"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachWord64</span>	<span class='hs-conid'>Integer</span>		<span class='hs-comment'>-- ^ @Word64#@ - at least 64 bits. Create with 'mkMachWord64'</span>
<a name="line-27"></a>
<a name="line-28"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachFloat</span>	<span class='hs-conid'>Rational</span>        <span class='hs-comment'>-- ^ @Float#@. Create with 'mkMachFloat'</span>
<a name="line-29"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachDouble</span>	<span class='hs-conid'>Rational</span>        <span class='hs-comment'>-- ^ @Double#@. Create with 'mkMachDouble'</span>
<a name="line-30"></a>
<a name="line-31"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>MachLabel</span>   <span class='hs-conid'>FastString</span>
<a name="line-32"></a>  		<span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-33"></a>        <span class='hs-conid'>FunctionOrData</span>
<a name="line-34"></a>                <span class='hs-comment'>-- ^ A label literal. Parameters:</span>
<a name="line-35"></a>  		        <span class='hs-comment'>--</span>
<a name="line-36"></a>  		        <span class='hs-comment'>-- 1) The name of the symbol mentioned in the declaration</span>
<a name="line-37"></a>  		        <span class='hs-comment'>--</span>
<a name="line-38"></a>  		        <span class='hs-comment'>-- 2) The size (in bytes) of the arguments</span>
<a name="line-39"></a>				<span class='hs-comment'>--    the label expects. Only applicable with</span>
<a name="line-40"></a>				<span class='hs-comment'>--    @stdcall@ labels. @Just x@ =&gt; @\&lt;x\&gt;@ will</span>
<a name="line-41"></a>				<span class='hs-comment'>--    be appended to label name when emitting assembly.</span>
</pre>\end{code}

Binary instance

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Binary</span> <span class='hs-conid'>Literal</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span> <span class='hs-varid'>aa</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>0</span><span class='hs-layout'>;</span> <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>aa</span>
<a name="line-3"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-varid'>ab</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>1</span><span class='hs-layout'>;</span> <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>ab</span>
<a name="line-4"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachNullAddr</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>2</span>
<a name="line-5"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span> <span class='hs-varid'>ad</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>3</span><span class='hs-layout'>;</span> <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>ad</span>
<a name="line-6"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span> <span class='hs-varid'>ae</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>4</span><span class='hs-layout'>;</span> <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>ae</span>
<a name="line-7"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>af</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>5</span><span class='hs-layout'>;</span> <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>af</span>
<a name="line-8"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span> <span class='hs-varid'>ag</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>6</span><span class='hs-layout'>;</span> <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>ag</span>
<a name="line-9"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span> <span class='hs-varid'>ah</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>7</span><span class='hs-layout'>;</span> <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>ah</span>
<a name="line-10"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-varid'>ai</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>8</span><span class='hs-layout'>;</span> <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>ai</span>
<a name="line-11"></a>    <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachLabel</span> <span class='hs-varid'>aj</span> <span class='hs-varid'>mb</span> <span class='hs-varid'>fod</span><span class='hs-layout'>)</span>
<a name="line-12"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>putByte</span> <span class='hs-varid'>bh</span> <span class='hs-num'>9</span>
<a name="line-13"></a>             <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>aj</span>
<a name="line-14"></a>             <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>mb</span>
<a name="line-15"></a>             <span class='hs-varid'>put_</span> <span class='hs-varid'>bh</span> <span class='hs-varid'>fod</span>
<a name="line-16"></a>    <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-17"></a>	    <span class='hs-varid'>h</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getByte</span> <span class='hs-varid'>bh</span>
<a name="line-18"></a>	    <span class='hs-keyword'>case</span> <span class='hs-varid'>h</span> <span class='hs-keyword'>of</span>
<a name="line-19"></a>	      <span class='hs-num'>0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-20"></a>		    <span class='hs-varid'>aa</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-21"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span> <span class='hs-varid'>aa</span><span class='hs-layout'>)</span>
<a name="line-22"></a>	      <span class='hs-num'>1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-23"></a>		    <span class='hs-varid'>ab</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-24"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-varid'>ab</span><span class='hs-layout'>)</span>
<a name="line-25"></a>	      <span class='hs-num'>2</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-26"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachNullAddr</span><span class='hs-layout'>)</span>
<a name="line-27"></a>	      <span class='hs-num'>3</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-28"></a>		    <span class='hs-varid'>ad</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-29"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span> <span class='hs-varid'>ad</span><span class='hs-layout'>)</span>
<a name="line-30"></a>	      <span class='hs-num'>4</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-31"></a>		    <span class='hs-varid'>ae</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-32"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span> <span class='hs-varid'>ae</span><span class='hs-layout'>)</span>
<a name="line-33"></a>	      <span class='hs-num'>5</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-34"></a>		    <span class='hs-varid'>af</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-35"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>af</span><span class='hs-layout'>)</span>
<a name="line-36"></a>	      <span class='hs-num'>6</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-37"></a>		    <span class='hs-varid'>ag</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-38"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span> <span class='hs-varid'>ag</span><span class='hs-layout'>)</span>
<a name="line-39"></a>	      <span class='hs-num'>7</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-40"></a>		    <span class='hs-varid'>ah</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-41"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span> <span class='hs-varid'>ah</span><span class='hs-layout'>)</span>
<a name="line-42"></a>	      <span class='hs-num'>8</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-43"></a>		    <span class='hs-varid'>ai</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-44"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-varid'>ai</span><span class='hs-layout'>)</span>
<a name="line-45"></a>	      <span class='hs-num'>9</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-46"></a>		    <span class='hs-varid'>aj</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-47"></a>		    <span class='hs-varid'>mb</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-48"></a>		    <span class='hs-varid'>fod</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span> <span class='hs-varid'>bh</span>
<a name="line-49"></a>		    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachLabel</span> <span class='hs-varid'>aj</span> <span class='hs-varid'>mb</span> <span class='hs-varid'>fod</span><span class='hs-layout'>)</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Literal</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>    <span class='hs-varid'>ppr</span> <span class='hs-varid'>lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprLit</span> <span class='hs-varid'>lit</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>Literal</span> <span class='hs-keyword'>where</span>
<a name="line-5"></a>    <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>p</span> <span class='hs-varid'>lit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showsPrecSDoc</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>lit</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>Literal</span> <span class='hs-keyword'>where</span>
<a name="line-8"></a>    <span class='hs-varid'>a</span> <span class='hs-varop'>==</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span>   <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span> <span class='hs-layout'>}</span>
<a name="line-9"></a>    <span class='hs-varid'>a</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span>  <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>  <span class='hs-layout'>}</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Ord</span> <span class='hs-conid'>Literal</span> <span class='hs-keyword'>where</span>
<a name="line-12"></a>    <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span>  <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span>  <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span> <span class='hs-layout'>}</span>
<a name="line-13"></a>    <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;</span>	 <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span>  <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span> <span class='hs-layout'>}</span>
<a name="line-14"></a>    <span class='hs-varid'>a</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span>  <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>  <span class='hs-layout'>}</span>
<a name="line-15"></a>    <span class='hs-varid'>a</span> <span class='hs-varop'>&gt;</span>	 <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>  <span class='hs-layout'>}</span>
<a name="line-16"></a>    <span class='hs-varid'>compare</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cmpLit</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span>
</pre>\end{code}


	Construction
	~~~~~~~~~~~~
\begin{code}
<pre><a name="line-1"></a><a name="mkMachInt"></a><span class='hs-comment'>-- | Creates a 'Literal' of type @Int#@</span>
<a name="line-2"></a><span class='hs-definition'>mkMachInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-3"></a><span class='hs-definition'>mkMachInt</span>  <span class='hs-varid'>x</span>   <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-- ASSERT2( inIntRange x,  integer x ) </span>
<a name="line-4"></a>	 	 <span class='hs-comment'>-- Not true: you can write out of range Int# literals</span>
<a name="line-5"></a>		 <span class='hs-comment'>-- For example, one can write (intToWord# 0xffff0000) to</span>
<a name="line-6"></a>		 <span class='hs-comment'>-- get a particular Word bit-pattern, and there's no other</span>
<a name="line-7"></a>		 <span class='hs-comment'>-- convenient way to write such literals, which is why we allow it.</span>
<a name="line-8"></a>		 <span class='hs-conid'>MachInt</span> <span class='hs-varid'>x</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="mkMachWord"></a><span class='hs-comment'>-- | Creates a 'Literal' of type @Word#@</span>
<a name="line-11"></a><span class='hs-definition'>mkMachWord</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-12"></a><span class='hs-definition'>mkMachWord</span> <span class='hs-varid'>x</span>   <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-- ASSERT2( inWordRange x, integer x ) </span>
<a name="line-13"></a>		 <span class='hs-conid'>MachWord</span> <span class='hs-varid'>x</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="mkMachInt64"></a><span class='hs-comment'>-- | Creates a 'Literal' of type @Int64#@</span>
<a name="line-16"></a><span class='hs-definition'>mkMachInt64</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-17"></a><span class='hs-definition'>mkMachInt64</span>  <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt64</span> <span class='hs-varid'>x</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="mkMachWord64"></a><span class='hs-comment'>-- | Creates a 'Literal' of type @Word64#@</span>
<a name="line-20"></a><span class='hs-definition'>mkMachWord64</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-21"></a><span class='hs-definition'>mkMachWord64</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachWord64</span> <span class='hs-varid'>x</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="mkMachFloat"></a><span class='hs-comment'>-- | Creates a 'Literal' of type @Float#@</span>
<a name="line-24"></a><span class='hs-definition'>mkMachFloat</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-25"></a><span class='hs-definition'>mkMachFloat</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachFloat</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="mkMachDouble"></a><span class='hs-comment'>-- | Creates a 'Literal' of type @Double#@</span>
<a name="line-28"></a><span class='hs-definition'>mkMachDouble</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-29"></a><span class='hs-definition'>mkMachDouble</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachDouble</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="mkMachChar"></a><span class='hs-comment'>-- | Creates a 'Literal' of type @Char#@</span>
<a name="line-32"></a><span class='hs-definition'>mkMachChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-33"></a><span class='hs-definition'>mkMachChar</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachChar</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="mkMachString"></a><span class='hs-comment'>-- | Creates a 'Literal' of type @Addr#@, which is appropriate for passing to</span>
<a name="line-36"></a><span class='hs-comment'>-- e.g. some of the \"error\" functions in GHC.Err such as @GHC.Err.runtimeError@</span>
<a name="line-37"></a><span class='hs-definition'>mkMachString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-38"></a><span class='hs-definition'>mkMachString</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachStr</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkFastString</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- stored UTF-8 encoded</span>
<a name="line-39"></a>
<a name="line-40"></a><a name="inIntRange"></a><span class='hs-definition'>inIntRange</span><span class='hs-layout'>,</span> <span class='hs-varid'>inWordRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-41"></a><span class='hs-definition'>inIntRange</span>  <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>tARGET_MIN_INT</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>tARGET_MAX_INT</span>
<a name="line-42"></a><a name="inWordRange"></a><span class='hs-definition'>inWordRange</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span>		    <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>tARGET_MAX_WORD</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="inCharRange"></a><span class='hs-definition'>inCharRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-45"></a><span class='hs-definition'>inCharRange</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span>  <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;=</span> <span class='hs-chr'>'\0'</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>chr</span> <span class='hs-varid'>tARGET_MAX_CHAR</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="isZeroLit"></a><span class='hs-comment'>-- | Tests whether the literal represents a zero of whatever type it is</span>
<a name="line-48"></a><span class='hs-definition'>isZeroLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-49"></a><span class='hs-definition'>isZeroLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>    <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-50"></a><span class='hs-definition'>isZeroLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span>  <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-51"></a><span class='hs-definition'>isZeroLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span>   <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-52"></a><span class='hs-definition'>isZeroLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-53"></a><span class='hs-definition'>isZeroLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span>  <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-54"></a><span class='hs-definition'>isZeroLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-55"></a><span class='hs-definition'>isZeroLit</span> <span class='hs-keyword'>_</span>              <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
</pre>\end{code}

	Coercions
	~~~~~~~~~
\begin{code}
<pre><a name="line-1"></a><a name="word2IntLit"></a><span class='hs-definition'>word2IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>int2WordLit</span><span class='hs-layout'>,</span>
<a name="line-2"></a>  <span class='hs-varid'>narrow8IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrow16IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrow32IntLit</span><span class='hs-layout'>,</span>
<a name="line-3"></a>  <span class='hs-varid'>narrow8WordLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrow16WordLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>narrow32WordLit</span><span class='hs-layout'>,</span>
<a name="line-4"></a>  <span class='hs-varid'>char2IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>int2CharLit</span><span class='hs-layout'>,</span>
<a name="line-5"></a>  <span class='hs-varid'>float2IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>int2FloatLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>double2IntLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>int2DoubleLit</span><span class='hs-layout'>,</span>
<a name="line-6"></a>  <span class='hs-varid'>float2DoubleLit</span><span class='hs-layout'>,</span> <span class='hs-varid'>double2FloatLit</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-definition'>word2IntLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> 
<a name="line-10"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>w</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>tARGET_MAX_INT</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-varid'>tARGET_MAX_WORD</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span> <span class='hs-varid'>w</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="int2WordLit"></a><span class='hs-definition'>int2WordLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-14"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachWord</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>tARGET_MAX_WORD</span> <span class='hs-varop'>+</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- (-1)  ---&gt;  tARGET_MAX_WORD</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachWord</span> <span class='hs-varid'>i</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="narrow8IntLit"></a><span class='hs-definition'>narrow8IntLit</span>    <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>  <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span>  <span class='hs-layout'>(</span><span class='hs-varid'>toInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int8</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-18"></a><a name="narrow16IntLit"></a><span class='hs-definition'>narrow16IntLit</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>  <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span>  <span class='hs-layout'>(</span><span class='hs-varid'>toInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int16</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-19"></a><a name="narrow32IntLit"></a><span class='hs-definition'>narrow32IntLit</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>  <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span>  <span class='hs-layout'>(</span><span class='hs-varid'>toInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int32</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-20"></a><a name="narrow8WordLit"></a><span class='hs-definition'>narrow8WordLit</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachWord</span> <span class='hs-layout'>(</span><span class='hs-varid'>toInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word8</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-21"></a><a name="narrow16WordLit"></a><span class='hs-definition'>narrow16WordLit</span>  <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachWord</span> <span class='hs-layout'>(</span><span class='hs-varid'>toInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word16</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-22"></a><a name="narrow32WordLit"></a><span class='hs-definition'>narrow32WordLit</span>  <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachWord</span> <span class='hs-layout'>(</span><span class='hs-varid'>toInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-23"></a>
<a name="line-24"></a><a name="char2IntLit"></a><span class='hs-definition'>char2IntLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span>  <span class='hs-layout'>(</span><span class='hs-varid'>toInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-25"></a><a name="int2CharLit"></a><span class='hs-definition'>int2CharLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>  <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachChar</span> <span class='hs-layout'>(</span><span class='hs-varid'>chr</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="float2IntLit"></a><span class='hs-definition'>float2IntLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span>   <span class='hs-layout'>(</span><span class='hs-varid'>truncate</span>    <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-28"></a><a name="int2FloatLit"></a><span class='hs-definition'>int2FloatLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>   <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachFloat</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="double2IntLit"></a><span class='hs-definition'>double2IntLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachInt</span>    <span class='hs-layout'>(</span><span class='hs-varid'>truncate</span>    <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-31"></a><a name="int2DoubleLit"></a><span class='hs-definition'>int2DoubleLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>   <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachDouble</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="float2DoubleLit"></a><span class='hs-definition'>float2DoubleLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span>  <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachDouble</span> <span class='hs-varid'>f</span>
<a name="line-34"></a><a name="double2FloatLit"></a><span class='hs-definition'>double2FloatLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachFloat</span>  <span class='hs-varid'>d</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="nullAddrLit"></a><span class='hs-definition'>nullAddrLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span>
<a name="line-37"></a><span class='hs-definition'>nullAddrLit</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>MachNullAddr</span>
</pre>\end{code}

	Predicates
	~~~~~~~~~~
\begin{code}
<pre><a name="line-1"></a><a name="litIsTrivial"></a><span class='hs-comment'>-- | True if there is absolutely no penalty to duplicating the literal.</span>
<a name="line-2"></a><span class='hs-comment'>-- False principally of strings</span>
<a name="line-3"></a><span class='hs-definition'>litIsTrivial</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-4"></a><span class='hs-comment'>--	c.f. CoreUtils.exprIsTrivial</span>
<a name="line-5"></a><span class='hs-definition'>litIsTrivial</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-6"></a><span class='hs-definition'>litIsTrivial</span> <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="litIsDupable"></a><span class='hs-comment'>-- | True if code space does not go bad if we duplicate this literal</span>
<a name="line-9"></a><span class='hs-comment'>-- Currently we treat it just like 'litIsTrivial'</span>
<a name="line-10"></a><span class='hs-definition'>litIsDupable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-11"></a><span class='hs-comment'>--	c.f. CoreUtils.exprIsDupable</span>
<a name="line-12"></a><span class='hs-definition'>litIsDupable</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-13"></a><span class='hs-definition'>litIsDupable</span> <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="litFitsInChar"></a><span class='hs-definition'>litFitsInChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-16"></a><span class='hs-definition'>litFitsInChar</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-17"></a>    		         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>minBound</span> 
<a name="line-18"></a>                        <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>maxBound</span> 
<a name="line-19"></a><span class='hs-definition'>litFitsInChar</span> <span class='hs-keyword'>_</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
</pre>\end{code}

	Types
	~~~~~
\begin{code}
<pre><a name="line-1"></a><a name="literalType"></a><span class='hs-comment'>-- | Find the Haskell 'Type' the literal occupies</span>
<a name="line-2"></a><span class='hs-definition'>literalType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>
<a name="line-3"></a><span class='hs-definition'>literalType</span> <span class='hs-conid'>MachNullAddr</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addrPrimTy</span>
<a name="line-4"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>charPrimTy</span>
<a name="line-5"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addrPrimTy</span>
<a name="line-6"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intPrimTy</span>
<a name="line-7"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wordPrimTy</span>
<a name="line-8"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>int64PrimTy</span>
<a name="line-9"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>word64PrimTy</span>
<a name="line-10"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>floatPrimTy</span>
<a name="line-11"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doublePrimTy</span>
<a name="line-12"></a><span class='hs-definition'>literalType</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachLabel</span> <span class='hs-keyword'>_</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'>addrPrimTy</span>
</pre>\end{code}


	Comparison
	~~~~~~~~~~
\begin{code}
<pre><a name="line-1"></a><a name="cmpLit"></a><span class='hs-definition'>cmpLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span>
<a name="line-2"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span>      <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span>	   <span class='hs-varid'>b</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-3"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span>       <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span>	   <span class='hs-varid'>b</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-4"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachNullAddr</span><span class='hs-layout'>)</span>      <span class='hs-layout'>(</span><span class='hs-conid'>MachNullAddr</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-5"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>       <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>	   <span class='hs-varid'>b</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-6"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span>      <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span>	   <span class='hs-varid'>b</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-7"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span>     <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span>	   <span class='hs-varid'>b</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-8"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span>    <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span>	   <span class='hs-varid'>b</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-9"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span>     <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span>	   <span class='hs-varid'>b</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-10"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span>    <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span>	   <span class='hs-varid'>b</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-11"></a><span class='hs-definition'>cmpLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachLabel</span>     <span class='hs-varid'>a</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachLabel</span>      <span class='hs-varid'>b</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'>a</span> <span class='hs-varop'>`compare`</span> <span class='hs-varid'>b</span>
<a name="line-12"></a><span class='hs-definition'>cmpLit</span> <span class='hs-varid'>lit1</span>		   <span class='hs-varid'>lit2</span>		        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>litTag</span> <span class='hs-varid'>lit1</span> <span class='hs-varop'>&lt;#</span> <span class='hs-varid'>litTag</span> <span class='hs-varid'>lit2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-13"></a>					        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  		     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="litTag"></a><span class='hs-definition'>litTag</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FastInt</span>
<a name="line-16"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span>      <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-17"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span>       <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-18"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachNullAddr</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>3</span><span class='hs-layout'>)</span>
<a name="line-19"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span>       <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>4</span><span class='hs-layout'>)</span>
<a name="line-20"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span>      <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>5</span><span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span>     <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>6</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span>    <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>7</span><span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span>     <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>8</span><span class='hs-layout'>)</span>
<a name="line-24"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span>    <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>9</span><span class='hs-layout'>)</span>
<a name="line-25"></a><span class='hs-definition'>litTag</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachLabel</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-sel'>_ILIT</span><span class='hs-layout'>(</span><span class='hs-num'>10</span><span class='hs-layout'>)</span>
</pre>\end{code}

	Printing
	~~~~~~~~
* MachX (i.e. unboxed) things are printed unadornded (e.g. 3, 'a', "foo")
  exceptions: MachFloat gets an initial keyword prefix.

\begin{code}
<pre><a name="line-1"></a><a name="pprLit"></a><span class='hs-definition'>pprLit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-2"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span> <span class='hs-varid'>ch</span><span class='hs-layout'>)</span>  	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprHsChar</span> <span class='hs-varid'>ch</span>
<a name="line-3"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>    	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprHsString</span> <span class='hs-varid'>s</span>
<a name="line-4"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>    	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprIntVal</span> <span class='hs-varid'>i</span>
<a name="line-5"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>  	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"__int64"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>integer</span> <span class='hs-varid'>i</span>
<a name="line-6"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>   	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"__word"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>integer</span> <span class='hs-varid'>w</span>
<a name="line-7"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"__word64"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>integer</span> <span class='hs-varid'>w</span>
<a name="line-8"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>  	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"__float"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>rational</span> <span class='hs-varid'>f</span>
<a name="line-9"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>rational</span> <span class='hs-varid'>d</span>
<a name="line-10"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachNullAddr</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"__NULL"</span><span class='hs-layout'>)</span>
<a name="line-11"></a><span class='hs-definition'>pprLit</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachLabel</span> <span class='hs-varid'>l</span> <span class='hs-varid'>mb</span> <span class='hs-varid'>fod</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"__label"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>b</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>fod</span>
<a name="line-12"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb</span> <span class='hs-keyword'>of</span>
<a name="line-13"></a>              <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprHsString</span> <span class='hs-varid'>l</span>
<a name="line-14"></a>              <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>doubleQuotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>unpackFS</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-chr'>'@'</span><span class='hs-conop'>:</span><span class='hs-varid'>show</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="pprIntVal"></a><span class='hs-definition'>pprIntVal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-17"></a><span class='hs-comment'>-- ^ Print negative integers with parens to be sure it's unambiguous</span>
<a name="line-18"></a><span class='hs-definition'>pprIntVal</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>integer</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-19"></a>	    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>integer</span> <span class='hs-varid'>i</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Hashing}
%*									*
%************************************************************************

Hash values should be zero or a positive integer.  No negatives please.
(They mess up the UniqFM for some reason.)

\begin{code}
<pre><a name="line-1"></a><a name="hashLiteral"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-2"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachChar</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>    	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-varop'>+</span> <span class='hs-num'>1000</span>	<span class='hs-comment'>-- Keep it out of range of common ints</span>
<a name="line-3"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachStr</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>     	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>hashFS</span> <span class='hs-varid'>s</span>
<a name="line-4"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachNullAddr</span><span class='hs-layout'>)</span>    	<span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-5"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>   	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>hashInteger</span> <span class='hs-varid'>i</span>
<a name="line-6"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachInt64</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>hashInteger</span> <span class='hs-varid'>i</span>
<a name="line-7"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>   	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>hashInteger</span> <span class='hs-varid'>i</span>
<a name="line-8"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachWord64</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> 	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>hashInteger</span> <span class='hs-varid'>i</span>
<a name="line-9"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachFloat</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>   	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>hashRational</span> <span class='hs-varid'>r</span>
<a name="line-10"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachDouble</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>  	<span class='hs-keyglyph'>=</span> <span class='hs-varid'>hashRational</span> <span class='hs-varid'>r</span>
<a name="line-11"></a><span class='hs-definition'>hashLiteral</span> <span class='hs-layout'>(</span><span class='hs-conid'>MachLabel</span> <span class='hs-varid'>s</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'>hashFS</span> <span class='hs-varid'>s</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="hashRational"></a><span class='hs-definition'>hashRational</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-14"></a><span class='hs-definition'>hashRational</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hashInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>numerator</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="hashInteger"></a><span class='hs-definition'>hashInteger</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-17"></a><span class='hs-definition'>hashInteger</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>abs</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromInteger</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-varop'>`rem`</span> <span class='hs-num'>10000</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-18"></a>		<span class='hs-comment'>-- The 1+ is to avoid zero, which is a Bad Number</span>
<a name="line-19"></a>		<span class='hs-comment'>-- since we use * to combine hash values</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="hashFS"></a><span class='hs-definition'>hashFS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FastString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-22"></a><span class='hs-definition'>hashFS</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>iBox</span> <span class='hs-layout'>(</span><span class='hs-varid'>uniqueOfFS</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
</pre>\end{code}
</body>
</html>