<?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@ => @\<x\>@ 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'><-</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'>-></span> <span class='hs-keyword'>do</span> <a name="line-20"></a> <span class='hs-varid'>aa</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-keyword'>do</span> <a name="line-23"></a> <span class='hs-varid'>ab</span> <span class='hs-keyglyph'><-</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'>-></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'>-></span> <span class='hs-keyword'>do</span> <a name="line-28"></a> <span class='hs-varid'>ad</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-keyword'>do</span> <a name="line-31"></a> <span class='hs-varid'>ae</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-keyword'>do</span> <a name="line-34"></a> <span class='hs-varid'>af</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-keyword'>do</span> <a name="line-37"></a> <span class='hs-varid'>ag</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-keyword'>do</span> <a name="line-40"></a> <span class='hs-varid'>ah</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-keyword'>do</span> <a name="line-43"></a> <span class='hs-varid'>ai</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-keyword'>do</span> <a name="line-46"></a> <span class='hs-varid'>aj</span> <span class='hs-keyglyph'><-</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'><-</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'><-</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'>-></span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></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'><=</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'>-></span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></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'><</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'>-></span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></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'>>=</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'>-></span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span><span class='hs-layout'>;</span> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></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'>></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'>-></span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span><span class='hs-layout'>;</span> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>>=</span> <span class='hs-varid'>tARGET_MIN_INT</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>x</span> <span class='hs-varop'><=</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'>>=</span> <span class='hs-num'>0</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>x</span> <span class='hs-varop'><=</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'>-></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'>>=</span> <span class='hs-chr'>'\0'</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>c</span> <span class='hs-varop'><=</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'>-></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'>-></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'>></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'><</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) ---> 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'>-></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'>-></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'>-></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'><=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>minBound</span> <a name="line-18"></a> <span class='hs-varop'>&&</span> <span class='hs-varid'>fromInteger</span> <span class='hs-varid'>i</span> <span class='hs-varop'>>=</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'>-></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'>-></span> <span class='hs-conid'>Literal</span> <span class='hs-keyglyph'>-></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'><#</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'>-></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'>-></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'><+></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'><+></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'><+></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'><+></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'><+></span> <span class='hs-varid'>b</span> <span class='hs-varop'><+></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'>-></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'>-></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'>-></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'><</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'>-></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'>-></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'>-></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'>-></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>