aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorEvan Haas <evan@lagerdata.com>2021-03-08 07:01:19 -0800
committerAndrew Kelley <andrew@ziglang.org>2021-04-06 11:22:27 -0700
commit8de14a98a68752cc834848343f2e7867ee8ca6c9 (patch)
tree7e6bc3259ec3926054830613d63025afa8e19117 /lib/std
parent38d8aab4d283efe2f43c7e18411f6df7e1c2d04b (diff)
downloadzig-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.zig32
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