summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/bpf_jit_machdep.c
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2008-08-13 19:25:09 +0000
committerjkim <jkim@FreeBSD.org>2008-08-13 19:25:09 +0000
commit39084a201d11f684ca4c324e1cfe7c542655253f (patch)
tree3512d5b3951840727710ba347dc6a3d4e05a8917 /sys/amd64/amd64/bpf_jit_machdep.c
parent9d7147e6705596f8536df40e157210a88878a3e8 (diff)
downloadFreeBSD-src-39084a201d11f684ca4c324e1cfe7c542655253f.zip
FreeBSD-src-39084a201d11f684ca4c324e1cfe7c542655253f.tar.gz
- Remove unnecessary jump instruction(s) when offset(s) is/are zero(s).
- Constantly use conditional jumps for unsigned integers.
Diffstat (limited to 'sys/amd64/amd64/bpf_jit_machdep.c')
-rw-r--r--sys/amd64/amd64/bpf_jit_machdep.c79
1 files changed, 34 insertions, 45 deletions
diff --git a/sys/amd64/amd64/bpf_jit_machdep.c b/sys/amd64/amd64/bpf_jit_machdep.c
index b20c433..eb8e924 100644
--- a/sys/amd64/amd64/bpf_jit_machdep.c
+++ b/sys/amd64/amd64/bpf_jit_machdep.c
@@ -159,7 +159,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
MOVrd(ECX, ESI);
ADDib(sizeof(int), ECX);
CMPrd(EDI, ECX);
- JLEb(6);
+ JBEb(6);
ZEROrd(EAX);
MOVrq3(R8, RBX);
RET();
@@ -173,7 +173,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
MOVrd(ECX, ESI);
ADDib(sizeof(short), ECX);
CMPrd(EDI, ECX);
- JLEb(4);
+ JBEb(4);
MOVrq3(R8, RBX);
RET();
MOVobw(RBX, RSI, AX);
@@ -184,7 +184,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
ZEROrd(EAX);
MOVid(ins->k, ECX);
CMPrd(EDI, ECX);
- JLEb(4);
+ JBEb(4);
MOVrq3(R8, RBX);
RET();
MOVobb(RBX, RCX, AL);
@@ -204,7 +204,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
MOVrd(ECX, ESI);
ADDib(sizeof(int), ECX);
CMPrd(EDI, ECX);
- JLEb(6);
+ JBEb(6);
ZEROrd(EAX);
MOVrq3(R8, RBX);
RET();
@@ -219,7 +219,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
MOVrd(ECX, ESI);
ADDib(sizeof(short), ECX);
CMPrd(EDI, ECX);
- JLEb(4);
+ JBEb(4);
MOVrq3(R8, RBX);
RET();
MOVobw(RBX, RSI, AX);
@@ -231,7 +231,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
MOVid(ins->k, ECX);
ADDrd(EDX, ECX);
CMPrd(EDI, ECX);
- JLEb(4);
+ JBEb(4);
MOVrq3(R8, RBX);
RET();
MOVobb(RBX, RCX, AL);
@@ -240,7 +240,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
case BPF_LDX|BPF_MSH|BPF_B:
MOVid(ins->k, ECX);
CMPrd(EDI, ECX);
- JLEb(6);
+ JBEb(6);
ZEROrd(EAX);
MOVrq3(R8, RBX);
RET();
@@ -293,70 +293,59 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
break;
case BPF_JMP|BPF_JGT|BPF_K:
+ if (ins->jt == 0 && ins->jf == 0)
+ break;
CMPid(ins->k, EAX);
- /* 5 is the size of the following JMP */
- JG(stream.refs[stream.bpf_pc + ins->jt] -
- stream.refs[stream.bpf_pc] + 5 );
- JMP(stream.refs[stream.bpf_pc + ins->jf] -
- stream.refs[stream.bpf_pc]);
+ JCC(JA, JBE);
break;
case BPF_JMP|BPF_JGE|BPF_K:
+ if (ins->jt == 0 && ins->jf == 0)
+ break;
CMPid(ins->k, EAX);
- JGE(stream.refs[stream.bpf_pc + ins->jt] -
- stream.refs[stream.bpf_pc] + 5);
- JMP(stream.refs[stream.bpf_pc + ins->jf] -
- stream.refs[stream.bpf_pc]);
+ JCC(JAE, JB);
break;
case BPF_JMP|BPF_JEQ|BPF_K:
+ if (ins->jt == 0 && ins->jf == 0)
+ break;
CMPid(ins->k, EAX);
- JE(stream.refs[stream.bpf_pc + ins->jt] -
- stream.refs[stream.bpf_pc] + 5);
- JMP(stream.refs[stream.bpf_pc + ins->jf] -
- stream.refs[stream.bpf_pc]);
+ JCC(JE, JNE);
break;
case BPF_JMP|BPF_JSET|BPF_K:
- MOVrd(EAX, ECX);
- ANDid(ins->k, ECX);
- JE(stream.refs[stream.bpf_pc + ins->jf] -
- stream.refs[stream.bpf_pc] + 5);
- JMP(stream.refs[stream.bpf_pc + ins->jt] -
- stream.refs[stream.bpf_pc]);
+ if (ins->jt == 0 && ins->jf == 0)
+ break;
+ TESTid(ins->k, EAX);
+ JCC(JNE, JE);
break;
case BPF_JMP|BPF_JGT|BPF_X:
+ if (ins->jt == 0 && ins->jf == 0)
+ break;
CMPrd(EDX, EAX);
- JA(stream.refs[stream.bpf_pc + ins->jt] -
- stream.refs[stream.bpf_pc] + 5);
- JMP(stream.refs[stream.bpf_pc + ins->jf] -
- stream.refs[stream.bpf_pc]);
+ JCC(JA, JBE);
break;
case BPF_JMP|BPF_JGE|BPF_X:
+ if (ins->jt == 0 && ins->jf == 0)
+ break;
CMPrd(EDX, EAX);
- JAE(stream.refs[stream.bpf_pc + ins->jt] -
- stream.refs[stream.bpf_pc] + 5);
- JMP(stream.refs[stream.bpf_pc + ins->jf] -
- stream.refs[stream.bpf_pc]);
+ JCC(JAE, JB);
break;
case BPF_JMP|BPF_JEQ|BPF_X:
+ if (ins->jt == 0 && ins->jf == 0)
+ break;
CMPrd(EDX, EAX);
- JE(stream.refs[stream.bpf_pc + ins->jt] -
- stream.refs[stream.bpf_pc] + 5);
- JMP(stream.refs[stream.bpf_pc + ins->jf] -
- stream.refs[stream.bpf_pc]);
+ JCC(JE, JNE);
break;
case BPF_JMP|BPF_JSET|BPF_X:
- MOVrd(EAX, ECX);
- ANDrd(EDX, ECX);
- JE(stream.refs[stream.bpf_pc + ins->jf] -
- stream.refs[stream.bpf_pc] + 5);
- JMP(stream.refs[stream.bpf_pc + ins->jt] -
- stream.refs[stream.bpf_pc]);
+ if (ins->jt == 0 && ins->jf == 0)
+ break;
+ TESTrd(EDX, EAX);
+ JCC(JNE, JE);
break;
case BPF_ALU|BPF_ADD|BPF_X:
@@ -374,7 +363,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
break;
case BPF_ALU|BPF_DIV|BPF_X:
- CMPid(0, EDX);
+ TESTrd(EDX, EDX);
JNEb(6);
ZEROrd(EAX);
MOVrq3(R8, RBX);
OpenPOWER on IntegriCloud