Module Name: src
Committed By: alnsn
Date: Tue Jul 22 08:29:51 UTC 2014
Modified Files:
src/sys/net: bpfjit.c
Log Message:
Two tweaks: don't use a temporary register to dereference the err agrument
after xcall and don't generate ((tmp1 & 0xf) << 2) twice in emit_msh().
To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sys/net/bpfjit.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/bpfjit.c
diff -u src/sys/net/bpfjit.c:1.29 src/sys/net/bpfjit.c:1.30
--- src/sys/net/bpfjit.c:1.29 Tue Jul 22 08:20:08 2014
+++ src/sys/net/bpfjit.c Tue Jul 22 08:29:51 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: bpfjit.c,v 1.29 2014/07/22 08:20:08 alnsn Exp $ */
+/* $NetBSD: bpfjit.c,v 1.30 2014/07/22 08:29:51 alnsn Exp $ */
/*-
* Copyright (c) 2011-2014 Alexander Nasonov.
@@ -31,9 +31,9 @@
#include <sys/cdefs.h>
#ifdef _KERNEL
-__KERNEL_RCSID(0, "$NetBSD: bpfjit.c,v 1.29 2014/07/22 08:20:08 alnsn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bpfjit.c,v 1.30 2014/07/22 08:29:51 alnsn Exp $");
#else
-__RCSID("$NetBSD: bpfjit.c,v 1.29 2014/07/22 08:20:08 alnsn Exp $");
+__RCSID("$NetBSD: bpfjit.c,v 1.30 2014/07/22 08:29:51 alnsn Exp $");
#endif
#include <sys/types.h>
@@ -612,19 +612,11 @@ emit_xcall(struct sljit_compiler *compil
return status;
}
- /* tmp2 = *err; */
- status = sljit_emit_op1(compiler,
- SLJIT_MOV_UI,
- BJ_TMP2REG, 0,
- SLJIT_MEM1(SLJIT_LOCALS_REG),
- offsetof(struct bpfjit_stack, err));
- if (status != SLJIT_SUCCESS)
- return status;
-
- /* if (tmp2 != 0) return 0; */
+ /* if (*err != 0) return 0; */
jump = sljit_emit_cmp(compiler,
- SLJIT_C_NOT_EQUAL,
- BJ_TMP2REG, 0,
+ SLJIT_C_NOT_EQUAL|SLJIT_INT_OP,
+ SLJIT_MEM1(SLJIT_LOCALS_REG),
+ offsetof(struct bpfjit_stack, err),
SLJIT_IMM, 0);
if (jump == NULL)
return SLJIT_ERR_ALLOC_FAILED;
@@ -989,24 +981,6 @@ emit_msh(struct sljit_compiler *compiler
if (status != SLJIT_SUCCESS)
return status;
- /* tmp1 &= 0xf */
- status = sljit_emit_op2(compiler,
- SLJIT_AND,
- BJ_TMP1REG, 0,
- BJ_TMP1REG, 0,
- SLJIT_IMM, 0xf);
- if (status != SLJIT_SUCCESS)
- return status;
-
- /* tmp1 = tmp1 << 2 */
- status = sljit_emit_op2(compiler,
- SLJIT_SHL,
- BJ_XREG, 0,
- BJ_TMP1REG, 0,
- SLJIT_IMM, 2);
- if (status != SLJIT_SUCCESS)
- return status;
-
#ifdef _KERNEL
over_mchain_jump = sljit_emit_jump(compiler, SLJIT_JUMP);
if (over_mchain_jump == NULL)
@@ -1035,6 +1009,12 @@ emit_msh(struct sljit_compiler *compiler
if (status != SLJIT_SUCCESS)
return status;
+ label = sljit_emit_label(compiler);
+ if (label == NULL)
+ return SLJIT_ERR_ALLOC_FAILED;
+ sljit_set_label(over_mchain_jump, label);
+#endif
+
/* tmp1 &= 0xf */
status = sljit_emit_op2(compiler,
SLJIT_AND,
@@ -1044,7 +1024,7 @@ emit_msh(struct sljit_compiler *compiler
if (status != SLJIT_SUCCESS)
return status;
- /* tmp1 = tmp1 << 2 */
+ /* X = tmp1 << 2 */
status = sljit_emit_op2(compiler,
SLJIT_SHL,
BJ_XREG, 0,
@@ -1053,13 +1033,6 @@ emit_msh(struct sljit_compiler *compiler
if (status != SLJIT_SUCCESS)
return status;
-
- label = sljit_emit_label(compiler);
- if (label == NULL)
- return SLJIT_ERR_ALLOC_FAILED;
- sljit_set_label(over_mchain_jump, label);
-#endif
-
return SLJIT_SUCCESS;
}
@@ -2107,8 +2080,8 @@ bpfjit_generate_code(const bpf_ctx_t *bc
sljit_compiler_verbose(compiler, stderr);
#endif
- status = sljit_emit_enter(compiler, 2, nscratches(hints),
- nsaveds(hints), sizeof(struct bpfjit_stack));
+ status = sljit_emit_enter(compiler,
+ 2, nscratches(hints), nsaveds(hints), sizeof(struct bpfjit_stack));
if (status != SLJIT_SUCCESS)
goto fail;