summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/bpf_jit_machdep.c
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2010-04-22 23:47:19 +0000
committerjkim <jkim@FreeBSD.org>2010-04-22 23:47:19 +0000
commit42eb898c75b992137e13abf8bfc18b021635f943 (patch)
tree2b9e849b750f9c695432a137ae52596a7718b41a /sys/amd64/amd64/bpf_jit_machdep.c
parent0ce1581c92eafeba1f652d19f178834c45830d1d (diff)
downloadFreeBSD-src-42eb898c75b992137e13abf8bfc18b021635f943.zip
FreeBSD-src-42eb898c75b992137e13abf8bfc18b021635f943.tar.gz
If a conditional jump instruction has the same jt and jf, do not perform
the test and jump unconditionally.
Diffstat (limited to 'sys/amd64/amd64/bpf_jit_machdep.c')
-rw-r--r--sys/amd64/amd64/bpf_jit_machdep.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/sys/amd64/amd64/bpf_jit_machdep.c b/sys/amd64/amd64/bpf_jit_machdep.c
index 6a5793e..fe861d2 100644
--- a/sys/amd64/amd64/bpf_jit_machdep.c
+++ b/sys/amd64/amd64/bpf_jit_machdep.c
@@ -419,62 +419,77 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, size_t *size)
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;
OpenPOWER on IntegriCloud