mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
cond
This commit is contained in:
parent
18747ae31a
commit
503c9328dc
@ -15,7 +15,7 @@ print:
|
|||||||
|
|
||||||
.1:
|
.1:
|
||||||
test b[ax0], b[ax0]
|
test b[ax0], b[ax0]
|
||||||
jz .2
|
cjmpz .2
|
||||||
prn b[ax0]
|
prn b[ax0]
|
||||||
inc ax0
|
inc ax0
|
||||||
loop .1
|
loop .1
|
||||||
|
@ -5,6 +5,15 @@
|
|||||||
; void strcpy(char *, const char *)
|
; void strcpy(char *, const char *)
|
||||||
;
|
;
|
||||||
strcpy:
|
strcpy:
|
||||||
|
test b[ax1], b[ax1]
|
||||||
|
cmovz b[ax0], 0
|
||||||
|
cretz
|
||||||
|
|
||||||
|
.1:
|
||||||
|
test b[ax1], b[ax1]
|
||||||
|
cmovz b[ax0], 0
|
||||||
|
cretz
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;
|
;
|
||||||
|
@ -9,31 +9,27 @@ strlen:
|
|||||||
|
|
||||||
.1:
|
.1:
|
||||||
test b[ax0], b[ax0]
|
test b[ax0], b[ax0]
|
||||||
jz .2
|
cretz
|
||||||
|
|
||||||
inc rax
|
inc rax
|
||||||
inc ax0
|
inc ax0
|
||||||
jmp .1
|
jmp .1
|
||||||
|
|
||||||
.2:
|
|
||||||
ret
|
|
||||||
|
|
||||||
;
|
;
|
||||||
; int strnlen(char *, int)
|
; int strnlen(char *, int)
|
||||||
;
|
;
|
||||||
strnlen:
|
strnlen:
|
||||||
xor rax, rax
|
xor rax, rax
|
||||||
mov rcx, ax1
|
mov rcx, ax1
|
||||||
jcxz .2
|
;jcxz .2
|
||||||
dec rcx
|
dec rcx
|
||||||
|
|
||||||
.1:
|
.1:
|
||||||
test b[ax0], b[ax0]
|
test b[ax0], b[ax0]
|
||||||
jz .2
|
cretz
|
||||||
|
|
||||||
inc rax
|
inc rax
|
||||||
inc ax0
|
inc ax0
|
||||||
loop .1
|
loop .1
|
||||||
|
|
||||||
.2:
|
|
||||||
ret
|
ret
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
strrev:
|
strrev:
|
||||||
test b[ax1], b[ax1]
|
test b[ax1], b[ax1]
|
||||||
cmovz b[ax0], 0
|
cmovz b[ax0], 0
|
||||||
jz .4
|
cretz
|
||||||
|
|
||||||
; save str's location
|
; save str's location
|
||||||
mov rdx, ax1
|
mov rdx, ax1
|
||||||
@ -16,25 +16,19 @@ strrev:
|
|||||||
; the null terminator
|
; the null terminator
|
||||||
.1:
|
.1:
|
||||||
test b[ax1+1], b[ax1+1]
|
test b[ax1+1], b[ax1+1]
|
||||||
jz .2
|
cincnz ax1
|
||||||
|
cjmpnz .1
|
||||||
inc ax1
|
|
||||||
jmp .1
|
|
||||||
|
|
||||||
|
.2:
|
||||||
; copy, going backward though str
|
; copy, going backward though str
|
||||||
; and forward through buf
|
; and forward through buf
|
||||||
.2:
|
|
||||||
mov b[ax0], b[ax1]
|
mov b[ax0], b[ax1]
|
||||||
|
|
||||||
cmp ax1, rdx
|
cmp ax1, rdx
|
||||||
je .3
|
cmovz b[ax0+1], 0
|
||||||
|
cretz
|
||||||
|
|
||||||
inc ax0
|
inc ax0
|
||||||
dec ax1
|
dec ax1
|
||||||
jmp .2
|
jmp .2
|
||||||
|
|
||||||
.3:
|
|
||||||
mov b[ax0+1], 0
|
|
||||||
|
|
||||||
.4:
|
|
||||||
ret
|
|
||||||
|
@ -12,7 +12,7 @@ obj = $(patsubst %.c,%.o,$(src))
|
|||||||
|
|
||||||
CFLAGS=-O2 -g -Wall -fno-builtin-log
|
CFLAGS=-O2 -g -Wall -fno-builtin-log
|
||||||
|
|
||||||
%.o: %.c i_arch.h *.h $(src)
|
%.o: %.c i_arch.h *.h */*.h $(src)
|
||||||
@gcc $(CFLAGS) -c $< -o $@
|
@gcc $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
i_arch.h: instrs/INSTRS instrs/arch_i.py
|
i_arch.h: instrs/INSTRS instrs/arch_i.py
|
||||||
|
138
pc/instrs/INSTRS
138
pc/instrs/INSTRS
@ -59,6 +59,20 @@ add m r
|
|||||||
add m i
|
add m i
|
||||||
add m m
|
add m m
|
||||||
|
|
||||||
|
caddz r r
|
||||||
|
caddz r i
|
||||||
|
caddz r m
|
||||||
|
caddz m r
|
||||||
|
caddz m i
|
||||||
|
caddz m m
|
||||||
|
|
||||||
|
caddnz r r
|
||||||
|
caddnz r i
|
||||||
|
caddnz r m
|
||||||
|
caddnz m r
|
||||||
|
caddnz m i
|
||||||
|
caddnz m m
|
||||||
|
|
||||||
sub r r
|
sub r r
|
||||||
sub r i
|
sub r i
|
||||||
sub r m
|
sub r m
|
||||||
@ -66,22 +80,60 @@ sub m r
|
|||||||
sub m i
|
sub m i
|
||||||
sub m m
|
sub m m
|
||||||
|
|
||||||
|
csubz r r
|
||||||
|
csubz r i
|
||||||
|
csubz r m
|
||||||
|
csubz m r
|
||||||
|
csubz m i
|
||||||
|
csubz m m
|
||||||
|
|
||||||
|
csubnz r r
|
||||||
|
csubnz r i
|
||||||
|
csubnz r m
|
||||||
|
csubnz m r
|
||||||
|
csubnz m i
|
||||||
|
csubnz m m
|
||||||
|
|
||||||
# rdx = hi(rax * $0)
|
# rdx = hi(rax * $0)
|
||||||
# rax = lo(rax * $0)
|
# rax = lo(rax * $0)
|
||||||
mul r
|
mul r
|
||||||
mul i
|
mul i
|
||||||
|
|
||||||
|
cmulz r
|
||||||
|
cmulz i
|
||||||
|
|
||||||
|
cmulnz r
|
||||||
|
cmulnz i
|
||||||
|
|
||||||
# rdx = rax % $0
|
# rdx = rax % $0
|
||||||
# rax = rax / $0
|
# rax = rax / $0
|
||||||
div r
|
div r
|
||||||
div i
|
div i
|
||||||
|
|
||||||
|
cdivz r
|
||||||
|
cdivz i
|
||||||
|
|
||||||
|
cdivnz r
|
||||||
|
cdivnz i
|
||||||
|
|
||||||
inc r
|
inc r
|
||||||
inc m
|
inc m
|
||||||
|
|
||||||
|
cincz r
|
||||||
|
cincz m
|
||||||
|
|
||||||
|
cincnz r
|
||||||
|
cincnz m
|
||||||
|
|
||||||
dec r
|
dec r
|
||||||
dec m
|
dec m
|
||||||
|
|
||||||
|
cdecz r
|
||||||
|
cdecz m
|
||||||
|
|
||||||
|
cdecnz r
|
||||||
|
cdecnz m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Comparison instruction
|
# Comparison instruction
|
||||||
#
|
#
|
||||||
@ -115,30 +167,34 @@ test m m
|
|||||||
jmp r
|
jmp r
|
||||||
jmp i
|
jmp i
|
||||||
|
|
||||||
loop r
|
cjmpz r
|
||||||
loop i
|
cjmpz i
|
||||||
|
cjmpnz r
|
||||||
|
cjmpnz i
|
||||||
|
|
||||||
jz r
|
cjmpa r
|
||||||
jz i
|
cjmpa i
|
||||||
jnz r
|
cjmpae r
|
||||||
jnz i
|
cjmpae i
|
||||||
je r
|
|
||||||
je i
|
|
||||||
jne r
|
|
||||||
jne i
|
|
||||||
|
|
||||||
ja r
|
cjmpb r
|
||||||
ja i
|
cjmpb i
|
||||||
jae r
|
cjmpbe r
|
||||||
jae i
|
cjmpbe i
|
||||||
|
|
||||||
jb r
|
|
||||||
jb i
|
|
||||||
jbe r
|
|
||||||
jbe i
|
|
||||||
|
|
||||||
jcxz r
|
jcxz r
|
||||||
jcxz i
|
jcxz i
|
||||||
|
jcxnz r
|
||||||
|
jcxnz i
|
||||||
|
|
||||||
|
loop r
|
||||||
|
loop i
|
||||||
|
|
||||||
|
cloopz r
|
||||||
|
cloopz i
|
||||||
|
|
||||||
|
cloopnz r
|
||||||
|
cloopnz i
|
||||||
|
|
||||||
#
|
#
|
||||||
# Movement instructions
|
# Movement instructions
|
||||||
@ -151,16 +207,6 @@ mov m r
|
|||||||
mov m i
|
mov m i
|
||||||
mov m m
|
mov m m
|
||||||
|
|
||||||
xchg r r
|
|
||||||
xchg r i
|
|
||||||
xchg r m
|
|
||||||
xchg m r
|
|
||||||
xchg m i
|
|
||||||
xchg m m
|
|
||||||
|
|
||||||
lea r m
|
|
||||||
lea m m
|
|
||||||
|
|
||||||
cmovz r r
|
cmovz r r
|
||||||
cmovz r i
|
cmovz r i
|
||||||
cmovz r m
|
cmovz r m
|
||||||
@ -175,6 +221,36 @@ cmovnz m r
|
|||||||
cmovnz m i
|
cmovnz m i
|
||||||
cmovnz m m
|
cmovnz m m
|
||||||
|
|
||||||
|
xchg r r
|
||||||
|
xchg r i
|
||||||
|
xchg r m
|
||||||
|
xchg m r
|
||||||
|
xchg m i
|
||||||
|
xchg m m
|
||||||
|
|
||||||
|
cxchgz r r
|
||||||
|
cxchgz r i
|
||||||
|
cxchgz r m
|
||||||
|
cxchgz m r
|
||||||
|
cxchgz m i
|
||||||
|
cxchgz m m
|
||||||
|
|
||||||
|
cxchgnz r r
|
||||||
|
cxchgnz r i
|
||||||
|
cxchgnz r m
|
||||||
|
cxchgnz m r
|
||||||
|
cxchgnz m i
|
||||||
|
cxchgnz m m
|
||||||
|
|
||||||
|
lea r m
|
||||||
|
lea m m
|
||||||
|
|
||||||
|
cleaz r m
|
||||||
|
cleaz m m
|
||||||
|
|
||||||
|
cleanz r m
|
||||||
|
cleanz m m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Stack manipulation instructions
|
# Stack manipulation instructions
|
||||||
#
|
#
|
||||||
@ -191,6 +267,8 @@ call i
|
|||||||
call m
|
call m
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
cretz
|
||||||
|
cretnz
|
||||||
|
|
||||||
# push rbp
|
# push rbp
|
||||||
# mov rbp, rsp
|
# mov rbp, rsp
|
||||||
@ -199,6 +277,8 @@ enter
|
|||||||
# mov rbp, [rsp+8]
|
# mov rbp, [rsp+8]
|
||||||
# add rsp, 8
|
# add rsp, 8
|
||||||
leave
|
leave
|
||||||
|
cleavez
|
||||||
|
cleavenz
|
||||||
|
|
||||||
pushf
|
pushf
|
||||||
|
|
||||||
|
@ -4,6 +4,13 @@
|
|||||||
#include "instrs.h"
|
#include "instrs.h"
|
||||||
#include "arch_i.h"
|
#include "arch_i.h"
|
||||||
|
|
||||||
|
IMPL_COND(inc);
|
||||||
|
IMPL_COND(dec);
|
||||||
|
IMPL_COND(add);
|
||||||
|
IMPL_COND(sub);
|
||||||
|
IMPL_COND(mul);
|
||||||
|
IMPL_COND(div);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Unsigned arithmetic instructions
|
// Unsigned arithmetic instructions
|
||||||
//
|
//
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#include "instrs.h"
|
#include "instrs.h"
|
||||||
#include "arch_i.h"
|
#include "arch_i.h"
|
||||||
|
|
||||||
|
IMPL_COND(break);
|
||||||
|
|
||||||
IMPL_START_0(break)
|
IMPL_START_0(break)
|
||||||
{
|
{
|
||||||
log("\nExecuting BREAK INSTR\n");
|
log("\nExecuting BREAK INSTR\n");
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
|
|
||||||
#define IMPL_START_0(name) \
|
#define IMPL_START_0(name) \
|
||||||
void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
||||||
{ \
|
{
|
||||||
|
|
||||||
#define IMPL_START_1(name) \
|
#define IMPL_START_1(name) \
|
||||||
void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
||||||
{ \
|
{ \
|
||||||
ulong v1 = (p1->type == A_REG ? ctx->r[p1->val].val : p1->val); \
|
ulong v1 = (p1->type == A_REG ? ctx->r[p1->val].val : p1->val); \
|
||||||
if (p1->mem) v1 = readmem(ctx, v1 + p1->off, p1->mlen); \
|
if (p1->mem) v1 = readmem(ctx, v1 + p1->off, p1->mlen);
|
||||||
|
|
||||||
#define IMPL_START_2(name) \
|
#define IMPL_START_2(name) \
|
||||||
void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
||||||
@ -19,13 +19,13 @@ void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
|||||||
ulong v1 = (p1->type == A_REG ? ctx->r[p1->val].val : p1->val); \
|
ulong v1 = (p1->type == A_REG ? ctx->r[p1->val].val : p1->val); \
|
||||||
ulong v2 = (p2->type == A_REG ? ctx->r[p2->val].val : p2->val); \
|
ulong v2 = (p2->type == A_REG ? ctx->r[p2->val].val : p2->val); \
|
||||||
if (p1->mem) v1 = readmem(ctx, v1 + p1->off, p1->mlen); \
|
if (p1->mem) v1 = readmem(ctx, v1 + p1->off, p1->mlen); \
|
||||||
if (p2->mem) v2 = readmem(ctx, v2 + p2->off, p2->mlen); \
|
if (p2->mem) v2 = readmem(ctx, v2 + p2->off, p2->mlen);
|
||||||
|
|
||||||
#define IMPL_START_3(name) \
|
#define IMPL_START_3(name) \
|
||||||
void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
||||||
{ \
|
{ \
|
||||||
ulong v2 = (p2->type == A_REG ? ctx->r[p2->val].val : p2->val); \
|
ulong v2 = (p2->type == A_REG ? ctx->r[p2->val].val : p2->val); \
|
||||||
if (p2->mem) v2 = readmem(ctx, v2 + p2->off, p2->mlen); \
|
if (p2->mem) v2 = readmem(ctx, v2 + p2->off, p2->mlen);
|
||||||
|
|
||||||
#define IMPL_OUT \
|
#define IMPL_OUT \
|
||||||
assert(p1->type == A_REG || p1->mem); \
|
assert(p1->type == A_REG || p1->mem); \
|
||||||
@ -34,11 +34,41 @@ void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
|||||||
writemem(ctx, v1, addr + p1->off, p1->mlen); \
|
writemem(ctx, v1, addr + p1->off, p1->mlen); \
|
||||||
} \
|
} \
|
||||||
else ctx->r[p1->val].val = v1; \
|
else ctx->r[p1->val].val = v1; \
|
||||||
} \
|
}
|
||||||
|
|
||||||
#define IMPL_END \
|
#define IMPL_END \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// c...z instructions easy implementation
|
||||||
|
//
|
||||||
|
|
||||||
|
#define IMPL_CxxxZ(name) \
|
||||||
|
IMPL_START_0(c##name##z) \
|
||||||
|
{ \
|
||||||
|
if (ctx->r[FLG].val & ZF) { \
|
||||||
|
i_##name(ctx, p1, p2); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
IMPL_END
|
||||||
|
|
||||||
|
#define IMPL_CxxxNZ(name) \
|
||||||
|
IMPL_START_0(c##name##nz) \
|
||||||
|
{ \
|
||||||
|
if (!(ctx->r[FLG].val & ZF)) { \
|
||||||
|
i_##name(ctx, p1, p2); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
IMPL_END
|
||||||
|
|
||||||
|
#define IMPL_COND(name) \
|
||||||
|
IMPL_CxxxZ(name); \
|
||||||
|
IMPL_CxxxNZ(name)
|
||||||
|
|
||||||
|
//
|
||||||
|
// Consistency checks
|
||||||
|
//
|
||||||
|
|
||||||
#define CHK_SUPERV() \
|
#define CHK_SUPERV() \
|
||||||
do { \
|
do { \
|
||||||
if ((ctx->r[CR0].val & UF) == 1) { \
|
if ((ctx->r[CR0].val & UF) == 1) { \
|
||||||
@ -54,9 +84,14 @@ void i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2) \
|
|||||||
_except(ctx, E_STK, "RSP above RBP"); \
|
_except(ctx, E_STK, "RSP above RBP"); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Common operations
|
||||||
|
//
|
||||||
|
|
||||||
#define PUSH(v) \
|
#define PUSH(v) \
|
||||||
writemem64(ctx, v, ctx->r[RSP].val); \
|
writemem64(ctx, v, ctx->r[RSP].val); \
|
||||||
ctx->r[RSP].val -= 8; \
|
ctx->r[RSP].val -= 8;
|
||||||
|
|
||||||
#define POP(v) \
|
#define POP(v) \
|
||||||
ctx->r[RSP].val += 8; \
|
ctx->r[RSP].val += 8; \
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
#include "instrs.h"
|
#include "instrs.h"
|
||||||
#include "arch_i.h"
|
#include "arch_i.h"
|
||||||
|
|
||||||
|
IMPL_COND(jmp);
|
||||||
|
IMPL_COND(loop);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Jump instructions
|
// Jump instructions
|
||||||
//
|
//
|
||||||
@ -23,56 +26,28 @@ IMPL_START_1(loop)
|
|||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
IMPL_START_1(jz)
|
IMPL_START_1(cjmpa)
|
||||||
{
|
|
||||||
if (ctx->r[FLG].val & ZF)
|
|
||||||
JUMP(v1);
|
|
||||||
}
|
|
||||||
IMPL_END;
|
|
||||||
|
|
||||||
IMPL_START_1(jnz)
|
|
||||||
{
|
|
||||||
if (!(ctx->r[FLG].val & ZF))
|
|
||||||
JUMP(v1);
|
|
||||||
}
|
|
||||||
IMPL_END;
|
|
||||||
|
|
||||||
IMPL_START_1(je)
|
|
||||||
{
|
|
||||||
if (ctx->r[FLG].val & ZF)
|
|
||||||
JUMP(v1);
|
|
||||||
}
|
|
||||||
IMPL_END;
|
|
||||||
|
|
||||||
IMPL_START_1(jne)
|
|
||||||
{
|
|
||||||
if (!(ctx->r[FLG].val & ZF))
|
|
||||||
JUMP(v1);
|
|
||||||
}
|
|
||||||
IMPL_END;
|
|
||||||
|
|
||||||
IMPL_START_1(ja)
|
|
||||||
{
|
{
|
||||||
if (!(ctx->r[FLG].val & ZF) && !(ctx->r[FLG].val & CF))
|
if (!(ctx->r[FLG].val & ZF) && !(ctx->r[FLG].val & CF))
|
||||||
JUMP(v1);
|
JUMP(v1);
|
||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
IMPL_START_1(jae)
|
IMPL_START_1(cjmpae)
|
||||||
{
|
{
|
||||||
if (!(ctx->r[FLG].val & CF))
|
if (!(ctx->r[FLG].val & CF))
|
||||||
JUMP(v1);
|
JUMP(v1);
|
||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
IMPL_START_1(jb)
|
IMPL_START_1(cjmpb)
|
||||||
{
|
{
|
||||||
if (!(ctx->r[FLG].val & ZF) && ctx->r[FLG].val & CF)
|
if (!(ctx->r[FLG].val & ZF) && ctx->r[FLG].val & CF)
|
||||||
JUMP(v1);
|
JUMP(v1);
|
||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
IMPL_START_1(jbe)
|
IMPL_START_1(cjmpbe)
|
||||||
{
|
{
|
||||||
if (ctx->r[FLG].val & CF)
|
if (ctx->r[FLG].val & CF)
|
||||||
JUMP(v1);
|
JUMP(v1);
|
||||||
@ -85,3 +60,11 @@ IMPL_START_1(jcxz)
|
|||||||
JUMP(v1);
|
JUMP(v1);
|
||||||
}
|
}
|
||||||
IMPL_END;
|
IMPL_END;
|
||||||
|
|
||||||
|
IMPL_START_1(jcxnz)
|
||||||
|
{
|
||||||
|
if (ctx->r[RCX].val)
|
||||||
|
JUMP(v1);
|
||||||
|
}
|
||||||
|
IMPL_END;
|
||||||
|
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
#include "instrs.h"
|
#include "instrs.h"
|
||||||
#include "arch_i.h"
|
#include "arch_i.h"
|
||||||
|
|
||||||
|
IMPL_COND(mov);
|
||||||
|
IMPL_COND(lea);
|
||||||
|
IMPL_COND(xchg);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Movement instructions
|
// Movement instructions
|
||||||
//
|
//
|
||||||
@ -38,17 +42,3 @@ IMPL_START_1(gcs)
|
|||||||
}
|
}
|
||||||
IMPL_OUT;
|
IMPL_OUT;
|
||||||
|
|
||||||
IMPL_START_2(cmovz)
|
|
||||||
{
|
|
||||||
if (ctx->r[FLG].val & ZF)
|
|
||||||
v1 = v2;
|
|
||||||
}
|
|
||||||
IMPL_OUT;
|
|
||||||
|
|
||||||
IMPL_START_2(cmovnz)
|
|
||||||
{
|
|
||||||
if (!(ctx->r[FLG].val & ZF))
|
|
||||||
v1 = v2;
|
|
||||||
}
|
|
||||||
IMPL_OUT;
|
|
||||||
|
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
#include "instrs.h"
|
#include "instrs.h"
|
||||||
#include "arch_i.h"
|
#include "arch_i.h"
|
||||||
|
|
||||||
|
IMPL_COND(ret);
|
||||||
|
IMPL_COND(leave);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Stack manipulation instructions
|
// Stack manipulation instructions
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user