From 47d5ebb78f132160f8096248e3c7c81af3248d80 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Sat, 6 Jun 2026 12:14:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=AD=97=E8=8A=82=E7=A0=81=E4=B8=8E=E8=B7=B3=E8=BD=AC=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E8=BE=85=E5=8A=A9=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_compiler/src/opcode.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/crates/oxide_compiler/src/opcode.rs b/crates/oxide_compiler/src/opcode.rs index f5f995c2..269b58d4 100644 --- a/crates/oxide_compiler/src/opcode.rs +++ b/crates/oxide_compiler/src/opcode.rs @@ -25,8 +25,11 @@ pub enum OpCode { LTE = 0x14, GTE = 0x15, IN = 0x16, + NOT = 0x17, + AND = 0x18, + OR = 0x19, - // ── Control Flow (0x20-0x2F) ── + // -- Control Flow (0x20-0x2F) -- JMP = 0x20, JMP_IF_FALSE = 0x21, JMP_IF_TRUE = 0x22, @@ -100,6 +103,9 @@ impl TryFrom for OpCode { 0x14 => Ok(OpCode::LTE), 0x15 => Ok(OpCode::GTE), 0x16 => Ok(OpCode::IN), + 0x17 => Ok(OpCode::NOT), + 0x18 => Ok(OpCode::AND), + 0x19 => Ok(OpCode::OR), 0x20 => Ok(OpCode::JMP), 0x21 => Ok(OpCode::JMP_IF_FALSE), 0x22 => Ok(OpCode::JMP_IF_TRUE), @@ -148,6 +154,9 @@ impl fmt::Display for OpCode { OpCode::LTE => "LTE", OpCode::GTE => "GTE", OpCode::IN => "IN", + OpCode::NOT => "NOT", + OpCode::AND => "AND", + OpCode::OR => "OR", OpCode::JMP => "JMP", OpCode::JMP_IF_FALSE => "JMP_IF_FALSE", OpCode::JMP_IF_TRUE => "JMP_IF_TRUE", @@ -215,3 +224,21 @@ pub fn imm16(instr: Instr) -> u16 { pub fn offset16(instr: Instr) -> i16 { ((instr >> 16) & 0xFFFF) as i16 } + +pub fn encode_jmp(offset: i16) -> Instr { + let lo = (offset as u16 & 0xFF) as u8; + let hi = ((offset as u16 >> 8) & 0xFF) as u8; + encode(OpCode::JMP, 0, lo, hi) +} + +pub fn encode_jmp_if_false(rd: u8, offset: i16) -> Instr { + let lo = (offset as u16 & 0xFF) as u8; + let hi = ((offset as u16 >> 8) & 0xFF) as u8; + encode(OpCode::JMP_IF_FALSE, rd, lo, hi) +} + +pub fn encode_jmp_if_true(rd: u8, offset: i16) -> Instr { + let lo = (offset as u16 & 0xFF) as u8; + let hi = ((offset as u16 >> 8) & 0xFF) as u8; + encode(OpCode::JMP_IF_TRUE, rd, lo, hi) +}