diff options
| author | Evan Haas <evan@lagerdata.com> | 2021-03-08 07:01:19 -0800 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-04-06 11:22:27 -0700 |
| commit | 8de14a98a68752cc834848343f2e7867ee8ca6c9 (patch) | |
| tree | 7e6bc3259ec3926054830613d63025afa8e19117 /lib/std | |
| parent | 38d8aab4d283efe2f43c7e18411f6df7e1c2d04b (diff) | |
| download | zig-8de14a98a68752cc834848343f2e7867ee8ca6c9.tar.gz zig-8de14a98a68752cc834848343f2e7867ee8ca6c9.zip | |
translate-c: Add support for vector expressions
Includes vector types, __builtin_shufflevector, and __builtin_convertvector
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/meta.zig | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/std/meta.zig b/lib/std/meta.zig index cdc93e5d33..2ed737cea3 100644 --- a/lib/std/meta.zig +++ b/lib/std/meta.zig @@ -1297,3 +1297,35 @@ pub fn globalOption(comptime name: []const u8, comptime T: type) ?T { return null; return @as(T, @field(root, name)); } + +/// This function is for translate-c and is not intended for general use. +/// Convert from clang __builtin_shufflevector index to Zig @shuffle index +/// clang requires __builtin_shufflevector index arguments to be integer constants. +/// negative values for `this_index` indicate "don't care" so we arbitrarily choose 0 +/// clang enforces that `this_index` is less than the total number of vector elements +/// See https://ziglang.org/documentation/master/#shuffle +/// See https://clang.llvm.org/docs/LanguageExtensions.html#langext-builtin-shufflevector +pub fn shuffleVectorIndex(comptime this_index: c_int, comptime source_vector_len: usize) i32 { + if (this_index <= 0) return 0; + + const positive_index = @intCast(usize, this_index); + if (positive_index < source_vector_len) return @intCast(i32, this_index); + const b_index = positive_index - source_vector_len; + return ~@intCast(i32, b_index); +} + +test "shuffleVectorIndex" { + const vector_len: usize = 4; + + testing.expect(shuffleVectorIndex(-1, vector_len) == 0); + + testing.expect(shuffleVectorIndex(0, vector_len) == 0); + testing.expect(shuffleVectorIndex(1, vector_len) == 1); + testing.expect(shuffleVectorIndex(2, vector_len) == 2); + testing.expect(shuffleVectorIndex(3, vector_len) == 3); + + testing.expect(shuffleVectorIndex(4, vector_len) == -1); + testing.expect(shuffleVectorIndex(5, vector_len) == -2); + testing.expect(shuffleVectorIndex(6, vector_len) == -3); + testing.expect(shuffleVectorIndex(7, vector_len) == -4); +}
\ No newline at end of file |
