|
@@ -19,7 +19,7 @@
|
|
|
#define RA(inst) (((inst) >> 15) & 0x1FUL)
|
|
|
#define RB(inst) (((inst) >> 10) & 0x1FUL)
|
|
|
#define SV(inst) (((inst) >> 8) & 0x3UL)
|
|
|
-#define IMM(inst) (((inst) >> 0) & 0x3FFFUL)
|
|
|
+#define IMM(inst) (((inst) >> 0) & 0x7FFFUL)
|
|
|
|
|
|
#define RA3(inst) (((inst) >> 3) & 0x7UL)
|
|
|
#define RT3(inst) (((inst) >> 6) & 0x7UL)
|
|
@@ -28,6 +28,9 @@
|
|
|
#define RA5(inst) (((inst) >> 0) & 0x1FUL)
|
|
|
#define RT4(inst) (((inst) >> 5) & 0xFUL)
|
|
|
|
|
|
+#define GET_IMMSVAL(imm_value) \
|
|
|
+ (((imm_value >> 14) & 0x1) ? (imm_value - 0x8000) : imm_value)
|
|
|
+
|
|
|
#define __get8_data(val,addr,err) \
|
|
|
__asm__( \
|
|
|
"1: lbi.bi %1, [%2], #1\n" \
|
|
@@ -467,7 +470,7 @@ static inline int do_32(unsigned long inst, struct pt_regs *regs)
|
|
|
}
|
|
|
|
|
|
if (imm)
|
|
|
- shift = IMM(inst) * len;
|
|
|
+ shift = GET_IMMSVAL(IMM(inst)) * len;
|
|
|
else
|
|
|
shift = *idx_to_addr(regs, RB(inst)) << SV(inst);
|
|
|
|