#define A64_UXTH(sf, Rd, Rn) A64_UBFM(sf, Rd, Rn, 0, 15)
 #define A64_UXTW(sf, Rd, Rn) A64_UBFM(sf, Rd, Rn, 0, 31)
 
+/* Sign extend */
+#define A64_SXTB(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 7)
+#define A64_SXTH(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 15)
+#define A64_SXTW(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 31)
+
 /* Move wide (immediate) */
 #define A64_MOVEW(sf, Rd, imm16, shift, type) \
        aarch64_insn_gen_movewide(Rd, imm16, shift, \
 
        /* dst = src */
        case BPF_ALU | BPF_MOV | BPF_X:
        case BPF_ALU64 | BPF_MOV | BPF_X:
-               emit(A64_MOV(is64, dst, src), ctx);
+               switch (insn->off) {
+               case 0:
+                       emit(A64_MOV(is64, dst, src), ctx);
+                       break;
+               case 8:
+                       emit(A64_SXTB(is64, dst, src), ctx);
+                       break;
+               case 16:
+                       emit(A64_SXTH(is64, dst, src), ctx);
+                       break;
+               case 32:
+                       emit(A64_SXTW(is64, dst, src), ctx);
+                       break;
+               }
                break;
        /* dst = dst OP src */
        case BPF_ALU | BPF_ADD | BPF_X: