| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]--> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <meta name="generator" content="Asciidoctor 1.5.7"> |
| <meta name="author" content="Khronos® OpenCL Working Group"> |
| <title>The OpenCL™ SPIR-V Environment Specification</title> |
| <style> |
| /*! normalize.css v2.1.2 | MIT License | git.io/normalize */ |
| /* ========================================================================== HTML5 display definitions ========================================================================== */ |
| /** Correct `block` display not defined in IE 8/9. */ |
| article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } |
| |
| /** Correct `inline-block` display not defined in IE 8/9. */ |
| audio, canvas, video { display: inline-block; } |
| |
| /** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ |
| audio:not([controls]) { display: none; height: 0; } |
| |
| /** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */ |
| [hidden], template { display: none; } |
| |
| script { display: none !important; } |
| |
| /* ========================================================================== Base ========================================================================== */ |
| /** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ |
| html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } |
| |
| /** Remove default margin. */ |
| body { margin: 0; } |
| |
| /* ========================================================================== Links ========================================================================== */ |
| /** Remove the gray background color from active links in IE 10. */ |
| a { background: transparent; } |
| |
| /** Address `outline` inconsistency between Chrome and other browsers. */ |
| a:focus { outline: thin dotted; } |
| |
| /** Improve readability when focused and also mouse hovered in all browsers. */ |
| a:active, a:hover { outline: 0; } |
| |
| /* ========================================================================== Typography ========================================================================== */ |
| /** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */ |
| h1 { font-size: 2em; margin: 0.67em 0; } |
| |
| /** Address styling not present in IE 8/9, Safari 5, and Chrome. */ |
| abbr[title] { border-bottom: 1px dotted; } |
| |
| /** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ |
| b, strong { font-weight: bold; } |
| |
| /** Address styling not present in Safari 5 and Chrome. */ |
| dfn { font-style: italic; } |
| |
| /** Address differences between Firefox and other browsers. */ |
| hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } |
| |
| /** Address styling not present in IE 8/9. */ |
| mark { background: #ff0; color: #000; } |
| |
| /** Correct font family set oddly in Safari 5 and Chrome. */ |
| code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } |
| |
| /** Improve readability of pre-formatted text in all browsers. */ |
| pre { white-space: pre-wrap; } |
| |
| /** Set consistent quote types. */ |
| q { quotes: "\201C" "\201D" "\2018" "\2019"; } |
| |
| /** Address inconsistent and variable font size in all browsers. */ |
| small { font-size: 80%; } |
| |
| /** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ |
| sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } |
| |
| sup { top: -0.5em; } |
| |
| sub { bottom: -0.25em; } |
| |
| /* ========================================================================== Embedded content ========================================================================== */ |
| /** Remove border when inside `a` element in IE 8/9. */ |
| img { border: 0; } |
| |
| /** Correct overflow displayed oddly in IE 9. */ |
| svg:not(:root) { overflow: hidden; } |
| |
| /* ========================================================================== Figures ========================================================================== */ |
| /** Address margin not present in IE 8/9 and Safari 5. */ |
| figure { margin: 0; } |
| |
| /* ========================================================================== Forms ========================================================================== */ |
| /** Define consistent border, margin, and padding. */ |
| fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } |
| |
| /** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */ |
| legend { border: 0; /* 1 */ padding: 0; /* 2 */ } |
| |
| /** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */ |
| button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } |
| |
| /** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ |
| button, input { line-height: normal; } |
| |
| /** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */ |
| button, select { text-transform: none; } |
| |
| /** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */ |
| button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } |
| |
| /** Re-set default cursor for disabled elements. */ |
| button[disabled], html input[disabled] { cursor: default; } |
| |
| /** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */ |
| input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } |
| |
| /** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */ |
| input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } |
| |
| /** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */ |
| input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } |
| |
| /** Remove inner padding and border in Firefox 4+. */ |
| button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } |
| |
| /** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */ |
| textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } |
| |
| /* ========================================================================== Tables ========================================================================== */ |
| /** Remove most spacing between table cells. */ |
| table { border-collapse: collapse; border-spacing: 0; } |
| |
| meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; } |
| |
| meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; } |
| |
| meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; } |
| |
| *, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } |
| |
| html, body { font-size: 100%; } |
| |
| body { background: white; color: #222222; padding: 0; margin: 0; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; } |
| |
| a:hover { cursor: pointer; } |
| |
| img, object, embed { max-width: 100%; height: auto; } |
| |
| object, embed { height: 100%; } |
| |
| img { -ms-interpolation-mode: bicubic; } |
| |
| #map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; } |
| |
| .left { float: left !important; } |
| |
| .right { float: right !important; } |
| |
| .text-left { text-align: left !important; } |
| |
| .text-right { text-align: right !important; } |
| |
| .text-center { text-align: center !important; } |
| |
| .text-justify { text-align: justify !important; } |
| |
| .hide { display: none; } |
| |
| .antialiased { -webkit-font-smoothing: antialiased; } |
| |
| img { display: inline-block; vertical-align: middle; } |
| |
| textarea { height: auto; min-height: 50px; } |
| |
| select { width: 100%; } |
| |
| object, svg { display: inline-block; vertical-align: middle; } |
| |
| .center { margin-left: auto; margin-right: auto; } |
| |
| .spread { width: 100%; } |
| |
| p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; } |
| |
| .subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.4; color: black; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; } |
| |
| /* Typography resets */ |
| div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; } |
| |
| /* Default Link Styles */ |
| a { color: #0068b0; text-decoration: none; line-height: inherit; } |
| a:hover, a:focus { color: #333333; } |
| a img { border: none; } |
| |
| /* Default paragraph styles */ |
| p { font-family: Noto, sans-serif; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 0.75em; text-rendering: optimizeLegibility; } |
| p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; } |
| |
| /* Default header styles */ |
| h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: Noto, sans-serif; font-weight: normal; font-style: normal; color: black; text-rendering: optimizeLegibility; margin-top: 0.5em; margin-bottom: 0.5em; line-height: 1.2125em; } |
| h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #4d4d4d; line-height: 0; } |
| |
| h1 { font-size: 2.125em; } |
| |
| h2 { font-size: 1.6875em; } |
| |
| h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; } |
| |
| h4 { font-size: 1.125em; } |
| |
| h5 { font-size: 1.125em; } |
| |
| h6 { font-size: 1em; } |
| |
| hr { border: solid #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; } |
| |
| /* Helpful Typography Defaults */ |
| em, i { font-style: italic; line-height: inherit; } |
| |
| strong, b { font-weight: bold; line-height: inherit; } |
| |
| small { font-size: 60%; line-height: inherit; } |
| |
| code { font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; color: #264357; } |
| |
| /* Lists */ |
| ul, ol, dl { font-size: 1em; line-height: 1.6; margin-bottom: 0.75em; list-style-position: outside; font-family: Noto, sans-serif; } |
| |
| ul, ol { margin-left: 1.5em; } |
| ul.no-bullet, ol.no-bullet { margin-left: 1.5em; } |
| |
| /* Unordered Lists */ |
| ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ } |
| ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; } |
| ul.square { list-style-type: square; } |
| ul.circle { list-style-type: circle; } |
| ul.disc { list-style-type: disc; } |
| ul.no-bullet { list-style: none; } |
| |
| /* Ordered Lists */ |
| ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; } |
| |
| /* Definition Lists */ |
| dl dt { margin-bottom: 0.3em; font-weight: bold; } |
| dl dd { margin-bottom: 0.75em; } |
| |
| /* Abbreviations */ |
| abbr, acronym { text-transform: uppercase; font-size: 90%; color: black; border-bottom: 1px dotted #dddddd; cursor: help; } |
| |
| abbr { text-transform: none; } |
| |
| /* Blockquotes */ |
| blockquote { margin: 0 0 0.75em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; } |
| blockquote cite { display: block; font-size: 0.8125em; color: #5e93b8; } |
| blockquote cite:before { content: "\2014 \0020"; } |
| blockquote cite a, blockquote cite a:visited { color: #5e93b8; } |
| |
| blockquote, blockquote p { line-height: 1.6; color: #333333; } |
| |
| /* Microformats */ |
| .vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #dddddd; padding: 0.625em 0.75em; } |
| .vcard li { margin: 0; display: block; } |
| .vcard .fn { font-weight: bold; font-size: 0.9375em; } |
| |
| .vevent .summary { font-weight: bold; } |
| .vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; } |
| |
| @media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; } |
| h1 { font-size: 2.75em; } |
| h2 { font-size: 2.3125em; } |
| h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; } |
| h4 { font-size: 1.4375em; } } |
| /* Tables */ |
| table { background: white; margin-bottom: 1.25em; border: solid 1px #d8d8ce; } |
| table thead, table tfoot { background: -webkit-linear-gradient(top, #add386, #90b66a); font-weight: bold; } |
| table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: white; text-align: left; } |
| table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #6d6e71; } |
| table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #edf2f2; } |
| table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.4; } |
| |
| body { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; tab-size: 4; } |
| |
| h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; } |
| |
| a:hover, a:focus { text-decoration: underline; } |
| |
| .clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; } |
| .clearfix:after, .float-group:after { clear: both; } |
| |
| *:not(pre) > code { font-size: inherit; font-style: normal !important; letter-spacing: 0; padding: 0; background-color: white; -webkit-border-radius: 0; border-radius: 0; line-height: inherit; word-wrap: break-word; } |
| *:not(pre) > code.nobreak { word-wrap: normal; } |
| *:not(pre) > code.nowrap { white-space: nowrap; } |
| |
| pre, pre > code { line-height: 1.6; color: #264357; font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; } |
| |
| em em { font-style: normal; } |
| |
| strong strong { font-weight: normal; } |
| |
| .keyseq { color: #333333; } |
| |
| kbd { font-family: Consolas, "Liberation Mono", Courier, monospace; display: inline-block; color: black; font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; } |
| |
| .keyseq kbd:first-child { margin-left: 0; } |
| |
| .keyseq kbd:last-child { margin-right: 0; } |
| |
| .menuseq, .menuref { color: #000; } |
| |
| .menuseq b:not(.caret), .menuref { font-weight: inherit; } |
| |
| .menuseq { word-spacing: -0.02em; } |
| .menuseq b.caret { font-size: 1.25em; line-height: 0.8; } |
| .menuseq i.caret { font-weight: bold; text-align: center; width: 0.45em; } |
| |
| b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; } |
| |
| b.button:before { content: "["; padding: 0 3px 0 2px; } |
| |
| b.button:after { content: "]"; padding: 0 2px 0 3px; } |
| |
| #header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 1.5em; padding-right: 1.5em; } |
| #header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; } |
| #header:after, #content:after, #footnotes:after, #footer:after { clear: both; } |
| |
| #content { margin-top: 1.25em; } |
| |
| #content:before { content: none; } |
| |
| #header > h1:first-child { color: black; margin-top: 2.25rem; margin-bottom: 0; } |
| #header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid #dddddd; } |
| #header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid #dddddd; padding-bottom: 8px; } |
| #header .details { border-bottom: 1px solid #dddddd; line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: #5e93b8; display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; } |
| #header .details span:first-child { margin-left: -0.125em; } |
| #header .details span.email a { color: #333333; } |
| #header .details br { display: none; } |
| #header .details br + span:before { content: "\00a0\2013\00a0"; } |
| #header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: #333333; } |
| #header .details br + span#revremark:before { content: "\00a0|\00a0"; } |
| #header #revnumber { text-transform: capitalize; } |
| #header #revnumber:after { content: "\00a0"; } |
| |
| #content > h1:first-child:not([class]) { color: black; border-bottom: 1px solid #dddddd; padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; } |
| |
| #toc { border-bottom: 0 solid #dddddd; padding-bottom: 0.5em; } |
| #toc > ul { margin-left: 0.125em; } |
| #toc ul.sectlevel0 > li > a { font-style: italic; } |
| #toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; } |
| #toc ul { font-family: Noto, sans-serif; list-style-type: none; } |
| #toc li { line-height: 1.3334; margin-top: 0.3334em; } |
| #toc a { text-decoration: none; } |
| #toc a:active { text-decoration: underline; } |
| |
| #toctitle { color: black; font-size: 1.2em; } |
| |
| @media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; } |
| body.toc2 { padding-left: 15em; padding-right: 0; } |
| #toc.toc2 { margin-top: 0 !important; background-color: white; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #dddddd; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; } |
| #toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; } |
| #toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; } |
| #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; } |
| #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } |
| body.toc2.toc-right { padding-left: 0; padding-right: 15em; } |
| body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #dddddd; left: auto; right: 0; } } |
| @media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; } |
| #toc.toc2 { width: 20em; } |
| #toc.toc2 #toctitle { font-size: 1.375em; } |
| #toc.toc2 > ul { font-size: 0.95em; } |
| #toc.toc2 ul ul { padding-left: 1.25em; } |
| body.toc2.toc-right { padding-left: 0; padding-right: 20em; } } |
| #content #toc { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; } |
| #content #toc > :first-child { margin-top: 0; } |
| #content #toc > :last-child { margin-bottom: 0; } |
| |
| #footer { max-width: 100%; background-color: none; padding: 1.25em; } |
| |
| #footer-text { color: black; line-height: 1.44; } |
| |
| #content { margin-bottom: 0.625em; } |
| |
| .sect1 { padding-bottom: 0.625em; } |
| |
| @media only screen and (min-width: 768px) { #content { margin-bottom: 1.25em; } |
| .sect1 { padding-bottom: 1.25em; } } |
| .sect1:last-child { padding-bottom: 0; } |
| |
| .sect1 + .sect1 { border-top: 0 solid #dddddd; } |
| |
| #content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; } |
| #content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; } |
| #content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; } |
| #content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: black; text-decoration: none; } |
| #content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: black; } |
| |
| .audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; } |
| |
| .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; } |
| |
| table.tableblock > caption.title { white-space: nowrap; overflow: visible; max-width: 0; } |
| |
| .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: black; } |
| |
| table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; } |
| |
| .admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; } |
| .admonitionblock > table td.icon { text-align: center; width: 80px; } |
| .admonitionblock > table td.icon img { max-width: initial; } |
| .admonitionblock > table td.icon .title { font-weight: bold; font-family: Noto, sans-serif; text-transform: uppercase; } |
| .admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #dddddd; color: #5e93b8; } |
| .admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; } |
| |
| .exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; } |
| .exampleblock > .content > :first-child { margin-top: 0; } |
| .exampleblock > .content > :last-child { margin-bottom: 0; } |
| |
| .sidebarblock { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; } |
| .sidebarblock > :first-child { margin-top: 0; } |
| .sidebarblock > :last-child { margin-bottom: 0; } |
| .sidebarblock > .content > .title { color: black; margin-top: 0; } |
| |
| .exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; } |
| |
| .literalblock pre, .listingblock pre:not(.highlight), .listingblock pre[class="highlight"], .listingblock pre[class^="highlight "], .listingblock pre.CodeRay, .listingblock pre.prettyprint { background: #eeeeee; } |
| .sidebarblock .literalblock pre, .sidebarblock .listingblock pre:not(.highlight), .sidebarblock .listingblock pre[class="highlight"], .sidebarblock .listingblock pre[class^="highlight "], .sidebarblock .listingblock pre.CodeRay, .sidebarblock .listingblock pre.prettyprint { background: #f2f1f1; } |
| |
| .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { border: 1px hidden #666666; -webkit-border-radius: 0; border-radius: 0; word-wrap: break-word; padding: 1.25em 1.5625em 1.125em 1.5625em; font-size: 0.8125em; } |
| .literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; } |
| @media only screen and (min-width: 768px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.90625em; } } |
| @media only screen and (min-width: 1280px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 1em; } } |
| |
| .literalblock.output pre { color: #eeeeee; background-color: #264357; } |
| |
| .listingblock pre.highlightjs { padding: 0; } |
| .listingblock pre.highlightjs > code { padding: 1.25em 1.5625em 1.125em 1.5625em; -webkit-border-radius: 0; border-radius: 0; } |
| |
| .listingblock > .content { position: relative; } |
| |
| .listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: #999; } |
| |
| .listingblock:hover code[data-lang]:before { display: block; } |
| |
| .listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; } |
| |
| .listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; } |
| |
| table.pyhltable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; } |
| |
| table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; line-height: 1.6; } |
| |
| table.pyhltable td.code { padding-left: .75em; padding-right: 0; } |
| |
| pre.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; } |
| |
| pre.pygments .lineno { display: inline-block; margin-right: .25em; } |
| |
| table.pyhltable .linenodiv { background: none !important; padding-right: 0 !important; } |
| |
| .quoteblock { margin: 0 1em 0.75em 1.5em; display: table; } |
| .quoteblock > .title { margin-left: -1.5em; margin-bottom: 0.75em; } |
| .quoteblock blockquote, .quoteblock blockquote p { color: #333333; font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; } |
| .quoteblock blockquote { margin: 0; padding: 0; border: 0; } |
| .quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: black; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } |
| .quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; } |
| .quoteblock .attribution { margin-top: 0.5em; margin-right: 0.5ex; text-align: right; } |
| .quoteblock .quoteblock { margin-left: 0; margin-right: 0; padding: 0.5em 0; border-left: 3px solid #5e93b8; } |
| .quoteblock .quoteblock blockquote { padding: 0 0 0 0.75em; } |
| .quoteblock .quoteblock blockquote:before { display: none; } |
| |
| .verseblock { margin: 0 1em 0.75em 1em; } |
| .verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: #333333; font-weight: 300; text-rendering: optimizeLegibility; } |
| .verseblock pre strong { font-weight: 400; } |
| .verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; } |
| |
| .quoteblock .attribution, .verseblock .attribution { font-size: 0.8125em; line-height: 1.45; font-style: italic; } |
| .quoteblock .attribution br, .verseblock .attribution br { display: none; } |
| .quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: #5e93b8; } |
| |
| .quoteblock.abstract { margin: 0 0 0.75em 0; display: block; } |
| .quoteblock.abstract blockquote, .quoteblock.abstract blockquote p { text-align: left; word-spacing: 0; } |
| .quoteblock.abstract blockquote:before, .quoteblock.abstract blockquote p:first-of-type:before { display: none; } |
| |
| table.tableblock { max-width: 100%; border-collapse: separate; } |
| table.tableblock td > .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; } |
| |
| table.tableblock, th.tableblock, td.tableblock { border: 0 solid #d8d8ce; } |
| |
| table.grid-all > thead > tr > .tableblock, table.grid-all > tbody > tr > .tableblock { border-width: 0 1px 1px 0; } |
| |
| table.grid-all > tfoot > tr > .tableblock { border-width: 1px 1px 0 0; } |
| |
| table.grid-cols > * > tr > .tableblock { border-width: 0 1px 0 0; } |
| |
| table.grid-rows > thead > tr > .tableblock, table.grid-rows > tbody > tr > .tableblock { border-width: 0 0 1px 0; } |
| |
| table.grid-rows > tfoot > tr > .tableblock { border-width: 1px 0 0 0; } |
| |
| table.grid-all > * > tr > .tableblock:last-child, table.grid-cols > * > tr > .tableblock:last-child { border-right-width: 0; } |
| |
| table.grid-all > tbody > tr:last-child > .tableblock, table.grid-all > thead:last-child > tr > .tableblock, table.grid-rows > tbody > tr:last-child > .tableblock, table.grid-rows > thead:last-child > tr > .tableblock { border-bottom-width: 0; } |
| |
| table.frame-all { border-width: 1px; } |
| |
| table.frame-sides { border-width: 0 1px; } |
| |
| table.frame-topbot { border-width: 1px 0; } |
| |
| th.halign-left, td.halign-left { text-align: left; } |
| |
| th.halign-right, td.halign-right { text-align: right; } |
| |
| th.halign-center, td.halign-center { text-align: center; } |
| |
| th.valign-top, td.valign-top { vertical-align: top; } |
| |
| th.valign-bottom, td.valign-bottom { vertical-align: bottom; } |
| |
| th.valign-middle, td.valign-middle { vertical-align: middle; } |
| |
| table thead th, table tfoot th { font-weight: bold; } |
| |
| tbody tr th { display: table-cell; line-height: 1.4; background: -webkit-linear-gradient(top, #add386, #90b66a); } |
| |
| tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: white; font-weight: bold; } |
| |
| p.tableblock > code:only-child { background: none; padding: 0; } |
| |
| p.tableblock { font-size: 1em; } |
| |
| td > div.verse { white-space: pre; } |
| |
| ol { margin-left: 1.75em; } |
| |
| ul li ol { margin-left: 1.5em; } |
| |
| dl dd { margin-left: 1.125em; } |
| |
| dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; } |
| |
| ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.375em; } |
| |
| ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled { list-style-type: none; } |
| |
| ul.no-bullet, ol.no-bullet, ol.unnumbered { margin-left: 0.625em; } |
| |
| ul.unstyled, ol.unstyled { margin-left: 0; } |
| |
| ul.checklist { margin-left: 0.625em; } |
| |
| ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1.25em; font-size: 0.8em; position: relative; bottom: 0.125em; } |
| |
| ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; } |
| |
| ul.inline { display: -ms-flexbox; display: -webkit-box; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; list-style: none; margin: 0 0 0.375em -0.75em; } |
| |
| ul.inline > li { margin-left: 0.75em; } |
| |
| .unstyled dl dt { font-weight: normal; font-style: normal; } |
| |
| ol.arabic { list-style-type: decimal; } |
| |
| ol.decimal { list-style-type: decimal-leading-zero; } |
| |
| ol.loweralpha { list-style-type: lower-alpha; } |
| |
| ol.upperalpha { list-style-type: upper-alpha; } |
| |
| ol.lowerroman { list-style-type: lower-roman; } |
| |
| ol.upperroman { list-style-type: upper-roman; } |
| |
| ol.lowergreek { list-style-type: lower-greek; } |
| |
| .hdlist > table, .colist > table { border: 0; background: none; } |
| .hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; } |
| |
| td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; } |
| |
| td.hdlist1 { font-weight: bold; padding-bottom: 0.75em; } |
| |
| .literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; } |
| |
| .colist > table tr > td:first-of-type { padding: 0.4em 0.75em 0 0.75em; line-height: 1; vertical-align: top; } |
| .colist > table tr > td:first-of-type img { max-width: initial; } |
| .colist > table tr > td:last-of-type { padding: 0.25em 0; } |
| |
| .thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; } |
| |
| .imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; } |
| .imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; } |
| .imageblock > .title { margin-bottom: 0; } |
| .imageblock.thumb, .imageblock.th { border-width: 6px; } |
| .imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; } |
| |
| .image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; } |
| .image.left { margin-right: 0.625em; } |
| .image.right { margin-left: 0.625em; } |
| |
| a.image { text-decoration: none; display: inline-block; } |
| a.image object { pointer-events: none; } |
| |
| sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; } |
| sup.footnote a, sup.footnoteref a { text-decoration: none; } |
| sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; } |
| |
| #footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; } |
| #footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; } |
| #footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; margin-bottom: 0.2em; } |
| #footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; margin-left: -1.05em; } |
| #footnotes .footnote:last-of-type { margin-bottom: 0; } |
| #content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; } |
| |
| .gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; } |
| .gist .file-data > table td.line-data { width: 99%; } |
| |
| div.unbreakable { page-break-inside: avoid; } |
| |
| .big { font-size: larger; } |
| |
| .small { font-size: smaller; } |
| |
| .underline { text-decoration: underline; } |
| |
| .overline { text-decoration: overline; } |
| |
| .line-through { text-decoration: line-through; } |
| |
| .aqua { color: #00bfbf; } |
| |
| .aqua-background { background-color: #00fafa; } |
| |
| .black { color: black; } |
| |
| .black-background { background-color: black; } |
| |
| .blue { color: #0000bf; } |
| |
| .blue-background { background-color: #0000fa; } |
| |
| .fuchsia { color: #bf00bf; } |
| |
| .fuchsia-background { background-color: #fa00fa; } |
| |
| .gray { color: #606060; } |
| |
| .gray-background { background-color: #7d7d7d; } |
| |
| .green { color: #006000; } |
| |
| .green-background { background-color: #007d00; } |
| |
| .lime { color: #00bf00; } |
| |
| .lime-background { background-color: #00fa00; } |
| |
| .maroon { color: #600000; } |
| |
| .maroon-background { background-color: #7d0000; } |
| |
| .navy { color: #000060; } |
| |
| .navy-background { background-color: #00007d; } |
| |
| .olive { color: #606000; } |
| |
| .olive-background { background-color: #7d7d00; } |
| |
| .purple { color: #600060; } |
| |
| .purple-background { background-color: #7d007d; } |
| |
| .red { color: #bf0000; } |
| |
| .red-background { background-color: #fa0000; } |
| |
| .silver { color: #909090; } |
| |
| .silver-background { background-color: #bcbcbc; } |
| |
| .teal { color: #006060; } |
| |
| .teal-background { background-color: #007d7d; } |
| |
| .white { color: #bfbfbf; } |
| |
| .white-background { background-color: #fafafa; } |
| |
| .yellow { color: #bfbf00; } |
| |
| .yellow-background { background-color: #fafa00; } |
| |
| span.icon > .fa { cursor: default; } |
| a span.icon > .fa { cursor: inherit; } |
| |
| .admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; } |
| .admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #29475c; } |
| .admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; } |
| .admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; } |
| .admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; } |
| .admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; } |
| |
| .conum[data-value] { display: inline-block; color: #fff !important; background-color: black; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; } |
| .conum[data-value] * { color: #fff !important; } |
| .conum[data-value] + b { display: none; } |
| .conum[data-value]:after { content: attr(data-value); } |
| pre .conum[data-value] { position: relative; top: -0.125em; } |
| |
| b.conum * { color: inherit !important; } |
| |
| .conum:not([data-value]):empty { display: none; } |
| |
| h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { border-bottom: 1px solid #dddddd; } |
| |
| .sect1 { padding-bottom: 0; } |
| |
| #toctitle { color: #00406F; font-weight: normal; margin-top: 1.5em; } |
| |
| .sidebarblock { border-color: #aaa; } |
| |
| code { -webkit-border-radius: 4px; border-radius: 4px; } |
| |
| p.tableblock.header { color: #6d6e71; } |
| |
| .literalblock pre, .listingblock pre { background: #eeeeee; } |
| |
| </style> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> |
| <style> |
| /* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */ |
| /*pre.CodeRay {background-color:#f7f7f8;}*/ |
| .CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em} |
| .CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)} |
| .CodeRay .line-numbers strong{color:rgba(0,0,0,.4)} |
| table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none} |
| table.CodeRay td{vertical-align: top;line-height:1.45} |
| table.CodeRay td.line-numbers{text-align:right} |
| table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)} |
| table.CodeRay td.code{padding:0 0 0 .5em} |
| table.CodeRay td.code>pre{padding:0} |
| .CodeRay .debug{color:#fff !important;background:#000080 !important} |
| .CodeRay .annotation{color:#007} |
| .CodeRay .attribute-name{color:#000080} |
| .CodeRay .attribute-value{color:#700} |
| .CodeRay .binary{color:#509} |
| .CodeRay .comment{color:#998;font-style:italic} |
| .CodeRay .char{color:#04d} |
| .CodeRay .char .content{color:#04d} |
| .CodeRay .char .delimiter{color:#039} |
| .CodeRay .class{color:#458;font-weight:bold} |
| .CodeRay .complex{color:#a08} |
| .CodeRay .constant,.CodeRay .predefined-constant{color:#008080} |
| .CodeRay .color{color:#099} |
| .CodeRay .class-variable{color:#369} |
| .CodeRay .decorator{color:#b0b} |
| .CodeRay .definition{color:#099} |
| .CodeRay .delimiter{color:#000} |
| .CodeRay .doc{color:#970} |
| .CodeRay .doctype{color:#34b} |
| .CodeRay .doc-string{color:#d42} |
| .CodeRay .escape{color:#666} |
| .CodeRay .entity{color:#800} |
| .CodeRay .error{color:#808} |
| .CodeRay .exception{color:inherit} |
| .CodeRay .filename{color:#099} |
| .CodeRay .function{color:#900;font-weight:bold} |
| .CodeRay .global-variable{color:#008080} |
| .CodeRay .hex{color:#058} |
| .CodeRay .integer,.CodeRay .float{color:#099} |
| .CodeRay .include{color:#555} |
| .CodeRay .inline{color:#000} |
| .CodeRay .inline .inline{background:#ccc} |
| .CodeRay .inline .inline .inline{background:#bbb} |
| .CodeRay .inline .inline-delimiter{color:#d14} |
| .CodeRay .inline-delimiter{color:#d14} |
| .CodeRay .important{color:#555;font-weight:bold} |
| .CodeRay .interpreted{color:#b2b} |
| .CodeRay .instance-variable{color:#008080} |
| .CodeRay .label{color:#970} |
| .CodeRay .local-variable{color:#963} |
| .CodeRay .octal{color:#40e} |
| .CodeRay .predefined{color:#369} |
| .CodeRay .preprocessor{color:#579} |
| .CodeRay .pseudo-class{color:#555} |
| .CodeRay .directive{font-weight:bold} |
| .CodeRay .type{font-weight:bold} |
| .CodeRay .predefined-type{color:inherit} |
| .CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold} |
| .CodeRay .key{color:#808} |
| .CodeRay .key .delimiter{color:#606} |
| .CodeRay .key .char{color:#80f} |
| .CodeRay .value{color:#088} |
| .CodeRay .regexp .delimiter{color:#808} |
| .CodeRay .regexp .content{color:#808} |
| .CodeRay .regexp .modifier{color:#808} |
| .CodeRay .regexp .char{color:#d14} |
| .CodeRay .regexp .function{color:#404;font-weight:bold} |
| .CodeRay .string{color:#d20} |
| .CodeRay .string .string .string{background:#ffd0d0} |
| .CodeRay .string .content{color:#d14} |
| .CodeRay .string .char{color:#d14} |
| .CodeRay .string .delimiter{color:#d14} |
| .CodeRay .shell{color:#d14} |
| .CodeRay .shell .delimiter{color:#d14} |
| .CodeRay .symbol{color:#990073} |
| .CodeRay .symbol .content{color:#a60} |
| .CodeRay .symbol .delimiter{color:#630} |
| .CodeRay .tag{color:#008080} |
| .CodeRay .tag-special{color:#d70} |
| .CodeRay .variable{color:#036} |
| .CodeRay .insert{background:#afa} |
| .CodeRay .delete{background:#faa} |
| .CodeRay .change{color:#aaf;background:#007} |
| .CodeRay .head{color:#f8f;background:#505} |
| .CodeRay .insert .insert{color:#080} |
| .CodeRay .delete .delete{color:#800} |
| .CodeRay .change .change{color:#66f} |
| .CodeRay .head .head{color:#f4f} |
| </style> |
| <link rel="stylesheet" href="../katex/katex.min.css"> |
| <script src="../katex/katex.min.js"></script> |
| <script src="../katex/contrib/auto-render.min.js"></script> |
| <!-- Use KaTeX to render math once document is loaded, see |
| https://github.com/Khan/KaTeX/tree/master/contrib/auto-render --> |
| <script> |
| document.addEventListener("DOMContentLoaded", function () { |
| renderMathInElement( |
| document.body, |
| { |
| delimiters: [ |
| { left: "$$", right: "$$", display: true}, |
| { left: "\\[", right: "\\]", display: true}, |
| { left: "$", right: "$", display: false}, |
| { left: "\\(", right: "\\)", display: false} |
| ] |
| } |
| ); |
| }); |
| </script></head> |
| <body class="book toc2 toc-left" style="max-width: 100;"> |
| <div id="header"> |
| <h1>The OpenCL<sup>™</sup> SPIR-V Environment Specification</h1> |
| <div class="details"> |
| <span id="author" class="author">Khronos<sup>®</sup> OpenCL Working Group</span><br> |
| <span id="revnumber">version V2.2-11,</span> |
| <span id="revdate">Fri, 19 Jul 2019 14:09:33 +0000</span> |
| <br><span id="revremark">from git branch: master commit: 2aaf7b58ead9567d8799b22ecc748b4892a1e04e</span> |
| </div> |
| <div id="toc" class="toc2"> |
| <div id="toctitle">Table of Contents</div> |
| <ul class="sectlevel1"> |
| <li><a href="#introduction">1. Introduction</a></li> |
| <li><a href="#common-properties">2. Common Properties</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_supported_spir_v_versions">2.1. Supported SPIR-V Versions</a></li> |
| <li><a href="#_extended_instruction_sets">2.2. Extended Instruction Sets</a></li> |
| <li><a href="#_source_language_encoding">2.3. Source Language Encoding</a></li> |
| <li><a href="#_numerical_type_formats">2.4. Numerical Type Formats</a></li> |
| <li><a href="#_supported_types">2.5. Supported Types</a></li> |
| <li><a href="#_image_channel_order_mapping">2.6. Image Channel Order Mapping</a></li> |
| <li><a href="#_image_channel_data_type_mapping">2.7. Image Channel Data Type Mapping</a></li> |
| <li><a href="#_kernels">2.8. Kernels</a></li> |
| </ul> |
| </li> |
| <li><a href="#required-capabilities">3. Required Capabilities</a> |
| <ul class="sectlevel2"> |
| <li><a href="#required-capabilities-1.0">3.1. SPIR-V 1.0</a></li> |
| <li><a href="#required-capabilities-1.1">3.2. SPIR-V 1.1</a></li> |
| <li><a href="#required-capabilities-1.2">3.3. SPIR-V 1.2</a></li> |
| </ul> |
| </li> |
| <li><a href="#validation-rules">4. Validation Rules</a></li> |
| <li><a href="#opencl_extensions">5. OpenCL Extensions</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_declaring_spir_v_extensions">5.1. Declaring SPIR-V Extensions</a></li> |
| <li><a href="#_full_and_embedded_profile_extensions">5.2. Full and Embedded Profile Extensions</a></li> |
| <li><a href="#_embedded_profile_extensions">5.3. Embedded Profile Extensions</a></li> |
| </ul> |
| </li> |
| <li><a href="#numerical_compliance">6. OpenCL Numerical Compliance</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_rounding_modes">6.1. Rounding Modes</a></li> |
| <li><a href="#_rounding_modes_for_conversions">6.2. Rounding Modes for Conversions</a></li> |
| <li><a href="#_out_of_range_conversions">6.3. Out-of-Range Conversions</a></li> |
| <li><a href="#_inf_nan_and_denormalized_numbers">6.4. INF, NaN, and Denormalized Numbers</a></li> |
| <li><a href="#_floating_point_exceptions">6.5. Floating-Point Exceptions</a></li> |
| <li><a href="#relative-error-as-ulps">6.6. Relative Error as ULPs</a></li> |
| <li><a href="#_edge_case_behavior">6.7. Edge Case Behavior</a></li> |
| </ul> |
| </li> |
| <li><a href="#image_addressing_and_filtering">7. Image Addressing and Filtering</a> |
| <ul class="sectlevel2"> |
| <li><a href="#image-coordinates">7.1. Image Coordinates</a></li> |
| <li><a href="#addressing-and-filter-modes">7.2. Addressing and Filter Modes</a></li> |
| <li><a href="#precision-of-addressing-and-filter-modes">7.3. Precision of Addressing and Filter Modes</a></li> |
| <li><a href="#conversion-rules">7.4. Conversion Rules</a></li> |
| <li><a href="#selecting-an-image-from-an-image-array">7.5. Selecting an Image from an Image Array</a></li> |
| <li><a href="#_data_format_for_reading_and_writing_images">7.6. Data Format for Reading and Writing Images</a></li> |
| <li><a href="#_sampled_and_sampler_less_reads">7.7. Sampled and Sampler-less Reads</a></li> |
| </ul> |
| </li> |
| <li><a href="#references">8. Normative References</a></li> |
| </ul> |
| </div> |
| </div> |
| <div id="content"> |
| <div id="preamble"> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Copyright 2008-2019 The Khronos Group.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This specification is protected by copyright laws and contains material proprietary |
| to the Khronos Group, Inc. Except as described by these terms, it or any components |
| may not be reproduced, republished, distributed, transmitted, displayed, broadcast |
| or otherwise exploited in any manner without the express prior written permission |
| of Khronos Group.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Khronos Group grants a conditional copyright license to use and reproduce the |
| unmodified specification for any purpose, without fee or royalty, EXCEPT no licenses |
| to any patent, trademark or other intellectual property rights are granted under |
| these terms. Parties desiring to implement the specification and make use of |
| Khronos trademarks in relation to that implementation, and receive reciprocal patent |
| license protection under the Khronos IP Policy must become Adopters and confirm the |
| implementation as conformant under the process defined by Khronos for this |
| specification; see <a href="https://www.khronos.org/adopters" class="bare">https://www.khronos.org/adopters</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Khronos Group makes no, and expressly disclaims any, representations or warranties, |
| express or implied, regarding this specification, including, without limitation: |
| merchantability, fitness for a particular purpose, non-infringement of any |
| intellectual property, correctness, accuracy, completeness, timeliness, and |
| reliability. Under no circumstances will the Khronos Group, or any of its Promoters, |
| Contributors or Members, or their respective partners, officers, directors, |
| employees, agents or representatives be liable for any damages, whether direct, |
| indirect, special or consequential damages for lost revenues, lost profits, or |
| otherwise, arising from or in connection with these materials.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Vulkan and Khronos are registered trademarks, and OpenXR, SPIR, SPIR-V, SYCL, WebGL, |
| WebCL, OpenVX, OpenVG, EGL, COLLADA, glTF, NNEF, OpenKODE, OpenKCAM, StreamInput, |
| OpenWF, OpenSL ES, OpenMAX, OpenMAX AL, OpenMAX IL, OpenMAX DL, OpenML and DevU are |
| trademarks of the Khronos Group Inc. ASTC is a trademark of ARM Holdings PLC, |
| OpenCL is a trademark of Apple Inc. and OpenGL and OpenML are registered trademarks |
| and the OpenGL ES and OpenGL SC logos are trademarks of Silicon Graphics |
| International used under license by Khronos. All other product names, trademarks, |
| and/or company names are used solely for identification and belong to their |
| respective owners.</p> |
| </div> |
| <div style="page-break-after: always;"></div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="introduction">1. Introduction</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p><a href="#opencl-spec">OpenCL</a> is an open, royalty-free, standard for general |
| purpose parallel programming across CPUs, GPUs, and other processors, giving |
| software developers portable and efficient access to the power of |
| heterogeneous processing platforms.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#spirv-spec">SPIR-V</a> is an open, royalty-free, standard intermediate |
| language capable of representing parallel compute kernels that are executed |
| by implementations of the OpenCL standard.</p> |
| </div> |
| <div class="paragraph"> |
| <p>SPIR-V is adaptable to multiple execution environments: a SPIR-V module is |
| consumed by an execution environment, as specified by a client API. |
| This document describes the SPIR-V execution environment for implementations |
| of the OpenCL standard. |
| The SPIR-V execution environment describes required support for some SPIR-V |
| capabilities, additional semantics for some SPIR-V instructions, and |
| additional validation rules that a SPIR-V binary module must adhere to in |
| order to be considered valid.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This document is written for compiler developers who are generating SPIR-V |
| modules intended to be consumed by the OpenCL API, for implementors of the |
| OpenCL API who are consuming SPIR-V modules, and for software developers who |
| are using SPIR-V modules with the OpenCL API.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="common-properties">2. Common Properties</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This section describes common properties of all OpenCL environments that |
| consume SPIR-V modules.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A SPIR-V module passed to an OpenCL environment is interpreted as a series |
| of 32-bit words in host endianness, with literal strings packed as described |
| in the SPIR-V specification. |
| The first few words of the SPIR-V module must be a magic number and a SPIR-V |
| version number, as described in the SPIR-V specification.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_supported_spir_v_versions">2.1. Supported SPIR-V Versions</h3> |
| <div class="paragraph"> |
| <p>An OpenCL environment describes the versions of SPIR-V modules that it |
| supports using the <code>CL_DEVICE_IL_VERSION</code> query in OpenCL 2.1 or newer, or the |
| <code>CL_DEVICE_IL_VERSION_KHR</code> query in the <code>cl_khr_il_program</code> extension.</p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL environments that support the <code>cl_khr_il_program</code> extension or |
| OpenCL 2.1 must support SPIR-V 1.0 modules. OpenCL environments that support |
| OpenCL 2.2 must support SPIR-V 1.0, 1.1, and 1.2 modules.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_extended_instruction_sets">2.2. Extended Instruction Sets</h3> |
| <div class="paragraph"> |
| <p>OpenCL environments supporting SPIR-V must support SPIR-V modules that import |
| the <strong>OpenCL.std</strong> |
| <a href="#opencl-extended-instruction-set">extended instruction set for OpenCL</a> |
| using <strong>OpExtInstImport</strong>. For example:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>... = OpExtInstImport "OpenCL.std"</pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_source_language_encoding">2.3. Source Language Encoding</h3> |
| <div class="paragraph"> |
| <p>If a SPIR-V module represents a program written in OpenCL C, then the |
| <em>Source Language</em> operand for the <strong>OpSource</strong> instruction should be |
| <strong>OpenCL_C</strong>, and the 32-bit literal language <em>Version</em> should describe the |
| version of OpenCL C, encoded MSB to LSB as:</p> |
| </div> |
| <div class="literalblock"> |
| <div class="content"> |
| <pre>0 | Major Number | Minor Number | Revision Number (optional)</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>If a SPIR-V module represents a program written in OpenCL C++, then the |
| <em>Source Language</em> operand for the <strong>OpSource</strong> instruction should be |
| <strong>OpenCL_CPP</strong>, and the 32-bit literal language <em>Version</em> should describe the |
| version of OpenCL C++, encoded similarly.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The source language version is purely informational and has no semantic |
| meaning.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_numerical_type_formats">2.4. Numerical Type Formats</h3> |
| <div class="paragraph"> |
| <p>For all OpenCL environments, floating-point types are represented and stored |
| using <a href="#ieee-754-spec">IEEE-754</a> semantics. |
| All integer formats are represented and stored using 2’s-complement format.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_supported_types">2.5. Supported Types</h3> |
| <div class="paragraph"> |
| <p>The following types are supported by OpenCL environments. |
| Note that some types may require additional capabilities, and may not be |
| supported by all OpenCL environments.</p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL environments support arrays declared using <strong>OpTypeArray</strong>, structs |
| declared using <strong>OpTypeStruct</strong>, functions declared using <strong>OpTypeFunction</strong>, |
| and pointers declared using <strong>OpTypePointer</strong>.</p> |
| </div> |
| <div class="sect3"> |
| <h4 id="_basic_scalar_and_vector_types">2.5.1. Basic Scalar and Vector Types</h4> |
| <div class="paragraph"> |
| <p><strong>OpTypeVoid</strong> is supported.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The following scalar types are supported by OpenCL environments:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpTypeBool</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeInt</strong>, with <em>Width</em> equal to 8, 16, 32, or 64, and with |
| <em>Signedness</em> equal to zero, indicating no signedness semantics.</p> |
| </li> |
| <li> |
| <p><strong>OpTypeFloat</strong>, with <em>Width</em> equal to 16, 32, or 64.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL environments support vector types declared using <strong>OpTypeVector</strong>. |
| The vector <em>Component Type</em> may be any of the scalar types described |
| above. |
| Supported vector <em>Component Counts</em> are 2, 3, 4, 8, or 16.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_image_related_data_types">2.5.2. Image-Related Data Types</h4> |
| <div class="paragraph"> |
| <p>The following table describes the <strong>OpTypeImage</strong> image types supported by |
| OpenCL environments:</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 1. Image Types</caption> |
| <colgroup> |
| <col style="width: 16.6666%;"> |
| <col style="width: 16.6666%;"> |
| <col style="width: 16.6666%;"> |
| <col style="width: 50.0002%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><em>Dim</em></th> |
| <th class="tableblock halign-left valign-top"><em>Depth</em></th> |
| <th class="tableblock halign-left valign-top"><em>Arrayed</em></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1D</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 1D image.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>1D</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 1D image array.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2D</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 2D image.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2D</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 2D depth image.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2D</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 2D image array.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>2D</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 2D depth image array.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>3D</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 3D image.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Buffer</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 1D buffer image.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><strong>OpTypeSampler</strong> may be used to declare sampler types in OpenCL environments.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_other_data_types">2.5.3. Other Data Types</h4> |
| <div class="paragraph"> |
| <p>The following table describes other data types that may be used in an |
| OpenCL environment:</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 2. Other Data Types</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Type</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeEvent</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL event representing async copies from global to local memory and vice-versa.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeDeviceEvent</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL device-side event representing commands enqueued to device command queues.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypePipe</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL pipe.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeReserveId</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL pipe reservation identifier.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpTypeQueue</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL device-side command queue.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_image_channel_order_mapping">2.6. Image Channel Order Mapping</h3> |
| <div class="paragraph"> |
| <p>The following table describes how the results of the SPIR-V |
| <strong>OpImageQueryOrder</strong> instruction correspond to the OpenCL host API image |
| channel orders.</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 3. Image Channel Order mapping</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>SPIR-V Image Channel Order</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>OpenCL Image Channel Order</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>R</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_R</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>A</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_A</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>RG</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RG</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>RA</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RA</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>RGB</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RGB</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>RGBA</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RGBA</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>BGRA</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_BGRA</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>ARGB</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_ARGB</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>Intensity</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_INTENSITY</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>Luminance</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_LUMINANCE</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>Rx</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_Rx</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>RGx</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RGx</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>RGBx</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_RGBx</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>Depth</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_DEPTH</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>DepthStencil</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_DEPTH_STENCIL</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>sRGB</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_sRGB</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>sRGBA</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_sRGBA</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>sBGRA</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_sBGRA</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>sRGBx</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_sRGBx</code></p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="sect2"> |
| <h3 id="_image_channel_data_type_mapping">2.7. Image Channel Data Type Mapping</h3> |
| <div class="paragraph"> |
| <p>The following table describes how the results of the SPIR-V |
| <strong>OpImageQueryFormat</strong> instruction correspond to the OpenCL host API image |
| channel data types.</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 4. Image Channel Data Type mapping</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>SPIR-V Image Channel Data Type</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>OpenCL Image Channel Data Type</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>SnormInt8</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SNORM_INT8</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>SnormInt16</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SNORM_INT16</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt8</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT8</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt16</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT16</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt24</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT24</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormShort565</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_SHORT_565</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormShort555</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_SHORT_555</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnormInt101010</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNORM_INT_101010</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>SignedInt8</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SIGNED_INT8</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>SignedInt16</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SIGNED_INT16</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>SignedInt32</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_SIGNED_INT32</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnsignedInt8</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNSIGNED_INT8</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnsignedInt16</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNSIGNED_INT16</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>UnsignedInt32</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_UNSIGNED_INT32</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>HalfFloat</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_HALF_FLOAT</code></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>Float</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>CL_FLOAT</code></p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="sect2"> |
| <h3 id="_kernels">2.8. Kernels</h3> |
| <div class="paragraph"> |
| <p>An <strong>OpFunction</strong> in a SPIR-V module that is identified with <strong>OpEntryPoint</strong> |
| defines an OpenCL kernel that may be invoked using the OpenCL host API |
| enqueue kernel interfaces.</p> |
| </div> |
| <div class="sect3"> |
| <h4 id="_kernel_return_types">2.8.1. Kernel Return Types</h4> |
| <div class="paragraph"> |
| <p>The <em>Result Type</em> for an <strong>OpFunction</strong> identified with <strong>OpEntryPoint</strong> must be |
| <strong>OpTypeVoid</strong>.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_kernel_arguments">2.8.2. Kernel Arguments</h4> |
| <div class="paragraph"> |
| <p>An <strong>OpFunctionParameter</strong> for an <strong>OpFunction</strong> that is identified with |
| <strong>OpEntryPoint</strong> defines an OpenCL kernel argument. |
| Allowed types for OpenCL kernel arguments are:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpTypeInt</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeFloat</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeStruct</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeVector</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypePointer</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeSampler</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeImage</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypePipe</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeQueue</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>For <strong>OpTypeInt</strong> parameters, supported <em>Widths</em> are 8, 16, 32, and 64, and |
| must have no signedness semantics.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For <strong>OpTypeFloat</strong> parameters, <em>Width</em> must be 32.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For <strong>OpTypeStruct</strong> parameters, supported structure <em>Member Types</em> are:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpTypeInt</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeFloat</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeStruct</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypeVector</strong></p> |
| </li> |
| <li> |
| <p><strong>OpTypePointer</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>For <strong>OpTypePointer</strong> parameters, supported <em>Storage Classes</em> are:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>CrossWorkgroup</strong></p> |
| </li> |
| <li> |
| <p><strong>Workgroup</strong></p> |
| </li> |
| <li> |
| <p><strong>UniformConstant</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL kernel argument types must have a representation in the OpenCL host |
| API.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Environments that support extensions or optional features may allow |
| additional types in an entry point’s parameter list.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="required-capabilities">3. Required Capabilities</h2> |
| <div class="sectionbody"> |
| <div class="sect2"> |
| <h3 id="required-capabilities-1.0">3.1. SPIR-V 1.0</h3> |
| <div class="paragraph"> |
| <p>An OpenCL environment that supports SPIR-V 1.0 must support SPIR-V 1.0 |
| modules that declare the following capabilities:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Addresses</strong></p> |
| </li> |
| <li> |
| <p><strong>Float16Buffer</strong></p> |
| </li> |
| <li> |
| <p><strong>Int64</strong> (Full Profile Only)</p> |
| </li> |
| <li> |
| <p><strong>Int16</strong></p> |
| </li> |
| <li> |
| <p><strong>Int8</strong></p> |
| </li> |
| <li> |
| <p><strong>Kernel</strong></p> |
| </li> |
| <li> |
| <p><strong>Linkage</strong></p> |
| </li> |
| <li> |
| <p><strong>Vector16</strong></p> |
| </li> |
| <li> |
| <p><strong>DeviceEnqueue</strong> (OpenCL 2.0 and Newer)</p> |
| </li> |
| <li> |
| <p><strong>GenericPointer</strong> (OpenCL 2.0 and Newer)</p> |
| </li> |
| <li> |
| <p><strong>Groups</strong> (OpenCL 2.0 and Newer)</p> |
| </li> |
| <li> |
| <p><strong>Pipes</strong> (OpenCL 2.0 and Newer)</p> |
| </li> |
| <li> |
| <p><strong>ImageBasic</strong> (if <code>CL_DEVICE_IMAGE_SUPPORT</code> is <code>CL_TRUE</code>)</p> |
| </li> |
| <li> |
| <p><strong>Float64</strong> (if the device supports double precision floating-point)</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the <strong>ImageBasic</strong> capability, then |
| the following capabilities must also be supported:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>LiteralSampler</strong></p> |
| </li> |
| <li> |
| <p><strong>Sampled1D</strong></p> |
| </li> |
| <li> |
| <p><strong>Image1D</strong></p> |
| </li> |
| <li> |
| <p><strong>SampledBuffer</strong></p> |
| </li> |
| <li> |
| <p><strong>ImageBuffer</strong></p> |
| </li> |
| <li> |
| <p><strong>ImageReadWrite</strong> (OpenCL 2.0 and Newer)</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="required-capabilities-1.1">3.2. SPIR-V 1.1</h3> |
| <div class="paragraph"> |
| <p>An OpenCL environment supporting SPIR-V 1.1 must support SPIR-V 1.1 |
| modules that declare the capabilities required for SPIR-V 1.0 modules, |
| above.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In addition, an OpenCL environment consuming SPIR-V 1.1 must support |
| SPIR-V 1.1 modules that declare the following capabilities:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>SubgroupDispatch</strong> (OpenCL 2.2 and Newer)</p> |
| </li> |
| <li> |
| <p><strong>PipeStorage</strong> (OpenCL 2.2 and Newer)</p> |
| </li> |
| <li> |
| <p><strong>Initializer</strong> (OpenCL 2.2 and Newer)</p> |
| </li> |
| <li> |
| <p><strong>Finalizer</strong> (OpenCL 2.2 and Newer)</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="required-capabilities-1.2">3.3. SPIR-V 1.2</h3> |
| <div class="paragraph"> |
| <p>An OpenCL environment supporting SPIR-V 1.2 must support SPIR-V 1.2 |
| modules that declare the capabilities required for SPIR-V 1.1 modules, |
| above.</p> |
| </div> |
| <div class="paragraph"> |
| <p>SPIR-V 1.2 does not add any new required capabilities.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="validation-rules">4. Validation Rules</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>The following are a list of validation rules that apply to SPIR-V modules |
| executing in all OpenCL environments:</p> |
| </div> |
| <div class="paragraph"> |
| <p>The <em>Execution Model</em> declared in <strong>OpEntryPoint</strong> must be <strong>Kernel</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The <em>Addressing Model</em> declared in <strong>OpMemoryModel</strong> must be either:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Physical32</strong> (for OpenCL devices reporting <code>32</code> for <code>CL_DEVICE_ADDRESS_BITS</code>)</p> |
| </li> |
| <li> |
| <p><strong>Physical64</strong> (for OpenCL devices reporting <code>64</code> for <code>CL_DEVICE_ADDRESS_BITS</code>)</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The <em>Memory Model</em> declared in <strong>OpMemoryModel</strong> must be <strong>OpenCL</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For all <strong>OpTypeInt</strong> integer type-declaration instructions:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>Signedness</em> must be 0, indicating no signedness semantics.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>For all <strong>OpTypeImage</strong> type-declaration instructions: |
| * <em>Sampled Type</em> must be <strong>OpTypeVoid</strong>. |
| * <em>Sampled</em> must be 0, indicating that the image usage will be known at |
| run time, not at compile time. |
| * <em>MS</em> must be 0, indicating single-sampled content. |
| * <em>Arrayed</em> may only be set to 1, indicating arrayed content, when <em>Dim</em> |
| is set to <strong>1D</strong> or <strong>2D</strong>. |
| * <em>Image Format</em> must be <strong>Unknown</strong>, indicating that the image does not |
| have a specified format. |
| * The optional image <em>Access Qualifier</em> must be present.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The image write instruction <strong>OpImageWrite</strong> must not include any optional |
| <em>Image Operands</em>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The image read instructions <strong>OpImageRead</strong> and <strong>OpImageSampleExplicitLod</strong> |
| must not include the optional <em>Image Operand</em> <strong>ConstOffset</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For all <strong>Atomic Instructions</strong>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Only 32-bit integer types are supported for the <em>Result Type</em> and/or |
| type of <em>Value</em>.</p> |
| </li> |
| <li> |
| <p>The <em>Pointer</em> operand must be a pointer to the <strong>Function</strong>, <strong>Workgroup</strong>, |
| or <strong>CrossWorkGroup</strong> <em>Storage Classes</em>. Note that an <strong>Atomic Instruction</strong> |
| on a pointer to the <strong>Function</strong> <em>Storage Class</em> is valid, but does not |
| have defined behavior.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Recursion is not supported. |
| The static function call graph for an entry point must not contain cycles.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Whether irreducible control flow is legal is implementation defined.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For the instructions <strong>OpGroupAsyncCopy</strong> and <strong>OpGroupWaitEvents</strong>, |
| <em>Scope</em> for <em>Execution</em> must be:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Workgroup</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>For all other instructions, <em>Scope</em> for <em>Execution</em> must be one of:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Workgroup</strong></p> |
| </li> |
| <li> |
| <p><strong>Subgroup</strong> (OpenCL 2.1 and Newer)</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>In an OpenCL 1.2 environment, |
| for the <strong>Barrier Instructions</strong> <strong>OpControlBarrier</strong> and <strong>OpMemoryBarrier</strong>, the |
| <em>Scope</em> for <em>Memory</em> must be <strong>Workgroup</strong>, and the memory-order constraint in |
| <em>Memory Semantics</em> must be <strong>SequentiallyConsistent</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In an OpenCL 1.2 environment, |
| for the <strong>Atomic Instructions</strong>, the <em>Scope</em> for <em>Memory</em> must be <strong>Device</strong>, |
| and the memory-order constraint in <em>Memory Semantics</em> must be <strong>Relaxed</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Otherwise, <em>Scope</em> for <em>Memory</em> must be one of:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>CrossDevice</strong></p> |
| </li> |
| <li> |
| <p><strong>Device</strong></p> |
| </li> |
| <li> |
| <p><strong>Workgroup</strong></p> |
| </li> |
| <li> |
| <p><strong>Invocation</strong></p> |
| </li> |
| <li> |
| <p><strong>Subgroup</strong> (OpenCL 2.1 and Newer)</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>In OpenCL 2.0 and newer environments, |
| the <em>Pointer</em> operand to all <strong>Atomic Instructions</strong> may be a pointer to |
| the <strong>Generic</strong> <em>Storage Class</em>, however behavior is still undefined if |
| the <strong>Generic</strong> pointer represents a pointer to the <strong>Function</strong> |
| <em>Storage Class</em>.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="opencl_extensions">5. OpenCL Extensions</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>An OpenCL environment may be modified by <a href="#opencl-extension-spec">OpenCL |
| extensions</a>. For example, some OpenCL extensions may require support |
| for support for additional SPIR-V capabilities or instructions, or by |
| relaxing SPIR-V restrictions. |
| Some OpenCL extensions may modify the OpenCL environment by requiring |
| consumption of a SPIR-V module that uses a SPIR-V extension. In this case, |
| the implementation will include the OpenCL extension in the host API |
| <code>CL_PLATFORM_EXTENSIONS</code> or <code>CL_DEVICE_EXTENSIONS</code> string, but not the |
| corresponding SPIR-V extension.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This section describes how the OpenCL environment is modified by Khronos |
| (<code>khr</code>) OpenCL extensions. Other OpenCL extensions, such as multi-vendor |
| (<code>ext</code>) extensions or vendor-specific extensions, describe how they modify |
| the OpenCL environment in their individual extension specifications. The |
| Khronos OpenCL extensions require no corresponding SPIR-V extensions.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_declaring_spir_v_extensions">5.1. Declaring SPIR-V Extensions</h3> |
| <div class="paragraph"> |
| <p>A SPIR-V module declares use of a SPIR-V extension using <strong>OpExtension</strong> and |
| the name of the SPIR-V extension. For example:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>OpExtension "SPV_KHR_extension_name"</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Only use of SPIR-V extensions may be declared in a SPIR-V module using |
| <strong>OpExtension</strong>; there is never a need to declare use of an OpenCL extension |
| in a SPIR-V module using <strong>OpExtension</strong>.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_full_and_embedded_profile_extensions">5.2. Full and Embedded Profile Extensions</h3> |
| <div class="sect3"> |
| <h4 id="_cl_khr_3d_image_writes">5.2.1. <code>cl_khr_3d_image_writes</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_3d_image_writes</code>, |
| then the environment must accept <em>Image</em> operands to <strong>OpImageWrite</strong> that |
| are declared with with dimensionality <em>Dim</em> equal to <strong>3D</strong>.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_depth_images">5.2.2. <code>cl_khr_depth_images</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_depth_images</code>, |
| then the environment must accept modules that declare 2D depth image types |
| using <strong>OpTypeImage</strong> with dimensionality <em>Dim</em> equal to <strong>2D</strong> and <em>Depth</em> |
| equal to 1, indicating a depth image. 2D depth images may optionally be |
| <em>Arrayed</em>, if supported.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Additionally, the following Image Channel Orders may be returned by |
| <strong>OpImageQueryOrder</strong>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Depth</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_device_enqueue_local_arg_types">5.2.3. <code>cl_khr_device_enqueue_local_arg_types</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension |
| <code>cl_khr_device_enqueue_local_arg_types</code>, then then environment will allow |
| <em>Invoke</em> functions to be passed to <strong>OpEnqueueKernel</strong> with <strong>Workgroup</strong> |
| memory pointer parameters of any type.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_fp16">5.2.4. <code>cl_khr_fp16</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_fp16</code>, then the |
| environment must accept modules that declare the following SPIR-V |
| capabilities:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Float16</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_fp64">5.2.5. <code>cl_khr_fp64</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_fp64</code>, then the |
| environment must accept modules that declare the following SPIR-V |
| capabilities:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Float64</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_gl_depth_images">5.2.6. <code>cl_khr_gl_depth_images</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_gl_depth_images</code>, |
| then the following Image Channel Orders may additionally be returned by |
| <strong>OpImageQueryOrder</strong>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>DepthStencil</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Also, the following Image Channel Data Types may additionally be returned by |
| <strong>OpImageQueryFormat</strong>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>UnormInt24</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_gl_msaa_sharing">5.2.7. <code>cl_khr_gl_msaa_sharing</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_gl_msaa_sharing</code>, |
| then the environment must accept modules that declare 2D multi-sampled |
| image types using <strong>OpTypeImage</strong> with dimensionality <em>Dim</em> equal to <strong>2D</strong> and |
| <em>MS</em> equal to 1, indicating multi-sampled content. 2D multi-sampled images |
| may optionally be <em>Arrayed</em> or <em>Depth</em> images, if supported.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The 2D multi-sampled images may be used with the following instructions:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpImageRead</strong></p> |
| </li> |
| <li> |
| <p><strong>OpImageQuerySizeLod</strong></p> |
| </li> |
| <li> |
| <p><strong>OpImageQueryFormat</strong></p> |
| </li> |
| <li> |
| <p><strong>OpImageQueryOrder</strong></p> |
| </li> |
| <li> |
| <p><strong>OpImageQuerySamples</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_int64_base_atomics_and_cl_khr_int64_extended_atomics">5.2.8. <code>cl_khr_int64_base_atomics</code> and <code>cl_khr_int64_extended_atomics</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_int64_base_atomics</code> |
| or <code>cl_khr_int64_extended_atomics</code>, then the environment must accept modules |
| that declare the following SPIR-V capabilities:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Int64Atomics</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>When the <strong>Int64Atomics</strong> capability is declared, 64-bit integer types are |
| valid for the <em>Result Type</em> and type of <em>Value</em> for all <strong>Atomic Instructions</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Note: OpenCL environments that consume SPIR-V must support both |
| <code>cl_khr_int64_base_atomics</code> and <code>cl_khr_int64_extended_atomics</code> or neither |
| of these extensions.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_mipmap_image">5.2.9. <code>cl_khr_mipmap_image</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_mipmap_image</code>, |
| then the environment must accept non-zero optional <strong>Lod</strong> <em>Image Operands</em> |
| for the following instructions:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpImageSampleExplicitLod</strong></p> |
| </li> |
| <li> |
| <p><strong>OpImageRead</strong></p> |
| </li> |
| <li> |
| <p><strong>OpImageQuerySizeLod</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Note: Implementations that support <code>cl_khr_mipmap_image</code> are not guaranteed |
| to support the <strong>ImageMipmap</strong> capability, since this extension does not |
| require non-zero optional <strong>Lod</strong> <em>Image Operands</em> for <strong>OpImageWrite</strong>.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_mipmap_image_writes">5.2.10. <code>cl_khr_mipmap_image_writes</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_mipmap_image_writes</code>, |
| then the environment must accept non-zero optional <strong>Lod</strong> <em>Image Operands</em> |
| for the following instructions:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpImageWrite</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Note: An implementation that supports <code>cl_khr_mipmap_image_writes</code> must also |
| support <code>cl_khr_mipmap_image</code>, and support for both extensions does |
| guarantee support for the <strong>ImageMipmap</strong> capability.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_subgroups">5.2.11. <code>cl_khr_subgroups</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_subgroups</code>, then |
| for all instructions except <strong>OpGroupAsyncCopy</strong> and <strong>OpGroupWaitEvents</strong> |
| the <em>Scope</em> for <em>Execution</em> may be:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Subgroup</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Additionally, for all instructions except <strong>Atomic Instructions</strong> in an |
| OpenCL 1.2 environment, the <em>Scope</em> for <em>Memory</em> may be:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Subgroup</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_subgroup_named_barrier">5.2.12. <code>cl_khr_subgroup_named_barrier</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension |
| <code>cl_khr_subgroup_named_barrier</code>, then the environment must accept modules |
| that declare the following SPIR-V capabilities:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>NamedBarrier</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_cl_khr_spirv_no_integer_wrap_decoration">5.2.13. <code>cl_khr_spirv_no_integer_wrap_decoration</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_spirv_no_integer_wrap_decoration</code>, then the environment must accept modules that declare use of the extension <code>SPV_KHR_no_integer_wrap_decoration</code> via <strong>OpExtension</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cl_khr_spirv_no_integer_wrap_decoration</code> and use of the SPIR-V extension <code>SPV_KHR_no_integer_wrap_decoration</code> is declared in the module via <strong>OpExtension</strong>, then the environment must accept modules that include the <strong>NoSignedWrap</strong> or <strong>NoUnsignedWrap</strong> decorations.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_embedded_profile_extensions">5.3. Embedded Profile Extensions</h3> |
| <div class="sect3"> |
| <h4 id="_cles_khr_int64">5.3.1. <code>cles_khr_int64</code></h4> |
| <div class="paragraph"> |
| <p>If the OpenCL environment supports the extension <code>cles_khr_int64</code>, then the |
| environment must accept modules that declare the following SPIR-V |
| capabilities:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Int64</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="numerical_compliance">6. OpenCL Numerical Compliance</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This section describes features of the <a href="#cpp14-spec">C++14</a> and |
| <a href="#ieee-754-spec">IEEE-754</a> standards that must be supported by all OpenCL |
| compliant devices.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This section describes the functionality that must be supported by all |
| OpenCL devices for single precision floating-point numbers. |
| Currently, only single precision floating-point is a requirement. |
| Half precision floating-point is an optional feature indicated by the |
| <strong>Float16</strong> capability. |
| Double precision floating-point is also an optional feature indicated by the |
| <strong>Float64</strong> capability.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_rounding_modes">6.1. Rounding Modes</h3> |
| <div class="paragraph"> |
| <p>Floating-point calculations may be carried out internally with extra |
| precision and then rounded to fit into the destination type. |
| IEEE 754 defines four possible rounding modes:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>Round to nearest even</em></p> |
| </li> |
| <li> |
| <p><em>Round toward +infinity</em></p> |
| </li> |
| <li> |
| <p><em>Round toward -infinity</em></p> |
| </li> |
| <li> |
| <p><em>Round toward zero</em></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The complete set of rounding modes supported by the device are described by |
| the <code>CL_DEVICE_SINGLE_FP_CONFIG</code>, <code>CL_DEVICE_HALF_FP_CONFIG</code>, and |
| <code>CL_DEVICE_DOUBLE_FP_CONFIG</code> device queries.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For double precision operations, <em>Round to nearest even</em> is a required |
| rounding mode, and is therefore the default rounding mode for double |
| precision operations.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For single precision operations, devices supporting the full profile must |
| support <em>Round to nearest even</em>, therefore for full profile devices this is |
| the default rounding mode for single precision operations. |
| Devices supporting the embedded profile may support either <em>Round to nearest |
| even</em> or <em>Round toward zero</em> as the default rounding mode for single |
| precision operations.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For half precision operations, devices may support either <em>Round to nearest |
| even</em> or <em>Round toward zero</em> as the default rounding mode for half precision |
| operations.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Only static selection of rounding mode is supported. |
| Dynamically reconfiguring the rounding mode as specified by the IEEE 754 |
| spec is not supported.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_rounding_modes_for_conversions">6.2. Rounding Modes for Conversions</h3> |
| <div class="paragraph"> |
| <p>Results of the following conversion instructions may include an optional |
| <strong>FPRoundingMode</strong> decoration:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpConvertFToU</strong></p> |
| </li> |
| <li> |
| <p><strong>OpConvertFToS</strong></p> |
| </li> |
| <li> |
| <p><strong>OpConvertSToF</strong></p> |
| </li> |
| <li> |
| <p><strong>OpConvertUToF</strong></p> |
| </li> |
| <li> |
| <p><strong>OpFConvert</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The <strong>FPRoundingMode</strong> decoration may not be added to results of any other |
| instruction.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If no rounding mode is specified explicitly via an <strong>FPRoundingMode</strong> |
| decoration, then the default rounding mode for conversion operations is:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>Round to nearest even</em>, for conversions to floating-point types.</p> |
| </li> |
| <li> |
| <p><em>Round toward zero</em>, for conversions from floating-point to integer types.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_out_of_range_conversions">6.3. Out-of-Range Conversions</h3> |
| <div class="paragraph"> |
| <p>When a conversion operand is either greater than the greatest representable |
| destination value or less than the least representable destination value, |
| it is said to be out-of-range.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Converting an out-of-range integer to an integer type without a |
| <strong>SaturatedConversion</strong> decoration follows <a href="#C99-spec">C99</a>/<a href="#cpp14-spec">C++14</a> conversion rules.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Converting an out-of-range floating point number to an integer type without |
| a <strong>SaturatedConversion</strong> decoration is implementation-defined.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_inf_nan_and_denormalized_numbers">6.4. INF, NaN, and Denormalized Numbers</h3> |
| <div class="paragraph"> |
| <p>INFs and NaNs must be supported. |
| Support for signaling NaNs is not required.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Support for denormalized numbers with single precision and half precision |
| floating-point is optional. |
| Denormalized single precision or half precision floating-point numbers |
| passed as the input or produced as the output of single precision or half |
| precision floating-point operations may be flushed to zero. |
| Support for denormalized numbers is required for double precision |
| floating-point.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Support for INFs, NaNs, and denormalized numbers is described by the |
| <code>CL_FP_DENORM</code> and <code>CL_FP_INF_NAN</code> bits in the <code>CL_DEVICE_SINGLE_FP_CONFIG</code>, |
| <code>CL_DEVICE_HALF_FP_CONFIG</code>, and <code>CL_DEVICE_DOUBLE_FP_CONFIG</code> device queries.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_floating_point_exceptions">6.5. Floating-Point Exceptions</h3> |
| <div class="paragraph"> |
| <p>Floating-point exceptions are disabled in OpenCL. |
| The result of a floating-point exception must match the IEEE 754 spec for |
| the exceptions-not-enabled case. |
| Whether and when the implementation sets floating-point flags or raises |
| floating-point exceptions is implementation-defined.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This standard provides no method for querying, clearing or setting |
| floating-point flags or trapping raised exceptions. |
| Due to non-performance, non-portability of trap mechanisms, and the |
| impracticality of servicing precise exceptions in a vector context |
| (especially on heterogeneous hardware), such features are discouraged.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Implementations that nevertheless support such operations through an |
| extension to the standard shall initialize with all exception flags cleared |
| and the exception masks set so that exceptions raised by arithmetic |
| operations do not trigger a trap to be taken. |
| If the underlying work is reused by the implementation, the implementation |
| is however not responsible for re-clearing the flags or resetting exception |
| masks to default values before entering the kernel. |
| That is to say that kernels that do not inspect flags or enable traps are |
| licensed to expect that their arithmetic will not trigger a trap. |
| Those kernels that do examine flags or enable traps are responsible for |
| clearing flag state and disabling all traps before returning control to the |
| implementation. |
| Whether or when the underlying work-item (and accompanying global |
| floating-point state if any) is reused is implementation-defined.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="relative-error-as-ulps">6.6. Relative Error as ULPs</h3> |
| <div class="paragraph"> |
| <p>In this section we discuss the maximum relative error defined as ulp (units |
| in the last place). |
| Addition, subtraction, multiplication, fused multiply-add, and conversion |
| between integer and a single precision floating-point format are IEEE 754 |
| compliant and are therefore correctly rounded. |
| Conversion between floating-point formats and explicit conversions must be |
| correctly rounded.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The ULP is defined as follows:</p> |
| </div> |
| <div class="quoteblock"> |
| <blockquote> |
| <div class="paragraph"> |
| <p>If x is a real number that lies between two finite consecutive |
| floating-point numbers a and b, without being equal to one of them, then |
| ulp(x) = |b - a|, otherwise ulp(x) is the distance between the two non-equal |
| finite floating-point numbers nearest x. |
| Moreover, ulp(NaN) is NaN.</p> |
| </div> |
| </blockquote> |
| </div> |
| <div class="paragraph"> |
| <p>Attribution: This definition was taken with consent from Jean-Michel Muller |
| with slight clarification for behavior at zero. Refer to: <a href="#ulp-definition">On the definition of ulp(x)</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>0 ULP is used for math functions that do not require rounding. |
| The reference value used to compute the ULP value is the infinitely precise |
| result.</p> |
| </div> |
| <div class="sect3"> |
| <h4 id="_ulp_values_for_math_instructions_full_profile">6.6.1. ULP Values for Math Instructions - Full Profile</h4> |
| <div class="paragraph"> |
| <p>The ULP Values for Math Instructions table below describes the minimum |
| accuracy of floating-point math arithmetic instructions for full profile |
| devices given as ULP values.</p> |
| </div> |
| <table id="ulp_values_for_math_instructions" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 5. ULP Values for Math Instructions - Full Profile</caption> |
| <colgroup> |
| <col style="width: 31%;"> |
| <col style="width: 23%;"> |
| <col style="width: 23%;"> |
| <col style="width: 23%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>SPIR-V Instruction</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Minimum Accuracy - Float64</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Minimum Accuracy - Float32</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Minimum Accuracy - Float16</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpFAdd</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpFSub</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpFMul</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpFDiv</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2.5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>acos</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 4 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 4 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>acosh</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 4 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 4 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>acospi</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>asin</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 4 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 4 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>asinh</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 4 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 4 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>asinpi</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>atan</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>atanh</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>atanpi</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 5 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>atan2</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 6 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 6 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>atan2pi</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 6 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 6 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>cbrt</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><= 2 ulp</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong>ceil</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Correctly rounded</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>OpExtInst</strong> <strong> |