* General Public License for more details.
  */
 
+#include <linux/bitops.h>
 #include <linux/kernel.h>
 #include <linux/kprobes.h>
 
 #include "simulate-insn.h"
 
-#define sign_extend(x, signbit)                \
-       ((x) | (0 - ((x) & (1 << (signbit)))))
-
 #define bbl_displacement(insn)         \
-       sign_extend(((insn) & 0x3ffffff) << 2, 27)
+       sign_extend32(((insn) & 0x3ffffff) << 2, 27)
 
 #define bcond_displacement(insn)       \
-       sign_extend(((insn >> 5) & 0x7ffff) << 2, 20)
+       sign_extend32(((insn >> 5) & 0x7ffff) << 2, 20)
 
 #define cbz_displacement(insn) \
-       sign_extend(((insn >> 5) & 0x7ffff) << 2, 20)
+       sign_extend32(((insn >> 5) & 0x7ffff) << 2, 20)
 
 #define tbz_displacement(insn) \
-       sign_extend(((insn >> 5) & 0x3fff) << 2, 15)
+       sign_extend32(((insn >> 5) & 0x3fff) << 2, 15)
 
 #define ldr_displacement(insn) \
-       sign_extend(((insn >> 5) & 0x7ffff) << 2, 20)
+       sign_extend32(((insn >> 5) & 0x7ffff) << 2, 20)
 
 static inline void set_x_reg(struct pt_regs *regs, int reg, u64 val)
 {
 
        xn = opcode & 0x1f;
        imm = ((opcode >> 3) & 0x1ffffc) | ((opcode >> 29) & 0x3);
-       imm = sign_extend(imm, 20);
+       imm = sign_extend64(imm, 20);
        if (opcode & 0x80000000)
                val = (imm<<12) + (addr & 0xfffffffffffff000);
        else