Chromium Code Reviews| 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 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 191 ``asm("":::"memory")``, which gets transformed to a sequentially | 191 ``asm("":::"memory")``, which gets transformed to a sequentially |
| 192 consistent memory barrier (equivalent to ``__sync_synchronize()``). In | 192 consistent memory barrier (equivalent to ``__sync_synchronize()``). In |
| 193 PNaCl this barrier is only guaranteed to order ``volatile`` and atomic | 193 PNaCl this barrier is only guaranteed to order ``volatile`` and atomic |
| 194 memory accesses, though in practice the implementation attempts to also | 194 memory accesses, though in practice the implementation attempts to also |
| 195 prevent reordering of memory accesses to objects which may escape. | 195 prevent reordering of memory accesses to objects which may escape. |
| 196 | 196 |
| 197 NaCl supports a fairly wide subset of inline assembly through GCC's | 197 NaCl supports a fairly wide subset of inline assembly through GCC's |
| 198 inline assembly syntax, with the restriction that the sandboxing model | 198 inline assembly syntax, with the restriction that the sandboxing model |
| 199 for the target architecture has to be respected. | 199 for the target architecture has to be respected. |
| 200 | 200 |
| 201 .. _portable_simd_vectors: | |
| 202 | |
| 203 Portable SIMD Vectors | |
| 204 ===================== | |
| 205 | |
| 206 SIMD vectors aren't part of the C/C++ standards and are traditionally | |
| 207 very hardware-specific. Portable Native Client offers a portable version | |
| 208 of SIMD vector datatypes and operations which map well to modern | |
| 209 architectures and offer performance which matches or approaches | |
| 210 hardware-specific uses. | |
| 211 | |
| 212 SIMD vector support was added to Portable Native Client for version 36 | |
| 213 of Chrome, and more features are expected to be added in subsequent | |
| 214 releases. | |
| 215 | |
| 216 Hand-Coding Vector Extensions | |
| 217 ----------------------------- | |
| 218 | |
| 219 The initial vector support in Portable Native Client adds `LLVM vectors | |
| 220 <http://clang.llvm.org/docs/LanguageExtensions.html#vectors-and-extended-vectors >`_ | |
| 221 / `GCC vectors | |
|
Derek Schuff
2014/04/24 16:06:20
maybe "LLVM vectors and GCC vectors" rather than j
JF
2014/04/24 16:16:30
Done.
| |
| 222 <http://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html>`_ since these | |
| 223 are well supported by different hardware platforms and don't require any | |
| 224 new compiler intrinsics. | |
| 225 | |
| 226 Vector types can be used through the ``vector_size`` attribute: | |
| 227 | |
| 228 .. naclcode:: | |
| 229 | |
| 230 typedef int v4si __attribute__((vector_size(16))); | |
| 231 v4si a = {1,2,3,4}; | |
| 232 v4si b = {5,6,7,8}; | |
| 233 v4si c, d, e; | |
| 234 c = b + 1; /* c = b + {1,1,1,1}; */ | |
| 235 d = 2 * b; /* d = {2,2,2,2} * b; */ | |
| 236 e = c + d; | |
| 237 | |
| 238 Vector comparisons are represented as a bitmask as wide as the compared | |
| 239 elements of all ``0`` or all ``1``: | |
| 240 | |
| 241 .. naclcode:: | |
| 242 | |
| 243 typedef int v4si __attribute__((vector_size(16))); | |
| 244 v4si snip(v2si in) { | |
| 245 v4si limit = {32,64,128,256}; | |
| 246 vs4i mask = in > limit; | |
| 247 vs4i ret = in & mask; | |
| 248 return ret; | |
| 249 } | |
| 250 | |
| 251 Vector datatypes are currently expected to be 128-bit wide with one of | |
| 252 the following element types: | |
| 253 | |
| 254 ============ ============ ================ | |
| 255 Type Num Elements Vector Bit Width | |
| 256 ============ ============ ================ | |
| 257 ``uint8_t`` 16 128 | |
| 258 ``int8_t`` 16 128 | |
| 259 ``uint16_t`` 8 128 | |
| 260 ``int16_t`` 8 128 | |
| 261 ``uint32_t`` 4 128 | |
| 262 ``int32_t`` 4 128 | |
| 263 ``float`` 4 128 | |
| 264 ============ ============ ================ | |
| 265 | |
| 266 64-bit integers and ``double`` will be supported in a future release, as | |
|
Derek Schuff
2014/04/24 16:06:20
maybe just write "64-bit integer and double-precis
JF
2014/04/24 16:16:30
Done.
| |
| 267 will 256-bit and 512-bit vectors. | |
| 268 | |
| 269 The following operators are supported on vectors: | |
| 270 | |
| 271 +----------------------------------------------+ | |
| 272 | unary ``+``, ``-`` | | |
| 273 +----------------------------------------------+ | |
| 274 | ``++``, ``--`` | | |
| 275 +----------------------------------------------+ | |
| 276 | ``+``, ``-``, ``*``, ``/``, ``%`` | | |
| 277 +----------------------------------------------+ | |
| 278 | ``&``, ``|``, ``^``, ``~`` | | |
| 279 +----------------------------------------------+ | |
| 280 | ``>>``, ``<<`` | | |
| 281 +----------------------------------------------+ | |
| 282 | ``!``, ``&&``, ``||`` | | |
| 283 +----------------------------------------------+ | |
| 284 | ``==``, ``!=``, ``>``, ``<``, ``>=``, ``<=`` | | |
| 285 +----------------------------------------------+ | |
| 286 | ``=`` | | |
| 287 +----------------------------------------------+ | |
| 288 | |
| 289 Furthermore, C-style casts can be used for: | |
| 290 | |
| 291 * Truncation. | |
| 292 * Zero- and sign-extension. | |
| 293 * Conversion to/from floating-point and signed/unsigned integer. | |
| 294 | |
| 295 It is also possible to use array-style indexing into vectors to extract | |
| 296 individual elements using ``[]``. | |
| 297 | |
| 298 Vector shuffles are currently unsupported but will be added soon. | |
| 299 | |
| 300 Auto-Vectorization | |
| 301 ------------------ | |
| 302 | |
| 303 Auto-vectorization is currently not enabled for Portable Native Client, | |
| 304 but will be in a future release. | |
| 305 | |
| 201 Undefined Behavior | 306 Undefined Behavior |
| 202 ================== | 307 ================== |
| 203 | 308 |
| 204 The C and C++ languages expose some undefined behavior which is | 309 The C and C++ languages expose some undefined behavior which is |
| 205 discussed in :ref:`PNaCl Undefined Behavior <undefined_behavior>`. | 310 discussed in :ref:`PNaCl Undefined Behavior <undefined_behavior>`. |
| 206 | 311 |
| 207 Floating-Point | 312 Floating-Point |
| 208 ============== | 313 ============== |
| 209 | 314 |
| 210 PNaCl exposes 32-bit and 64-bit floating point operations which are | 315 PNaCl exposes 32-bit and 64-bit floating point operations which are |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 indirect branches. If you are compiling a program that has a | 348 indirect branches. If you are compiling a program that has a |
| 244 compile-time option for using computed ``goto``, it's possible that the | 349 compile-time option for using computed ``goto``, it's possible that the |
| 245 program will run faster with the option turned off (e.g., if the program | 350 program will run faster with the option turned off (e.g., if the program |
| 246 does extra work to take advantage of computed ``goto``). | 351 does extra work to take advantage of computed ``goto``). |
| 247 | 352 |
| 248 NaCl supports computed ``goto`` without any transformation. | 353 NaCl supports computed ``goto`` without any transformation. |
| 249 | 354 |
| 250 Future Directions | 355 Future Directions |
| 251 ================= | 356 ================= |
| 252 | 357 |
| 253 SIMD | |
| 254 ---- | |
| 255 | |
| 256 PNaCl currently doesn't support SIMD. We plan to add SIMD support in the | |
| 257 very near future. | |
| 258 | |
| 259 NaCl supports SIMD. | |
| 260 | |
| 261 Inter-Process Communication | 358 Inter-Process Communication |
| 262 --------------------------- | 359 --------------------------- |
| 263 | 360 |
| 264 Inter-process communication through shared memory is currently not | 361 Inter-process communication through shared memory is currently not |
| 265 supported by PNaCl/NaCl. When implemented, it may be limited to | 362 supported by PNaCl/NaCl. When implemented, it may be limited to |
| 266 operations which are lock-free on the current platform (``is_lock_free`` | 363 operations which are lock-free on the current platform (``is_lock_free`` |
| 267 methods). It will rely on the address-free properly discussed in `Memory | 364 methods). It will rely on the address-free properly discussed in `Memory |
| 268 Model for Concurrent Operations`_. | 365 Model for Concurrent Operations`_. |
| 269 | 366 |
| 270 POSIX-style Signal Handling | 367 POSIX-style Signal Handling |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 288 A similar feature is **thread suspension**: The ability to | 385 A similar feature is **thread suspension**: The ability to |
| 289 asynchronously suspend and resume a thread and inspect or modify its | 386 asynchronously suspend and resume a thread and inspect or modify its |
| 290 execution state (such as register state). | 387 execution state (such as register state). |
| 291 | 388 |
| 292 Neither PNaCl nor NaCl currently support asynchronous interruption | 389 Neither PNaCl nor NaCl currently support asynchronous interruption |
| 293 or suspension of threads. | 390 or suspension of threads. |
| 294 | 391 |
| 295 If PNaCl were to support either of these, the interaction of | 392 If PNaCl were to support either of these, the interaction of |
| 296 ``volatile`` and atomics with same-thread signal handling would need | 393 ``volatile`` and atomics with same-thread signal handling would need |
| 297 to be carefully detailed. | 394 to be carefully detailed. |
| OLD | NEW |