diff options
author | Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> | 2016-06-22 12:25:03 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-06-24 01:15:04 -0400 |
commit | b1a057879af03f6e3b1700c909a6d089e83d1254 (patch) | |
tree | be16878f5cdb461040d2d217dc1d0a88fcf6b2b0 | |
parent | aaf2f7e09932a08c1287d8e4c602bccbe98f60a6 (diff) |
powerpc/bpf/jit: Optimize 64-bit Immediate loads
Similar to the LI32() optimization, if the value can be represented
in 32-bits, use LI32(). Also handle loading a few specific forms of
immediate values in an optimum manner.
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r-- | arch/powerpc/net/bpf_jit.h | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h index a9882db9ecaa..4c1e055ecd01 100644 --- a/arch/powerpc/net/bpf_jit.h +++ b/arch/powerpc/net/bpf_jit.h | |||
@@ -244,20 +244,25 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh); | |||
244 | } } while(0) | 244 | } } while(0) |
245 | 245 | ||
246 | #define PPC_LI64(d, i) do { \ | 246 | #define PPC_LI64(d, i) do { \ |
247 | if (!((uintptr_t)(i) & 0xffffffff00000000ULL)) \ | 247 | if ((long)(i) >= -2147483648 && \ |
248 | (long)(i) < 2147483648) \ | ||
248 | PPC_LI32(d, i); \ | 249 | PPC_LI32(d, i); \ |
249 | else { \ | 250 | else { \ |
250 | PPC_LIS(d, ((uintptr_t)(i) >> 48)); \ | 251 | if (!((uintptr_t)(i) & 0xffff800000000000ULL)) \ |
251 | if ((uintptr_t)(i) & 0x0000ffff00000000ULL) \ | 252 | PPC_LI(d, ((uintptr_t)(i) >> 32) & 0xffff); \ |
252 | PPC_ORI(d, d, \ | 253 | else { \ |
253 | ((uintptr_t)(i) >> 32) & 0xffff); \ | 254 | PPC_LIS(d, ((uintptr_t)(i) >> 48)); \ |
255 | if ((uintptr_t)(i) & 0x0000ffff00000000ULL) \ | ||
256 | PPC_ORI(d, d, \ | ||
257 | ((uintptr_t)(i) >> 32) & 0xffff); \ | ||
258 | } \ | ||
254 | PPC_SLDI(d, d, 32); \ | 259 | PPC_SLDI(d, d, 32); \ |
255 | if ((uintptr_t)(i) & 0x00000000ffff0000ULL) \ | 260 | if ((uintptr_t)(i) & 0x00000000ffff0000ULL) \ |
256 | PPC_ORIS(d, d, \ | 261 | PPC_ORIS(d, d, \ |
257 | ((uintptr_t)(i) >> 16) & 0xffff); \ | 262 | ((uintptr_t)(i) >> 16) & 0xffff); \ |
258 | if ((uintptr_t)(i) & 0x000000000000ffffULL) \ | 263 | if ((uintptr_t)(i) & 0x000000000000ffffULL) \ |
259 | PPC_ORI(d, d, (uintptr_t)(i) & 0xffff); \ | 264 | PPC_ORI(d, d, (uintptr_t)(i) & 0xffff); \ |
260 | } } while (0); | 265 | } } while (0) |
261 | 266 | ||
262 | #ifdef CONFIG_PPC64 | 267 | #ifdef CONFIG_PPC64 |
263 | #define PPC_FUNC_ADDR(d,i) do { PPC_LI64(d, i); } while(0) | 268 | #define PPC_FUNC_ADDR(d,i) do { PPC_LI64(d, i); } while(0) |