summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2008-08-12 20:10:45 +0000
committerjkim <jkim@FreeBSD.org>2008-08-12 20:10:45 +0000
commit5bf34e3e87fc944decb9cd18e97fe744117ac2f0 (patch)
treee54bdead5bbcf6e1613af28d396cacd942b6866b /sys/amd64
parent510c672e13b9748ab91e72576bf72a6ac7a325af (diff)
downloadFreeBSD-src-5bf34e3e87fc944decb9cd18e97fe744117ac2f0.zip
FreeBSD-src-5bf34e3e87fc944decb9cd18e97fe744117ac2f0.tar.gz
Replace all stack usages with registers and remove unused macros.
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/bpf_jit_machdep.c82
-rw-r--r--sys/amd64/amd64/bpf_jit_machdep.h85
2 files changed, 81 insertions, 86 deletions
diff --git a/sys/amd64/amd64/bpf_jit_machdep.c b/sys/amd64/amd64/bpf_jit_machdep.c
index d04ae2e..08e84f4 100644
--- a/sys/amd64/amd64/bpf_jit_machdep.c
+++ b/sys/amd64/amd64/bpf_jit_machdep.c
@@ -131,12 +131,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
ins = prog;
/* create the procedure header */
- PUSH(RBP);
- MOVrq(RSP, RBP);
- MOVdoq(ESI, -8, RBP);
- MOVdoq(EDX, -12, RBP);
- PUSH(RBX);
+ MOVrq2(RBX, R8);
MOVrq(RDI, RBX);
+ MOVrd2(ESI, R9D);
+ MOVrd(EDX, EDI);
for (i = 0; i < nins; i++) {
stream.bpf_pc++;
@@ -147,24 +145,24 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
case BPF_RET|BPF_K:
MOVid(ins->k, EAX);
- POP(RBX);
- LEAVE_RET();
+ MOVrq3(R8, RBX);
+ RET();
break;
case BPF_RET|BPF_A:
- POP(RBX);
- LEAVE_RET();
+ MOVrq3(R8, RBX);
+ RET();
break;
case BPF_LD|BPF_W|BPF_ABS:
MOVid(ins->k, ECX);
MOVrd(ECX, ESI);
ADDib(sizeof(int), ECX);
- CMPoqd(-12, RBP, ECX);
- JLEb(5);
+ CMPrd(EDI, ECX);
+ JLEb(6);
ZEROrd(EAX);
- POP(RBX);
- LEAVE_RET();
+ MOVrq3(R8, RBX);
+ RET();
MOVobd(RBX, RSI, EAX);
BSWAP(EAX);
break;
@@ -174,10 +172,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
MOVid(ins->k, ECX);
MOVrd(ECX, ESI);
ADDib(sizeof(short), ECX);
- CMPoqd(-12, RBP, ECX);
- JLEb(3);
- POP(RBX);
- LEAVE_RET();
+ CMPrd(EDI, ECX);
+ JLEb(4);
+ MOVrq3(R8, RBX);
+ RET();
MOVobw(RBX, RSI, AX);
SWAP_AX();
break;
@@ -185,19 +183,19 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
case BPF_LD|BPF_B|BPF_ABS:
ZEROrd(EAX);
MOVid(ins->k, ECX);
- CMPoqd(-12, RBP, ECX);
- JLEb(3);
- POP(RBX);
- LEAVE_RET();
+ CMPrd(EDI, ECX);
+ JLEb(4);
+ MOVrq3(R8, RBX);
+ RET();
MOVobb(RBX, RCX, AL);
break;
case BPF_LD|BPF_W|BPF_LEN:
- MOVoqd(-8, RBP, EAX);
+ MOVrd3(R9D, EAX);
break;
case BPF_LDX|BPF_W|BPF_LEN:
- MOVoqd(-8, RBP, EDX);
+ MOVrd3(R9D, EDX);
break;
case BPF_LD|BPF_W|BPF_IND:
@@ -205,11 +203,11 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
ADDrd(EDX, ECX);
MOVrd(ECX, ESI);
ADDib(sizeof(int), ECX);
- CMPoqd(-12, RBP, ECX);
- JLEb(5);
+ CMPrd(EDI, ECX);
+ JLEb(6);
ZEROrd(EAX);
- POP(RBX);
- LEAVE_RET();
+ MOVrq3(R8, RBX);
+ RET();
MOVobd(RBX, RSI, EAX);
BSWAP(EAX);
break;
@@ -220,10 +218,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
ADDrd(EDX, ECX);
MOVrd(ECX, ESI);
ADDib(sizeof(short), ECX);
- CMPoqd(-12, RBP, ECX);
- JLEb(3);
- POP(RBX);
- LEAVE_RET();
+ CMPrd(EDI, ECX);
+ JLEb(4);
+ MOVrq3(R8, RBX);
+ RET();
MOVobw(RBX, RSI, AX);
SWAP_AX();
break;
@@ -232,20 +230,20 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
ZEROrd(EAX);
MOVid(ins->k, ECX);
ADDrd(EDX, ECX);
- CMPoqd(-12, RBP, ECX);
- JLEb(3);
- POP(RBX);
- LEAVE_RET();
+ CMPrd(EDI, ECX);
+ JLEb(4);
+ MOVrq3(R8, RBX);
+ RET();
MOVobb(RBX, RCX, AL);
break;
case BPF_LDX|BPF_MSH|BPF_B:
MOVid(ins->k, ECX);
- CMPoqd(-12, RBP, ECX);
- JLEb(5);
+ CMPrd(EDI, ECX);
+ JLEb(6);
ZEROrd(EAX);
- POP(RBX);
- LEAVE_RET();
+ MOVrq3(R8, RBX);
+ RET();
ZEROrd(EDX);
MOVobb(RBX, RCX, DL);
ANDib(0xf, DL);
@@ -377,10 +375,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem)
case BPF_ALU|BPF_DIV|BPF_X:
CMPid(0, EDX);
- JNEb(5);
+ JNEb(6);
ZEROrd(EAX);
- POP(RBX);
- LEAVE_RET();
+ MOVrq3(R8, RBX);
+ RET();
MOVrd(EDX, ECX);
ZEROrd(EDX);
DIVrd(ECX);
diff --git a/sys/amd64/amd64/bpf_jit_machdep.h b/sys/amd64/amd64/bpf_jit_machdep.h
index e37bbf0..6d77c95 100644
--- a/sys/amd64/amd64/bpf_jit_machdep.h
+++ b/sys/amd64/amd64/bpf_jit_machdep.h
@@ -45,6 +45,14 @@
#define RBP 5
#define RSI 6
#define RDI 7
+#define R8 0
+#define R9 1
+#define R10 2
+#define R11 3
+#define R12 4
+#define R13 5
+#define R14 6
+#define R15 7
#define EAX 0
#define ECX 1
@@ -54,6 +62,14 @@
#define EBP 5
#define ESI 6
#define EDI 7
+#define R8D 0
+#define R9D 1
+#define R10D 2
+#define R11D 3
+#define R12D 4
+#define R13D 5
+#define R14D 6
+#define R15D 7
#define AX 0
#define CX 1
@@ -125,6 +141,20 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n);
(3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \
} while (0)
+/* movl sr32,dr32 (dr32 = %r8-15d) */
+#define MOVrd2(sr32, dr32) do { \
+ emitm(&stream, 0x8941, 2); \
+ emitm(&stream, \
+ (3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \
+} while (0)
+
+/* movl sr32,dr32 (sr32 = %r8-15d) */
+#define MOVrd3(sr32, dr32) do { \
+ emitm(&stream, 0x8944, 2); \
+ emitm(&stream, \
+ (3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \
+} while (0)
+
/* movq sr64,dr64 */
#define MOVrq(sr64, dr64) do { \
emitm(&stream, 0x8948, 2); \
@@ -132,20 +162,18 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n);
(3 << 6) | ((sr64 & 0x7) << 3) | (dr64 & 0x7), 1); \
} while (0)
-/* movl off(sr64),dr32 */
-#define MOVoqd(off, sr64, dr32) do { \
- emitm(&stream, 0x8b, 1); \
+/* movq sr64,dr64 (dr64 = %r8-15) */
+#define MOVrq2(sr64, dr64) do { \
+ emitm(&stream, 0x8949, 2); \
emitm(&stream, \
- (1 << 6) | ((dr32 & 0x7) << 3) | (sr64 & 0x7), 1); \
- emitm(&stream, off, 1); \
+ (3 << 6) | ((sr64 & 0x7) << 3) | (dr64 & 0x7), 1); \
} while (0)
-/* movl sr32,off(dr64) */
-#define MOVdoq(sr32, off, dr64) do { \
- emitm(&stream, 0x89, 1); \
+/* movq sr64,dr64 (sr64 = %r8-15) */
+#define MOVrq3(sr64, dr64) do { \
+ emitm(&stream, 0x894c, 2); \
emitm(&stream, \
- (1 << 6) | ((sr32 & 0x7) << 3) | (dr64 & 0x7), 1); \
- emitm(&stream, off, 1); \
+ (3 << 6) | ((sr64 & 0x7) << 3) | (dr64 & 0x7), 1); \
} while (0)
/* movl (sr64,or64,1),dr32 */
@@ -187,19 +215,9 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n);
emitm(&stream, 0xc486, 2); \
} while (0)
-/* pushq r64 */
-#define PUSH(r64) do { \
- emitm(&stream, (5 << 4) | (0 << 3) | (r64 & 0x7), 1); \
-} while (0)
-
-/* popq r64 */
-#define POP(r64) do { \
- emitm(&stream, (5 << 4) | (1 << 3) | (r64 & 0x7), 1); \
-} while (0)
-
-/* leaveq/retq */
-#define LEAVE_RET() do { \
- emitm(&stream, 0xc3c9, 2); \
+/* ret */
+#define RET() do { \
+ emitm(&stream, 0xc3, 1); \
} while (0)
/* addl sr32,dr32 */
@@ -215,13 +233,6 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n);
emitm(&stream, i32, 4); \
} while (0)
-/* addl i32,r32 */
-#define ADDid(i32, r32) do { \
- emitm(&stream, 0x81, 1); \
- emitm(&stream, (24 << 3) | r32, 1); \
- emitm(&stream, i32, 4); \
-} while (0)
-
/* addl i8,r32 */
#define ADDib(i8, r32) do { \
emitm(&stream, 0x83, 1); \
@@ -333,14 +344,6 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n);
emitm(&stream, (27 << 3) | (r32 & 0x7), 1); \
} while (0)
-/* cmpl off(sr64),dr32 */
-#define CMPoqd(off, sr64, dr32) do { \
- emitm(&stream, 0x3b, 1); \
- emitm(&stream, \
- (1 << 6) | ((dr32 & 0x7) << 3) | (sr64 & 0x7), 1); \
- emitm(&stream, off, 1); \
-} while (0)
-
/* cmpl sr32,dr32 */
#define CMPrd(sr32, dr32) do { \
emitm(&stream, 0x39, 1); \
@@ -372,12 +375,6 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n);
emitm(&stream, off32, 4); \
} while (0)
-/* jle off32 */
-#define JLE(off32) do { \
- emitm(&stream, 0x8e0f, 2); \
- emitm(&stream, off32, 4); \
-} while (0)
-
/* jle off8 */
#define JLEb(off8) do { \
emitm(&stream, 0x7e, 1); \
OpenPOWER on IntegriCloud