Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Apr 2010 23:47:19 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r207081 - in head/sys: amd64/amd64 i386/i386
Message-ID:  <201004222347.o3MNlJMU028201@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004222347.o3MNlJMU028201>