authorgravatar for paul.verigo@gmail.comPavel Verigo <paul.verigo@gmail.com> 2026-04-20 20:49:35+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-04-22 00:19:46+02:00
log22945fbbdc1ec89def58f39ddc8c35502b6e05dd
tree2d30a01ac77771db9f74f3927fa86969f6fa94a9
parent36faf76fe1eeb3aafcc4de94fc83fd8ca3b18b25

stage2-wasm: vector, std tests


30 files changed, 547 insertions(+), 453 deletions(-)

src/Air/Legalize.zig+9-4
......@@ -1503,7 +1503,7 @@ fn scalarizeBitcastBlockPayload(l: *Legalize, orig_inst: Air.Inst.Index) Error!?
15031503 l,
15041504 .store,
15051505 index_ptr,
1506 .fromValue(try pt.intValue(.usize, operand_ty.arrayLen(zcu))),
1506 .fromValue(try pt.intValue(.usize, operand_ty.arrayLen(zcu) - 1)),
15071507 );
15081508 _ = uint_block.addBinOp(l, .store, result_ptr, .fromValue(try pt.intValue(uint_ty, 0)));
15091509
......@@ -1811,6 +1811,7 @@ fn scalarizeReduceBlockPayload(l: *Legalize, orig_inst: Air.Inst.Index, optimize
18111811 .Or, .Xor, .Add => switch (scalar_ty.zigTypeTag(zcu)) {
18121812 .int => try pt.intValue(scalar_ty, 0),
18131813 .float => try pt.floatValue(scalar_ty, 0.0),
1814 .bool => .false,
18141815 else => unreachable,
18151816 },
18161817 // identity for multiplication is 1
......@@ -1820,9 +1821,13 @@ fn scalarizeReduceBlockPayload(l: *Legalize, orig_inst: Air.Inst.Index, optimize
18201821 else => unreachable,
18211822 },
18221823 // identity for AND is all 1 bits
1823 .And => switch (scalar_ty.intInfo(zcu).signedness) {
1824 .unsigned => try scalar_ty.maxIntScalar(pt, scalar_ty),
1825 .signed => try pt.intValue(scalar_ty, -1),
1824 .And => switch (scalar_ty.zigTypeTag(zcu)) {
1825 .int => switch (scalar_ty.intInfo(zcu).signedness) {
1826 .unsigned => try scalar_ty.maxIntScalar(pt, scalar_ty),
1827 .signed => try pt.intValue(scalar_ty, -1),
1828 },
1829 .bool => .true,
1830 else => unreachable,
18261831 },
18271832 // identity for @min is maximum value
18281833 .Min => switch (scalar_ty.zigTypeTag(zcu)) {
src/Type.zig+2-2
......@@ -935,7 +935,7 @@ pub fn abiAlignment(ty: Type, zcu: *const Zcu) Alignment {
935935 const bytes = ((elem_bits * vector_type.len) + 7) / 8;
936936 return .fromByteUnits(std.math.ceilPowerOfTwoAssert(u32, bytes));
937937 },
938 .stage2_c => return Type.fromInterned(vector_type.child).abiAlignment(zcu),
938 .stage2_c, .stage2_wasm => return Type.fromInterned(vector_type.child).abiAlignment(zcu),
939939 .stage2_x86_64 => {
940940 if (vector_type.child == .bool_type) {
941941 if (vector_type.len > 256 and target.cpu.has(.x86, .avx512f)) return .@"64";
......@@ -1084,7 +1084,7 @@ pub fn abiSize(ty: Type, zcu: *const Zcu) u64 {
10841084 const elem_ty: Type = .fromInterned(vec.child);
10851085 const bytes = switch (zcu.comp.getZigBackend()) {
10861086 else => std.math.divCeil(u64, vec.len * elem_ty.bitSize(zcu), 8) catch unreachable,
1087 .stage2_c => vec.len * elem_ty.abiSize(zcu),
1087 .stage2_c, .stage2_wasm => vec.len * elem_ty.abiSize(zcu),
10881088 .stage2_x86_64 => switch (elem_ty.toIntern()) {
10891089 .bool_type => std.math.divCeil(u64, vec.len, 8) catch unreachable,
10901090 else => vec.len * elem_ty.abiSize(zcu),
src/codegen.zig+5-1
......@@ -484,7 +484,11 @@ pub fn generateSymbol(
484484 },
485485 .vector_type => |vector_type| {
486486 const abi_size = math.cast(usize, ty.abiSize(zcu)) orelse return error.Overflow;
487 if (vector_type.child == .bool_type) {
487 const vector_bool_bitpacked = switch (zcu.comp.getZigBackend()) {
488 .stage2_wasm => false,
489 else => true,
490 };
491 if (vector_type.child == .bool_type and vector_bool_bitpacked) {
488492 const bytes = try w.writableSlice(abi_size);
489493 @memset(bytes, 0xaa);
490494 var index: usize = 0;
src/codegen/wasm/CodeGen.zig+369-262
......@@ -43,6 +43,83 @@ pub fn legalizeFeatures(_: *const std.Target) *const Air.Legalize.Features {
4343 .expand_packed_store,
4444 .expand_packed_struct_field_val,
4545 .expand_packed_aggregate_init,
46
47 .scalarize_add,
48 .scalarize_add_optimized,
49 .scalarize_add_wrap,
50 .scalarize_add_sat,
51 .scalarize_sub,
52 .scalarize_sub_optimized,
53 .scalarize_sub_wrap,
54 .scalarize_sub_sat,
55 .scalarize_mul,
56 .scalarize_mul_optimized,
57 .scalarize_mul_wrap,
58 .scalarize_mul_sat,
59 .scalarize_div_float,
60 .scalarize_div_float_optimized,
61 .scalarize_div_trunc,
62 .scalarize_div_trunc_optimized,
63 .scalarize_div_floor,
64 .scalarize_div_floor_optimized,
65 .scalarize_div_exact,
66 .scalarize_div_exact_optimized,
67 .scalarize_rem,
68 .scalarize_rem_optimized,
69 .scalarize_mod,
70 .scalarize_mod_optimized,
71 .scalarize_max,
72 .scalarize_min,
73 .scalarize_add_with_overflow,
74 .scalarize_sub_with_overflow,
75 .scalarize_mul_with_overflow,
76 .scalarize_shl_with_overflow,
77 .scalarize_bit_and,
78 .scalarize_bit_or,
79 .scalarize_shr,
80 .scalarize_shr_exact,
81 .scalarize_shl,
82 .scalarize_shl_exact,
83 .scalarize_shl_sat,
84 .scalarize_xor,
85 .scalarize_not,
86 .scalarize_bitcast,
87 .scalarize_clz,
88 .scalarize_ctz,
89 .scalarize_popcount,
90 .scalarize_byte_swap,
91 .scalarize_bit_reverse,
92 .scalarize_sqrt,
93 .scalarize_sin,
94 .scalarize_cos,
95 .scalarize_tan,
96 .scalarize_exp,
97 .scalarize_exp2,
98 .scalarize_log,
99 .scalarize_log2,
100 .scalarize_log10,
101 .scalarize_abs,
102 .scalarize_floor,
103 .scalarize_ceil,
104 .scalarize_round,
105 .scalarize_trunc_float,
106 .scalarize_neg,
107 .scalarize_neg_optimized,
108 .scalarize_cmp_vector,
109 .scalarize_cmp_vector_optimized,
110 .scalarize_fptrunc,
111 .scalarize_fpext,
112 .scalarize_intcast,
113 .scalarize_trunc,
114 .scalarize_int_from_float,
115 .scalarize_int_from_float_optimized,
116 .scalarize_float_from_int,
117 .scalarize_reduce,
118 .scalarize_reduce_optimized,
119 .scalarize_shuffle_one,
120 .scalarize_shuffle_two,
121 .scalarize_select,
122 .scalarize_mul_add,
46123 });
47124}
48125
......@@ -217,8 +294,7 @@ const WValue = union(enum) {
217294 try gen.addLocal(.local_set, new_local.local.value);
218295 return new_local;
219296 },
220 .local, .stack_offset => return value,
221 else => unreachable,
297 else => return value,
222298 }
223299 }
224300
......@@ -765,7 +841,8 @@ fn generateInner(cg: *CodeGen, any_returns: bool) InnerError!Mir {
765841 // In case we have a return value, but the last instruction is a noreturn (such as a while loop)
766842 // we emit an unreachable instruction to tell the stack validator that part will never be reached.
767843 if (any_returns and cg.air.instructions.len > 0) {
768 const inst: Air.Inst.Index = @enumFromInt(cg.air.instructions.len - 1);
844 const main_body = cg.air.getMainBody();
845 const inst: Air.Inst.Index = main_body[main_body.len - 1];
769846 const last_inst_ty = cg.typeOfIndex(inst);
770847 if (!last_inst_ty.hasRuntimeBits(zcu)) {
771848 try cg.addTag(.@"unreachable");
......@@ -1032,10 +1109,6 @@ fn allocStackPtr(cg: *CodeGen, inst: Air.Inst.Index) !WValue {
10321109 try cg.initializeStack();
10331110 }
10341111
1035 if (!pointee_ty.hasRuntimeBits(zcu)) {
1036 return cg.allocStack(Type.usize); // create a value containing just the stack pointer.
1037 }
1038
10391112 const abi_alignment = ptr_ty.ptrAlignment(zcu);
10401113 const abi_size = std.math.cast(u32, pointee_ty.abiSize(zcu)) orelse {
10411114 return cg.fail("Type {f} with ABI size of {d} exceeds stack frame size", .{
......@@ -1050,157 +1123,67 @@ fn allocStackPtr(cg: *CodeGen, inst: Air.Inst.Index) !WValue {
10501123 return .{ .stack_offset = .{ .value = offset, .references = 1 } };
10511124}
10521125
1053/// Performs a copy of bytes for a given type. Copying all bytes
1054/// from rhs to lhs.
1055fn memcpy(cg: *CodeGen, dst: WValue, src: WValue, len: WValue) !void {
1126fn emitMemoryCopy(cg: *CodeGen, dst: WValue, src: WValue, len: WValue) !void {
10561127 const len_known_neq_0 = switch (len) {
10571128 .imm32 => |val| if (val != 0) true else return,
10581129 .imm64 => |val| if (val != 0) true else return,
10591130 else => false,
10601131 };
1061 // When bulk_memory is enabled, we lower it to wasm's memcpy instruction.
1062 // If not, we lower it ourselves manually
1063 if (cg.target.cpu.has(.wasm, .bulk_memory)) {
1064 const len0_ok = cg.target.cpu.has(.wasm, .nontrapping_bulk_memory_len0);
1065 const emit_check = !(len0_ok or len_known_neq_0);
1132 const len0_ok = cg.target.cpu.has(.wasm, .nontrapping_bulk_memory_len0);
1133 const emit_check = !(len0_ok or len_known_neq_0);
10661134
1067 if (emit_check) {
1068 try cg.startBlock(.block, .empty);
1069
1070 // Even if `len` is zero, the spec requires an implementation to trap if `src + len` or
1071 // `dst + len` are out of memory bounds. This can easily happen in Zig in a case such
1072 // as:
1073 //
1074 // const dst: [*]u8 = undefined;
1075 // const src: [*]u8 = undefined;
1076 // var len: usize = runtime_zero();
1077 // @memcpy(dst[0..len], src[0..len]);
1078 //
1079 // So explicitly avoid using `memory.copy` in the `len == 0` case. Lovely design.
1080 try cg.emitWValue(len);
1081 try cg.addTag(.i32_eqz);
1082 try cg.addLabel(.br_if, 0);
1083 }
1135 if (emit_check) {
1136 try cg.startBlock(.block, .empty);
10841137
1085 try cg.lowerToStack(dst);
1086 try cg.lowerToStack(src);
1138 // Even if `len` is zero, the spec requires an implementation to trap if `src + len` or
1139 // `dst + len` are out of memory bounds. This can easily happen in Zig in a case such
1140 // as:
1141 //
1142 // const dst: [*]u8 = undefined;
1143 // const src: [*]u8 = undefined;
1144 // var len: usize = runtime_zero();
1145 // @memcpy(dst[0..len], src[0..len]);
1146 //
1147 // So explicitly avoid using `memory.copy` in the `len == 0` case. Lovely design.
10871148 try cg.emitWValue(len);
1088 try cg.addExtended(.memory_copy);
1089
1090 if (emit_check) {
1091 try cg.endBlock();
1092 }
1093
1094 return;
1149 try cg.addTag(.i32_eqz);
1150 try cg.addLabel(.br_if, 0);
10951151 }
10961152
1097 // when the length is comptime-known, rather than a runtime value, we can optimize the generated code by having
1098 // the loop during codegen, rather than inserting a runtime loop into the binary.
1099 switch (len) {
1100 .imm32, .imm64 => blk: {
1101 const length = switch (len) {
1102 .imm32 => |val| val,
1103 .imm64 => |val| val,
1104 else => unreachable,
1105 };
1106 // if the size (length) is more than 32 bytes, we use a runtime loop instead to prevent
1107 // binary size bloat.
1108 if (length > 32) break :blk;
1109 var offset: u32 = 0;
1110 const lhs_base = dst.offset();
1111 const rhs_base = src.offset();
1112 while (offset < length) : (offset += 1) {
1113 // get dst's address to store the result
1114 try cg.emitWValue(dst);
1115 // load byte from src's address
1116 try cg.emitWValue(src);
1117 switch (cg.ptr_size) {
1118 .wasm32 => {
1119 try cg.addMemArg(.i32_load8_u, .{ .offset = rhs_base + offset, .alignment = 1 });
1120 try cg.addMemArg(.i32_store8, .{ .offset = lhs_base + offset, .alignment = 1 });
1121 },
1122 .wasm64 => {
1123 try cg.addMemArg(.i64_load8_u, .{ .offset = rhs_base + offset, .alignment = 1 });
1124 try cg.addMemArg(.i64_store8, .{ .offset = lhs_base + offset, .alignment = 1 });
1125 },
1126 }
1127 }
1128 return;
1129 },
1130 else => {},
1131 }
1153 try cg.lowerToStack(dst);
1154 try cg.lowerToStack(src);
1155 try cg.emitWValue(len);
1156 try cg.addExtended(.memory_copy);
11321157
1133 // allocate a local for the offset, and set it to 0.
1134 // This to ensure that inside loops we correctly re-set the counter.
1135 var offset = try cg.allocLocal(Type.usize); // local for counter
1136 defer offset.free(cg);
1137 switch (cg.ptr_size) {
1138 .wasm32 => try cg.addImm32(0),
1139 .wasm64 => try cg.addImm64(0),
1158 if (emit_check) {
1159 try cg.endBlock();
11401160 }
1141 try cg.addLocal(.local_set, offset.local.value);
1142
1143 // outer block to jump to when loop is done
1144 try cg.startBlock(.block, .empty);
1145 try cg.startBlock(.loop, .empty);
1161}
11461162
1147 // loop condition (offset == length -> break)
1148 {
1149 try cg.emitWValue(offset);
1150 try cg.emitWValue(len);
1151 switch (cg.ptr_size) {
1152 .wasm32 => try cg.addTag(.i32_eq),
1153 .wasm64 => try cg.addTag(.i64_eq),
1154 }
1155 try cg.addLabel(.br_if, 1); // jump out of loop into outer block (finished)
1163fn memcpy(cg: *CodeGen, dst: WValue, src: WValue, len: WValue) !void {
1164 if (cg.target.cpu.has(.wasm, .bulk_memory)) {
1165 try cg.emitMemoryCopy(dst, src, len);
1166 return;
11561167 }
11571168
1158 // get dst ptr
1159 {
1160 try cg.emitWValue(dst);
1161 try cg.emitWValue(offset);
1162 switch (cg.ptr_size) {
1163 .wasm32 => try cg.addTag(.i32_add),
1164 .wasm64 => try cg.addTag(.i64_add),
1165 }
1166 }
1169 try cg.lowerToStack(dst);
1170 try cg.lowerToStack(src);
1171 try cg.emitWValue(len);
1172 try cg.addCallIntrinsic(.memcpy);
1173 try cg.addTag(.drop);
1174}
11671175
1168 // get src value and also store in dst
1169 {
1170 try cg.emitWValue(src);
1171 try cg.emitWValue(offset);
1172 switch (cg.ptr_size) {
1173 .wasm32 => {
1174 try cg.addTag(.i32_add);
1175 try cg.addMemArg(.i32_load8_u, .{ .offset = src.offset(), .alignment = 1 });
1176 try cg.addMemArg(.i32_store8, .{ .offset = dst.offset(), .alignment = 1 });
1177 },
1178 .wasm64 => {
1179 try cg.addTag(.i64_add);
1180 try cg.addMemArg(.i64_load8_u, .{ .offset = src.offset(), .alignment = 1 });
1181 try cg.addMemArg(.i64_store8, .{ .offset = dst.offset(), .alignment = 1 });
1182 },
1183 }
1176fn memmove(cg: *CodeGen, dst: WValue, src: WValue, len: WValue) !void {
1177 if (cg.target.cpu.has(.wasm, .bulk_memory)) {
1178 try cg.emitMemoryCopy(dst, src, len);
1179 return;
11841180 }
11851181
1186 // increment loop counter
1187 {
1188 try cg.emitWValue(offset);
1189 switch (cg.ptr_size) {
1190 .wasm32 => {
1191 try cg.addImm32(1);
1192 try cg.addTag(.i32_add);
1193 },
1194 .wasm64 => {
1195 try cg.addImm64(1);
1196 try cg.addTag(.i64_add);
1197 },
1198 }
1199 try cg.addLocal(.local_set, offset.local.value);
1200 try cg.addLabel(.br, 0); // jump to start of loop
1201 }
1202 try cg.endBlock(); // close off loop block
1203 try cg.endBlock(); // close off outer block
1182 try cg.lowerToStack(dst);
1183 try cg.lowerToStack(src);
1184 try cg.emitWValue(len);
1185 try cg.addCallIntrinsic(.memmove);
1186 try cg.addTag(.drop);
12041187}
12051188
12061189fn ptrSize(cg: *const CodeGen) u16 {
......@@ -1310,14 +1293,34 @@ fn genInst(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
13101293 const zcu = cg.pt.zcu;
13111294 const air_tags = cg.air.instructions.items(.tag);
13121295 return switch (air_tags[@intFromEnum(inst)]) {
1313 // No "scalarize" legalizations are enabled, so these instructions never appear.
1314 .legalize_vec_elem_val => unreachable,
1315 .legalize_vec_store_elem => unreachable,
13161296 // No soft float legalizations are enabled.
13171297 .legalize_compiler_rt_call => unreachable,
13181298
13191299 .inferred_alloc, .inferred_alloc_comptime => unreachable,
13201300
1301 .legalize_vec_elem_val => cg.airArrayElemVal(inst),
1302 .legalize_vec_store_elem => {
1303 const pl_op = cg.air.instructions.items(.data)[@intFromEnum(inst)].pl_op;
1304 const bin_op = cg.air.extraData(Air.Bin, pl_op.payload).data;
1305 const vec_ptr = try cg.resolveInst(pl_op.operand);
1306 const elem_idx = try cg.resolveInst(bin_op.lhs);
1307 const elem_val = try cg.resolveInst(bin_op.rhs);
1308
1309 const elem_ty = cg.typeOf(bin_op.rhs);
1310 const elem_size = elem_ty.abiSize(zcu);
1311
1312 try cg.lowerToStack(vec_ptr);
1313 try cg.emitWValue(elem_idx);
1314 try cg.addImm32(@intCast(elem_size));
1315 try cg.addTag(.i32_mul);
1316 try cg.addTag(.i32_add);
1317 const ptr = try WValue.toLocal(.stack, cg, Type.usize);
1318
1319 try cg.store(ptr, elem_val, elem_ty, 0);
1320
1321 return cg.finishAir(inst, .none, &.{ pl_op.operand, bin_op.lhs, bin_op.rhs });
1322 },
1323
13211324 .add,
13221325 .sub,
13231326 .mul,
......@@ -1818,7 +1821,8 @@ fn genInst(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
18181821 .wasm_memory_size => cg.airWasmMemorySize(inst),
18191822 .wasm_memory_grow => cg.airWasmMemoryGrow(inst),
18201823
1821 .memcpy, .memmove => cg.airMemcpy(inst),
1824 .memcpy => cg.airMemcpy(inst),
1825 .memmove => cg.airMemmove(inst),
18221826
18231827 .ret_addr => cg.airRetAddr(inst),
18241828 .tag_name => cg.airTagName(inst),
......@@ -2105,7 +2109,7 @@ fn airStore(cg: *CodeGen, inst: Air.Inst.Index, safety: bool) InnerError!void {
21052109 return cg.finishAir(inst, .none, &.{ bin_op.lhs, bin_op.rhs });
21062110 }
21072111
2108 assert(ptr_info.packed_offset.host_size == 0); // legalize .expand_packed_store
2112 assert(!(ptr_info.packed_offset.host_size > 0 and ptr_info.flags.vector_index == .none)); // legalize .expand_packed_store
21092113
21102114 try cg.store(lhs, rhs, ty, 0);
21112115
......@@ -2180,35 +2184,22 @@ fn airLoad(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
21802184
21812185 if (!ty.hasRuntimeBits(zcu)) return cg.finishAir(inst, .none, &.{ty_op.operand});
21822186
2183 assert(ptr_info.packed_offset.host_size == 0); // legalize .expand_packed_load
2184
2185 const result = result: {
2186 if (isByRef(ty, zcu, cg.target)) {
2187 const new_local = try cg.allocStack(ty);
2188 try cg.store(new_local, operand, ty, 0);
2189 break :result new_local;
2190 }
2187 assert(!(ptr_info.packed_offset.host_size > 0 and ptr_info.flags.vector_index == .none)); // legalize .expand_packed_load
21912188
2192 const loaded = try cg.load(operand, ty, 0);
2193 const ty_size = ty.abiSize(zcu);
2194 if (ty.isAbiInt(zcu) and ty_size * 8 > ty.bitSize(zcu)) {
2195 const int_info = ty.intInfo(zcu);
2196 const loaded_int_ty: IntType = .{
2197 .is_signed = int_info.signedness == .signed,
2198 .bits = @intCast(ty_size * 8),
2199 };
2200 break :result try cg.intTrunc(.fromType(cg, ty), loaded_int_ty, loaded);
2201 } else {
2202 break :result loaded;
2203 }
2204 };
2189 const result = try cg.load(operand, ty, 0);
22052190 return cg.finishAir(inst, result, &.{ty_op.operand});
22062191}
22072192
22082193/// Loads an operand from the linear memory section.
2209/// NOTE: Leaves the value on the stack.
2194/// NOTE: Leaves the value on the stack, if isByRef == false.
22102195fn load(cg: *CodeGen, operand: WValue, ty: Type, offset: u32) InnerError!WValue {
22112196 const zcu = cg.pt.zcu;
2197 if (isByRef(ty, zcu, cg.target)) {
2198 const val = try cg.allocStack(ty);
2199 try cg.store(val, try operand.toLocal(cg, .usize), ty, 0);
2200 return val;
2201 }
2202
22122203 // load local's value from memory by its stack position
22132204 try cg.emitWValue(operand);
22142205
......@@ -2254,6 +2245,14 @@ fn load(cg: *CodeGen, operand: WValue, ty: Type, offset: u32) InnerError!WValue
22542245 },
22552246 );
22562247
2248 if (ty.isAbiInt(zcu)) {
2249 const int_info: IntType = .fromType(cg, ty);
2250 switch (int_info.bits) {
2251 8, 16, 32, 64 => {},
2252 else => _ = try cg.intWrap(int_info, .stack),
2253 }
2254 }
2255
22572256 return .stack;
22582257}
22592258
......@@ -2321,7 +2320,7 @@ const IntType = struct {
23212320 .hasRuntimeBits(zcu)) .{ .is_signed = false, .bits = zcu.errorSetBits() } else unreachable,
23222321 .simple_type => |simple_type| return switch (simple_type) {
23232322 .bool => .{ .is_signed = false, .bits = 1 },
2324 .anyerror => .{ .is_signed = false, .bits = zcu.errorSetBits() },
2323 .anyerror, .adhoc_inferred_error_set => .{ .is_signed = false, .bits = zcu.errorSetBits() },
23252324 .isize => .{ .is_signed = true, .bits = cg.target.ptrBitWidth() },
23262325 .usize => .{ .is_signed = false, .bits = cg.target.ptrBitWidth() },
23272326 .c_char => .{ .is_signed = cg.target.cCharSignedness() == .signed, .bits = cg.target.cTypeBitSize(.char) },
......@@ -2334,7 +2333,7 @@ const IntType = struct {
23342333 .c_longlong => .{ .is_signed = true, .bits = cg.target.cTypeBitSize(.longlong) },
23352334 .c_ulonglong => .{ .is_signed = false, .bits = cg.target.cTypeBitSize(.longlong) },
23362335 .f16, .f32, .f64, .f80, .f128, .c_longdouble => unreachable,
2337 .anyopaque, .void, .type, .comptime_int, .comptime_float, .noreturn, .null, .undefined, .enum_literal, .adhoc_inferred_error_set, .generic_poison => unreachable,
2336 .anyopaque, .void, .type, .comptime_int, .comptime_float, .noreturn, .null, .undefined, .enum_literal, .generic_poison => unreachable,
23382337 },
23392338 .struct_type => {
23402339 const loaded_struct = ip.loadStructType(ty_index);
......@@ -3069,7 +3068,13 @@ fn intClz(cg: *CodeGen, ty: IntType, operand: WValue) InnerError!WValue {
30693068 var msb = try (try cg.load(operand, Type.u64, 8)).toLocal(cg, Type.u64);
30703069 defer msb.free(cg);
30713070
3072 try cg.emitWValue(msb);
3071 if (ty.is_signed and ty.bits < 128) {
3072 const mask: u64 = ~@as(u64, 0) >> @intCast(128 - ty.bits);
3073 _ = try cg.intAnd(.u64, msb, .{ .imm64 = mask });
3074 } else {
3075 try cg.emitWValue(msb);
3076 }
3077
30733078 try cg.addTag(.i64_clz);
30743079 _ = try cg.load(operand, Type.u64, 0);
30753080 try cg.addTag(.i64_clz);
......@@ -3078,6 +3083,12 @@ fn intClz(cg: *CodeGen, ty: IntType, operand: WValue) InnerError!WValue {
30783083 _ = try cg.intCmp(.u64, .neq, msb, .{ .imm64 = 0 });
30793084 try cg.addTag(.select);
30803085 try cg.addTag(.i32_wrap_i64);
3086
3087 if (ty.bits < 128) {
3088 try cg.addImm32(128 - ty.bits);
3089 try cg.addTag(.i32_sub);
3090 }
3091
30813092 return .stack;
30823093 },
30833094 else => {
......@@ -4622,11 +4633,18 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal
46224633fn lowerPtr(cg: *CodeGen, ptr_val: InternPool.Index, prev_offset: u64) InnerError!WValue {
46234634 const pt = cg.pt;
46244635 const zcu = pt.zcu;
4636 const ip = &zcu.intern_pool;
46254637 const ptr = zcu.intern_pool.indexToKey(ptr_val).ptr;
46264638 const offset: u64 = prev_offset + ptr.byte_offset;
46274639 return switch (ptr.base_addr) {
4628 .nav => |nav| return .{ .nav_ref = .{ .nav_index = nav, .offset = @intCast(offset) } },
4629 .uav => |uav| return .{ .uav_ref = .{ .ip_index = uav.val, .offset = @intCast(offset), .orig_ptr_ty = uav.orig_ty } },
4640 .nav => |nav| return if (Type.fromInterned(ip.getNav(nav).resolved.?.type).isRuntimeFnOrHasRuntimeBits(zcu))
4641 .{ .nav_ref = .{ .nav_index = nav, .offset = @intCast(offset) } }
4642 else
4643 .{ .imm32 = @intCast(zcu.navAlignment(nav).forward(@as(u32, 0xaaaaaaaa))) },
4644 .uav => |uav| return if (Type.fromInterned(ip.typeOf(uav.val)).isRuntimeFnOrHasRuntimeBits(zcu))
4645 .{ .uav_ref = .{ .ip_index = uav.val, .offset = @intCast(offset), .orig_ptr_ty = uav.orig_ty } }
4646 else
4647 .{ .imm32 = @intCast(Type.fromInterned(uav.orig_ty).ptrAlignment(zcu).forward(@as(u32, 0xaaaaaaaa))) },
46304648 .int => return cg.lowerConstant(try pt.intValue(.usize, offset)),
46314649 .eu_payload => |eu_ptr| try cg.lowerPtr(
46324650 eu_ptr,
......@@ -4960,9 +4978,9 @@ fn airCmp(cg: *CodeGen, inst: Air.Inst.Index, op: std.math.CompareOperator) Inne
49604978 try cg.addImm32(if (op == .eq) 0 else 1);
49614979 try cg.addLocal(.local_set, result.local.value);
49624980
4963 _ = try cg.isNull(lhs, operand_ty, .i32_eq);
4981 _ = try cg.isNull(lhs, operand_ty, .i32_eq, .value);
49644982 try cg.addLocal(.local_tee, lhs_null.local.value);
4965 _ = try cg.isNull(rhs, operand_ty, .i32_eq);
4983 _ = try cg.isNull(rhs, operand_ty, .i32_eq, .value);
49664984 try cg.addTag(.i32_ne);
49674985 try cg.addLabel(.br_if, 0);
49684986
......@@ -5234,26 +5252,56 @@ fn airBitcast(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
52345252fn bitcast(cg: *CodeGen, dest_ty: Type, src_ty: Type, operand: WValue) InnerError!?WValue {
52355253 const zcu = cg.pt.zcu;
52365254 const bit_size = src_ty.bitSize(zcu);
5237 const needs_wrapping = (src_ty.isSignedInt(zcu) != dest_ty.isSignedInt(zcu)) and
5255 const dest_signed = if (dest_ty.isAbiInt(zcu)) IntType.fromType(cg, dest_ty).is_signed else false;
5256 const src_signed = if (src_ty.isAbiInt(zcu)) IntType.fromType(cg, src_ty).is_signed else false;
5257 const needs_wrapping = (src_signed != dest_signed) and
52385258 bit_size != 32 and bit_size != 64 and bit_size != 128;
52395259
5240 if (src_ty.isAnyFloat() or dest_ty.isAnyFloat()) {
5241 if (dest_ty.ip_index == .f16_type or src_ty.ip_index == .f16_type) return null;
5242 if (dest_ty.bitSize(zcu) > 64) return null;
5243 assert((dest_ty.isInt(zcu) and src_ty.isAnyFloat()) or (dest_ty.isAnyFloat() and src_ty.isInt(zcu)));
5244
5245 const dest_valtype = typeToValtype(dest_ty, zcu, cg.target);
5246 const opcode: Mir.Inst.Tag = switch (dest_valtype) {
5247 .i32 => .i32_reinterpret_f32,
5248 .i64 => .i64_reinterpret_f64,
5249 .f32 => .f32_reinterpret_i32,
5250 .f64 => .f64_reinterpret_i64,
5251 else => unreachable,
5252 };
5260 if (src_ty.isAnyFloat()) {
5261 const float_ty: FloatType = .fromType(cg, src_ty);
5262 switch (float_ty) {
5263 .f16, .f80, .f128 => {
5264 if (dest_signed) {
5265 const int_ty: IntType = .fromType(cg, dest_ty);
5266 return try cg.intWrap(int_ty, operand);
5267 } else {
5268 return null;
5269 }
5270 },
5271 .f32 => {
5272 try cg.emitWValue(operand);
5273 try cg.addTag(.i32_reinterpret_f32);
5274 return .stack;
5275 },
5276 .f64 => {
5277 try cg.emitWValue(operand);
5278 try cg.addTag(.i64_reinterpret_f64);
5279 return .stack;
5280 },
5281 }
5282 }
52535283
5254 try cg.emitWValue(operand);
5255 try cg.addTag(opcode);
5256 return .stack;
5284 if (dest_ty.isAnyFloat()) {
5285 const float_ty: FloatType = .fromType(cg, dest_ty);
5286 switch (float_ty) {
5287 .f16, .f80, .f128 => {
5288 if (src_signed) {
5289 return try cg.intWrap(.{ .bits = @intCast(bit_size), .is_signed = false }, operand);
5290 } else {
5291 return null;
5292 }
5293 },
5294 .f32 => {
5295 try cg.emitWValue(operand);
5296 try cg.addTag(.f32_reinterpret_i32);
5297 return .stack;
5298 },
5299 .f64 => {
5300 try cg.emitWValue(operand);
5301 try cg.addTag(.f64_reinterpret_i64);
5302 return .stack;
5303 },
5304 }
52575305 }
52585306
52595307 if (isByRef(src_ty, zcu, cg.target) and !isByRef(dest_ty, zcu, cg.target)) {
......@@ -5751,23 +5799,27 @@ fn airWrapErrUnionErr(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
57515799 return cg.finishAir(inst, result, &.{ty_op.operand});
57525800}
57535801
5754fn airIsNull(cg: *CodeGen, inst: Air.Inst.Index, opcode: std.wasm.Opcode, op_kind: enum { value, ptr }) InnerError!void {
5755 const zcu = cg.pt.zcu;
5802const OpKind = enum { value, ptr };
5803
5804fn airIsNull(cg: *CodeGen, inst: Air.Inst.Index, opcode: std.wasm.Opcode, op_kind: OpKind) InnerError!void {
57565805 const un_op = cg.air.instructions.items(.data)[@intFromEnum(inst)].un_op;
57575806 const operand = try cg.resolveInst(un_op);
57585807
57595808 const op_ty = cg.typeOf(un_op);
5760 const optional_ty = if (op_kind == .ptr) op_ty.childType(zcu) else op_ty;
5761 const result = try cg.isNull(operand, optional_ty, opcode);
5809 const result = try cg.isNull(operand, op_ty, opcode, op_kind);
57625810 return cg.finishAir(inst, result, &.{un_op});
57635811}
57645812
57655813/// For a given type and operand, checks if it's considered `null`.
57665814/// NOTE: Leaves the result on the stack
5767fn isNull(cg: *CodeGen, operand: WValue, optional_ty: Type, opcode: std.wasm.Opcode) InnerError!WValue {
5815fn isNull(cg: *CodeGen, operand: WValue, op_ty: Type, opcode: std.wasm.Opcode, op_kind: OpKind) InnerError!WValue {
57685816 const pt = cg.pt;
57695817 const zcu = pt.zcu;
57705818 try cg.emitWValue(operand);
5819 const optional_ty = switch (op_kind) {
5820 .value => op_ty,
5821 .ptr => op_ty.childType(zcu),
5822 };
57715823 const payload_ty = optional_ty.optionalChild(zcu);
57725824 if (!optional_ty.optionalReprIsPayload(zcu)) {
57735825 // When payload is zero-bits, we can treat operand as a value, rather than
......@@ -5783,6 +5835,13 @@ fn isNull(cg: *CodeGen, operand: WValue, optional_ty: Type, opcode: std.wasm.Opc
57835835 .wasm32 => try cg.addMemArg(.i32_load, .{ .offset = operand.offset(), .alignment = 4 }),
57845836 .wasm64 => try cg.addMemArg(.i64_load, .{ .offset = operand.offset(), .alignment = 8 }),
57855837 }
5838 } else {
5839 if (op_kind == .ptr) {
5840 try cg.addMemArg(.i32_load, .{
5841 .offset = operand.offset(),
5842 .alignment = 4,
5843 });
5844 }
57865845 }
57875846
57885847 // Compare the null value with '0'
......@@ -5934,10 +5993,7 @@ fn airSliceElemVal(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
59345993 try cg.addTag(.i32_mul);
59355994 try cg.addTag(.i32_add);
59365995
5937 const elem_result = if (isByRef(elem_ty, zcu, cg.target))
5938 .stack
5939 else
5940 try cg.load(.stack, elem_ty, 0);
5996 const elem_result = try cg.load(.stack, elem_ty, 0);
59415997
59425998 return cg.finishAir(inst, elem_result, &.{ bin_op.lhs, bin_op.rhs });
59435999}
......@@ -5991,10 +6047,7 @@ fn airArrayToSlice(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
59916047 // create a slice on the stack
59926048 const slice_local = try cg.allocStack(slice_ty);
59936049
5994 // store the array ptr in the slice
5995 if (array_ty.hasRuntimeBits(zcu)) {
5996 try cg.store(slice_local, operand, Type.usize, 0);
5997 }
6050 try cg.store(slice_local, operand, Type.usize, 0);
59986051
59996052 // store the length of the array in the slice
60006053 const array_len: u32 = @intCast(array_ty.arrayLen(zcu));
......@@ -6026,10 +6079,7 @@ fn airPtrElemVal(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
60266079 try cg.addTag(.i32_mul);
60276080 try cg.addTag(.i32_add);
60286081
6029 const elem_result = if (isByRef(elem_ty, zcu, cg.target))
6030 .stack
6031 else
6032 try cg.load(.stack, elem_ty, 0);
6082 const elem_result = try cg.load(.stack, elem_ty, 0);
60336083
60346084 return cg.finishAir(inst, elem_result, &.{ bin_op.lhs, bin_op.rhs });
60356085}
......@@ -6349,12 +6399,8 @@ fn airSplat(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
63496399 else => unreachable,
63506400 }
63516401 }
6352 const elem_size = elem_ty.bitSize(zcu);
6353 const vector_len = @as(usize, @intCast(ty.vectorLen(zcu)));
6354 if ((!std.math.isPowerOfTwo(elem_size) or elem_size % 8 != 0) and vector_len > 1) {
6355 return cg.fail("TODO: WebAssembly `@splat` for arbitrary element bitsize {d}", .{elem_size});
6356 }
63576402
6403 const vector_len = @as(usize, @intCast(ty.vectorLen(zcu)));
63586404 const result = try cg.allocStack(ty);
63596405 const elem_byte_size = @as(u32, @intCast(elem_ty.abiSize(zcu)));
63606406 var index: usize = 0;
......@@ -6494,7 +6540,7 @@ fn airAggregateInit(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
64946540
64956541 const result: WValue = result_value: {
64966542 switch (result_ty.zigTypeTag(zcu)) {
6497 .array => {
6543 .array, .vector => {
64986544 const result = try cg.allocStack(result_ty);
64996545 const elem_ty = result_ty.childType(zcu);
65006546 const elem_size = @as(u32, @intCast(elem_ty.abiSize(zcu)));
......@@ -6554,7 +6600,6 @@ fn airAggregateInit(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
65546600 break :result_value result;
65556601 },
65566602 },
6557 .vector => return cg.fail("TODO: Wasm backend: implement airAggregateInit for vectors", .{}),
65586603 else => unreachable,
65596604 }
65606605 };
......@@ -6792,6 +6837,37 @@ fn airMemcpy(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
67926837 return cg.finishAir(inst, .none, &.{ bin_op.lhs, bin_op.rhs });
67936838}
67946839
6840fn airMemmove(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
6841 const zcu = cg.pt.zcu;
6842 const bin_op = cg.air.instructions.items(.data)[@intFromEnum(inst)].bin_op;
6843 const dst = try cg.resolveInst(bin_op.lhs);
6844 const dst_ty = cg.typeOf(bin_op.lhs);
6845 const ptr_elem_ty = dst_ty.childType(zcu);
6846 const src = try cg.resolveInst(bin_op.rhs);
6847 const src_ty = cg.typeOf(bin_op.rhs);
6848 const len = switch (dst_ty.ptrSize(zcu)) {
6849 .slice => blk: {
6850 const slice_len = try cg.sliceLen(dst);
6851 if (ptr_elem_ty.abiSize(zcu) != 1) {
6852 try cg.emitWValue(slice_len);
6853 try cg.emitWValue(.{ .imm32 = @as(u32, @intCast(ptr_elem_ty.abiSize(zcu))) });
6854 try cg.addTag(.i32_mul);
6855 try cg.addLocal(.local_set, slice_len.local.value);
6856 }
6857 break :blk slice_len;
6858 },
6859 .one => @as(WValue, .{
6860 .imm32 = @as(u32, @intCast(ptr_elem_ty.arrayLen(zcu) * ptr_elem_ty.childType(zcu).abiSize(zcu))),
6861 }),
6862 .c, .many => unreachable,
6863 };
6864 const dst_ptr = try cg.sliceOrArrayPtr(dst, dst_ty);
6865 const src_ptr = try cg.sliceOrArrayPtr(src, src_ty);
6866 try cg.memmove(dst_ptr, src_ptr, len);
6867
6868 return cg.finishAir(inst, .none, &.{ bin_op.lhs, bin_op.rhs });
6869}
6870
67956871fn airRetAddr(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
67966872 // TODO: Implement this properly once stack serialization is solved
67976873 return cg.finishAir(inst, switch (cg.ptr_size) {
......@@ -6992,7 +7068,7 @@ fn airTagName(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
69927068
69937069 const result_ptr = try cg.allocStack(cg.typeOfIndex(inst));
69947070 try cg.lowerToStack(result_ptr);
6995 try cg.emitWValue(operand);
7071 try cg.lowerToStack(operand);
69967072 try cg.addInst(.{ .tag = .call_tag_name, .data = .{ .ip_index = enum_ty.toIntern() } });
69977073
69987074 return cg.finishAir(inst, result_ptr, &.{un_op});
......@@ -7195,9 +7271,8 @@ fn airAtomicRmw(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
71957271 const ty = cg.typeOfIndex(inst);
71967272 const op: std.builtin.AtomicRmwOp = extra.op();
71977273
7198 const int_ty: IntType = .fromType(cg, ty);
7199
72007274 if (cg.useAtomicFeature()) {
7275 const int_ty: IntType = .fromType(cg, ty);
72017276 switch (op) {
72027277 .Max,
72037278 .Min,
......@@ -7312,35 +7387,65 @@ fn airAtomicRmw(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
73127387 },
73137388 .Add,
73147389 .Sub,
7390 => {
7391 if (ty.isAnyFloat()) {
7392 const float_ty: FloatType = .fromType(cg, ty);
7393 try cg.emitWValue(ptr);
7394 _ = switch (op) {
7395 .Add => try cg.floatAdd(float_ty, result, operand),
7396 .Sub => try cg.floatSub(float_ty, result, operand),
7397 else => unreachable,
7398 };
7399 try cg.store(.stack, .stack, ty, ptr.offset());
7400 } else {
7401 const int_ty: IntType = .fromType(cg, ty);
7402 try cg.emitWValue(ptr);
7403 _ = switch (op) {
7404 .Add => try cg.intAdd(int_ty, result, operand),
7405 .Sub => try cg.intSub(int_ty, result, operand),
7406 else => unreachable,
7407 };
7408 _ = try cg.intWrap(int_ty, .stack);
7409 try cg.store(.stack, .stack, ty, ptr.offset());
7410 }
7411 },
73157412 .And,
73167413 .Or,
73177414 .Xor,
73187415 => {
7416 const int_ty: IntType = .fromType(cg, ty);
73197417 try cg.emitWValue(ptr);
73207418 _ = switch (op) {
7321 .Add => try cg.intAdd(int_ty, result, operand),
7322 .Sub => try cg.intSub(int_ty, result, operand),
73237419 .And => try cg.intAnd(int_ty, result, operand),
73247420 .Or => try cg.intOr(int_ty, result, operand),
73257421 .Xor => try cg.intXor(int_ty, result, operand),
73267422 else => unreachable,
73277423 };
7328 if (ty.isInt(zcu) and (op == .Add or op == .Sub)) {
7329 _ = try cg.intWrap(int_ty, .stack);
7330 }
73317424 try cg.store(.stack, .stack, ty, ptr.offset());
73327425 },
73337426 .Max,
73347427 .Min,
73357428 => {
7336 try cg.emitWValue(ptr);
7337 try cg.emitWValue(result);
7338 try cg.emitWValue(operand);
7339 _ = try cg.intCmp(int_ty, if (op == .Max) .gt else .lt, result, operand);
7340 try cg.addTag(.select);
7341 try cg.store(.stack, .stack, ty, ptr.offset());
7429 if (ty.isAnyFloat()) {
7430 const float_ty: FloatType = .fromType(cg, ty);
7431 try cg.emitWValue(ptr);
7432 try cg.emitWValue(result);
7433 try cg.emitWValue(operand);
7434 _ = try cg.floatCmp(float_ty, if (op == .Max) .gt else .lt, result, operand);
7435 try cg.addTag(.select);
7436 try cg.store(.stack, .stack, ty, ptr.offset());
7437 } else {
7438 const int_ty: IntType = .fromType(cg, ty);
7439 try cg.emitWValue(ptr);
7440 try cg.emitWValue(result);
7441 try cg.emitWValue(operand);
7442 _ = try cg.intCmp(int_ty, if (op == .Max) .gt else .lt, result, operand);
7443 try cg.addTag(.select);
7444 try cg.store(.stack, .stack, ty, ptr.offset());
7445 }
73427446 },
73437447 .Nand => {
7448 const int_ty: IntType = .fromType(cg, ty);
73447449 try cg.emitWValue(ptr);
73457450 const and_res = try cg.intAnd(int_ty, result, operand);
73467451 if (int_ty.bits <= 32) {
......@@ -7423,49 +7528,51 @@ fn airAsm(cg: *CodeGen, inst: Air.Inst.Index) InnerError!void {
74237528 else
74247529 .none;
74257530
7426 var local_map: assembly.LocalMap = .empty;
7427 defer local_map.deinit(cg.gpa);
7531 if (unwrapped_asm.source.len != 0) {
7532 var local_map: assembly.LocalMap = .empty;
7533 defer local_map.deinit(cg.gpa);
74287534
7429 {
7430 var it = unwrapped_asm.iterateOutputs();
7431 if (it.next()) |output| {
7432 const constraint = output.constraint;
7433 assert(output.operand == .none);
7434 const name = output.name;
7435
7436 if (!mem.eql(u8, constraint, "=r")) {
7437 return cg.fail("Self-hosted wasm backend requires output constraint to be equal \"=r\"", .{});
7438 }
7535 {
7536 var it = unwrapped_asm.iterateOutputs();
7537 if (it.next()) |output| {
7538 const constraint = output.constraint;
7539 assert(output.operand == .none);
7540 const name = output.name;
74397541
7440 const gop = try local_map.getOrPutValue(cg.gpa, name, result.local.value);
7441 assert(!gop.found_existing); // first value
7542 if (!mem.eql(u8, constraint, "=r")) {
7543 return cg.fail("Self-hosted wasm backend requires output constraint to be equal \"=r\"", .{});
7544 }
74427545
7443 assert(it.next() == null);
7444 }
7445 }
7546 const gop = try local_map.getOrPutValue(cg.gpa, name, result.local.value);
7547 assert(!gop.found_existing); // first value
74467548
7447 {
7448 var it = unwrapped_asm.iterateInputs();
7449 while (it.next()) |input| {
7450 const constraint = input.constraint;
7451 const operand = try cg.resolveInst(input.operand);
7452 const name = input.name;
7453
7454 if (!mem.eql(u8, constraint, "r")) {
7455 return cg.fail("Self-hosted wasm backend requires input constraint to be equal \"r\"", .{});
7549 assert(it.next() == null);
74567550 }
7551 }
74577552
7458 try cg.lowerToStack(operand);
7459 const op_local = try WValue.toLocal(.stack, cg, cg.typeOf(input.operand));
7553 {
7554 var it = unwrapped_asm.iterateInputs();
7555 while (it.next()) |input| {
7556 const constraint = input.constraint;
7557 const operand = try cg.resolveInst(input.operand);
7558 const name = input.name;
7559
7560 if (!mem.eql(u8, constraint, "r")) {
7561 return cg.fail("Self-hosted wasm backend requires input constraint to be equal \"r\"", .{});
7562 }
7563
7564 try cg.lowerToStack(operand);
7565 const op_local = try WValue.toLocal(.stack, cg, cg.typeOf(input.operand));
74607566
7461 const gop = try local_map.getOrPutValue(cg.gpa, name, op_local.local.value);
7462 if (gop.found_existing) {
7463 return cg.fail("Duplicate asm variable name \"{s}\"", .{name});
7567 const gop = try local_map.getOrPutValue(cg.gpa, name, op_local.local.value);
7568 if (gop.found_existing) {
7569 return cg.fail("Duplicate asm variable name \"{s}\"", .{name});
7570 }
74647571 }
74657572 }
7466 }
74677573
7468 try assembly.assemble(cg, unwrapped_asm.source, &local_map);
7574 try assembly.assemble(cg, unwrapped_asm.source, &local_map);
7575 }
74697576
74707577 var bt = cg.liveness.iterateBigTomb(inst);
74717578 for (outputs) |output| if (output != .none) cg.feed(&bt, output);
src/codegen/wasm/Mir.zig+3
......@@ -1028,6 +1028,9 @@ pub const Intrinsic = enum(u32) {
10281028 tanf,
10291029 tanq,
10301030 truncq,
1031 memcpy,
1032 memmove,
1033 memset,
10311034 __addo_limb64,
10321035 __subo_limb64,
10331036 __cmp_limb64,
src/link/Wasm/Flush.zig+54-34
......@@ -1865,7 +1865,6 @@ fn emitTagNameFunction(
18651865) !void {
18661866 const comp = wasm.base.comp;
18671867 const gpa = comp.gpa;
1868 const diags = &comp.link_diags;
18691868 const zcu = comp.zcu.?;
18701869 const ip = &zcu.intern_pool;
18711870 const enum_type = ip.loadEnumType(enum_type_ip);
......@@ -1909,11 +1908,7 @@ fn emitTagNameFunction(
19091908 }
19101909
19111910 const int_info = Zcu.Type.intInfo(.fromInterned(enum_type.int_tag_type), zcu);
1912 const outer_block_type: std.wasm.BlockType = switch (int_info.bits) {
1913 0...32 => .i32,
1914 33...64 => .i64,
1915 else => return diags.fail("wasm linker does not yet implement @tagName for sparse enums with more than 64 bit integer tag types", .{}),
1916 };
1911 const is_big_int = int_info.bits > 64;
19171912
19181913 try code.ensureUnusedCapacity(
19191914 gpa,
......@@ -1930,41 +1925,66 @@ fn emitTagNameFunction(
19301925
19311926 // Outer block that computes table offset.
19321927 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.block));
1933 code.appendAssumeCapacity(@intFromEnum(outer_block_type));
1928 code.appendAssumeCapacity(@intFromEnum(std.wasm.BlockType.i32));
19341929
19351930 for (tag_values, 0..) |tag_value, tag_index| {
19361931 // block for this if case
19371932 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.block));
19381933 code.appendAssumeCapacity(@intFromEnum(std.wasm.BlockType.empty));
19391934
1940 // Tag value whose name should be returned.
1941 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.local_get));
1942 appendReservedUleb32(code, 1);
1943
19441935 const val: Zcu.Value = .fromInterned(tag_value);
1945 switch (outer_block_type) {
1946 .i32 => {
1947 const x: u32 = switch (int_info.signedness) {
1948 .signed => @bitCast(@as(i32, @intCast(val.toSignedInt(zcu)))),
1949 .unsigned => @intCast(val.toUnsignedInt(zcu)),
1950 };
1951 appendReservedI32Const(code, x);
1952 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i32_ne));
1953 },
1954 .i64 => {
1955 const x: u64 = switch (int_info.signedness) {
1956 .signed => @bitCast(val.toSignedInt(zcu)),
1957 .unsigned => val.toUnsignedInt(zcu),
1958 };
1959 appendReservedI64Const(code, x);
1936 if (is_big_int) {
1937 var val_space: Zcu.Value.BigIntSpace = undefined;
1938 const val_bigint = val.toBigInt(&val_space, zcu);
1939 const num_limbs = (int_info.bits + 63) / 64;
1940
1941 const limbs = try gpa.alloc(u64, num_limbs);
1942 defer gpa.free(limbs);
1943 val_bigint.writeTwosComplement(@ptrCast(limbs), .little);
1944
1945 try code.ensureUnusedCapacity(gpa, 35 * num_limbs);
1946
1947 for (0..num_limbs) |limb_index| {
1948 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.local_get));
1949 appendReservedUleb32(code, 1);
1950
1951 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i64_load));
1952 appendReservedUleb32(code, @ctz(@as(u32, 8)));
1953 appendReservedUleb32(code, @intCast(limb_index * 8));
1954
1955 appendReservedI64Const(code, limbs[limb_index]);
19601956 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i64_ne));
1961 },
1962 else => unreachable,
1963 }
19641957
1965 // if they're not equal, break out of current branch
1966 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.br_if));
1967 appendReservedUleb32(code, 0);
1958 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.br_if));
1959 appendReservedUleb32(code, 0);
1960 }
1961 } else {
1962 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.local_get));
1963 appendReservedUleb32(code, 1);
1964
1965 switch (int_info.bits) {
1966 0...32 => {
1967 const x: u32 = switch (int_info.signedness) {
1968 .signed => @bitCast(@as(i32, @intCast(val.toSignedInt(zcu)))),
1969 .unsigned => @intCast(val.toUnsignedInt(zcu)),
1970 };
1971 appendReservedI32Const(code, x);
1972 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i32_ne));
1973 },
1974 33...64 => {
1975 const x: u64 = switch (int_info.signedness) {
1976 .signed => @bitCast(val.toSignedInt(zcu)),
1977 .unsigned => val.toUnsignedInt(zcu),
1978 };
1979 appendReservedI64Const(code, x);
1980 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i64_ne));
1981 },
1982 else => unreachable,
1983 }
1984
1985 code.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.br_if));
1986 appendReservedUleb32(code, 0);
1987 }
19681988
19691989 // Put the table offset of the result on the stack.
19701990 appendReservedI32Const(code, @intCast(tag_index * slice_abi_size));
......@@ -1995,7 +2015,7 @@ fn appendReservedI32Const(bytes: *ArrayList(u8), val: u32) void {
19952015 bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i32_const));
19962016 var w: std.Io.Writer = .fromArrayList(bytes);
19972017 defer bytes.* = w.toArrayList();
1998 return w.writeSleb128(val) catch |err| switch (err) {
2018 return w.writeSleb128(@as(i32, @bitCast(val))) catch |err| switch (err) {
19992019 error.WriteFailed => unreachable,
20002020 };
20012021}
......@@ -2005,7 +2025,7 @@ fn appendReservedI64Const(bytes: *ArrayList(u8), val: u64) void {
20052025 bytes.appendAssumeCapacity(@intFromEnum(std.wasm.Opcode.i64_const));
20062026 var w: std.Io.Writer = .fromArrayList(bytes);
20072027 defer bytes.* = w.toArrayList();
2008 return w.writeSleb128(val) catch |err| switch (err) {
2028 return w.writeSleb128(@as(i64, @bitCast(val))) catch |err| switch (err) {
20092029 error.WriteFailed => unreachable,
20102030 };
20112031}
test/behavior/abs.zig+2-5
......@@ -214,9 +214,9 @@ test "@abs floats" {
214214 try comptime testAbsFloats(f64);
215215 try testAbsFloats(f64);
216216 try comptime testAbsFloats(f80);
217 if (builtin.zig_backend != .stage2_wasm and builtin.zig_backend != .stage2_spirv and builtin.zig_backend != .stage2_riscv64) try testAbsFloats(f80);
217 if (builtin.zig_backend != .stage2_spirv and builtin.zig_backend != .stage2_riscv64) try testAbsFloats(f80);
218218 try comptime testAbsFloats(f128);
219 if (builtin.zig_backend != .stage2_wasm and builtin.zig_backend != .stage2_spirv and builtin.zig_backend != .stage2_riscv64) try testAbsFloats(f128);
219 if (builtin.zig_backend != .stage2_spirv and builtin.zig_backend != .stage2_riscv64) try testAbsFloats(f128);
220220}
221221
222222fn testAbsFloats(comptime T: type) !void {
......@@ -259,7 +259,6 @@ fn testAbsFloats(comptime T: type) !void {
259259test "@abs int vectors" {
260260 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
261261 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
262 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
263262 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
264263 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
265264 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -326,7 +325,6 @@ fn testAbsIntVectors(comptime len: comptime_int) !void {
326325
327326test "@abs unsigned int vectors" {
328327 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
329 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
330328 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
331329 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
332330 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -385,7 +383,6 @@ fn testAbsUnsignedIntVectors(comptime len: comptime_int) !void {
385383
386384test "@abs float vectors" {
387385 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
388 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
389386 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
390387 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
391388 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
test/behavior/align.zig-1
......@@ -527,7 +527,6 @@ test "alignment of zero-bit types is respected" {
527527 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
528528 if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
529529 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
530 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
531530 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
532531
533532 const S = struct { arr: [0]usize = .{} };
test/behavior/atomics.zig-1
......@@ -189,7 +189,6 @@ test "atomicrmw with floats" {
189189 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
190190 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
191191 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
192 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
193192
194193 try testAtomicRmwFloat();
195194 try comptime testAtomicRmwFloat();
test/behavior/basic.zig-1
......@@ -1147,7 +1147,6 @@ test "arrays and vectors with big integers" {
11471147 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11481148 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
11491149 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1150 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
11511150 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
11521151 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
11531152 if (builtin.zig_backend == .stage2_llvm and (builtin.abi == .gnuabin32 or builtin.abi == .muslabin32)) return error.SkipZigTest; // https://github.com/ziglang/zig/issues/23805
test/behavior/bitcast.zig-2
......@@ -387,7 +387,6 @@ test "bitcast vector to integer and back" {
387387 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
388388 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
389389 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
390 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
391390 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
392391 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
393392 if (builtin.cpu.arch.endian() == .big and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
......@@ -530,7 +529,6 @@ test "@bitCast of extern struct containing pointer" {
530529 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
531530 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
532531 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
533 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
534532 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; // TODO
535533
536534 const S = struct {
test/behavior/bitreverse.zig-5
......@@ -122,7 +122,6 @@ fn vector8() !void {
122122
123123test "bitReverse vectors u8" {
124124 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
125 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
126125 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
127126 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
128127 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -142,7 +141,6 @@ fn vector16() !void {
142141
143142test "bitReverse vectors u16" {
144143 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
145 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
146144 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
147145 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
148146 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -162,7 +160,6 @@ fn vector24() !void {
162160
163161test "bitReverse vectors u24" {
164162 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
165 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
166163 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
167164 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
168165 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -181,8 +178,6 @@ fn vector0() !void {
181178}
182179
183180test "bitReverse vectors u0" {
184 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
185
186181 try comptime vector0();
187182 try vector0();
188183}
test/behavior/byteswap.zig-5
......@@ -82,7 +82,6 @@ fn vector8() !void {
8282
8383test "@byteSwap vectors u8" {
8484 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
85 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
8685 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
8786 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
8887 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -102,7 +101,6 @@ fn vector16() !void {
102101
103102test "@byteSwap vectors u16" {
104103 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
105 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
106104 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
107105 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
108106 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -122,7 +120,6 @@ fn vector24() !void {
122120
123121test "@byteSwap vectors u24" {
124122 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
125 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
126123 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
127124 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
128125 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -141,8 +138,6 @@ fn vector0() !void {
141138}
142139
143140test "@byteSwap vectors u0" {
144 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
145
146141 try comptime vector0();
147142 try vector0();
148143}
test/behavior/cast.zig-15
......@@ -268,7 +268,6 @@ test "type coercion from int to float" {
268268 try check.value(c_longdouble, @as(u1, 0)); // Smoke test - size varies by target.
269269
270270 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
271 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
272271
273272 // Basic sanity check that the coercions work for vectors too.
274273 const int_vec: @Vector(2, u24) = @splat(123);
......@@ -758,7 +757,6 @@ test "cast *[1][*]const u8 to [*]const ?[*]const u8" {
758757
759758test "@intCast on vector" {
760759 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
761 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
762760 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
763761 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
764762 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2145,7 +2143,6 @@ test "peer type resolution: array and vector with same child type" {
21452143 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
21462144 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
21472145 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
2148 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
21492146
21502147 var arr: [2]u32 = .{ 0, 1 };
21512148 var vec: @Vector(2, u32) = .{ 2, 3 };
......@@ -2167,7 +2164,6 @@ test "peer type resolution: array and vector with same child type" {
21672164test "peer type resolution: array with smaller child type and vector with larger child type" {
21682165 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
21692166 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2170 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
21712167 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
21722168 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
21732169
......@@ -2279,7 +2275,6 @@ test "peer type resolution: three-way resolution combines error set and optional
22792275test "peer type resolution: vector and optional vector" {
22802276 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
22812277 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2282 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
22832278 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
22842279 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; // TODO
22852280 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
......@@ -2349,7 +2344,6 @@ test "peer type resolution: array and tuple" {
23492344test "peer type resolution: vector and tuple" {
23502345 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
23512346 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2352 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
23532347 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
23542348
23552349 var vec: @Vector(3, i32) = .{ 1, 2, 3 };
......@@ -2373,7 +2367,6 @@ test "peer type resolution: vector and tuple" {
23732367test "peer type resolution: vector and array and tuple" {
23742368 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
23752369 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2376 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
23772370 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
23782371 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
23792372
......@@ -2816,7 +2809,6 @@ test "cast builtins can wrap result in error union and optional" {
28162809
28172810test "@floatCast on vector" {
28182811 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2819 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
28202812 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
28212813 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
28222814 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2857,7 +2849,6 @@ test "@floatCast on vector" {
28572849
28582850test "@ptrFromInt on vector" {
28592851 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2860 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
28612852 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
28622853 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
28632854 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2882,7 +2873,6 @@ test "@ptrFromInt on vector" {
28822873
28832874test "@intFromPtr on vector" {
28842875 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2885 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
28862876 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
28872877 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
28882878 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2907,7 +2897,6 @@ test "@intFromPtr on vector" {
29072897
29082898test "@floatFromInt on vector" {
29092899 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2910 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
29112900 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
29122901 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
29132902 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2927,7 +2916,6 @@ test "@floatFromInt on vector" {
29272916
29282917test "@intFromFloat on vector" {
29292918 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2930 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
29312919 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
29322920 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
29332921 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2947,7 +2935,6 @@ test "@intFromFloat on vector" {
29472935
29482936test "@intFromBool on vector" {
29492937 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2950 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
29512938 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
29522939 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
29532940 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -3023,7 +3010,6 @@ test "result information is preserved through many nested structures" {
30233010test "@intCast vector of signed integer" {
30243011 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
30253012 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
3026 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
30273013 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
30283014 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
30293015 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -3109,7 +3095,6 @@ test "@intFromFloat boundary cases" {
31093095test "@intFromFloat vector boundary cases" {
31103096 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
31113097 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3112 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
31133098
31143099 const S = struct {
31153100 fn case(comptime I: type, unshifted_inputs: [2]f32, expected: [2]I) !void {
test/behavior/enum.zig+98-1
......@@ -1057,7 +1057,6 @@ test "tag name with signed enum values" {
10571057test "tag name with large enum values" {
10581058 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
10591059 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
1060 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
10611060
10621061 const Kdf = enum(u128) {
10631062 aes_kdf = 0xea4f8ac1080d74bf60448a629af3d9c9,
......@@ -1074,6 +1073,104 @@ test "tag name with large enum values" {
10741073 try expect(mem.eql(u8, @tagName(kdf), "argon2id"));
10751074}
10761075
1076test "@tagName with exotic integer enum types" {
1077 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1078 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
1079
1080 const S = struct {
1081 fn testEnumSigned(comptime T: type) !void {
1082 {
1083 const E1 = enum(T) {
1084 a = -125,
1085 b = 125,
1086 c = std.math.minInt(T),
1087 d = std.math.maxInt(T),
1088 };
1089
1090 var e: E1 = .a;
1091 try expect(mem.eql(u8, @tagName(e), "a"));
1092 e = .b;
1093 try expect(mem.eql(u8, @tagName(e), "b"));
1094 e = .c;
1095 try expect(mem.eql(u8, @tagName(e), "c"));
1096 e = .d;
1097 try expect(mem.eql(u8, @tagName(e), "d"));
1098 }
1099 {
1100 const E2 = enum(T) {
1101 a = -125,
1102 b = 125,
1103 c = std.math.minInt(T),
1104 d = std.math.maxInt(T),
1105 _,
1106 };
1107
1108 var e: E2 = .a;
1109 try expect(mem.eql(u8, @tagName(e), "a"));
1110 e = .b;
1111 try expect(mem.eql(u8, @tagName(e), "b"));
1112 e = .c;
1113 try expect(mem.eql(u8, @tagName(e), "c"));
1114 e = .d;
1115 try expect(mem.eql(u8, @tagName(e), "d"));
1116 }
1117 }
1118
1119 fn testEnumUnsigned(comptime T: type) !void {
1120 {
1121 const E1 = enum(T) {
1122 a = std.math.maxInt(T) - 125,
1123 b = 125,
1124 c = std.math.minInt(T),
1125 d = std.math.maxInt(T),
1126 };
1127
1128 var e: E1 = .a;
1129 try expect(mem.eql(u8, @tagName(e), "a"));
1130 e = .b;
1131 try expect(mem.eql(u8, @tagName(e), "b"));
1132 e = .c;
1133 try expect(mem.eql(u8, @tagName(e), "c"));
1134 e = .d;
1135 try expect(mem.eql(u8, @tagName(e), "d"));
1136 }
1137 {
1138 const E2 = enum(T) {
1139 a = std.math.maxInt(T) - 125,
1140 b = 125,
1141 c = std.math.minInt(T),
1142 d = std.math.maxInt(T),
1143 _,
1144 };
1145
1146 var e: E2 = .a;
1147 try expect(mem.eql(u8, @tagName(e), "a"));
1148 e = .b;
1149 try expect(mem.eql(u8, @tagName(e), "b"));
1150 e = .c;
1151 try expect(mem.eql(u8, @tagName(e), "c"));
1152 e = .d;
1153 try expect(mem.eql(u8, @tagName(e), "d"));
1154 }
1155 }
1156
1157 fn doTheTest() !void {
1158 try testEnumSigned(i33);
1159 try testEnumSigned(i95);
1160 try testEnumSigned(i127);
1161 try testEnumSigned(i257);
1162
1163 try testEnumUnsigned(u33);
1164 try testEnumUnsigned(u95);
1165 try testEnumUnsigned(u127);
1166 try testEnumUnsigned(u257);
1167 }
1168 };
1169
1170 try S.doTheTest();
1171 try comptime S.doTheTest();
1172}
1173
10771174test "@tagName in callconv(.c) function" {
10781175 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
10791176 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
test/behavior/floatop.zig-22
......@@ -221,9 +221,7 @@ fn testCmp(comptime T: type) !void {
221221
222222test "vector cmp f16" {
223223 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
224 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
225224 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
226 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
227225 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
228226 if (builtin.cpu.arch.isArm()) return error.SkipZigTest;
229227 if (builtin.cpu.arch.isPowerPC64()) return error.SkipZigTest;
......@@ -236,7 +234,6 @@ test "vector cmp f16" {
236234test "vector cmp f32" {
237235 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
238236 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
239 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
240237 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
241238 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
242239 if (builtin.cpu.arch.isArm()) return error.SkipZigTest;
......@@ -249,7 +246,6 @@ test "vector cmp f32" {
249246
250247test "vector cmp f64" {
251248 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
252 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
253249 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
254250 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
255251 if (builtin.cpu.arch.isArm()) return error.SkipZigTest;
......@@ -262,7 +258,6 @@ test "vector cmp f64" {
262258
263259test "vector cmp f128" {
264260 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
265 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
266261 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
267262 if (builtin.zig_backend == .stage2_c and builtin.cpu.arch.isArm()) return error.SkipZigTest;
268263 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -281,7 +276,6 @@ test "vector cmp f80/c_longdouble" {
281276 if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .powerpc64le) return error.SkipZigTest;
282277 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
283278 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
284 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
285279
286280 try testCmpVector(f80);
287281 try comptime testCmpVector(f80);
......@@ -477,7 +471,6 @@ fn testSqrt(comptime T: type) !void {
477471
478472test "@sqrt with vectors" {
479473 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
480 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
481474 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
482475 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
483476 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -546,7 +539,6 @@ fn testSin(comptime T: type) !void {
546539
547540test "@sin with vectors" {
548541 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
549 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
550542 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
551543 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
552544 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -615,7 +607,6 @@ fn testCos(comptime T: type) !void {
615607
616608test "@cos with vectors" {
617609 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
618 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
619610 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
620611 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
621612 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -684,7 +675,6 @@ fn testTan(comptime T: type) !void {
684675
685676test "@tan with vectors" {
686677 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
687 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
688678 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
689679 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
690680 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -757,7 +747,6 @@ fn testExp(comptime T: type) !void {
757747
758748test "@exp with vectors" {
759749 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
760 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
761750 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
762751 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
763752 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -825,7 +814,6 @@ fn testExp2(comptime T: type) !void {
825814
826815test "@exp2 with @vectors" {
827816 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
828 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
829817 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
830818 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
831819 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -893,7 +881,6 @@ fn testLog(comptime T: type) !void {
893881
894882test "@log with @vectors" {
895883 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
896 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
897884 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
898885 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
899886 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -959,7 +946,6 @@ fn testLog2(comptime T: type) !void {
959946
960947test "@log2 with vectors" {
961948 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
962 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
963949 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
964950 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
965951 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1031,7 +1017,6 @@ fn testLog10(comptime T: type) !void {
10311017
10321018test "@log10 with vectors" {
10331019 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1034 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10351020 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10361021 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
10371022 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1151,7 +1136,6 @@ fn testFabs(comptime T: type) !void {
11511136test "@abs with vectors" {
11521137 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11531138 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1154 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
11551139 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
11561140
11571141 try testFabsWithVectors();
......@@ -1241,7 +1225,6 @@ fn testFloor(comptime T: type) !void {
12411225test "@floor with vectors" {
12421226 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12431227 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1244 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
12451228 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
12461229
12471230 try testFloorWithVectors();
......@@ -1349,7 +1332,6 @@ fn testCeil(comptime T: type) !void {
13491332test "@ceil with vectors" {
13501333 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
13511334 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1352 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
13531335 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
13541336
13551337 try testCeilWithVectors();
......@@ -1439,7 +1421,6 @@ fn testTrunc(comptime T: type) !void {
14391421test "@trunc with vectors" {
14401422 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
14411423 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1442 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
14431424 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
14441425
14451426 try testTruncWithVectors();
......@@ -1460,7 +1441,6 @@ test "neg f16" {
14601441 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14611442 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14621443 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1463 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
14641444
14651445 if (builtin.os.tag == .freebsd) {
14661446 // TODO file issue to track this failure
......@@ -1486,7 +1466,6 @@ test "neg f80/f128/c_longdouble" {
14861466 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14871467 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14881468 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
1489 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
14901469 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
14911470
14921471 try testNeg(f80);
......@@ -1741,7 +1720,6 @@ test "comptime calls are only memoized when float arguments are bit-for-bit equa
17411720}
17421721
17431722test "result location forwarded through unary float builtins" {
1744 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
17451723 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
17461724 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
17471725 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
test/behavior/lower_strlit_to_vector.zig-1
......@@ -4,7 +4,6 @@ const builtin = @import("builtin");
44test "strlit to vector" {
55 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
66 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
87 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
98
109 const strlit = "0123456789abcdef0123456789ABCDEF";
test/behavior/math.zig-12
......@@ -100,7 +100,6 @@ fn testOneClz(comptime T: type, x: T) u32 {
100100
101101test "@clz vectors" {
102102 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
103 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
104103 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
105104 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
106105 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -184,7 +183,6 @@ fn testCtz128() !void {
184183
185184test "@ctz vectors" {
186185 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
187 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
188186 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
189187 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
190188 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -584,7 +582,6 @@ test "large integer division" {
584582 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
585583 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
586584 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
587 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
588585 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
589586 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
590587
......@@ -2260,7 +2257,6 @@ fn testRound(comptime T: type, x: T) !void {
22602257
22612258test "vector integer addition" {
22622259 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2263 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
22642260 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
22652261 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
22662262 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2322,7 +2318,6 @@ fn testNanEqNan(comptime F: type) !void {
23222318
23232319test "vector comparison" {
23242320 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2325 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
23262321 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
23272322 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
23282323 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2414,7 +2409,6 @@ test "mod lazy values" {
24142409
24152410test "@clz works on both vector and scalar inputs" {
24162411 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2417 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
24182412 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
24192413 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
24202414 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2489,7 +2483,6 @@ test "runtime int comparison to inf is comptime-known" {
24892483}
24902484
24912485test "float divide by zero" {
2492 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
24932486 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
24942487 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
24952488 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2525,7 +2518,6 @@ test "float divide by zero" {
25252518
25262519test "partially-runtime integer vector division would be illegal if vector elements were reordered" {
25272520 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2528 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
25292521 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
25302522 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
25312523 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2554,7 +2546,6 @@ test "partially-runtime integer vector division would be illegal if vector eleme
25542546
25552547test "float vector division of comptime zero by runtime nan is nan" {
25562548 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2557 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
25582549 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
25592550 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
25602551 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2572,7 +2563,6 @@ test "float vector division of comptime zero by runtime nan is nan" {
25722563
25732564test "float vector multiplication of comptime zero by runtime nan is nan" {
25742565 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2575 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
25762566 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
25772567 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
25782568 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2588,7 +2578,6 @@ test "float vector multiplication of comptime zero by runtime nan is nan" {
25882578}
25892579
25902580test "comptime float vector division of zero by nan is nan" {
2591 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
25922581 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
25932582 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
25942583 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -2603,7 +2592,6 @@ test "comptime float vector division of zero by nan is nan" {
26032592}
26042593
26052594test "comptime float vector multiplication of zero by nan is nan" {
2606 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
26072595 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
26082596 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
26092597 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
test/behavior/maximum_minimum.zig-7
......@@ -28,7 +28,6 @@ test "@max" {
2828
2929test "@max on vectors" {
3030 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
31 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
3231 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
3332 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
3433 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -82,7 +81,6 @@ test "@min" {
8281
8382test "@min for vectors" {
8483 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
85 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
8684 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
8785 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
8886 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -165,7 +163,6 @@ test "@min/@max more than two arguments" {
165163
166164test "@min/@max more than two vector arguments" {
167165 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
168 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
169166 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
170167 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
171168 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -195,7 +192,6 @@ test "@min/@max notices bounds" {
195192
196193test "@min/@max notices vector bounds" {
197194 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
198 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
199195 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
200196 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
201197 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -246,7 +242,6 @@ test "@min/@max notices bounds from types" {
246242
247243test "@min/@max notices bounds from vector types" {
248244 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
249 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
250245 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
251246 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
252247 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -287,7 +282,6 @@ test "@min/@max notices bounds from types when comptime-known value is undef" {
287282
288283test "@min/@max notices bounds from vector types when element of comptime-known vector is undef" {
289284 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
290 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
291285 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
292286 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
293287 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -357,7 +351,6 @@ test "@min/@max with runtime signed and unsigned integers of same size" {
357351
358352test "@min/@max with runtime vectors of signed and unsigned integers of same size" {
359353 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
360 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
361354 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
362355 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
363356 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
test/behavior/memmove.zig-4
......@@ -6,7 +6,6 @@ test "memmove and memset intrinsics" {
66 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
77 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
88 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
9 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
109 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1110
1211 try testMemmoveMemset();
......@@ -34,7 +33,6 @@ test "@memmove with both operands single-ptr-to-array, one is null-terminated" {
3433 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
3534 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
3635 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
37 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
3836 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3937
4038 try testMemmoveBothSinglePtrArrayOneIsNullTerminated();
......@@ -78,7 +76,6 @@ test "@memmove dest many pointer" {
7876 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7977 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
8078 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
81 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
8279 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
8380
8481 try testMemmoveDestManyPtr();
......@@ -121,7 +118,6 @@ test "@memmove slice" {
121118 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
122119 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
123120 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
124 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
125121 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
126122
127123 try testMemmoveSlice();
test/behavior/memset.zig-2
......@@ -80,7 +80,6 @@ test "memset with 1-byte struct element" {
8080 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
8181 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
8282 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
83 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
8483
8584 const S = struct { x: bool };
8685 var buf: [5]S = undefined;
......@@ -93,7 +92,6 @@ test "memset with 1-byte array element" {
9392 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
9493 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
9594 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
96 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
9795
9896 const A = [1]bool;
9997 var buf: [5]A = undefined;
test/behavior/muladd.zig-5
......@@ -100,7 +100,6 @@ fn vector16() !void {
100100
101101test "vector f16" {
102102 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
103 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
104103 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
105104 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
106105 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -125,7 +124,6 @@ fn vector32() !void {
125124
126125test "vector f32" {
127126 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
128 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
129127 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
130128 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
131129 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -150,7 +148,6 @@ fn vector64() !void {
150148
151149test "vector f64" {
152150 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
153 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
154151 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
155152 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
156153 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -174,7 +171,6 @@ fn vector80() !void {
174171
175172test "vector f80" {
176173 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
177 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
178174 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
179175 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
180176 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -200,7 +196,6 @@ fn vector128() !void {
200196
201197test "vector f128" {
202198 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
203 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
204199 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
205200 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
206201 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
test/behavior/popcount.zig-1
......@@ -77,7 +77,6 @@ fn testPopCountIntegers() !void {
7777
7878test "@popCount vectors" {
7979 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
80 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
8180 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
8281 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
8382 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
test/behavior/ptrcast.zig-2
......@@ -515,7 +515,6 @@ test "@ptrCast single-item pointer to slice with length 1" {
515515 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
516516 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
517517 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
518 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
519518
520519 const S = struct {
521520 fn doTheTest(comptime T: type, ptr: *const T) !void {
......@@ -536,7 +535,6 @@ test "@ptrCast single-item pointer to slice of bytes" {
536535 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
537536 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
538537 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
539 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
540538
541539 const S = struct {
542540 fn doTheTest(comptime T: type, ptr: *const T) !void {
test/behavior/select.zig-3
......@@ -5,7 +5,6 @@ const expect = std.testing.expect;
55
66test "@select vectors" {
77 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
98 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
109 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1110 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -36,7 +35,6 @@ fn selectVectors() !void {
3635
3736test "@select arrays" {
3837 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
39 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
4038 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
4139 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
4240 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -68,7 +66,6 @@ fn selectArrays() !void {
6866test "@select compare result" {
6967 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7068 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
71 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
7269 if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .hexagon) return error.SkipZigTest;
7370
7471 const S = struct {
test/behavior/shuffle.zig-3
......@@ -51,7 +51,6 @@ test "@shuffle int" {
5151
5252test "@shuffle int strange sizes" {
5353 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
54 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
5554 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
5655 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
5756 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -133,7 +132,6 @@ fn testShuffle(
133132
134133test "@shuffle bool 1" {
135134 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
136 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
137135 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
138136 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
139137 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -156,7 +154,6 @@ test "@shuffle bool 1" {
156154
157155test "@shuffle bool 2" {
158156 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
159 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
160157 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
161158 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
162159 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
test/behavior/truncate.zig-1
......@@ -112,7 +112,6 @@ test "@truncate > 128 bits" {
112112
113113test "truncate on vectors" {
114114 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
115 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
116115 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
117116 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
118117 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
test/behavior/union.zig-1
......@@ -2184,7 +2184,6 @@ test "matching captures causes union equivalence" {
21842184test "signed enum tag with negative value" {
21852185 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
21862186 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
2187 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
21882187 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
21892188
21902189 const Enum = enum(i8) {
test/behavior/vector.zig+4-49
......@@ -9,7 +9,6 @@ const expectEqual = std.testing.expectEqual;
99test "implicit cast vector to array - bool" {
1010 if (builtin.cpu.arch == .aarch64_be and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
1111 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
1312
1413 const S = struct {
1514 fn doTheTest() !void {
......@@ -33,7 +32,6 @@ test "implicit cast vector to array - bool" {
3332
3433test "implicit cast array to vector - bool" {
3534 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
36 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
3735
3836 const S = struct {
3937 fn doTheTest() !void {
......@@ -57,7 +55,6 @@ test "implicit cast array to vector - bool" {
5755
5856test "vector wrap operators" {
5957 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
60 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
6158 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6259 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
6360 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -81,7 +78,6 @@ test "vector wrap operators" {
8178
8279test "vector bin compares with mem.eql" {
8380 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
84 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
8581 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
8682 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
8783 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -106,7 +102,6 @@ test "vector bin compares with mem.eql" {
106102
107103test "vector int operators" {
108104 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
109 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
110105 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
111106 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
112107 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -129,7 +124,6 @@ test "vector int operators" {
129124
130125test "vector float operators" {
131126 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
132 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
133127 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
134128 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
135129 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -173,7 +167,6 @@ test "vector float operators" {
173167
174168test "vector bit operators" {
175169 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
176 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
177170 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
178171 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
179172 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -228,7 +221,6 @@ test "array to vector" {
228221 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
229222 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
230223 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
231 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
232224
233225 const S = struct {
234226 fn doTheTest() !void {
......@@ -247,7 +239,6 @@ test "array vector coercion - odd sizes" {
247239 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
248240 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
249241 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
250 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
251242 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
252243
253244 const S = struct {
......@@ -286,7 +277,6 @@ test "array to vector with element type coercion" {
286277 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
287278 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
288279 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
289 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
290280 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
291281 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
292282
......@@ -304,7 +294,6 @@ test "array to vector with element type coercion" {
304294}
305295
306296test "peer type resolution with coercible element types" {
307 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
308297 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
309298 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
310299
......@@ -323,7 +312,6 @@ test "peer type resolution with coercible element types" {
323312
324313test "tuple to vector" {
325314 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
326 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
327315 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
328316 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
329317 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -346,7 +334,6 @@ test "tuple to vector" {
346334
347335test "vector casts of sizes not divisible by 8" {
348336 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
349 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
350337 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
351338 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
352339 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -493,7 +480,6 @@ test "initialize vector which is a struct field" {
493480
494481test "vector comparison operators" {
495482 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
496 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
497483 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
498484 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
499485 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -539,7 +525,6 @@ test "vector comparison operators" {
539525
540526test "vector division operators" {
541527 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
542 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
543528 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
544529 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
545530 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -632,7 +617,6 @@ test "vector division operators" {
632617
633618test "vector bitwise not operator" {
634619 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
635 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
636620 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
637621 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
638622 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -671,7 +655,6 @@ test "vector bitwise not operator" {
671655
672656test "vector boolean not operator" {
673657 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
674 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
675658 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
676659 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
677660 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -700,7 +683,6 @@ test "vector boolean not operator" {
700683
701684test "vector shift operators" {
702685 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
703 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
704686 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
705687 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
706688 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -772,7 +754,6 @@ test "vector shift operators" {
772754
773755test "vector reduce operation" {
774756 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
775 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
776757 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
777758 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
778759 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -902,7 +883,6 @@ test "vector reduce operation" {
902883}
903884
904885test "vector @reduce comptime" {
905 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
906886 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
907887 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
908888
......@@ -919,7 +899,6 @@ test "vector @reduce comptime" {
919899
920900test "saturating add" {
921901 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
922 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
923902 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
924903 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
925904 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1020,7 +999,6 @@ test "saturating add" {
1020999
10211000test "saturating subtraction" {
10221001 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1023 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10241002 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10251003 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
10261004 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1113,7 +1091,6 @@ test "saturating subtraction" {
11131091
11141092test "saturating multiplication" {
11151093 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1116 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
11171094 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11181095 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11191096 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1141,7 +1118,6 @@ test "saturating multiplication" {
11411118
11421119test "saturating shift-left" {
11431120 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1144 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
11451121 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11461122 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11471123 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1165,7 +1141,6 @@ test "saturating shift-left" {
11651141
11661142test "multiplication-assignment operator with an array operand" {
11671143 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1168 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
11691144 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11701145 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11711146 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -1186,7 +1161,6 @@ test "multiplication-assignment operator with an array operand" {
11861161
11871162test "@addWithOverflow" {
11881163 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1189 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
11901164 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11911165 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
11921166 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -1235,7 +1209,6 @@ test "@addWithOverflow" {
12351209
12361210test "@subWithOverflow" {
12371211 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1238 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
12391212 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12401213 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
12411214 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -1268,7 +1241,6 @@ test "@subWithOverflow" {
12681241
12691242test "@mulWithOverflow" {
12701243 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1271 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
12721244 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12731245 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
12741246 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -1290,7 +1262,6 @@ test "@mulWithOverflow" {
12901262
12911263test "@shlWithOverflow" {
12921264 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1293 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
12941265 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12951266 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
12961267 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -1313,28 +1284,27 @@ test "@shlWithOverflow" {
13131284test "alignment of vectors" {
13141285 try expect(@alignOf(@Vector(2, u8)) == switch (builtin.zig_backend) {
13151286 else => 2,
1316 .stage2_c => @alignOf(u8),
1287 .stage2_c, .stage2_wasm => @alignOf(u8),
13171288 .stage2_x86_64 => 16,
13181289 });
13191290 try expect(@alignOf(@Vector(2, u1)) == switch (builtin.zig_backend) {
13201291 else => 1,
1321 .stage2_c => @alignOf(u1),
1292 .stage2_c, .stage2_wasm => @alignOf(u1),
13221293 .stage2_x86_64 => 16,
13231294 });
13241295 try expect(@alignOf(@Vector(1, u1)) == switch (builtin.zig_backend) {
13251296 else => 1,
1326 .stage2_c => @alignOf(u1),
1297 .stage2_c, .stage2_wasm => @alignOf(u1),
13271298 .stage2_x86_64 => 16,
13281299 });
13291300 try expect(@alignOf(@Vector(2, u16)) == switch (builtin.zig_backend) {
13301301 else => 4,
1331 .stage2_c => @alignOf(u16),
1302 .stage2_c, .stage2_wasm => @alignOf(u16),
13321303 .stage2_x86_64 => 16,
13331304 });
13341305}
13351306
13361307test "loading the second vector from a slice of vectors" {
1337 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
13381308 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13391309 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13401310 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1351,7 +1321,6 @@ test "loading the second vector from a slice of vectors" {
13511321
13521322test "array of vectors is copied" {
13531323 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1354 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
13551324 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13561325 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13571326 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1375,7 +1344,6 @@ test "array of vectors is copied" {
13751344
13761345test "byte vector initialized in inline function" {
13771346 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1378 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
13791347 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13801348 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
13811349 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -1401,7 +1369,6 @@ test "byte vector initialized in inline function" {
14011369}
14021370
14031371test "zero divisor" {
1404 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
14051372 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14061373 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14071374
......@@ -1420,7 +1387,6 @@ test "zero divisor" {
14201387}
14211388
14221389test "zero multiplicand" {
1423 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
14241390 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14251391 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14261392 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
......@@ -1444,7 +1410,6 @@ test "zero multiplicand" {
14441410}
14451411
14461412test "@intCast to u0" {
1447 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
14481413 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14491414 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14501415 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -1469,7 +1434,6 @@ test "modRem with zero divisor" {
14691434
14701435test "array operands to shuffle are coerced to vectors" {
14711436 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1472 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
14731437 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14741438 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14751439 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
......@@ -1486,7 +1450,6 @@ test "load packed vector element" {
14861450 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
14871451 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14881452 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1489 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
14901453 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
14911454
14921455 var x: @Vector(2, u15) = .{ 1, 4 };
......@@ -1498,7 +1461,6 @@ test "store packed vector element" {
14981461 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
14991462 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
15001463 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1501 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
15021464 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
15031465 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
15041466 if (builtin.cpu.arch == .aarch64_be and builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
......@@ -1513,7 +1475,6 @@ test "store packed vector element" {
15131475test "store to vector in slice" {
15141476 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
15151477 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1516 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
15171478 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
15181479 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
15191480
......@@ -1531,7 +1492,6 @@ test "store to vector in slice" {
15311492test "store vector with memset" {
15321493 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
15331494 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1534 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
15351495 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
15361496 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; // TODO
15371497 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
......@@ -1574,7 +1534,6 @@ test "addition of vectors represented as strings" {
15741534test "compare vectors with different element types" {
15751535 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
15761536 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1577 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
15781537 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
15791538 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
15801539
......@@ -1586,7 +1545,6 @@ test "compare vectors with different element types" {
15861545
15871546test "vector pointer is indexable" {
15881547 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1589 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
15901548 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
15911549
15921550 const V = @Vector(2, u32);
......@@ -1609,7 +1567,6 @@ test "vector pointer is indexable" {
16091567
16101568test "boolean vector with 2 or more booleans" {
16111569 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1612 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
16131570 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
16141571
16151572 const vec1 = @Vector(2, bool){ true, true };
......@@ -1622,7 +1579,6 @@ test "boolean vector with 2 or more booleans" {
16221579test "bitcast to vector with different child type" {
16231580 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
16241581 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1625 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
16261582 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
16271583 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
16281584 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
......@@ -1667,7 +1623,6 @@ test "arithmetic on zero-length vectors" {
16671623}
16681624
16691625test "@reduce on bool vector" {
1670 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
16711626 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
16721627
16731628 const a = @Vector(2, bool){ true, true };
test/tests.zig+1-1
......@@ -1473,7 +1473,7 @@ const module_test_targets = blk: {
14731473 .os_tag = .wasi,
14741474 .abi = .none,
14751475 },
1476 .skip_modules = &.{ "compiler-rt", "std" },
1476 .skip_modules = &.{"compiler-rt"},
14771477 .use_llvm = false,
14781478 .use_lld = false,
14791479 },