authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-17 18:52:53+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-17 20:24:14+01:00
log9b715cb46250cbdd610f081b976b2e161df57218
treea7abebac48b64772c079a8ccf81d093f37eeb2fa
parent79628d48a4429818bddef2e86e2d7073d1955302

stage2: implement airArrayToSlice for x86_64

* implement `genSetStack` for `ptr_stack_offset` * handle `ptr_add` * implement storing from register into pointer in register * split alignment and array tests into those that pass on x86_64 and those that do not * pass more tests on x86_64

5 files changed, 331 insertions(+), 287 deletions(-)

src/arch/x86_64/CodeGen.zig+26-7
......@@ -1659,6 +1659,18 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
16591659 },
16601660 }
16611661 },
1662 .register => |src_reg| {
1663 const abi_size = value_ty.abiSize(self.target.*);
1664 _ = try self.addInst(.{
1665 .tag = .mov,
1666 .ops = (Mir.Ops{
1667 .reg1 = reg.to64(),
1668 .reg2 = registerAlias(src_reg, @intCast(u32, abi_size)),
1669 .flags = 0b10,
1670 }).encode(),
1671 .data = .{ .imm = 0 },
1672 });
1673 },
16621674 else => |other| {
16631675 return self.fail("TODO implement set pointee with {}", .{other});
16641676 },
......@@ -1822,7 +1834,7 @@ fn genBinMathOp(self: *Self, inst: Air.Inst.Index, op_lhs: Air.Inst.Ref, op_rhs:
18221834 const dst_ty = self.air.typeOfIndex(inst);
18231835 const air_tags = self.air.instructions.items(.tag);
18241836 switch (air_tags[inst]) {
1825 .add, .addwrap => try self.genBinMathOpMir(.add, dst_ty, .unsigned, dst_mcv, src_mcv),
1837 .add, .addwrap, .ptr_add => try self.genBinMathOpMir(.add, dst_ty, .unsigned, dst_mcv, src_mcv),
18261838 .bool_or, .bit_or => try self.genBinMathOpMir(.@"or", dst_ty, .unsigned, dst_mcv, src_mcv),
18271839 .bool_and, .bit_and => try self.genBinMathOpMir(.@"and", dst_ty, .unsigned, dst_mcv, src_mcv),
18281840 .sub, .subwrap => try self.genBinMathOpMir(.sub, dst_ty, .unsigned, dst_mcv, src_mcv),
......@@ -3125,7 +3137,6 @@ fn setRegOrMem(self: *Self, ty: Type, loc: MCValue, val: MCValue) !void {
31253137fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerError!void {
31263138 switch (mcv) {
31273139 .dead => unreachable,
3128 .ptr_stack_offset => unreachable,
31293140 .ptr_embedded_in_code => unreachable,
31303141 .unreach, .none => return, // Nothing to do.
31313142 .undef => {
......@@ -3241,7 +3252,9 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
32413252 }
32423253 return self.fail("TODO implement memcpy for setting stack from {}", .{mcv});
32433254 },
3244 .stack_offset => |off| {
3255 .ptr_stack_offset,
3256 .stack_offset,
3257 => |off| {
32453258 if (stack_offset == off) {
32463259 // Copy stack variable to itself; nothing to do.
32473260 return;
......@@ -3618,10 +3631,16 @@ fn airBitCast(self: *Self, inst: Air.Inst.Index) !void {
36183631
36193632fn airArrayToSlice(self: *Self, inst: Air.Inst.Index) !void {
36203633 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
3621 const result: MCValue = if (self.liveness.isUnused(inst))
3622 .dead
3623 else
3624 return self.fail("TODO implement airArrayToSlice for {}", .{self.target.cpu.arch});
3634 const ptr_ty = self.air.typeOf(ty_op.operand);
3635 const ptr = try self.resolveInst(ty_op.operand);
3636 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else blk: {
3637 const stack_offset = try self.allocMem(inst, 16, 16);
3638 const array_ty = ptr_ty.childType();
3639 const array_len = array_ty.arrayLenIncludingSentinel();
3640 try self.genSetStack(Type.initTag(.usize), stack_offset + 8, ptr);
3641 try self.genSetStack(Type.initTag(.u64), stack_offset + 16, .{ .immediate = array_len });
3642 break :blk .{ .stack_offset = stack_offset };
3643 };
36253644 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
36263645}
36273646
test/behavior.zig+191-185
......@@ -17,195 +17,201 @@ test {
1717 _ = @import("behavior/bugs/655.zig");
1818 _ = @import("behavior/bool.zig");
1919
20 if (builtin.zig_backend != .stage2_arm and builtin.zig_backend != .stage2_x86_64) {
21 // Tests that pass for stage1, llvm backend, C backend, wasm backend.
22 _ = @import("behavior/align.zig");
23 _ = @import("behavior/array.zig");
24 _ = @import("behavior/basic.zig");
25 _ = @import("behavior/bitcast.zig");
26 _ = @import("behavior/bugs/624.zig");
27 _ = @import("behavior/bugs/704.zig");
28 _ = @import("behavior/bugs/1486.zig");
29 _ = @import("behavior/bugs/2692.zig");
30 _ = @import("behavior/bugs/2889.zig");
31 _ = @import("behavior/bugs/3046.zig");
32 _ = @import("behavior/bugs/3586.zig");
33 _ = @import("behavior/bugs/4560.zig");
34 _ = @import("behavior/bugs/4769_a.zig");
35 _ = @import("behavior/bugs/4769_b.zig");
36 _ = @import("behavior/bugs/4954.zig");
37 _ = @import("behavior/byval_arg_var.zig");
38 _ = @import("behavior/call.zig");
39 _ = @import("behavior/cast.zig");
40 _ = @import("behavior/defer.zig");
41 _ = @import("behavior/enum.zig");
42 _ = @import("behavior/error.zig");
43 _ = @import("behavior/for.zig");
44 _ = @import("behavior/generics.zig");
45 _ = @import("behavior/if.zig");
46 _ = @import("behavior/import.zig");
47 _ = @import("behavior/incomplete_struct_param_tld.zig");
48 _ = @import("behavior/inttoptr.zig");
49 _ = @import("behavior/member_func.zig");
50 _ = @import("behavior/null.zig");
51 _ = @import("behavior/optional.zig");
52 _ = @import("behavior/pointers.zig");
53 _ = @import("behavior/ptrcast.zig");
54 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
55 _ = @import("behavior/src.zig");
56 _ = @import("behavior/struct.zig");
57 _ = @import("behavior/this.zig");
58 _ = @import("behavior/truncate.zig");
59 _ = @import("behavior/try.zig");
60 _ = @import("behavior/undefined.zig");
61 _ = @import("behavior/underscore.zig");
62 _ = @import("behavior/usingnamespace.zig");
63 _ = @import("behavior/void.zig");
64 _ = @import("behavior/while.zig");
20 if (builtin.zig_backend != .stage2_arm) {
21 // Tests that pass for stage1, llvm backend, C backend, wasm backend and x86_64 backend.
22 _ = @import("behavior/align_simple.zig");
23 _ = @import("behavior/array_simple.zig");
6524
66 if (builtin.zig_backend != .stage2_wasm) {
67 // Tests that pass for stage1, llvm backend, C backend
68 _ = @import("behavior/cast_int.zig");
69 _ = @import("behavior/int128.zig");
70 _ = @import("behavior/translate_c_macros.zig");
25 if (builtin.zig_backend != .stage2_arm and builtin.zig_backend != .stage2_x86_64) {
26 // Tests that pass for stage1, llvm backend, C backend, wasm backend.
27 _ = @import("behavior/align.zig");
28 _ = @import("behavior/array.zig");
29 _ = @import("behavior/basic.zig");
30 _ = @import("behavior/bitcast.zig");
31 _ = @import("behavior/bugs/624.zig");
32 _ = @import("behavior/bugs/704.zig");
33 _ = @import("behavior/bugs/1486.zig");
34 _ = @import("behavior/bugs/2692.zig");
35 _ = @import("behavior/bugs/2889.zig");
36 _ = @import("behavior/bugs/3046.zig");
37 _ = @import("behavior/bugs/3586.zig");
38 _ = @import("behavior/bugs/4560.zig");
39 _ = @import("behavior/bugs/4769_a.zig");
40 _ = @import("behavior/bugs/4769_b.zig");
41 _ = @import("behavior/bugs/4954.zig");
42 _ = @import("behavior/byval_arg_var.zig");
43 _ = @import("behavior/call.zig");
44 _ = @import("behavior/cast.zig");
45 _ = @import("behavior/defer.zig");
46 _ = @import("behavior/enum.zig");
47 _ = @import("behavior/error.zig");
48 _ = @import("behavior/for.zig");
49 _ = @import("behavior/generics.zig");
50 _ = @import("behavior/if.zig");
51 _ = @import("behavior/import.zig");
52 _ = @import("behavior/incomplete_struct_param_tld.zig");
53 _ = @import("behavior/inttoptr.zig");
54 _ = @import("behavior/member_func.zig");
55 _ = @import("behavior/null.zig");
56 _ = @import("behavior/optional.zig");
57 _ = @import("behavior/pointers.zig");
58 _ = @import("behavior/ptrcast.zig");
59 _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
60 _ = @import("behavior/src.zig");
61 _ = @import("behavior/struct.zig");
62 _ = @import("behavior/this.zig");
63 _ = @import("behavior/truncate.zig");
64 _ = @import("behavior/try.zig");
65 _ = @import("behavior/undefined.zig");
66 _ = @import("behavior/underscore.zig");
67 _ = @import("behavior/usingnamespace.zig");
68 _ = @import("behavior/void.zig");
69 _ = @import("behavior/while.zig");
7170
72 if (builtin.zig_backend != .stage2_c) {
73 // Tests that pass for stage1 and the llvm backend.
74 _ = @import("behavior/align_llvm.zig");
75 _ = @import("behavior/alignof.zig");
76 _ = @import("behavior/array_llvm.zig");
77 _ = @import("behavior/atomics.zig");
78 _ = @import("behavior/basic_llvm.zig");
79 _ = @import("behavior/bit_shifting.zig");
80 _ = @import("behavior/bugs/394.zig");
81 _ = @import("behavior/bugs/656.zig");
82 _ = @import("behavior/bugs/1277.zig");
83 _ = @import("behavior/bugs/1310.zig");
84 _ = @import("behavior/bugs/1381.zig");
85 _ = @import("behavior/bugs/1500.zig");
86 _ = @import("behavior/bugs/1735.zig");
87 _ = @import("behavior/bugs/1741.zig");
88 _ = @import("behavior/bugs/2006.zig");
89 _ = @import("behavior/bugs/2578.zig");
90 _ = @import("behavior/bugs/3007.zig");
91 _ = @import("behavior/bugs/3112.zig");
92 _ = @import("behavior/bugs/3367.zig");
93 _ = @import("behavior/bugs/7250.zig");
94 _ = @import("behavior/bugs/9584.zig");
95 _ = @import("behavior/cast_llvm.zig");
96 _ = @import("behavior/enum_llvm.zig");
97 _ = @import("behavior/error_llvm.zig");
98 _ = @import("behavior/eval.zig");
99 _ = @import("behavior/floatop.zig");
100 _ = @import("behavior/fn.zig");
101 _ = @import("behavior/generics_llvm.zig");
102 _ = @import("behavior/math.zig");
103 _ = @import("behavior/maximum_minimum.zig");
104 _ = @import("behavior/merge_error_sets.zig");
105 _ = @import("behavior/namespace_depends_on_compile_var.zig");
106 _ = @import("behavior/null_llvm.zig");
107 _ = @import("behavior/optional_llvm.zig");
108 _ = @import("behavior/popcount.zig");
109 _ = @import("behavior/saturating_arithmetic.zig");
110 _ = @import("behavior/sizeof_and_typeof.zig");
111 _ = @import("behavior/slice.zig");
112 _ = @import("behavior/struct_llvm.zig");
113 _ = @import("behavior/switch.zig");
114 _ = @import("behavior/union.zig");
115 _ = @import("behavior/widening.zig");
71 if (builtin.zig_backend != .stage2_wasm) {
72 // Tests that pass for stage1, llvm backend, C backend
73 _ = @import("behavior/cast_int.zig");
74 _ = @import("behavior/int128.zig");
75 _ = @import("behavior/translate_c_macros.zig");
11676
117 if (builtin.zig_backend != .stage1) {
118 // When all comptime_memory.zig tests pass, #9646 can be closed.
119 // _ = @import("behavior/comptime_memory.zig");
120 _ = @import("behavior/slice_stage2.zig");
121 } else {
122 // Tests that only pass for the stage1 backend.
123 _ = @import("behavior/align_stage1.zig");
124 if (builtin.os.tag != .wasi) {
125 _ = @import("behavior/asm.zig");
126 _ = @import("behavior/async_fn.zig");
127 }
128 _ = @import("behavior/await_struct.zig");
129 _ = @import("behavior/bitcast_stage1.zig");
130 _ = @import("behavior/bitreverse.zig");
131 _ = @import("behavior/bugs/421.zig");
132 _ = @import("behavior/bugs/529.zig");
133 _ = @import("behavior/bugs/718.zig");
134 _ = @import("behavior/bugs/726.zig");
135 _ = @import("behavior/bugs/828.zig");
136 _ = @import("behavior/bugs/920.zig");
137 _ = @import("behavior/bugs/1025.zig");
138 _ = @import("behavior/bugs/1076.zig");
139 _ = @import("behavior/bugs/1120.zig");
140 _ = @import("behavior/bugs/1421.zig");
141 _ = @import("behavior/bugs/1442.zig");
142 _ = @import("behavior/bugs/1607.zig");
143 _ = @import("behavior/bugs/1851.zig");
144 _ = @import("behavior/bugs/1914.zig");
145 _ = @import("behavior/bugs/2114.zig");
146 _ = @import("behavior/bugs/3384.zig");
147 _ = @import("behavior/bugs/3742.zig");
148 _ = @import("behavior/bugs/3779.zig");
149 _ = @import("behavior/bugs/4328.zig");
150 _ = @import("behavior/bugs/5398.zig");
151 _ = @import("behavior/bugs/5413.zig");
152 _ = @import("behavior/bugs/5474.zig");
153 _ = @import("behavior/bugs/5487.zig");
154 _ = @import("behavior/bugs/6456.zig");
155 _ = @import("behavior/bugs/6781.zig");
156 _ = @import("behavior/bugs/7003.zig");
157 _ = @import("behavior/bugs/7027.zig");
158 _ = @import("behavior/bugs/7047.zig");
159 _ = @import("behavior/bugs/10147.zig");
160 _ = @import("behavior/byteswap.zig");
161 _ = @import("behavior/call_stage1.zig");
162 _ = @import("behavior/cast_stage1.zig");
163 _ = @import("behavior/const_slice_child.zig");
164 _ = @import("behavior/defer_stage1.zig");
165 _ = @import("behavior/enum_stage1.zig");
166 _ = @import("behavior/error_stage1.zig");
167 _ = @import("behavior/eval_stage1.zig");
168 _ = @import("behavior/field_parent_ptr.zig");
169 _ = @import("behavior/floatop_stage1.zig");
170 _ = @import("behavior/fn_stage1.zig");
171 _ = @import("behavior/fn_delegation.zig");
172 _ = @import("behavior/for_stage1.zig");
173 _ = @import("behavior/if_stage1.zig");
174 _ = @import("behavior/ir_block_deps.zig");
175 _ = @import("behavior/math_stage1.zig");
176 _ = @import("behavior/misc.zig");
177 _ = @import("behavior/muladd.zig");
178 _ = @import("behavior/null_stage1.zig");
179 _ = @import("behavior/optional_stage1.zig");
180 _ = @import("behavior/pointers_stage1.zig");
181 _ = @import("behavior/popcount_stage1.zig");
182 _ = @import("behavior/ptrcast_stage1.zig");
183 _ = @import("behavior/reflection.zig");
184 _ = @import("behavior/saturating_arithmetic_stage1.zig");
185 _ = @import("behavior/select.zig");
186 _ = @import("behavior/shuffle.zig");
187 _ = @import("behavior/sizeof_and_typeof_stage1.zig");
188 _ = @import("behavior/slice_stage1.zig");
189 _ = @import("behavior/struct_contains_null_ptr_itself.zig");
190 _ = @import("behavior/struct_contains_slice_of_itself.zig");
191 _ = @import("behavior/struct_stage1.zig");
192 _ = @import("behavior/switch_prong_err_enum.zig");
193 _ = @import("behavior/switch_prong_implicit_cast.zig");
194 _ = @import("behavior/switch_stage1.zig");
195 _ = @import("behavior/truncate_stage1.zig");
196 _ = @import("behavior/tuple.zig");
197 _ = @import("behavior/type_stage1.zig");
198 _ = @import("behavior/type_info_stage1.zig");
199 _ = @import("behavior/typename.zig");
200 _ = @import("behavior/union_stage1.zig");
201 _ = @import("behavior/union_with_members.zig");
202 _ = @import("behavior/var_args.zig");
203 _ = @import("behavior/vector.zig");
204 if (builtin.target.cpu.arch == .wasm32) {
205 _ = @import("behavior/wasm.zig");
77 if (builtin.zig_backend != .stage2_c) {
78 // Tests that pass for stage1 and the llvm backend.
79 _ = @import("behavior/align_llvm.zig");
80 _ = @import("behavior/alignof.zig");
81 _ = @import("behavior/array_llvm.zig");
82 _ = @import("behavior/atomics.zig");
83 _ = @import("behavior/basic_llvm.zig");
84 _ = @import("behavior/bit_shifting.zig");
85 _ = @import("behavior/bugs/394.zig");
86 _ = @import("behavior/bugs/656.zig");
87 _ = @import("behavior/bugs/1277.zig");
88 _ = @import("behavior/bugs/1310.zig");
89 _ = @import("behavior/bugs/1381.zig");
90 _ = @import("behavior/bugs/1500.zig");
91 _ = @import("behavior/bugs/1735.zig");
92 _ = @import("behavior/bugs/1741.zig");
93 _ = @import("behavior/bugs/2006.zig");
94 _ = @import("behavior/bugs/2578.zig");
95 _ = @import("behavior/bugs/3007.zig");
96 _ = @import("behavior/bugs/3112.zig");
97 _ = @import("behavior/bugs/3367.zig");
98 _ = @import("behavior/bugs/7250.zig");
99 _ = @import("behavior/bugs/9584.zig");
100 _ = @import("behavior/cast_llvm.zig");
101 _ = @import("behavior/enum_llvm.zig");
102 _ = @import("behavior/error_llvm.zig");
103 _ = @import("behavior/eval.zig");
104 _ = @import("behavior/floatop.zig");
105 _ = @import("behavior/fn.zig");
106 _ = @import("behavior/generics_llvm.zig");
107 _ = @import("behavior/math.zig");
108 _ = @import("behavior/maximum_minimum.zig");
109 _ = @import("behavior/merge_error_sets.zig");
110 _ = @import("behavior/namespace_depends_on_compile_var.zig");
111 _ = @import("behavior/null_llvm.zig");
112 _ = @import("behavior/optional_llvm.zig");
113 _ = @import("behavior/popcount.zig");
114 _ = @import("behavior/saturating_arithmetic.zig");
115 _ = @import("behavior/sizeof_and_typeof.zig");
116 _ = @import("behavior/slice.zig");
117 _ = @import("behavior/struct_llvm.zig");
118 _ = @import("behavior/switch.zig");
119 _ = @import("behavior/union.zig");
120 _ = @import("behavior/widening.zig");
121
122 if (builtin.zig_backend != .stage1) {
123 // When all comptime_memory.zig tests pass, #9646 can be closed.
124 // _ = @import("behavior/comptime_memory.zig");
125 _ = @import("behavior/slice_stage2.zig");
126 } else {
127 // Tests that only pass for the stage1 backend.
128 _ = @import("behavior/align_stage1.zig");
129 if (builtin.os.tag != .wasi) {
130 _ = @import("behavior/asm.zig");
131 _ = @import("behavior/async_fn.zig");
132 }
133 _ = @import("behavior/await_struct.zig");
134 _ = @import("behavior/bitcast_stage1.zig");
135 _ = @import("behavior/bitreverse.zig");
136 _ = @import("behavior/bugs/421.zig");
137 _ = @import("behavior/bugs/529.zig");
138 _ = @import("behavior/bugs/718.zig");
139 _ = @import("behavior/bugs/726.zig");
140 _ = @import("behavior/bugs/828.zig");
141 _ = @import("behavior/bugs/920.zig");
142 _ = @import("behavior/bugs/1025.zig");
143 _ = @import("behavior/bugs/1076.zig");
144 _ = @import("behavior/bugs/1120.zig");
145 _ = @import("behavior/bugs/1421.zig");
146 _ = @import("behavior/bugs/1442.zig");
147 _ = @import("behavior/bugs/1607.zig");
148 _ = @import("behavior/bugs/1851.zig");
149 _ = @import("behavior/bugs/1914.zig");
150 _ = @import("behavior/bugs/2114.zig");
151 _ = @import("behavior/bugs/3384.zig");
152 _ = @import("behavior/bugs/3742.zig");
153 _ = @import("behavior/bugs/3779.zig");
154 _ = @import("behavior/bugs/4328.zig");
155 _ = @import("behavior/bugs/5398.zig");
156 _ = @import("behavior/bugs/5413.zig");
157 _ = @import("behavior/bugs/5474.zig");
158 _ = @import("behavior/bugs/5487.zig");
159 _ = @import("behavior/bugs/6456.zig");
160 _ = @import("behavior/bugs/6781.zig");
161 _ = @import("behavior/bugs/7003.zig");
162 _ = @import("behavior/bugs/7027.zig");
163 _ = @import("behavior/bugs/7047.zig");
164 _ = @import("behavior/bugs/10147.zig");
165 _ = @import("behavior/byteswap.zig");
166 _ = @import("behavior/call_stage1.zig");
167 _ = @import("behavior/cast_stage1.zig");
168 _ = @import("behavior/const_slice_child.zig");
169 _ = @import("behavior/defer_stage1.zig");
170 _ = @import("behavior/enum_stage1.zig");
171 _ = @import("behavior/error_stage1.zig");
172 _ = @import("behavior/eval_stage1.zig");
173 _ = @import("behavior/field_parent_ptr.zig");
174 _ = @import("behavior/floatop_stage1.zig");
175 _ = @import("behavior/fn_stage1.zig");
176 _ = @import("behavior/fn_delegation.zig");
177 _ = @import("behavior/for_stage1.zig");
178 _ = @import("behavior/if_stage1.zig");
179 _ = @import("behavior/ir_block_deps.zig");
180 _ = @import("behavior/math_stage1.zig");
181 _ = @import("behavior/misc.zig");
182 _ = @import("behavior/muladd.zig");
183 _ = @import("behavior/null_stage1.zig");
184 _ = @import("behavior/optional_stage1.zig");
185 _ = @import("behavior/pointers_stage1.zig");
186 _ = @import("behavior/popcount_stage1.zig");
187 _ = @import("behavior/ptrcast_stage1.zig");
188 _ = @import("behavior/reflection.zig");
189 _ = @import("behavior/saturating_arithmetic_stage1.zig");
190 _ = @import("behavior/select.zig");
191 _ = @import("behavior/shuffle.zig");
192 _ = @import("behavior/sizeof_and_typeof_stage1.zig");
193 _ = @import("behavior/slice_stage1.zig");
194 _ = @import("behavior/struct_contains_null_ptr_itself.zig");
195 _ = @import("behavior/struct_contains_slice_of_itself.zig");
196 _ = @import("behavior/struct_stage1.zig");
197 _ = @import("behavior/switch_prong_err_enum.zig");
198 _ = @import("behavior/switch_prong_implicit_cast.zig");
199 _ = @import("behavior/switch_stage1.zig");
200 _ = @import("behavior/truncate_stage1.zig");
201 _ = @import("behavior/tuple.zig");
202 _ = @import("behavior/type_stage1.zig");
203 _ = @import("behavior/type_info_stage1.zig");
204 _ = @import("behavior/typename.zig");
205 _ = @import("behavior/union_stage1.zig");
206 _ = @import("behavior/union_with_members.zig");
207 _ = @import("behavior/var_args.zig");
208 _ = @import("behavior/vector.zig");
209 if (builtin.target.cpu.arch == .wasm32) {
210 _ = @import("behavior/wasm.zig");
211 }
212 _ = @import("behavior/while_stage1.zig");
213 _ = @import("behavior/translate_c_macros_stage1.zig");
206214 }
207 _ = @import("behavior/while_stage1.zig");
208 _ = @import("behavior/translate_c_macros_stage1.zig");
209215 }
210216 }
211217 }
test/behavior/align.zig-95
......@@ -3,36 +3,6 @@ const expect = std.testing.expect;
33const builtin = @import("builtin");
44const native_arch = builtin.target.cpu.arch;
55
6var foo: u8 align(4) = 100;
7
8test "global variable alignment" {
9 comptime try expect(@typeInfo(@TypeOf(&foo)).Pointer.alignment == 4);
10 comptime try expect(@TypeOf(&foo) == *align(4) u8);
11 {
12 const slice = @as(*[1]u8, &foo)[0..];
13 comptime try expect(@TypeOf(slice) == *align(4) [1]u8);
14 }
15 {
16 var runtime_zero: usize = 0;
17 const slice = @as(*[1]u8, &foo)[runtime_zero..];
18 comptime try expect(@TypeOf(slice) == []align(4) u8);
19 }
20}
21
22test "default alignment allows unspecified in type syntax" {
23 try expect(*u32 == *align(@alignOf(u32)) u32);
24}
25
26test "implicitly decreasing pointer alignment" {
27 const a: u32 align(4) = 3;
28 const b: u32 align(8) = 4;
29 try expect(addUnaligned(&a, &b) == 7);
30}
31
32fn addUnaligned(a: *align(1) const u32, b: *align(1) const u32) u32 {
33 return a.* + b.*;
34}
35
366test "implicitly decreasing slice alignment" {
377 const a: u32 align(4) = 3;
388 const b: u32 align(8) = 4;
......@@ -42,18 +12,6 @@ fn addUnalignedSlice(a: []align(1) const u32, b: []align(1) const u32) u32 {
4212 return a[0] + b[0];
4313}
4414
45test "@alignCast pointers" {
46 var x: u32 align(4) = 1;
47 expectsOnly1(&x);
48 try expect(x == 2);
49}
50fn expectsOnly1(x: *align(1) u32) void {
51 expects4(@alignCast(4, x));
52}
53fn expects4(x: *align(4) u32) void {
54 x.* += 1;
55}
56
5715test "specifying alignment allows pointer cast" {
5816 try testBytesAlign(0x33);
5917}
......@@ -76,62 +34,9 @@ fn sliceExpects4(slice: []align(4) u32) void {
7634 slice[0] += 1;
7735}
7836
79test "alignment of structs" {
80 try expect(@alignOf(struct {
81 a: i32,
82 b: *i32,
83 }) == @alignOf(usize));
84}
85
8637test "return error union with 128-bit integer" {
8738 try expect(3 == try give());
8839}
8940fn give() anyerror!u128 {
9041 return 3;
9142}
92
93test "alignment of >= 128-bit integer type" {
94 try expect(@alignOf(u128) == 16);
95 try expect(@alignOf(u129) == 16);
96}
97
98test "alignment of struct with 128-bit field" {
99 try expect(@alignOf(struct {
100 x: u128,
101 }) == 16);
102
103 comptime {
104 try expect(@alignOf(struct {
105 x: u128,
106 }) == 16);
107 }
108}
109
110test "size of extern struct with 128-bit field" {
111 try expect(@sizeOf(extern struct {
112 x: u128,
113 y: u8,
114 }) == 32);
115
116 comptime {
117 try expect(@sizeOf(extern struct {
118 x: u128,
119 y: u8,
120 }) == 32);
121 }
122}
123
124test "@ptrCast preserves alignment of bigger source" {
125 var x: u32 align(16) = 1234;
126 const ptr = @ptrCast(*u8, &x);
127 try expect(@TypeOf(ptr) == *align(16) u8);
128}
129
130test "alignstack" {
131 try expect(fnWithAlignedStack() == 1234);
132}
133
134fn fnWithAlignedStack() i32 {
135 @setAlignStack(256);
136 return 1234;
137}
test/behavior/align_simple.zig created+99
......@@ -0,0 +1,99 @@
1const std = @import("std");
2const expect = std.testing.expect;
3const builtin = @import("builtin");
4const native_arch = builtin.target.cpu.arch;
5
6var foo: u8 align(4) = 100;
7
8test "global variable alignment" {
9 comptime try expect(@typeInfo(@TypeOf(&foo)).Pointer.alignment == 4);
10 comptime try expect(@TypeOf(&foo) == *align(4) u8);
11 {
12 const slice = @as(*[1]u8, &foo)[0..];
13 comptime try expect(@TypeOf(slice) == *align(4) [1]u8);
14 }
15 {
16 var runtime_zero: usize = 0;
17 const slice = @as(*[1]u8, &foo)[runtime_zero..];
18 comptime try expect(@TypeOf(slice) == []align(4) u8);
19 }
20}
21
22test "default alignment allows unspecified in type syntax" {
23 try expect(*u32 == *align(@alignOf(u32)) u32);
24}
25
26test "implicitly decreasing pointer alignment" {
27 const a: u32 align(4) = 3;
28 const b: u32 align(8) = 4;
29 try expect(addUnaligned(&a, &b) == 7);
30}
31
32fn addUnaligned(a: *align(1) const u32, b: *align(1) const u32) u32 {
33 return a.* + b.*;
34}
35
36test "@alignCast pointers" {
37 var x: u32 align(4) = 1;
38 expectsOnly1(&x);
39 try expect(x == 2);
40}
41fn expectsOnly1(x: *align(1) u32) void {
42 expects4(@alignCast(4, x));
43}
44fn expects4(x: *align(4) u32) void {
45 x.* += 1;
46}
47
48test "alignment of structs" {
49 try expect(@alignOf(struct {
50 a: i32,
51 b: *i32,
52 }) == @alignOf(usize));
53}
54
55test "alignment of >= 128-bit integer type" {
56 try expect(@alignOf(u128) == 16);
57 try expect(@alignOf(u129) == 16);
58}
59
60test "alignment of struct with 128-bit field" {
61 try expect(@alignOf(struct {
62 x: u128,
63 }) == 16);
64
65 comptime {
66 try expect(@alignOf(struct {
67 x: u128,
68 }) == 16);
69 }
70}
71
72test "size of extern struct with 128-bit field" {
73 try expect(@sizeOf(extern struct {
74 x: u128,
75 y: u8,
76 }) == 32);
77
78 comptime {
79 try expect(@sizeOf(extern struct {
80 x: u128,
81 y: u8,
82 }) == 32);
83 }
84}
85
86test "@ptrCast preserves alignment of bigger source" {
87 var x: u32 align(16) = 1234;
88 const ptr = @ptrCast(*u8, &x);
89 try expect(@TypeOf(ptr) == *align(16) u8);
90}
91
92test "alignstack" {
93 try expect(fnWithAlignedStack() == 1234);
94}
95
96fn fnWithAlignedStack() i32 {
97 @setAlignStack(256);
98 return 1234;
99}
test/behavior/array_simple.zig created+15
......@@ -0,0 +1,15 @@
1const std = @import("std");
2const testing = std.testing;
3const expect = testing.expect;
4
5test "array to slice" {
6 const a: u32 align(4) = 3;
7 const b: u32 align(8) = 4;
8 const a_slice: []align(1) const u32 = @as(*const [1]u32, &a)[0..];
9 const b_slice: []align(1) const u32 = @as(*const [1]u32, &b)[0..];
10 try expect(a_slice[0] + b_slice[0] == 7);
11
12 const d: []const u32 = &[2]u32{ 1, 2 };
13 const e: []const u32 = &[3]u32{ 3, 4, 5 };
14 try expect(d[0] + e[0] + d[1] + e[1] == 10);
15}