| <?xml version="1.0" encoding="UTF-8"?> |
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd"> |
| <!-- saved from url=(0013)about:internet --> |
| <?xml-stylesheet type="text/xsl" href="mathml.xsl"?><html xmlns="http://www.w3.org/1999/xhtml" xmlns:pref="http://www.w3.org/2002/Math/preference" xmlns:xlink="http://www.w3.org/1999/xlink" pref:renderer="mathplayer-dl"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
| <style xmlns="" type="text/css"> |
| /* This style sets a margin around the entire page */ |
| html, body { |
| margin: 10px; |
| } |
| |
| p { |
| font: normal 16px verdana, sans-serif; |
| margin: 0; |
| padding-bottom:12px; |
| } |
| |
| h1 { |
| font: bold 25px verdana, sans-serif; |
| margin-top: 0; |
| margin-bottom: 3px; |
| padding-top: 0; |
| padding-bottom: 0; |
| } |
| |
| h2 { |
| font: bold 19px verdana, sans-serif; |
| margin-top: 28px; |
| margin-bottom: 3px; |
| padding-top: 0; |
| padding-bottom: 0; |
| } |
| |
| h3 { |
| font: bold 19px verdana, sans-serif !important; |
| margin-top: 28px; |
| margin-bottom: 3px; |
| padding-top: 0; |
| padding-bottom: 0; |
| } |
| |
| li { |
| font: normal 16px verdana, sans-serif; |
| margin-top: 0; |
| margin-bottom: 18px; |
| padding-top: 0; |
| padding-bottom: 0; |
| } |
| |
| .pdparam { |
| font: italic 16px verdana, sans-serif; |
| } |
| |
| .term { |
| font: italic 16px verdana, sans-serif; |
| font-weight: normal; |
| } |
| |
| .type { |
| font: normal 16px verdana, sans-serif !important; |
| } |
| |
| .parameter { |
| font-style: italic; |
| } |
| |
| a:link, a:visited { |
| color: blue; |
| text-decoration: none; |
| font: normal 16px; |
| } |
| |
| a:hover { |
| background-color: #FFFF99; |
| font: normal 16px; |
| } |
| |
| div.funcsynopsis { |
| text-align: left; |
| background-color: #e6e6e6; |
| font: normal 16px verdana, sans-serif; |
| padding-top: 10px; |
| padding-bottom: 10px; |
| } |
| |
| div.funcsynopsis table { |
| border-collapse: separate; |
| font: normal 16px verdana, sans-serif; |
| } |
| |
| div.funcsynopsis td { |
| background-color: #e6e6e6; |
| border: 0 solid #000; |
| padding: 1px; |
| font: normal 16px verdana, sans-serif; |
| } |
| |
| div.refsect1 { |
| font-family: verdana, sans-serif; |
| font-size: 16px; |
| } |
| |
| code.constant { |
| font: normal 16px courier new, monospace !important; |
| } |
| |
| span.errorname { |
| font: normal 16px verdana, sans-serif !important; |
| } |
| |
| code.function { |
| font: bold 16px verdana, sans-serif !important; |
| } |
| |
| b.fsfunc { |
| font: bold 16px verdana, sans-serif !important; |
| } |
| |
| code.varname { |
| font: italic 16px verdana, sans-serif; |
| } |
| |
| code.replaceable { |
| font: italic 16px courier new, monospace; |
| } |
| |
| code.funcdef { |
| font: normal 16px verdana, sans-serif !important; |
| } |
| |
| .citerefentry { |
| font: normal 16px verdana, sans-serif !important; |
| } |
| |
| .parameter { |
| font-style: italic; |
| } |
| |
| code.fsfunc { |
| font: normal 16px verdana, sans-serif !important; |
| } |
| |
| /* PARAMETER: This style controls spacing between the terms in Parameter section */ |
| dt { |
| margin-top: 15px; |
| } |
| |
| /* TABLES: These styles apply to all tables OTHER than the Synopsis and Example tables */ |
| div.refsect1 table { |
| width: 100%; |
| margin-top: 10px; |
| background-color: #FFF; |
| border-collapse: collapse; |
| border-color: #000; |
| border-width: 1px; |
| font: normal 16px verdana, sans-serif; |
| } |
| |
| div.refsect1 th { |
| border-collapse: collapse; |
| border-color: #000; |
| border-width: 1px; |
| font: bold 16px verdana, sans-serif; |
| } |
| |
| div.refsect1 td { |
| background-color: #FFF; |
| padding: 5px; |
| vertical-align: text-top; |
| border-collapse: collapse; |
| border-color: #000; |
| border-width: 1px; |
| font: normal 16px verdana, sans-serif; |
| } |
| |
| div.refsect1 p{ |
| font: normal 16px verdana, sans-serif; |
| margin-top: 8px; |
| margin-bottom: 8px; |
| padding-top: 0; |
| padding-bottom: 0; |
| } |
| |
| |
| /* EXAMPLE: These styles apply only to the Example section */ |
| div.refsect2 { |
| font: normal 16px courier new, monospace !important; |
| } |
| |
| div.refsect2 table { |
| margin-top: 0; |
| background-color: #e6e6e6; |
| width: 100%; |
| border: 0 solid #000; |
| padding: 2px; |
| font: normal 16px courier new, monospace !important; |
| } |
| |
| div.refsect2 td { |
| background-color: #e6e6e6; |
| font: normal 16px courier new, monospace !important; |
| white-space:pre; |
| } |
| |
| /* COPYRIGHT: This style formats the text of the copyright statement at the bottom of the page */ |
| div.refsect3 { |
| font: normal 11px verdana, sans-serif; |
| margin-top: 50px; |
| margin-bottom: 20px; |
| padding-top: 0; |
| padding-bottom: 0; |
| } |
| |
| </style> |
| <title>Reinterpreting Types Using as_type() and as_typen()</title> |
| <meta name="generator" content="DocBook XSL Stylesheets V1.79.1" /> |
| <meta name="keywords" content="Reinterpreting Types, as_typen(), as_type()" /> |
| </head> |
| <body> |
| <div class="refentry"> |
| <a id="id-1"></a> |
| <div class="titlepage"></div> |
| <div xmlns="" class="refnamediv"> |
| <a xmlns="http://www.w3.org/1999/xhtml" id="ReinterpretingTypesUsingas_typen()"></a> |
| <h1>as_type(), as_typen()</h1> |
| <p> |
| </p> |
| </div> |
| <div class="refsect2"> |
| <a id="synopsis"></a> |
| <h3></h3> |
| <div class="informaltable"> |
| <table class="informaltable" border="0"> |
| <colgroup> |
| <col align="left" class="col1" /> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td align="left"> |
| as_type() |
| </td> |
| </tr> |
| <tr> |
| <td align="left"> |
| as_type<em class="replaceable"><code>n</code></em>() |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="refsect1"> |
| <a id="description"></a> |
| <h2>Description</h2> |
| <p> |
| All data types described in <a class="citerefentry" href="scalarDataTypes.html"><span class="citerefentry"><span class="refentrytitle">Scalar |
| Data Types</span></span></a> and |
| <a class="citerefentry" href="vectorDataTypes.html"><span class="citerefentry"><span class="refentrytitle">Vector Data |
| Types</span></span></a> (except <span class="type">bool</span>, <span class="type">half</span> |
| (unless the <a class="citerefentry" href="cl_khr_fp16.html"><span class="citerefentry"><span class="refentrytitle">cl_khr_fp16</span></span></a> |
| extension is supported), and <span class="type">void</span>) may be also reinterpreted as another |
| data type of the same size using the <code class="function">as_type()</code> operator for scalar |
| data types and the <code class="function">as_type<em class="replaceable"><code>n</code></em>()</code> operator |
| for vector data types. When the operand and result type contain the same number of |
| elements, the bits in the operand shall be returned directly without modification as |
| the new type. The usual type promotion for function arguments shall not be performed. |
| </p> |
| <p> |
| For example, <code class="code">as_float(0x3f800000)</code> returns <code class="code">1.0f</code>, which is |
| the value that the bit pattern <code class="code">0x3f800000</code> has if viewed as an IEEE-754 |
| single precision value. |
| </p> |
| <p> |
| When the operand and result type contain a different number of elements, the result |
| shall be implementation-defined except if the operand is a 4-component vector and the |
| result is a 3-component vector. In this case, the bits in the operand shall be returned |
| directly without modification as the new type. That is, a conforming implementation shall |
| explicitly define a behavior, but two conforming implementations need not have the same |
| behavior when the number of elements in the result and operand types does not match. The |
| implementation may define the result to contain all, some or none of the original bits |
| in whatever order it chooses. It is an error to use the <code class="function">as_type()</code> |
| or <code class="function">as_type<em class="replaceable"><code>n</code></em>()</code> operators to reinterpret |
| data to a type of a different number of bytes. |
| </p> |
| </div> |
| <div class="refsect1"> |
| <a id="notes"></a> |
| <h2>Notes</h2> |
| <p> |
| While the union is intended to reflect the organization |
| of data in memory, the <code class="function">as_type()</code> and |
| <code class="function">as_type<em class="replaceable"><code>n</code></em>()</code> constructs are intended |
| to reflect the organization of data in register. The <code class="function">as_type()</code> |
| and <code class="function">as_type<em class="replaceable"><code>n</code></em>()</code> constructs are intended |
| to compile to no instructions on devices that use a shared register file designed to |
| operate on both the operand and result types. |
| </p> |
| <p> |
| Note that while differences in memory organization are expected to largely be limited |
| to those arising from endianness, the register based representation may also differ |
| due to size of the element in register. (For example, an architecture may load a char |
| into a 32-bit register, or a char vector into a SIMD vector register with fixed 32-bit |
| element size.) |
| </p> |
| <p> |
| If the element count does not match, then the implementation should pick a data |
| representation that most closely matches what would happen if an appropriate result type |
| operator was applied to a register containing data of the source type. If the number of |
| elements matches, then the <code class="function">as_type<em class="replaceable"><code>n</code></em>()</code> |
| should faithfully reproduce the behavior expected from a similar data type |
| reinterpretation using memory/unions. So, for example if an implementation stores |
| all single precision data as double in register, it should implement as_int( float ) |
| by first downconverting the double to single precision and then (if necessary) moving |
| the single precision bits to a register suitable for operating on integer data. |
| </p> |
| <p> |
| If data stored in different address spaces do not have the same endianness, then the |
| "dominant endianness" of the device should prevail. |
| </p> |
| </div> |
| <div class="refsect2"> |
| <a id="example1"></a> |
| <h3> |
| Example |
| </h3> |
| <div class="informaltable"> |
| <table class="informaltable" border="0"> |
| <colgroup> |
| <col align="left" class="col1" /> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td align="left"> |
| float f = 1.0f; |
| uint u = as_uint(f); // Legal. Contains: 0x3f800000 |
| |
| float4 f = (float4)(1.0f, 2.0f, 3.0f, 4.0f); |
| // Legal. Contains: (int4) |
| // (0x3f800000, 0x40000000, 0x40400000, 0x40800000) |
| int4 i = as_int4(f); |
| |
| float4 f, g; |
| int4 is_less = f < g; |
| |
| // Legal. f[i] = f[i] < g[i] ? f[i] : 0.0f |
| f = as_float4(as_int4(f) & is_less); |
| |
| int i; |
| // Legal. Result is implementation-defined. |
| short2 j = as_short2(i); |
| |
| int4 i; |
| // Legal. Result is implementation-defined. |
| short8 j = as_short8(i); |
| |
| float4 f; |
| //Error. result and operand have different size |
| double4 g = as_double4(f); // Only if double is supported. |
| |
| float4 f; |
| // Legal. g.xyz will have same values as f.xyz. g.w is undefined |
| float3 g = as_float3(f); |
| |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="refsect1"> |
| <a id="specification"></a> |
| <h2>Specification</h2> |
| <p> |
| <img src="pdficon_small1.gif" /> |
| |
| <a href="https://www.khronos.org/registry/cl/specs/opencl-2.1-openclc.pdf#page=24" target="OpenCL Spec">OpenCL Specification</a> |
| </p> |
| </div> |
| <div class="refsect1"> |
| <a id="seealso"></a> |
| <h2>Also see</h2> |
| <p> |
| <a class="citerefentry" href="scalarDataTypes.html"><span class="citerefentry"><span class="refentrytitle">Scalar Data Types</span></span></a>, |
| <a class="citerefentry" href="vectorDataTypes.html"><span class="citerefentry"><span class="refentrytitle">Vector Data Types</span></span></a> |
| </p> |
| </div> |
| <div xmlns="" class="refsect3" lang="en" xml:lang="en"><a xmlns="http://www.w3.org/1999/xhtml" id="Copyright"></a><h4 xmlns="http://www.w3.org/1999/xhtml"></h4><img xmlns="http://www.w3.org/1999/xhtml" src="KhronosLogo.jpg" /><p xmlns="http://www.w3.org/1999/xhtml"></p>Copyright © 2007-2015 The Khronos Group Inc. |
| Permission is hereby granted, free of charge, to any person obtaining a |
| copy of this software and/or associated documentation files (the |
| "Materials"), to deal in the Materials without restriction, including |
| without limitation the rights to use, copy, modify, merge, publish, |
| distribute, sublicense, and/or sell copies of the Materials, and to |
| permit persons to whom the Materials are furnished to do so, subject to |
| the condition that this copyright notice and permission notice shall be included |
| in all copies or substantial portions of the Materials. |
| </div> |
| </div> |
| </body> |
| </html> |