Skip to content

Commit 508262c

Browse files
committed
aarch64: more progress
- factor out `loadReg` - support all general system control registers in inline asm - fix asserts after iterating field offsets - fix typo in `slice_elem_val` - fix translation of argument locations
1 parent a189335 commit 508262c

File tree

8 files changed

+721
-316
lines changed

8 files changed

+721
-316
lines changed

src/codegen/aarch64.zig

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@ pub fn generate(
113113
},
114114
.stack_slot => |stack_slot| {
115115
assert(stack_slot.base == .sp);
116-
passed_vi.setParent(&isel, .{
117-
.stack_slot = named_stack_args.withOffset(stack_slot.offset),
118-
});
116+
passed_vi.changeStackSlot(&isel, named_stack_args.withOffset(stack_slot.offset));
119117
},
120118
.address, .value, .constant => unreachable,
121119
}

src/codegen/aarch64/Assemble.zig

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ fn nextToken(as: *Assemble, buf: *[token_buf_len]u8, comptime opts: struct {
215215

216216
const SymbolSpec = union(enum) {
217217
reg: struct { format: aarch64.encoding.Register.Format, allow_sp: bool = false },
218+
systemreg,
218219
imm: struct {
219220
type: std.builtin.Type.Int,
220221
multiple_of: comptime_int = 1,
@@ -227,6 +228,7 @@ const SymbolSpec = union(enum) {
227228
fn Storage(comptime spec: SymbolSpec) type {
228229
return switch (spec) {
229230
.reg => aarch64.encoding.Register,
231+
.systemreg => aarch64.encoding.Register.System,
230232
.imm => |imm| @Type(.{ .int = imm.type }),
231233
.extend => Instruction.DataProcessingRegister.AddSubtractExtendedRegister.Option,
232234
.shift => Instruction.DataProcessingRegister.Shift.Op,
@@ -238,8 +240,7 @@ const SymbolSpec = union(enum) {
238240
const Result = Storage(spec);
239241
switch (spec) {
240242
.reg => |reg_spec| {
241-
var buf: [token_buf_len]u8 = undefined;
242-
const reg = Result.parse(std.ascii.lowerString(&buf, token[0..@min(token.len, buf.len)])) orelse {
243+
const reg = Result.parse(token) orelse {
243244
log.debug("invalid register: \"{f}\"", .{std.zig.fmtString(token)});
244245
return null;
245246
};
@@ -253,6 +254,14 @@ const SymbolSpec = union(enum) {
253254
}
254255
return reg;
255256
},
257+
.systemreg => {
258+
const systemreg = Result.parse(token) orelse {
259+
log.debug("invalid system register: \"{f}\"", .{std.zig.fmtString(token)});
260+
return null;
261+
};
262+
assert(systemreg.op0 >= 2);
263+
return systemreg;
264+
},
256265
.imm => |imm_spec| {
257266
const imm = std.fmt.parseInt(Result, token, 0) catch {
258267
log.debug("invalid immediate: \"{f}\"", .{std.zig.fmtString(token)});

src/codegen/aarch64/Select.zig

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

src/codegen/aarch64/encoding.zig

Lines changed: 434 additions & 41 deletions
Large diffs are not rendered by default.

src/codegen/aarch64/instructions.zon

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -851,11 +851,21 @@
851851
},
852852
// C6.2.228 MRS
853853
.{
854-
.pattern = "MRS <Xt>, CTR_EL0",
854+
.pattern = "MRS <Xt>, <systemreg>",
855855
.symbols = .{
856856
.Xt = .{ .reg = .{ .format = .{ .integer = .doubleword } } },
857+
.systemreg = .systemreg,
857858
},
858-
.encode = .{ .mrs, .Xt, 0b11, 0b011, 0b0000, 0b0000, 0b001 },
859+
.encode = .{ .mrs, .Xt, .systemreg },
860+
},
861+
// C6.2.230 MSR (register)
862+
.{
863+
.pattern = "MSR <systemreg>, <Xt>",
864+
.symbols = .{
865+
.systemreg = .systemreg,
866+
.Xt = .{ .reg = .{ .format = .{ .integer = .doubleword } } },
867+
},
868+
.encode = .{ .msr, .systemreg, .Xt },
859869
},
860870
// C6.2.234 NEG
861871
.{

test/behavior/basic.zig

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,6 @@ fn testPointerToVoidReturnType2() *const void {
471471
}
472472

473473
test "array 2D const double ptr" {
474-
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
475474
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
476475
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
477476
if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
@@ -484,7 +483,6 @@ test "array 2D const double ptr" {
484483
}
485484

486485
test "array 2D const double ptr with offset" {
487-
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
488486
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
489487
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
490488
if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
@@ -497,7 +495,6 @@ test "array 2D const double ptr with offset" {
497495
}
498496

499497
test "array 3D const double ptr with offset" {
500-
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
501498
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
502499
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
503500
if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;

test/behavior/cast.zig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1816,7 +1816,6 @@ test "peer type resolution: C pointer and @TypeOf(null)" {
18161816
}
18171817

18181818
test "peer type resolution: three-way resolution combines error set and optional" {
1819-
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
18201819
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
18211820
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
18221821
if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;

test/behavior/pointers.zig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,6 @@ test "pointer sentinel with optional element" {
436436
}
437437

438438
test "pointer sentinel with +inf" {
439-
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
440439
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
441440
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
442441
if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;

0 commit comments

Comments
 (0)