Skip to content

Commit c1e9ef9

Browse files
committed
Legalize: implement scalarization of unary operations
1 parent c907866 commit c1e9ef9

File tree

8 files changed

+635
-147
lines changed

8 files changed

+635
-147
lines changed

src/Air/Legalize.zig

Lines changed: 372 additions & 98 deletions
Large diffs are not rendered by default.

src/Zcu/PerThread.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1742,7 +1742,7 @@ pub fn linkerUpdateFunc(pt: Zcu.PerThread, func_index: InternPool.Index, air: *A
17421742
}
17431743

17441744
const backend = target_util.zigBackend(zcu.root_mod.resolved_target.result, zcu.comp.config.use_llvm);
1745-
try air.legalize(backend, zcu);
1745+
try air.legalize(backend, pt);
17461746

17471747
var liveness = try Air.Liveness.analyze(gpa, air.*, ip);
17481748
defer liveness.deinit(gpa);

src/arch/x86_64/CodeGen.zig

Lines changed: 250 additions & 40 deletions
Large diffs are not rendered by default.

test/behavior/bitreverse.zig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,12 @@ fn vector8() !void {
123123

124124
test "bitReverse vectors u8" {
125125
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
126-
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
127126
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
128127
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
129128
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
130129
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
131130
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
131+
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
132132

133133
try comptime vector8();
134134
try vector8();
@@ -144,12 +144,12 @@ fn vector16() !void {
144144

145145
test "bitReverse vectors u16" {
146146
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
147-
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
148147
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
149148
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
150149
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
151150
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
152151
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
152+
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
153153

154154
try comptime vector16();
155155
try vector16();
@@ -165,12 +165,12 @@ fn vector24() !void {
165165

166166
test "bitReverse vectors u24" {
167167
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
168-
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
169168
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
170169
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
171170
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
172171
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
173172
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
173+
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
174174

175175
try comptime vector24();
176176
try vector24();

test/behavior/byteswap.zig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ fn vector8() !void {
9595

9696
test "@byteSwap vectors u8" {
9797
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
98-
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
9998
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
10099
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
101100
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
102101
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
103102
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
103+
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
104104

105105
try comptime vector8();
106106
try vector8();
@@ -116,12 +116,12 @@ fn vector16() !void {
116116

117117
test "@byteSwap vectors u16" {
118118
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
119-
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
120119
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
121120
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
122121
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
123122
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
124123
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
124+
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
125125

126126
try comptime vector16();
127127
try vector16();
@@ -137,12 +137,12 @@ fn vector24() !void {
137137

138138
test "@byteSwap vectors u24" {
139139
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
140-
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
141140
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
142141
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
143142
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
144143
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
145144
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
145+
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
146146

147147
try comptime vector24();
148148
try vector24();

test/behavior/math.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,12 @@ fn testCtz128() !void {
193193

194194
test "@ctz vectors" {
195195
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
196-
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
197196
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
198197
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
199198
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
200199
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
201200
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
201+
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
202202

203203
try testCtzVectors();
204204
try comptime testCtzVectors();

test/behavior/popcount.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ fn testPopCountIntegers() !void {
7777

7878
test "@popCount vectors" {
7979
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
80-
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
8180
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
8281
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
8382
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
8483
if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
8584
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
85+
if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
8686

8787
try comptime testPopCountVectors();
8888
try testPopCountVectors();

test/behavior/x86_64/unary.zig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4828,6 +4828,7 @@ inline fn ctz(comptime Type: type, rhs: Type) @TypeOf(@ctz(rhs)) {
48284828
test ctz {
48294829
const test_ctz = unary(ctz, .{});
48304830
try test_ctz.testInts();
4831+
try test_ctz.testIntVectors();
48314832
}
48324833

48334834
inline fn popCount(comptime Type: type, rhs: Type) @TypeOf(@popCount(rhs)) {
@@ -4836,6 +4837,7 @@ inline fn popCount(comptime Type: type, rhs: Type) @TypeOf(@popCount(rhs)) {
48364837
test popCount {
48374838
const test_pop_count = unary(popCount, .{});
48384839
try test_pop_count.testInts();
4840+
try test_pop_count.testIntVectors();
48394841
}
48404842

48414843
inline fn byteSwap(comptime Type: type, rhs: Type) RoundBitsUp(Type, 8) {
@@ -4844,6 +4846,7 @@ inline fn byteSwap(comptime Type: type, rhs: Type) RoundBitsUp(Type, 8) {
48444846
test byteSwap {
48454847
const test_byte_swap = unary(byteSwap, .{});
48464848
try test_byte_swap.testInts();
4849+
try test_byte_swap.testIntVectors();
48474850
}
48484851

48494852
inline fn bitReverse(comptime Type: type, rhs: Type) @TypeOf(@bitReverse(rhs)) {
@@ -4852,6 +4855,7 @@ inline fn bitReverse(comptime Type: type, rhs: Type) @TypeOf(@bitReverse(rhs)) {
48524855
test bitReverse {
48534856
const test_bit_reverse = unary(bitReverse, .{});
48544857
try test_bit_reverse.testInts();
4858+
try test_bit_reverse.testIntVectors();
48554859
}
48564860

48574861
inline fn sqrt(comptime Type: type, rhs: Type) @TypeOf(@sqrt(rhs)) {

0 commit comments

Comments
 (0)