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_ */
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to