diff options
Diffstat (limited to 'docs/LangRef.html')
-rw-r--r-- | docs/LangRef.html | 79 |
1 files changed, 44 insertions, 35 deletions
diff --git a/docs/LangRef.html b/docs/LangRef.html index 79d6f88..35990bd 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -3714,17 +3714,27 @@ of an intrinsic function. Additionally, because intrinsic functions are part of the LLVM language, it is required if any are added that they be documented here.</p> -<p>Some intrinsic functions can be overloaded, i.e., the intrinsic represents -a family of functions that perform the same operation but on different data -types. This is most frequent with the integer types. Since LLVM can represent -over 8 million different integer types, there is a way to declare an intrinsic -that can be overloaded based on its arguments. Such an intrinsic will have the -names of its argument types encoded into its function name, each -preceded by a period. For example, the <tt>llvm.ctpop</tt> function can take an -integer of any width. This leads to a family of functions such as -<tt>i32 @llvm.ctpop.i8(i8 %val)</tt> and <tt>i32 @llvm.ctpop.i29(i29 %val)</tt>. -</p> - +<p>Some intrinsic functions can be overloaded, i.e., the intrinsic represents +a family of functions that perform the same operation but on different data +types. Because LLVM can represent over 8 million different integer types, +overloading is used commonly to allow an intrinsic function to operate on any +integer type. One or more of the argument types or the result type can be +overloaded to accept any integer type. Argument types may also be defined as +exactly matching a previous argument's type or the result type. This allows an +intrinsic function which accepts multiple arguments, but needs all of them to +be of the same type, to only be overloaded with respect to a single argument or +the result.</p> + +<p>Overloaded intrinsics will have the names of its overloaded argument types +encoded into its function name, each preceded by a period. Only those types +which are overloaded result in a name suffix. Arguments whose type is matched +against another type do not. For example, the <tt>llvm.ctpop</tt> function can +take an integer of any width and returns an integer of exactly the same integer +width. This leads to a family of functions such as +<tt>i8 @llvm.ctpop.i8(i8 %val)</tt> and <tt>i29 @llvm.ctpop.i29(i29 %val)</tt>. +Only one type, the return type, is overloaded, and only one type suffix is +required. Because the argument's type is matched against the return type, it +does not require its own name suffix.</p> <p>To learn how to add an intrinsic function, please see the <a href="ExtendingLLVM.html">Extending LLVM Guide</a>. @@ -4558,12 +4568,11 @@ These allow efficient code generation for some algorithms. <h5>Syntax:</h5> <p>This is an overloaded intrinsic function. You can use bswap on any integer -type that is an even number of bytes (i.e. BitWidth % 16 == 0). Note the suffix -that includes the type for the result and the operand. +type that is an even number of bytes (i.e. BitWidth % 16 == 0). <pre> - declare i16 @llvm.bswap.i16.i16(i16 <id>) - declare i32 @llvm.bswap.i32.i32(i32 <id>) - declare i64 @llvm.bswap.i64.i64(i64 <id>) + declare i16 @llvm.bswap.i16(i16 <id>) + declare i32 @llvm.bswap.i32(i32 <id>) + declare i64 @llvm.bswap.i64(i64 <id>) </pre> <h5>Overview:</h5> @@ -4578,12 +4587,12 @@ byte order. <h5>Semantics:</h5> <p> -The <tt>llvm.bswap.16.i16</tt> intrinsic returns an i16 value that has the high +The <tt>llvm.bswap.i16</tt> intrinsic returns an i16 value that has the high and low byte of the input i16 swapped. Similarly, the <tt>llvm.bswap.i32</tt> intrinsic returns an i32 value that has the four bytes of the input i32 swapped, so that if the input bytes are numbered 0, 1, 2, 3 then the returned -i32 will have its bytes in 3, 2, 1, 0 order. The <tt>llvm.bswap.i48.i48</tt>, -<tt>llvm.bswap.i64.i64</tt> and other intrinsics extend this concept to +i32 will have its bytes in 3, 2, 1, 0 order. The <tt>llvm.bswap.i48</tt>, +<tt>llvm.bswap.i64</tt> and other intrinsics extend this concept to additional even-byte lengths (6 bytes, 8 bytes and more, respectively). </p> @@ -4600,11 +4609,11 @@ additional even-byte lengths (6 bytes, 8 bytes and more, respectively). <p>This is an overloaded intrinsic. You can use llvm.ctpop on any integer bit width. Not all targets support all bit widths however. <pre> - declare i32 @llvm.ctpop.i8 (i8 <src>) - declare i32 @llvm.ctpop.i16(i16 <src>) + declare i8 @llvm.ctpop.i8 (i8 <src>) + declare i16 @llvm.ctpop.i16(i16 <src>) declare i32 @llvm.ctpop.i32(i32 <src>) - declare i32 @llvm.ctpop.i64(i64 <src>) - declare i32 @llvm.ctpop.i256(i256 <src>) + declare i64 @llvm.ctpop.i64(i64 <src>) + declare i256 @llvm.ctpop.i256(i256 <src>) </pre> <h5>Overview:</h5> @@ -4639,11 +4648,11 @@ The '<tt>llvm.ctpop</tt>' intrinsic counts the 1's in a variable. <p>This is an overloaded intrinsic. You can use <tt>llvm.ctlz</tt> on any integer bit width. Not all targets support all bit widths however. <pre> - declare i32 @llvm.ctlz.i8 (i8 <src>) - declare i32 @llvm.ctlz.i16(i16 <src>) + declare i8 @llvm.ctlz.i8 (i8 <src>) + declare i16 @llvm.ctlz.i16(i16 <src>) declare i32 @llvm.ctlz.i32(i32 <src>) - declare i32 @llvm.ctlz.i64(i64 <src>) - declare i32 @llvm.ctlz.i256(i256 <src>) + declare i64 @llvm.ctlz.i64(i64 <src>) + declare i256 @llvm.ctlz.i256(i256 <src>) </pre> <h5>Overview:</h5> @@ -4682,11 +4691,11 @@ of src. For example, <tt>llvm.ctlz(i32 2) = 30</tt>. <p>This is an overloaded intrinsic. You can use <tt>llvm.cttz</tt> on any integer bit width. Not all targets support all bit widths however. <pre> - declare i32 @llvm.cttz.i8 (i8 <src>) - declare i32 @llvm.cttz.i16(i16 <src>) + declare i8 @llvm.cttz.i8 (i8 <src>) + declare i16 @llvm.cttz.i16(i16 <src>) declare i32 @llvm.cttz.i32(i32 <src>) - declare i32 @llvm.cttz.i64(i64 <src>) - declare i32 @llvm.cttz.i256(i256 <src>) + declare i64 @llvm.cttz.i64(i64 <src>) + declare i256 @llvm.cttz.i256(i256 <src>) </pre> <h5>Overview:</h5> @@ -4723,8 +4732,8 @@ of src. For example, <tt>llvm.cttz(2) = 1</tt>. <p>This is an overloaded intrinsic. You can use <tt>llvm.part.select</tt> on any integer bit width. <pre> - declare i17 @llvm.part.select.i17.i17 (i17 %val, i32 %loBit, i32 %hiBit) - declare i29 @llvm.part.select.i29.i29 (i29 %val, i32 %loBit, i32 %hiBit) + declare i17 @llvm.part.select.i17 (i17 %val, i32 %loBit, i32 %hiBit) + declare i29 @llvm.part.select.i29 (i29 %val, i32 %loBit, i32 %hiBit) </pre> <h5>Overview:</h5> @@ -4770,8 +4779,8 @@ returned in the reverse order. So, for example, if <tt>X</tt> has the value <p>This is an overloaded intrinsic. You can use <tt>llvm.part.set</tt> on any integer bit width. <pre> - declare i17 @llvm.part.set.i17.i17.i9 (i17 %val, i9 %repl, i32 %lo, i32 %hi) - declare i29 @llvm.part.set.i29.i29.i9 (i29 %val, i9 %repl, i32 %lo, i32 %hi) + declare i17 @llvm.part.set.i17.i9 (i17 %val, i9 %repl, i32 %lo, i32 %hi) + declare i29 @llvm.part.set.i29.i9 (i29 %val, i9 %repl, i32 %lo, i32 %hi) </pre> <h5>Overview:</h5> |