OLD | NEW |
1 ============================ | 1 ============================ |
2 PNaCl C/C++ Language Support | 2 PNaCl C/C++ Language Support |
3 ============================ | 3 ============================ |
4 | 4 |
5 .. contents:: | 5 .. contents:: |
6 :local: | 6 :local: |
7 :backlinks: none | 7 :backlinks: none |
8 :depth: 3 | 8 :depth: 3 |
9 | 9 |
10 Source language support | 10 Source language support |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 | 208 |
209 Portable SIMD Vectors | 209 Portable SIMD Vectors |
210 ===================== | 210 ===================== |
211 | 211 |
212 SIMD vectors aren't part of the C/C++ standards and are traditionally | 212 SIMD vectors aren't part of the C/C++ standards and are traditionally |
213 very hardware-specific. Portable Native Client offers a portable version | 213 very hardware-specific. Portable Native Client offers a portable version |
214 of SIMD vector datatypes and operations which map well to modern | 214 of SIMD vector datatypes and operations which map well to modern |
215 architectures and offer performance which matches or approaches | 215 architectures and offer performance which matches or approaches |
216 hardware-specific uses. | 216 hardware-specific uses. |
217 | 217 |
218 SIMD vector support was added to Portable Native Client for version 37 | 218 SIMD vector support was added to Portable Native Client for version 37 of Chrome |
219 of Chrome and more features, including performance enhancements, are | 219 and more features, including performance enhancements, have been added in |
220 expected to be added in subsequent releases. | 220 subsequent releases, see the :ref:`Release Notes <sdk-release-notes>` for more |
| 221 details. |
221 | 222 |
222 Hand-Coding Vector Extensions | 223 Hand-Coding Vector Extensions |
223 ----------------------------- | 224 ----------------------------- |
224 | 225 |
225 The initial vector support in Portable Native Client adds `LLVM vectors | 226 The initial vector support in Portable Native Client adds `LLVM vectors |
226 <http://clang.llvm.org/docs/LanguageExtensions.html#vectors-and-extended-vectors
>`_ | 227 <http://clang.llvm.org/docs/LanguageExtensions.html#vectors-and-extended-vectors
>`_ |
227 and `GCC vectors | 228 and `GCC vectors |
228 <http://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html>`_ since these | 229 <http://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html>`_ since these |
229 are well supported by different hardware platforms and don't require any | 230 are well supported by different hardware platforms and don't require any |
230 new compiler intrinsics. | 231 new compiler intrinsics. |
(...skipping 16 matching lines...) Expand all Loading... |
247 .. naclcode:: | 248 .. naclcode:: |
248 | 249 |
249 typedef int v4s __attribute__((vector_size(16))); | 250 typedef int v4s __attribute__((vector_size(16))); |
250 v4s snip(v4s in) { | 251 v4s snip(v4s in) { |
251 v4s limit = {32,64,128,256}; | 252 v4s limit = {32,64,128,256}; |
252 v4s mask = in > limit; | 253 v4s mask = in > limit; |
253 v4s ret = in & mask; | 254 v4s ret = in & mask; |
254 return ret; | 255 return ret; |
255 } | 256 } |
256 | 257 |
257 Vector datatypes are currently expected to be 128-bit wide with one of | 258 Vector datatypes are currently expected to be 128-bit wide with one of the |
258 the following element types: | 259 following element types, and they're expected to be aligned to the underlying |
| 260 element's bit width (loads and store will otherwise be broken up into scalar |
| 261 accesses to prevent faults): |
259 | 262 |
260 ============ ============ ================ | 263 ============ ============ ================ ====================== |
261 Type Num Elements Vector Bit Width | 264 Type Num Elements Vector Bit Width Expected Bit Alignment |
262 ============ ============ ================ | 265 ============ ============ ================ ====================== |
263 ``uint8_t`` 16 128 | 266 ``uint8_t`` 16 128 8 |
264 ``int8_t`` 16 128 | 267 ``int8_t`` 16 128 8 |
265 ``uint16_t`` 8 128 | 268 ``uint16_t`` 8 128 16 |
266 ``int16_t`` 8 128 | 269 ``int16_t`` 8 128 16 |
267 ``uint32_t`` 4 128 | 270 ``uint32_t`` 4 128 32 |
268 ``int32_t`` 4 128 | 271 ``int32_t`` 4 128 32 |
269 ``float`` 4 128 | 272 ``float`` 4 128 32 |
270 ============ ============ ================ | 273 ============ ============ ================ ====================== |
271 | 274 |
272 64-bit integers and double-precision floating point will be supported in | 275 64-bit integers and double-precision floating point will be supported in |
273 a future release, as will 256-bit and 512-bit vectors. | 276 a future release, as will 256-bit and 512-bit vectors. |
274 | 277 |
| 278 Vector element bit width alignment can be stated explicitly (this is assumed by |
| 279 PNaCl, but not necessarily by other compilers), and smaller alignments can also |
| 280 be specified: |
| 281 |
| 282 .. naclcode:: |
| 283 |
| 284 typedef int v4s_element __attribute__((vector_size(16), aligned(4))); |
| 285 typedef int v4s_unaligned __attribute__((vector_size(16), aligned(1))); |
| 286 |
| 287 |
275 The following operators are supported on vectors: | 288 The following operators are supported on vectors: |
276 | 289 |
277 +----------------------------------------------+ | 290 +----------------------------------------------+ |
278 | unary ``+``, ``-`` | | 291 | unary ``+``, ``-`` | |
279 +----------------------------------------------+ | 292 +----------------------------------------------+ |
280 | ``++``, ``--`` | | 293 | ``++``, ``--`` | |
281 +----------------------------------------------+ | 294 +----------------------------------------------+ |
282 | ``+``, ``-``, ``*``, ``/``, ``%`` | | 295 | ``+``, ``-``, ``*``, ``/``, ``%`` | |
283 +----------------------------------------------+ | 296 +----------------------------------------------+ |
284 | ``&``, ``|``, ``^``, ``~`` | | 297 | ``&``, ``|``, ``^``, ``~`` | |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 A similar feature is **thread suspension**: The ability to | 467 A similar feature is **thread suspension**: The ability to |
455 asynchronously suspend and resume a thread and inspect or modify its | 468 asynchronously suspend and resume a thread and inspect or modify its |
456 execution state (such as register state). | 469 execution state (such as register state). |
457 | 470 |
458 Neither PNaCl nor NaCl currently support asynchronous interruption | 471 Neither PNaCl nor NaCl currently support asynchronous interruption |
459 or suspension of threads. | 472 or suspension of threads. |
460 | 473 |
461 If PNaCl were to support either of these, the interaction of | 474 If PNaCl were to support either of these, the interaction of |
462 ``volatile`` and atomics with same-thread signal handling would need | 475 ``volatile`` and atomics with same-thread signal handling would need |
463 to be carefully detailed. | 476 to be carefully detailed. |
OLD | NEW |