diff options
-rw-r--r-- | disassembler.c | 4 | ||||
-rw-r--r-- | v7/apf.h | 2 | ||||
-rw-r--r-- | v7/apf_interpreter.c | 16 | ||||
-rw-r--r-- | v7/apf_interpreter_source.c | 14 |
4 files changed, 23 insertions, 13 deletions
diff --git a/disassembler.c b/disassembler.c index 38b7eb2..2e93c3c 100644 --- a/disassembler.c +++ b/disassembler.c @@ -75,6 +75,7 @@ static const char* opcode_names [] = { [LDDW_OPCODE] = "lddw", [STDW_OPCODE] = "stdw", [WRITE_OPCODE] = "write", + [JNSET_OPCODE] = "jnset", }; static void print_jump_target(uint32_t target, uint32_t program_len) { @@ -174,7 +175,8 @@ const char* apf_disassemble(const uint8_t* program, uint32_t program_len, uint32 case JNE_OPCODE: case JGT_OPCODE: case JLT_OPCODE: - case JSET_OPCODE: { + case JSET_OPCODE: + case JNSET_OPCODE: { PRINT_OPCODE(); bprintf("r0, "); // Load second immediate field. @@ -210,6 +210,8 @@ typedef union { */ #define PKTDATACOPY_OPCODE 25 +#define JNSET_OPCODE 26 // JSET with reverse condition (jump if no bits set) + /* ---------------------------------------------------------------------------------------------- */ // Extended opcodes. diff --git a/v7/apf_interpreter.c b/v7/apf_interpreter.c index 6fcbf93..c4ef59e 100644 --- a/v7/apf_interpreter.c +++ b/v7/apf_interpreter.c @@ -266,6 +266,8 @@ typedef union { */ #define PKTDATACOPY_OPCODE 25 +#define JNSET_OPCODE 26 /* JSET with reverse condition (jump if no bits set) */ + /* ---------------------------------------------------------------------------------------------- */ /* Extended opcodes. */ @@ -806,7 +808,8 @@ static int do_apf_run(apf_context* ctx) { case JNE_OPCODE: case JGT_OPCODE: case JLT_OPCODE: - case JSET_OPCODE: { + case JSET_OPCODE: + case JNSET_OPCODE: { u32 cmp_imm = 0; /* Load second immediate field. */ if (reg_num == 1) { @@ -815,11 +818,12 @@ static int do_apf_run(apf_context* ctx) { cmp_imm = decode_imm(ctx, imm_len); /* 2nd imm, at worst 8 bytes past prog_len */ } switch (opcode) { - case JEQ_OPCODE: if (ctx->R[0] == cmp_imm) ctx->pc += imm; break; - case JNE_OPCODE: if (ctx->R[0] != cmp_imm) ctx->pc += imm; break; - case JGT_OPCODE: if (ctx->R[0] > cmp_imm) ctx->pc += imm; break; - case JLT_OPCODE: if (ctx->R[0] < cmp_imm) ctx->pc += imm; break; - case JSET_OPCODE: if (ctx->R[0] & cmp_imm) ctx->pc += imm; break; + case JEQ_OPCODE: if ( ctx->R[0] == cmp_imm ) ctx->pc += imm; break; + case JNE_OPCODE: if ( ctx->R[0] != cmp_imm ) ctx->pc += imm; break; + case JGT_OPCODE: if ( ctx->R[0] > cmp_imm ) ctx->pc += imm; break; + case JLT_OPCODE: if ( ctx->R[0] < cmp_imm ) ctx->pc += imm; break; + case JSET_OPCODE: if ( ctx->R[0] & cmp_imm ) ctx->pc += imm; break; + case JNSET_OPCODE: if (!(ctx->R[0] & cmp_imm)) ctx->pc += imm; break; } break; } diff --git a/v7/apf_interpreter_source.c b/v7/apf_interpreter_source.c index 7259d5e..a36a4ee 100644 --- a/v7/apf_interpreter_source.c +++ b/v7/apf_interpreter_source.c @@ -262,7 +262,8 @@ static int do_apf_run(apf_context* ctx) { case JNE_OPCODE: case JGT_OPCODE: case JLT_OPCODE: - case JSET_OPCODE: { + case JSET_OPCODE: + case JNSET_OPCODE: { u32 cmp_imm = 0; // Load second immediate field. if (reg_num == 1) { @@ -271,11 +272,12 @@ static int do_apf_run(apf_context* ctx) { cmp_imm = decode_imm(ctx, imm_len); // 2nd imm, at worst 8 bytes past prog_len } switch (opcode) { - case JEQ_OPCODE: if (ctx->R[0] == cmp_imm) ctx->pc += imm; break; - case JNE_OPCODE: if (ctx->R[0] != cmp_imm) ctx->pc += imm; break; - case JGT_OPCODE: if (ctx->R[0] > cmp_imm) ctx->pc += imm; break; - case JLT_OPCODE: if (ctx->R[0] < cmp_imm) ctx->pc += imm; break; - case JSET_OPCODE: if (ctx->R[0] & cmp_imm) ctx->pc += imm; break; + case JEQ_OPCODE: if ( ctx->R[0] == cmp_imm ) ctx->pc += imm; break; + case JNE_OPCODE: if ( ctx->R[0] != cmp_imm ) ctx->pc += imm; break; + case JGT_OPCODE: if ( ctx->R[0] > cmp_imm ) ctx->pc += imm; break; + case JLT_OPCODE: if ( ctx->R[0] < cmp_imm ) ctx->pc += imm; break; + case JSET_OPCODE: if ( ctx->R[0] & cmp_imm ) ctx->pc += imm; break; + case JNSET_OPCODE: if (!(ctx->R[0] & cmp_imm)) ctx->pc += imm; break; } break; } |