Kaynağa Gözat

Merge pull request #65 from Aursen/master

fix: neg32 support
Dean 利迪恩 1 hafta önce
ebeveyn
işleme
8e4d1bd5ba
2 değiştirilmiş dosya ile 25 ekleme ve 1 silme
  1. 23 0
      crates/assembler/src/parser.rs
  2. 2 1
      crates/assembler/src/sbpf.pest

+ 23 - 0
crates/assembler/src/parser.rs

@@ -414,6 +414,7 @@ fn process_instruction(
             Rule::instr_lddw => return process_lddw(inner, const_map, span_range),
             Rule::instr_call => return process_call(inner, const_map, span_range),
             Rule::instr_callx => return process_callx(inner, span_range),
+            Rule::instr_neg32 => return process_neg32(inner, span_range),
             Rule::instr_neg64 => return process_neg64(inner, span_range),
             Rule::instr_alu64_imm | Rule::instr_alu32_imm => {
                 return process_alu_imm(inner, const_map, span_range);
@@ -794,6 +795,28 @@ fn process_callx(
     })
 }
 
+fn process_neg32(
+    pair: Pair<Rule>,
+    span: std::ops::Range<usize>,
+) -> Result<Instruction, CompileError> {
+    let mut dst = None;
+
+    for inner in pair.into_inner() {
+        if inner.as_rule() == Rule::register {
+            dst = Some(parse_register(inner)?);
+        }
+    }
+
+    Ok(Instruction {
+        opcode: Opcode::Neg32,
+        dst,
+        src: None,
+        off: None,
+        imm: None,
+        span,
+    })
+}
+
 fn process_neg64(
     pair: Pair<Rule>,
     span: std::ops::Range<usize>,

+ 2 - 1
crates/assembler/src/sbpf.pest

@@ -128,6 +128,7 @@ instr_alu32_imm = { alu_32_op ~ register ~ "," ~ operand }
 instr_alu32_reg = { alu_32_op ~ register ~ "," ~ register }
 
 // Negate operation
+instr_neg32 = { "neg32" ~ register }
 instr_neg64 = { "neg64" ~ register }
 
 // Memory Load Operations
@@ -169,7 +170,7 @@ instr_exit  = { "exit" }
 
 // All instructions
 instruction = {
-    (instr_lddw | instr_callx | instr_call | instr_exit | instr_neg64 | instr_alu64_imm | instr_alu64_reg | instr_alu32_imm | instr_alu32_reg | instr_load | instr_store_imm | instr_store_reg | instr_jump_imm | instr_jump_reg | instr_jump_uncond | instr_endian) ~ (NEWLINE | &EOI)
+    (instr_lddw | instr_callx | instr_call | instr_exit | instr_neg32 | instr_neg64 | instr_alu64_imm | instr_alu64_reg | instr_alu32_imm | instr_alu32_reg | instr_load | instr_store_imm | instr_store_reg | instr_jump_imm | instr_jump_reg | instr_jump_uncond | instr_endian) ~ (NEWLINE | &EOI)
 }
 
 statement = {