powerpc/bpf/jit: Introduce rotate immediate instructions
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Wed, 22 Jun 2016 16:25:04 +0000 (21:55 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 24 Jun 2016 05:15:14 +0000 (15:15 +1000)
Since we will be using the rotate immediate instructions for extended
BPF JIT, let's introduce macros for the same. And since the shift
immediate operations use the rotate immediate instructions, let's redo
those macros to use the newly introduced instructions.

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>
arch/powerpc/include/asm/ppc-opcode.h
arch/powerpc/net/bpf_jit.h

index 1d035c1cc8898baaf00cd1eb9c5a284bf6e159d0..fd8d640a8e28ac1c7f17822e5407a3045c746224 100644 (file)
 #define __PPC_SH(s)    __PPC_WS(s)
 #define __PPC_MB(s)    (((s) & 0x1f) << 6)
 #define __PPC_ME(s)    (((s) & 0x1f) << 1)
+#define __PPC_MB64(s)  (__PPC_MB(s) | ((s) & 0x20))
+#define __PPC_ME64(s)  __PPC_MB64(s)
 #define __PPC_BI(s)    (((s) & 0x1f) << 16)
 #define __PPC_CT(t)    (((t) & 0x0f) << 21)
 
index 4c1e055ecd01dc273d398c59272ad38338b3453b..95d0e3809c9e0b22985a1e8ff98a0ea319acd956 100644 (file)
@@ -210,18 +210,20 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
                                     ___PPC_RS(a) | ___PPC_RB(s))
 #define PPC_SRW(d, a, s)       EMIT(PPC_INST_SRW | ___PPC_RA(d) |            \
                                     ___PPC_RS(a) | ___PPC_RB(s))
+#define PPC_RLWINM(d, a, i, mb, me)    EMIT(PPC_INST_RLWINM | ___PPC_RA(d) | \
+                                       ___PPC_RS(a) | __PPC_SH(i) |          \
+                                       __PPC_MB(mb) | __PPC_ME(me))
+#define PPC_RLDICR(d, a, i, me)                EMIT(PPC_INST_RLDICR | ___PPC_RA(d) | \
+                                       ___PPC_RS(a) | __PPC_SH(i) |          \
+                                       __PPC_ME64(me) | (((i) & 0x20) >> 4))
+
 /* slwi = rlwinm Rx, Ry, n, 0, 31-n */
-#define PPC_SLWI(d, a, i)      EMIT(PPC_INST_RLWINM | ___PPC_RA(d) |         \
-                                    ___PPC_RS(a) | __PPC_SH(i) |             \
-                                    __PPC_MB(0) | __PPC_ME(31-(i)))
+#define PPC_SLWI(d, a, i)      PPC_RLWINM(d, a, i, 0, 31-(i))
 /* srwi = rlwinm Rx, Ry, 32-n, n, 31 */
-#define PPC_SRWI(d, a, i)      EMIT(PPC_INST_RLWINM | ___PPC_RA(d) |         \
-                                    ___PPC_RS(a) | __PPC_SH(32-(i)) |        \
-                                    __PPC_MB(i) | __PPC_ME(31))
+#define PPC_SRWI(d, a, i)      PPC_RLWINM(d, a, 32-(i), i, 31)
 /* sldi = rldicr Rx, Ry, n, 63-n */
-#define PPC_SLDI(d, a, i)      EMIT(PPC_INST_RLDICR | ___PPC_RA(d) |         \
-                                    ___PPC_RS(a) | __PPC_SH(i) |             \
-                                    __PPC_MB(63-(i)) | (((i) & 0x20) >> 4))
+#define PPC_SLDI(d, a, i)      PPC_RLDICR(d, a, i, 63-(i))
+
 #define PPC_NEG(d, a)          EMIT(PPC_INST_NEG | ___PPC_RT(d) | ___PPC_RA(a))
 
 /* Long jump; (unconditional 'branch') */