From 4cc7195a06d01e25b8176bc18a46c83f41833260 Mon Sep 17 00:00:00 2001 From: jkim Date: Tue, 24 Jun 2008 20:12:12 +0000 Subject: Emit opcodes closer to GNU as(1) generated codes and micro-optimize. --- sys/amd64/amd64/bpf_jit_machdep.c | 22 +++++----- sys/amd64/amd64/bpf_jit_machdep.h | 90 +++++++++++++++++---------------------- 2 files changed, 49 insertions(+), 63 deletions(-) diff --git a/sys/amd64/amd64/bpf_jit_machdep.c b/sys/amd64/amd64/bpf_jit_machdep.c index 638f9d8..d04ae2e 100644 --- a/sys/amd64/amd64/bpf_jit_machdep.c +++ b/sys/amd64/amd64/bpf_jit_machdep.c @@ -162,7 +162,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) ADDib(sizeof(int), ECX); CMPoqd(-12, RBP, ECX); JLEb(5); - ZERO_EAX(); + ZEROrd(EAX); POP(RBX); LEAVE_RET(); MOVobd(RBX, RSI, EAX); @@ -170,7 +170,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) break; case BPF_LD|BPF_H|BPF_ABS: - ZERO_EAX(); + ZEROrd(EAX); MOVid(ins->k, ECX); MOVrd(ECX, ESI); ADDib(sizeof(short), ECX); @@ -183,7 +183,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) break; case BPF_LD|BPF_B|BPF_ABS: - ZERO_EAX(); + ZEROrd(EAX); MOVid(ins->k, ECX); CMPoqd(-12, RBP, ECX); JLEb(3); @@ -207,7 +207,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) ADDib(sizeof(int), ECX); CMPoqd(-12, RBP, ECX); JLEb(5); - ZERO_EAX(); + ZEROrd(EAX); POP(RBX); LEAVE_RET(); MOVobd(RBX, RSI, EAX); @@ -215,7 +215,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) break; case BPF_LD|BPF_H|BPF_IND: - ZERO_EAX(); + ZEROrd(EAX); MOVid(ins->k, ECX); ADDrd(EDX, ECX); MOVrd(ECX, ESI); @@ -229,7 +229,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) break; case BPF_LD|BPF_B|BPF_IND: - ZERO_EAX(); + ZEROrd(EAX); MOVid(ins->k, ECX); ADDrd(EDX, ECX); CMPoqd(-12, RBP, ECX); @@ -243,10 +243,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) MOVid(ins->k, ECX); CMPoqd(-12, RBP, ECX); JLEb(5); - ZERO_EAX(); + ZEROrd(EAX); POP(RBX); LEAVE_RET(); - ZERO_EDX(); + ZEROrd(EDX); MOVobb(RBX, RCX, DL); ANDib(0xf, DL); SHLib(2, EDX); @@ -378,11 +378,11 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_ALU|BPF_DIV|BPF_X: CMPid(0, EDX); JNEb(5); - ZERO_EAX(); + ZEROrd(EAX); POP(RBX); LEAVE_RET(); MOVrd(EDX, ECX); - ZERO_EDX(); + ZEROrd(EDX); DIVrd(ECX); MOVrd(ECX, EDX); break; @@ -422,7 +422,7 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_ALU|BPF_DIV|BPF_K: MOVrd(EDX, ECX); - ZERO_EDX(); + ZEROrd(EDX); MOVid(ins->k, ESI); DIVrd(ESI); MOVrd(ECX, EDX); diff --git a/sys/amd64/amd64/bpf_jit_machdep.h b/sys/amd64/amd64/bpf_jit_machdep.h index a6a592c..e37bbf0 100644 --- a/sys/amd64/amd64/bpf_jit_machdep.h +++ b/sys/amd64/amd64/bpf_jit_machdep.h @@ -120,22 +120,21 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* movl sr32,dr32 */ #define MOVrd(sr32, dr32) do { \ - emitm(&stream, (8 << 4) | 3 | (1 << 3), 1); \ + emitm(&stream, 0x89, 1); \ emitm(&stream, \ - (3 << 6) | ((dr32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + (3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \ } while (0) /* movq sr64,dr64 */ #define MOVrq(sr64, dr64) do { \ - emitm(&stream, 0x48, 1); \ - emitm(&stream, (8 << 4) | 3 | (1 << 3), 1); \ + emitm(&stream, 0x8948, 2); \ emitm(&stream, \ - (3 << 6) | ((dr64 & 0x7) << 3) | (sr64 & 0x7), 1); \ + (3 << 6) | ((sr64 & 0x7) << 3) | (dr64 & 0x7), 1); \ } while (0) /* movl off(sr64),dr32 */ #define MOVoqd(off, sr64, dr32) do { \ - emitm(&stream, (8 << 4) | 3 | (1 << 3), 1); \ + emitm(&stream, 0x8b, 1); \ emitm(&stream, \ (1 << 6) | ((dr32 & 0x7) << 3) | (sr64 & 0x7), 1); \ emitm(&stream, off, 1); \ @@ -143,7 +142,7 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* movl sr32,off(dr64) */ #define MOVdoq(sr32, off, dr64) do { \ - emitm(&stream, (8 << 4) | 1 | (1 << 3), 1); \ + emitm(&stream, 0x89, 1); \ emitm(&stream, \ (1 << 6) | ((sr32 & 0x7) << 3) | (dr64 & 0x7), 1); \ emitm(&stream, off, 1); \ @@ -151,15 +150,14 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* movl (sr64,or64,1),dr32 */ #define MOVobd(sr64, or64, dr32) do { \ - emitm(&stream, (8 << 4) | 3 | (1 << 3), 1); \ + emitm(&stream, 0x8b, 1); \ emitm(&stream, ((dr32 & 0x7) << 3) | 4, 1); \ emitm(&stream, ((or64 & 0x7) << 3) | (sr64 & 0x7), 1); \ } while (0) /* movw (sr64,or64,1),dr16 */ #define MOVobw(sr64, or64, dr16) do { \ - emitm(&stream, 0x66, 1); \ - emitm(&stream, (8 << 4) | 3 | (1 << 3), 1); \ + emitm(&stream, 0x8b66, 2); \ emitm(&stream, ((dr16 & 0x7) << 3) | 4, 1); \ emitm(&stream, ((or64 & 0x7) << 3) | (sr64 & 0x7), 1); \ } while (0) @@ -186,8 +184,7 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* xchgb %al,%ah */ #define SWAP_AX() do { \ - emitm(&stream, 0x86, 1); \ - emitm(&stream, 0xc4, 1); \ + emitm(&stream, 0xc486, 2); \ } while (0) /* pushq r64 */ @@ -202,15 +199,14 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* leaveq/retq */ #define LEAVE_RET() do { \ - emitm(&stream, 0xc9, 1); \ - emitm(&stream, 0xc3, 1); \ + emitm(&stream, 0xc3c9, 2); \ } while (0) /* addl sr32,dr32 */ #define ADDrd(sr32, dr32) do { \ - emitm(&stream, 0x03, 1); \ + emitm(&stream, 0x01, 1); \ emitm(&stream, \ - (3 << 6) | ((dr32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + (3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \ } while (0) /* addl i32,%eax */ @@ -235,9 +231,9 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* subl sr32,dr32 */ #define SUBrd(sr32, dr32) do { \ - emitm(&stream, 0x2b, 1); \ + emitm(&stream, 0x29, 1); \ emitm(&stream, \ - (3 << 6) | ((dr32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + (3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \ } while (0) /* subl i32,%eax */ @@ -260,8 +256,12 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* andb i8,r8 */ #define ANDib(i8, r8) do { \ - emitm(&stream, 0x80, 1); \ - emitm(&stream, (7 << 5) | r8, 1); \ + if (r8 == AL) { \ + emitm(&stream, 0x24, 1); \ + } else { \ + emitm(&stream, 0x80, 1); \ + emitm(&stream, (7 << 5) | r8, 1); \ + } \ emitm(&stream, i8, 1); \ } while (0) @@ -269,38 +269,36 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); #define ANDid(i32, r32) do { \ if (r32 == EAX) { \ emitm(&stream, 0x25, 1); \ - emitm(&stream, i32, 4); \ } else { \ emitm(&stream, 0x81, 1); \ emitm(&stream, (7 << 5) | r32, 1); \ - emitm(&stream, i32, 4); \ } \ + emitm(&stream, i32, 4); \ } while (0) /* andl sr32,dr32 */ #define ANDrd(sr32, dr32) do { \ - emitm(&stream, 0x23, 1); \ + emitm(&stream, 0x21, 1); \ emitm(&stream, \ - (3 << 6) | ((dr32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + (3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \ } while (0) /* orl sr32,dr32 */ #define ORrd(sr32, dr32) do { \ - emitm(&stream, 0x0b, 1); \ + emitm(&stream, 0x09, 1); \ emitm(&stream, \ - (3 << 6) | ((dr32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + (3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \ } while (0) /* orl i32,r32 */ #define ORid(i32, r32) do { \ if (r32 == EAX) { \ emitm(&stream, 0x0d, 1); \ - emitm(&stream, i32, 4); \ } else { \ emitm(&stream, 0x81, 1); \ emitm(&stream, (25 << 3) | r32, 1); \ - emitm(&stream, i32, 4); \ } \ + emitm(&stream, i32, 4); \ } while (0) /* shll i8,r32 */ @@ -337,7 +335,7 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* cmpl off(sr64),dr32 */ #define CMPoqd(off, sr64, dr32) do { \ - emitm(&stream, (3 << 4) | 3 | (1 << 3), 1); \ + emitm(&stream, 0x3b, 1); \ emitm(&stream, \ (1 << 6) | ((dr32 & 0x7) << 3) | (sr64 & 0x7), 1); \ emitm(&stream, off, 1); \ @@ -345,9 +343,9 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* cmpl sr32,dr32 */ #define CMPrd(sr32, dr32) do { \ - emitm(&stream, 0x3b, 1); \ + emitm(&stream, 0x39, 1); \ emitm(&stream, \ - (3 << 6) | ((dr32 & 0x7) << 3) | (sr32 & 0x7), 1); \ + (3 << 6) | ((sr32 & 0x7) << 3) | (dr32 & 0x7), 1); \ } while (0) /* cmpl i32,dr32 */ @@ -370,15 +368,13 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* je off32 */ #define JE(off32) do { \ - emitm(&stream, 0x0f, 1); \ - emitm(&stream, 0x84, 1); \ + emitm(&stream, 0x840f, 2); \ emitm(&stream, off32, 4); \ } while (0) /* jle off32 */ #define JLE(off32) do { \ - emitm(&stream, 0x0f, 1); \ - emitm(&stream, 0x8e, 1); \ + emitm(&stream, 0x8e0f, 2); \ emitm(&stream, off32, 4); \ } while (0) @@ -390,29 +386,25 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* ja off32 */ #define JA(off32) do { \ - emitm(&stream, 0x0f, 1); \ - emitm(&stream, 0x87, 1); \ + emitm(&stream, 0x870f, 2); \ emitm(&stream, off32, 4); \ } while (0) /* jae off32 */ #define JAE(off32) do { \ - emitm(&stream, 0x0f, 1); \ - emitm(&stream, 0x83, 1); \ + emitm(&stream, 0x830f, 2); \ emitm(&stream, off32, 4); \ } while (0) /* jg off32 */ #define JG(off32) do { \ - emitm(&stream, 0x0f, 1); \ - emitm(&stream, 0x8f, 1); \ + emitm(&stream, 0x8f0f, 2); \ emitm(&stream, off32, 4); \ } while (0) /* jge off32 */ #define JGE(off32) do { \ - emitm(&stream, 0x0f, 1); \ - emitm(&stream, 0x8d, 1); \ + emitm(&stream, 0x8d0f, 2); \ emitm(&stream, off32, 4); \ } while (0) @@ -422,16 +414,10 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, off32, 4); \ } while (0) -/* xorl %eax,%eax */ -#define ZERO_EAX() do { \ - emitm(&stream, 0x31, 1); \ - emitm(&stream, 0xc0, 1); \ -} while (0) - -/* xorl %edx,%edx */ -#define ZERO_EDX() do { \ +/* xorl r32,r32 */ +#define ZEROrd(r32) do { \ emitm(&stream, 0x31, 1); \ - emitm(&stream, 0xd2, 1); \ + emitm(&stream, (3 << 6) | ((r32 & 0x7) << 3) | (r32 & 0x7), 1); \ } while (0) #endif /* _BPF_JIT_MACHDEP_H_ */ -- cgit v1.1