Changes in directory llvm/docs:
LangRef.html updated: 1.160 -> 1.161 --- Log message: For PR950: http://llvm.org/PR950 : Early commit of the documentation for new conversion instructions for easier review. --- Diffs of the changes: (+405 -33) LangRef.html | 438 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 405 insertions(+), 33 deletions(-) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.160 llvm/docs/LangRef.html:1.161 --- llvm/docs/LangRef.html:1.160 Wed Nov 1 19:53:58 2006 +++ llvm/docs/LangRef.html Tue Nov 7 19:11:31 2006 @@ -115,10 +115,22 @@ <li><a href="#i_getelementptr">'<tt>getelementptr</tt>' Instruction</a></li> </ol> </li> + <li><a href="#otherops">Cast Operations</a> + <ol> + <li><a href="#i_trunc">'<tt>trunc .. to</tt>' Instruction</a></li> + <li><a href="#i_zext">'<tt>zext .. to</tt>' Instruction</a></li> + <li><a href="#i_sext">'<tt>sext .. to</tt>' Instruction</a></li> + <li><a href="#i_fptrunc">'<tt>fptrunc .. to</tt>' Instruction</a></li> + <li><a href="#i_fpext">'<tt>fpext .. to</tt>' Instruction</a></li> + <li><a href="#i_fp2uint">'<tt>fp2uint .. to</tt>' Instruction</a></li> + <li><a href="#i_fp2sint">'<tt>fp2sint .. to</tt>' Instruction</a></li> + <li><a href="#i_uint2fp">'<tt>uint2fp .. to</tt>' Instruction</a></li> + <li><a href="#i_sint2fp">'<tt>sint2fp .. to</tt>' Instruction</a></li> + <li><a href="#i_bitconvert">'<tt>bitconvert .. to</tt>' Instruction</a></li> + </ol> <li><a href="#otherops">Other Operations</a> <ol> <li><a href="#i_phi">'<tt>phi</tt>' Instruction</a></li> - <li><a href="#i_cast">'<tt>cast .. to</tt>' Instruction</a></li> <li><a href="#i_select">'<tt>select</tt>' Instruction</a></li> <li><a href="#i_call">'<tt>call</tt>' Instruction</a></li> <li><a href="#i_va_arg">'<tt>va_arg</tt>' Instruction</a></li> @@ -1170,9 +1182,54 @@ following is the syntax for constant expressions:</p> <dl> - <dt><b><tt>cast ( CST to TYPE )</tt></b></dt> - - <dd>Cast a constant to another type.</dd> + <dt><b><tt>trunc ( CST to TYPE )</tt></b></dt> + <dd>Truncate a constant to another type. The bit size of CST must be larger + than the bit size of TYPE. Both types must be integral.</dd> + + <dt><b><tt>zext ( CST to TYPE )</tt></b></dt> + <dd>Zero extend a constant to another type. The bit size of CST must be + smaller or equal to the bit size of TYPE. Both types must be integral.</dd> + + <dt><b><tt>sext ( CST to TYPE )</tt></b></dt> + <dd>Sign extend a constant to another type. The bit size of CST must be + smaller or equal to the bit size of TYPE. Both types must be integral.</dd> + + <dt><b><tt>fptrunc ( CST to TYPE )</tt></b></dt> + <dd>Truncate a floating point constant to another floating point type. The + size of CST must be larger than the size of TYPE. Both types must be + floating point.</dd> + + <dt><b><tt>fpext ( CST to TYPE )</tt></b></dt> + <dd>Floating point extend a constant to another type. The size of CST must be + smaller or equal to the size of TYPE. Both types must be floating point.</dd> + + <dt><b><tt>fp2uint ( CST to TYPE )</tt></b></dt> + <dd>Convert a floating point constant to the corresponding unsigned integer + constant. TYPE must be an integer type. CST must be floating point. If the + value won't fit in the integer type, the results are undefined.</dd> + + <dt><b><tt>fp2sint ( CST to TYPE )</tt></b></dt> + <dd>Convert a floating point constant to the corresponding signed integer + constant. TYPE must be an integer type. CST must be floating point. If the + value won't fit in the integer type, the results are undefined.</dd> + + <dt><b><tt>uint2fp ( CST to TYPE )</tt></b></dt> + <dd>Convert an unsigned integer constant to the corresponding floating point + constant. TYPE must be floating point. CST must be of integer type. If the + value won't fit in the floating point type, the results are undefined.</dd> + + <dt><b><tt>sint2fp ( CST to TYPE )</tt></b></dt> + <dd>Convert a signed integer constant to the corresponding floating point + constant. TYPE must be floating point. CST must be of integer type. If the + value won't fit in the floating point type, the results are undefined.</dd> + + <dt><b><tt>bitconvert ( CST to TYPE )</tt></b></dt> + <dd>Convert a constant, CST, to another TYPE. The size of CST and TYPE must be + identical (same number of bits). The conversion is done as if the CST value + was stored to memory and read back as TYPE. In other words, no bits change + with this operator, just the type. This can be used for conversion of pointer + and packed types to any other type, as long as they have the same bit width. + </dd> <dt><b><tt>getelementptr ( CSTPTR, IDX0, IDX1, ... )</tt></b></dt> @@ -1403,7 +1460,7 @@ <pre> <i>; Emulate a conditional br instruction</i> - %Val = <a href="#i_cast">cast</a> bool %value to int + %Val = <a href="#i_zext">zext</a> bool %value to int switch int %Val, label %truedest [int 0, label %falsedest ] <i>; Emulate an unconditional br instruction</i> @@ -2740,60 +2797,375 @@ <!-- _______________________________________________________________________ --> <div class="doc_subsubsection"> - <a name="i_cast">'<tt>cast .. to</tt>' Instruction</a> + <a name="i_trunc">'<tt>trunc .. to</tt>' Instruction</a> </div> - <div class="doc_text"> <h5>Syntax:</h5> - <pre> - <result> = cast <ty> <value> to <ty2> <i>; yields ty2</i> + <result> = trunc <ty> <value> to <ty2> <i>; yields ty2</i> </pre> <h5>Overview:</h5> - <p> -The '<tt>cast</tt>' instruction is used as the primitive means to convert -integers to floating point, change data type sizes, and break type safety (by -casting pointers). +The '<tt>trunc</tt>' instruction truncates its operand to the type <tt>ty2</tt>. </p> - <h5>Arguments:</h5> +<p> +The '<tt>trunc</tt>' instruction takes a <tt>value</tt> to trunc, which must +be an <a href="#t_integer">integer</a> type, and a type that specifies the size +and type of the result, which must be an <a href="#t_integral">integral</a> +type.</p> +<h5>Semantics:</h5> <p> -The '<tt>cast</tt>' instruction takes a value to cast, which must be a first -class value, and a type to cast it to, which must also be a <a -href="#t_firstclass">first class</a> type. -</p> +The '<tt>trunc</tt>' instruction truncates the high order bits in <tt>value</tt> +and converts the reamining bits to <tt>ty2</tt>. The bit size of <tt>value</tt> +must be larger than the bit size of <tt>ty2</tt>. Equal sized types are not +allowed. This implies that a <tt>trunc</tt> cannot be a <i>no-op cast</i>. It +will always truncate bits.</p> + +<p>When truncating to bool, the truncation is done as a comparison against +zero. If the <tt>value</tt> was zero, the bool result will be <tt>false</tt>. +If the <tt>value</tt> was non-zero, the bool result will be <tt>true</tt>.</p> + +<h5>Example:</h5> +<pre> + %X = trunc int 257 to ubyte <i>; yields ubyte:1</i> + %Y = trunc int 123 to bool <i>; yields bool:true</i> +</pre> +</div> + +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_zext">'<tt>zext .. to</tt>' Instruction</a> +</div> +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + <result> = zext <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>zext</tt>' instruction zero extends its operand to type +<tt>ty2</tt>.</p> + + +<h5>Arguments:</h5> +<p>The '<tt>zext</tt>' instruction takes a value to cast, which must be of +<a href="#t_integral">integral</a> type, and a type to cast it to, which must +also be of <a href="#t_integral">integral</a> type. The bit size of the +<tt>value</tt> must be smaller than or equal to the bit size of the +destination type, <tt>ty2</tt>.</p> <h5>Semantics:</h5> +<p>The <tt>zext</tt> fills the high order bits of the <tt>value</tt> with zero +bits until it reaches the size of the destination type, <tt>ty2</tt>. When the +the operand and the type are the same size, no bit filling is done and the +cast is considered a <i>no-op cast</i> because no bits change (only the type +changes).</p> + +<p>When zero extending to bool, the extension is done as a comparison against +zero. If the <tt>value</tt> was zero, the bool result will be <tt>false</tt>. +If the <tt>value</tt> was non-zero, the bool result will be <tt>true</tt>.</p> +<h5>Example:</h5> +<pre> + %X = zext int 257 to ulong <i>; yields ulong:257</i> + %Y = zext bool true to int <i>; yields int:1</i> +</pre> +</div> + +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_sext">'<tt>sext .. to</tt>' Instruction</a> +</div> +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + <result> = sext <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>sext</tt>' sign extends <tt>value</tt> to the type <tt>ty2</tt>.</p> + +<h5>Arguments:</h5> <p> -This instruction follows the C rules for explicit casts when determining how the -data being cast must change to fit in its new container. -</p> +The '<tt>sext</tt>' instruction takes a value to cast, which must be of +<a href="#t_integral">integral</a> type, and a type to cast it to, which must +also be of <a href="#t_integral">integral</a> type.</p> +<h5>Semantics:</h5> <p> -When casting to bool, any value that would be considered true in the context of -a C '<tt>if</tt>' condition is converted to the boolean '<tt>true</tt>' values, -all else are '<tt>false</tt>'. +The '<tt>sext</tt>' instruction performs a sign extension by copying the sign +bit (highest order bit) of the <tt>value</tt> until it reaches the bit size of +the type <tt>ty2</tt>. When the the operand and the type are the same size, +no bit filling is done and the cast is considered a <i>no-op cast</i> because +no bits change (only the type changes).</p> + +<p>When sign extending to bool, the extension is done as a comparison against +zero. If the <tt>value</tt> was zero, the bool result will be <tt>false</tt>. +If the <tt>value</tt> was non-zero, the bool result will be <tt>true</tt>.</p> + +<h5>Example:</h5> + +<pre> + %X = sext sbyte -1 to ushort <i>; yields ushort:65535</i> + %Y = sext bool true to int <i>; yields int:-1</i> +</pre> +</div> + +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_fpext">'<tt>fpext .. to</tt>' Instruction</a> +</div> +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + <result> = fpext <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>fpext</tt>' extends a floating point <tt>value</tt> to a larger +floating point value.</p> + +<h5>Arguments:</h5> +<p>The '<tt>fpext</tt>' instruction takes a +<a href="#t_floating">floating point</a> <tt>value</tt> to cast, +and a <a href="#t_floating">floating point</a> type to cast it to.</p> + +<h5>Semantics:</h5> +<p>The '<tt>fpext</tt>' instruction extends the <tt>value</tt> from one floating +point type to another. If the type of the <tt>value</tt> and <tt>ty2</tt> are +the same, the instruction is considered a <i>no-op cast</i> because no bits +change.</p> + +<h5>Example:</h5> +<pre> + %X = fpext float 3.1415 to double <i>; yields double:3.1415</i> + %Y = fpext float 1.0 to float <i>; yields float:1.0 (no-op)</i> +</pre> +</div> + +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_fptrunc">'<tt>fptrunc .. to</tt>' Instruction</a> +</div> + +<div class="doc_text"> + +<h5>Syntax:</h5> + +<pre> + <result> = fptrunc <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>fptrunc</tt>' instruction truncates <tt>value</tt> to type +<tt>ty2</tt>.</p> + + +<h5>Arguments:</h5> +<p>The '<tt>fptrunc</tt>' instruction takes a <a href="#t_floating">floating + point</a> value to cast and a <a href="#t_floating">floating point</a> type to +cast it to. The size of <tt>value</tt> must be larger than the size of +<tt>ty2</a>. This implies that <tt>fptrunc</tt> cannot be used to make a +<i>no-op cast</i>.</p> + +<h5>Semantics:</h5> +<p> The '<tt>fptrunc</tt>' instruction converts a +<a href="#t_floating">floating point</a> value from a larger type to a smaller +type. If the value cannot fit within the destination type, <tt>ty2</tt>, then +the results are undefined.</p> + +<h5>Example:</h5> +<pre> + %X = fptrunc double 123.0 to float <i>; yields float:123.0</i> + %Y = fptrunc double 1.0E+300 to float <i>; yields undefined</i> +</pre> +</div> + +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_fp2uint">'<tt>fp2uint .. to</tt>' Instruction</a> +</div> +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + <result> = fp2uint <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>fp2uint</tt>' converts a floating point <tt>value</tt> to its +unsigned integer equivalent of type <tt>ty2</tt>. </p> -<p> -When extending an integral value from a type of one signness to another (for -example '<tt>sbyte</tt>' to '<tt>ulong</tt>'), the value is sign-extended if the -<b>source</b> value is signed, and zero-extended if the source value is -unsigned. <tt>bool</tt> values are always zero extended into either zero or -one. +<h5>Arguments:</h5> +<p>The '<tt>fp2uint</tt>' instruction takes a value to cast, which must be a +<a href="#t_floating">floating point</a> value, and a type to cast it to, which +must be an <a href="#t_integral">integral</a> type.</p> + +<h5>Semantics:</h5> +<p> The '<tt>fp2uint</tt>' instruction converts its +<a href="#t_floating">floating point</a> operand into the nearest (rounding +towards zero) unsigned integer value. If the value cannot fit in <tt>ty2</tt>, +the results are undefined.</p> + +<p>When converting to bool, the conversion is done as a comparison against +zero. If the <tt>value</tt> was zero, the bool result will be <tt>false</tt>. +If the <tt>value</tt> was non-zero, the bool result will be <tt>true</tt>.</p> + +<h5>Example:</h5> +<pre> + %X = fp2uint double 123.0 to int <i>; yields int:123</i> + %Y = fp2uint float 1.0E+300 to bool <i>; yields bool:true</i> + %X = fp2uint float 1.04E+17 to ubyte <i>; yields undefined:1</i> +</pre> +</div> + +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_fp2sint">'<tt>fp2sint .. to</tt>' Instruction</a> +</div> +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + <result> = fp2sint <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>fp2sint</tt>' instruction converts +<a href="#t_floating">floating point</a> <tt>value</tt> to type <tt>ty2</tt>. </p> + +<h5>Arguments:</h5> +<p> The '<tt>fp2sint</tt>' instruction takes a value to cast, which must be a +<a href="#t_floating">floating point</a> value, and a type to cast it to, which +must also be an <a href="#t_integral">integral</a> type.</p> + +<h5>Semantics:</h5> +<p>The '<tt>fp2sint</tt>' instruction converts its +<a href="#t_floating">floating point</a> operand into the nearest (rounding +towards zero) signed integer value. If the value cannot fit in <tt>ty2</tt>, +the results are undefined.</p> + +<p>When converting to bool, the conversion is done as a comparison against +zero. If the <tt>value</tt> was zero, the bool result will be <tt>false</tt>. +If the <tt>value</tt> was non-zero, the bool result will be <tt>true</tt>.</p> + +<h5>Example:</h5> +<pre> + %X = fp2sint double -123.0 to int <i>; yields int:-123</i> + %Y = fp2sint float 1.0E-247 to bool <i>; yields bool:true</i> + %X = fp2sint float 1.04E+17 to sbyte <i>; yields undefined:1</i> +</pre> +</div> + +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_uint2fp">'<tt>uint2fp .. to</tt>' Instruction</a> +</div> +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + <result> = uint2fp <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>uint2fp</tt>' instruction regards <tt>value</tt> as an unsigned +integer and converts that value to the <tt>ty2</tt> type.</p> + + +<h5>Arguments:</h5> +<p>The '<tt>uint2fp</tt>' instruction takes a value to cast, which must be an +<a href="#t_integral">integral</a> value, and a type to cast it to, which must +be a <a href="#t_floating">floating point</a> type.</p> + +<h5>Semantics:</h5> +<p>The '<tt>uint2fp</tt>' instruction interprets its operand as an unsigned +integer quantity and converts it to the corresponding floating point value. If +the value cannot fit in the floating point value, the results are undefined.</p> + + +<h5>Example:</h5> +<pre> + %X = uint2fp int 257 to float <i>; yields float:257.0</i> + %Y = uint2fp sbyte -1 to double <i>; yields double:255.0</i> +</pre> +</div> + +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_sint2fp">'<tt>sint2fp .. to</tt>' Instruction</a> +</div> +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + <result> = sint2fp <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>sint2fp</tt>' instruction regards <tt>value</tt> as a signed +integer and converts that value to the <tt>ty2</tt> type.</p> + +<h5>Arguments:</h5> +<p>The '<tt>sint2fp</tt>' instruction takes a value to cast, which must be an +<a href="#t_integral">integral</a> value, and a type to cast it to, which must be +a <a href="#t_floating">floating point</a> type.</p> + +<h5>Semantics:</h5> +<p>The '<tt>sint2fp</tt>' instruction interprets its operand as a signed +integer quantity and converts it to the corresponding floating point value. If +the value cannot fit in the floating point value, the results are undefined.</p> + <h5>Example:</h5> +<pre> + %X = sint2fp int 257 to float <i>; yields float:257.0</i> + %Y = sint2fp sbyte -1 to double <i>; yields double:-1.0</i> +</pre> +</div> +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_bitconvert">'<tt>bitconvert .. to</tt>' Instruction</a> +</div> +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + <result> = bitconvert <ty> <value> to <ty2> <i>; yields ty2</i> +</pre> + +<h5>Overview:</h5> +<p>The '<tt>bitconvert</tt>' instruction converts <tt>value</tt> to type +<tt>ty2</tt> without changing any bits.</p> + +<h5>Arguments:</h5> +<p>The '<tt>bitconvert</tt>' instruction takes a value to cast, which must be +a first class value, and a type to cast it to, which must also be a <a + href="#t_firstclass">first class</a> type. The bit sizes of <tt>value</tt> +and the destination type, <tt>ty2</tt>, must be identical.</p> + +<h5>Semantics:</h5> +<p>The '<tt>bitconvert</tt>' instruction converts <tt>value</tt> to type +<tt>ty2</tt> as if the value had been stored to memory and read back as type +<tt>ty2</tt>. That is, no bits are changed during the conversion. The +<tt>bitconvert</tt> instruction may be used to construct <i>no-op casts</i> that +the <tt>zext, sext, and fpext</tt> instructions do not permit.</p> + +<h5>Example:</h5> <pre> - %X = cast int 257 to ubyte <i>; yields ubyte:1</i> - %Y = cast int 123 to bool <i>; yields bool:true</i> + %X = bitconvert ubyte 255 to sbyte <i>; yields sbyte:-1</i> + %Y = bitconvert uint* %x to uint <i>; yields uint:%x</i> </pre> </div> @@ -4000,7 +4372,7 @@ <a href="mailto:[EMAIL PROTECTED]">Chris Lattner</a><br> <a href="http://llvm.org">The LLVM Compiler Infrastructure</a><br> - Last modified: $Date: 2006/11/02 01:53:58 $ + Last modified: $Date: 2006/11/08 01:11:31 $ </address> </body> </html> _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits