diff options
author | jkim <jkim@FreeBSD.org> | 2008-08-13 19:25:09 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2008-08-13 19:25:09 +0000 |
commit | 39084a201d11f684ca4c324e1cfe7c542655253f (patch) | |
tree | 3512d5b3951840727710ba347dc6a3d4e05a8917 /sys/amd64/amd64/bpf_jit_machdep.c | |
parent | 9d7147e6705596f8536df40e157210a88878a3e8 (diff) | |
download | FreeBSD-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.c | 79 |
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); |