authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-05-15 10:03:38+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-05-15 19:52:43+02:00
log5b03d55c5ecf697086db7c454e0f3982fec42408
tree4a6b5dd9d81afd7364c9fa2feba25681e070f50d
parent5f97652da8881773b823a0730e5791816668528a

x64: rename brk to int3, and MIR to interrupt


3 files changed, 18 insertions(+), 9 deletions(-)

src/arch/x86_64/CodeGen.zig+4-2
...@@ -3755,8 +3755,10 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void {...@@ -3755,8 +3755,10 @@ fn airArg(self: *Self, inst: Air.Inst.Index) !void {
37553755
3756fn airBreakpoint(self: *Self) !void {3756fn airBreakpoint(self: *Self) !void {
3757 _ = try self.addInst(.{3757 _ = try self.addInst(.{
3758 .tag = .brk,3758 .tag = .interrupt,
3759 .ops = undefined,3759 .ops = (Mir.Ops{
3760 .flags = 0b00,
3761 }).encode(),
3760 .data = undefined,3762 .data = undefined,
3761 });3763 });
3762 return self.finishAirBookkeeping();3764 return self.finishAirBookkeeping();
src/arch/x86_64/Emit.zig+11-5
...@@ -178,7 +178,7 @@ pub fn lowerMir(emit: *Emit) InnerError!void {...@@ -178,7 +178,7 @@ pub fn lowerMir(emit: *Emit) InnerError!void {
178178
179 .@"test" => try emit.mirTest(inst),179 .@"test" => try emit.mirTest(inst),
180180
181 .brk => try emit.mirBrk(),181 .interrupt => try emit.mirInterrupt(inst),
182 .nop => try emit.mirNop(),182 .nop => try emit.mirNop(),
183183
184 .call_extern => try emit.mirCallExtern(inst),184 .call_extern => try emit.mirCallExtern(inst),
...@@ -225,8 +225,14 @@ fn fixupRelocs(emit: *Emit) InnerError!void {...@@ -225,8 +225,14 @@ fn fixupRelocs(emit: *Emit) InnerError!void {
225 }225 }
226}226}
227227
228fn mirBrk(emit: *Emit) InnerError!void {228fn mirInterrupt(emit: *Emit, inst: Mir.Inst.Index) InnerError!void {
229 return lowerToZoEnc(.brk, emit.code);229 const tag = emit.mir.instructions.items(.tag)[inst];
230 assert(tag == .interrupt);
231 const ops = Mir.Ops.decode(emit.mir.instructions.items(.ops)[inst]);
232 switch (ops.flags) {
233 0b00 => return lowerToZoEnc(.int3, emit.code),
234 else => return emit.fail("TODO handle variant 0b{b} of interrupt instruction", .{ops.flags}),
235 }
230}236}
231237
232fn mirNop(emit: *Emit) InnerError!void {238fn mirNop(emit: *Emit) InnerError!void {
...@@ -1074,7 +1080,7 @@ const Tag = enum {...@@ -1074,7 +1080,7 @@ const Tag = enum {
1074 push,1080 push,
1075 pop,1081 pop,
1076 @"test",1082 @"test",
1077 brk,1083 int3,
1078 nop,1084 nop,
1079 imul,1085 imul,
1080 mul,1086 mul,
...@@ -1278,7 +1284,7 @@ inline fn getOpCode(tag: Tag, enc: Encoding, is_one_byte: bool) ?OpCode {...@@ -1278,7 +1284,7 @@ inline fn getOpCode(tag: Tag, enc: Encoding, is_one_byte: bool) ?OpCode {
1278 .zo => return switch (tag) {1284 .zo => return switch (tag) {
1279 .ret_near => OpCode.oneByte(0xc3),1285 .ret_near => OpCode.oneByte(0xc3),
1280 .ret_far => OpCode.oneByte(0xcb),1286 .ret_far => OpCode.oneByte(0xcb),
1281 .brk => OpCode.oneByte(0xcc),1287 .int3 => OpCode.oneByte(0xcc),
1282 .nop => OpCode.oneByte(0x90),1288 .nop => OpCode.oneByte(0x90),
1283 .syscall => OpCode.twoByte(0x0f, 0x05),1289 .syscall => OpCode.twoByte(0x0f, 0x05),
1284 .cbw => OpCode.oneByte(0x98),1290 .cbw => OpCode.oneByte(0x98),
src/arch/x86_64/Mir.zig+3-2
...@@ -342,8 +342,9 @@ pub const Inst = struct {...@@ -342,8 +342,9 @@ pub const Inst = struct {
342 /// TODO handle more cases342 /// TODO handle more cases
343 @"test",343 @"test",
344344
345 /// Breakpoint345 /// Breakpoint form:
346 brk,346 /// 0b00 int3
347 interrupt,
347348
348 /// Nop349 /// Nop
349 nop,350 nop,