svn commit: r207081 - in head/sys: amd64/amd64 i386/i386
Jung-uk Kim
jkim at FreeBSD.org
Thu Apr 22 23:47:19 UTC 2010
Author: jkim
Date: Thu Apr 22 23:47:19 2010
New Revision: 207081
URL: http://svn.freebsd.org/changeset/base/207081
Log:
If a conditional jump instruction has the same jt and jf, do not perform
the test and jump unconditionally.
Modified:
head/sys/amd64/amd64/bpf_jit_machdep.c
head/sys/amd64/amd64/bpf_jit_machdep.h
head/sys/i386/i386/bpf_jit_machdep.c
head/sys/i386/i386/bpf_jit_machdep.h
Modified: head/sys/amd64/amd64/bpf_jit_machdep.c
==============================================================================
--- head/sys/amd64/amd64/bpf_jit_machdep.c Thu Apr 22 22:15:08 2010 (r207080)
+++ head/sys/amd64/amd64/bpf_jit_machdep.c Thu Apr 22 23:47:19 2010 (r207081)
@@ -419,62 +419,77 @@ bpf_jit_compile(struct bpf_insn *prog, u
break;
case BPF_JMP|BPF_JA:
- JMP(stream.refs[stream.bpf_pc + ins->k] -
- stream.refs[stream.bpf_pc]);
+ JUMP(ins->k);
break;
case BPF_JMP|BPF_JGT|BPF_K:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPid(ins->k, EAX);
JCC(JA, JBE);
break;
case BPF_JMP|BPF_JGE|BPF_K:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPid(ins->k, EAX);
JCC(JAE, JB);
break;
case BPF_JMP|BPF_JEQ|BPF_K:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPid(ins->k, EAX);
JCC(JE, JNE);
break;
case BPF_JMP|BPF_JSET|BPF_K:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
TESTid(ins->k, EAX);
JCC(JNE, JE);
break;
case BPF_JMP|BPF_JGT|BPF_X:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPrd(EDX, EAX);
JCC(JA, JBE);
break;
case BPF_JMP|BPF_JGE|BPF_X:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPrd(EDX, EAX);
JCC(JAE, JB);
break;
case BPF_JMP|BPF_JEQ|BPF_X:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPrd(EDX, EAX);
JCC(JE, JNE);
break;
case BPF_JMP|BPF_JSET|BPF_X:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
TESTrd(EDX, EAX);
JCC(JNE, JE);
break;
Modified: head/sys/amd64/amd64/bpf_jit_machdep.h
==============================================================================
--- head/sys/amd64/amd64/bpf_jit_machdep.h Thu Apr 22 22:15:08 2010 (r207080)
+++ head/sys/amd64/amd64/bpf_jit_machdep.h Thu Apr 22 23:47:19 2010 (r207081)
@@ -473,4 +473,10 @@ typedef void (*emit_func)(bpf_bin_stream
} \
} while (0)
+#define JUMP(off) do { \
+ if ((off) != 0) \
+ JMP(stream.refs[stream.bpf_pc + (off)] - \
+ stream.refs[stream.bpf_pc]); \
+} while (0)
+
#endif /* _BPF_JIT_MACHDEP_H_ */
Modified: head/sys/i386/i386/bpf_jit_machdep.c
==============================================================================
--- head/sys/i386/i386/bpf_jit_machdep.c Thu Apr 22 22:15:08 2010 (r207080)
+++ head/sys/i386/i386/bpf_jit_machdep.c Thu Apr 22 23:47:19 2010 (r207081)
@@ -440,62 +440,77 @@ bpf_jit_compile(struct bpf_insn *prog, u
break;
case BPF_JMP|BPF_JA:
- JMP(stream.refs[stream.bpf_pc + ins->k] -
- stream.refs[stream.bpf_pc]);
+ JUMP(ins->k);
break;
case BPF_JMP|BPF_JGT|BPF_K:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPid(ins->k, EAX);
JCC(JA, JBE);
break;
case BPF_JMP|BPF_JGE|BPF_K:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPid(ins->k, EAX);
JCC(JAE, JB);
break;
case BPF_JMP|BPF_JEQ|BPF_K:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPid(ins->k, EAX);
JCC(JE, JNE);
break;
case BPF_JMP|BPF_JSET|BPF_K:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
TESTid(ins->k, EAX);
JCC(JNE, JE);
break;
case BPF_JMP|BPF_JGT|BPF_X:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPrd(EDX, EAX);
JCC(JA, JBE);
break;
case BPF_JMP|BPF_JGE|BPF_X:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPrd(EDX, EAX);
JCC(JAE, JB);
break;
case BPF_JMP|BPF_JEQ|BPF_X:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
CMPrd(EDX, EAX);
JCC(JE, JNE);
break;
case BPF_JMP|BPF_JSET|BPF_X:
- if (ins->jt == 0 && ins->jf == 0)
+ if (ins->jt == ins->jf) {
+ JUMP(ins->jt);
break;
+ }
TESTrd(EDX, EAX);
JCC(JNE, JE);
break;
Modified: head/sys/i386/i386/bpf_jit_machdep.h
==============================================================================
--- head/sys/i386/i386/bpf_jit_machdep.h Thu Apr 22 22:15:08 2010 (r207080)
+++ head/sys/i386/i386/bpf_jit_machdep.h Thu Apr 22 23:47:19 2010 (r207081)
@@ -418,4 +418,10 @@ typedef void (*emit_func)(bpf_bin_stream
} \
} while (0)
+#define JUMP(off) do { \
+ if ((off) != 0) \
+ JMP(stream.refs[stream.bpf_pc + (off)] - \
+ stream.refs[stream.bpf_pc]); \
+} while (0)
+
#endif /* _BPF_JIT_MACHDEP_H_ */
More information about the svn-src-head
mailing list