Lines Matching refs:op
86 struct instruction_op *op) in branch_taken() argument
93 op->type |= DECCTR; in branch_taken()
501 static int do_fp_load(struct instruction_op *op, unsigned long ea, in do_fp_load() argument
514 nb = GETSIZE(op->type); in do_fp_load()
517 rn = op->reg; in do_fp_load()
528 if (op->type & FPCONV) in do_fp_load()
530 else if (op->type & SIGNEXT) in do_fp_load()
552 static int do_fp_store(struct instruction_op *op, unsigned long ea, in do_fp_store() argument
564 nb = GETSIZE(op->type); in do_fp_store()
567 rn = op->reg; in do_fp_store()
574 if (op->type & FPCONV) in do_fp_store()
699 void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg, in emulate_vsx_load() argument
708 size = GETSIZE(op->type); in emulate_vsx_load()
711 switch (op->element_size) { in emulate_vsx_load()
717 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) in emulate_vsx_load()
730 if (op->type & SIGNEXT) { in emulate_vsx_load()
733 } else if (op->vsx_flags & VSX_FPCONV) { in emulate_vsx_load()
743 } else if (op->vsx_flags & VSX_SPLAT) in emulate_vsx_load()
754 if (op->vsx_flags & VSX_SPLAT) { in emulate_vsx_load()
783 void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg, in emulate_vsx_store() argument
793 size = GETSIZE(op->type); in emulate_vsx_store()
795 switch (op->element_size) { in emulate_vsx_store()
800 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) in emulate_vsx_store()
814 if (size < 8 && op->vsx_flags & VSX_FPCONV) { in emulate_vsx_store()
859 static nokprobe_inline int do_vsx_load(struct instruction_op *op, in do_vsx_load() argument
863 int reg = op->reg; in do_vsx_load()
866 int size = GETSIZE(op->type); in do_vsx_load()
871 emulate_vsx_load(op, &buf, mem, cross_endian); in do_vsx_load()
891 static nokprobe_inline int do_vsx_store(struct instruction_op *op, in do_vsx_store() argument
895 int reg = op->reg; in do_vsx_store()
898 int size = GETSIZE(op->type); in do_vsx_store()
919 emulate_vsx_store(op, &buf, mem, cross_endian); in do_vsx_store()
950 #define __put_user_asmx(x, addr, err, op, cr) \ argument
954 "1: " op " %2,0,%3\n" \
966 #define __get_user_asmx(x, addr, err, op) \ argument
970 "1: "op" %1,0,%2\n" \
981 #define __cacheop_user_asmx(addr, err, op) \ argument
983 "1: "op" 0,%1\n" \
994 struct instruction_op *op) in set_cr0() argument
996 long val = op->val; in set_cr0()
998 op->type |= SETCC; in set_cr0()
999 op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000); in set_cr0()
1005 op->ccval |= 0x80000000; in set_cr0()
1007 op->ccval |= 0x40000000; in set_cr0()
1009 op->ccval |= 0x20000000; in set_cr0()
1012 static nokprobe_inline void set_ca32(struct instruction_op *op, bool val) in set_ca32() argument
1016 op->xerval |= XER_CA32; in set_ca32()
1018 op->xerval &= ~XER_CA32; in set_ca32()
1023 struct instruction_op *op, int rd, in add_with_carry() argument
1031 op->type = COMPUTE + SETREG + SETXER; in add_with_carry()
1032 op->reg = rd; in add_with_carry()
1033 op->val = val; in add_with_carry()
1040 op->xerval = regs->xer; in add_with_carry()
1042 op->xerval |= XER_CA; in add_with_carry()
1044 op->xerval &= ~XER_CA; in add_with_carry()
1046 set_ca32(op, (unsigned int)val < (unsigned int)val1 || in add_with_carry()
1051 struct instruction_op *op, in do_cmp_signed() argument
1056 op->type = COMPUTE + SETCC; in do_cmp_signed()
1065 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift); in do_cmp_signed()
1069 struct instruction_op *op, in do_cmp_unsigned() argument
1075 op->type = COMPUTE + SETCC; in do_cmp_unsigned()
1084 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift); in do_cmp_unsigned()
1088 struct instruction_op *op, in do_cmpb() argument
1100 op->val = out_val; in do_cmpb()
1108 struct instruction_op *op, in do_popcnt() argument
1119 op->val = out; in do_popcnt()
1125 op->val = out & 0x0000003f0000003fULL; in do_popcnt()
1130 op->val = out; /* popcntd */ in do_popcnt()
1135 struct instruction_op *op, in do_bpermd() argument
1148 op->val = perm; in do_bpermd()
1156 struct instruction_op *op, in do_prty() argument
1163 op->val = res & 0x0000000100000001ULL; in do_prty()
1168 op->val = res & 1; /*prtyd */ in do_prty()
1214 int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, in analyse_instr() argument
1230 op->type = COMPUTE; in analyse_instr()
1235 op->type = BRANCH; in analyse_instr()
1239 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1241 op->type |= SETLK; in analyse_instr()
1242 if (branch_taken(word, regs, op)) in analyse_instr()
1243 op->type |= BRTAKEN; in analyse_instr()
1248 op->type = SYSCALL; in analyse_instr()
1251 op->type = SYSCALL_VECTORED_0; in analyse_instr()
1255 op->type = UNKNOWN; in analyse_instr()
1259 op->type = BRANCH | BRTAKEN; in analyse_instr()
1265 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1267 op->type |= SETLK; in analyse_instr()
1272 op->type = COMPUTE + SETCC; in analyse_instr()
1278 op->ccval = (regs->ccr & ~(0xfUL << rd)) | (val << rd); in analyse_instr()
1283 op->type = BRANCH; in analyse_instr()
1285 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1287 op->type |= SETLK; in analyse_instr()
1288 if (branch_taken(word, regs, op)) in analyse_instr()
1289 op->type |= BRTAKEN; in analyse_instr()
1295 op->type = RFI; in analyse_instr()
1299 op->type = BARRIER | BARRIER_ISYNC; in analyse_instr()
1310 op->type = COMPUTE + SETCC; in analyse_instr()
1317 op->ccval = (regs->ccr & ~(1UL << (31 - rd))) | in analyse_instr()
1325 op->type = BARRIER + BARRIER_SYNC; in analyse_instr()
1329 op->type = BARRIER + BARRIER_LWSYNC; in analyse_instr()
1332 op->type = BARRIER + BARRIER_PTESYNC; in analyse_instr()
1339 op->type = BARRIER + BARRIER_EIEIO; in analyse_instr()
1363 op->reg = rd; in analyse_instr()
1364 op->val = regs->gpr[rd]; in analyse_instr()
1373 op->type = COMPUTE | PREFIXED; in analyse_instr()
1374 op->val = mlsd_8lsd_ea(word, suffix, regs); in analyse_instr()
1402 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1408 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1414 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1427 op->val = regs->gpr[ra] * (short) word; in analyse_instr()
1432 add_with_carry(regs, op, rd, ~regs->gpr[ra], imm, 1); in analyse_instr()
1442 do_cmp_unsigned(regs, op, val, imm, rd >> 2); in analyse_instr()
1452 do_cmp_signed(regs, op, val, imm, rd >> 2); in analyse_instr()
1457 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); in analyse_instr()
1462 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); in analyse_instr()
1463 set_cr0(regs, op); in analyse_instr()
1470 op->val = imm; in analyse_instr()
1477 op->val = imm; in analyse_instr()
1487 op->val = regs->nip + (imm << 16) + 4; in analyse_instr()
1490 op->type = UNKNOWN; in analyse_instr()
1498 op->val = (regs->gpr[ra] & ~imm) | (ROTATE(val, rb) & imm); in analyse_instr()
1505 op->val = ROTATE(val, rb) & MASK32(mb, me); in analyse_instr()
1513 op->val = ROTATE(val, rb) & MASK32(mb, me); in analyse_instr()
1517 op->val = regs->gpr[rd] | (unsigned short) word; in analyse_instr()
1522 op->val = regs->gpr[rd] | (imm << 16); in analyse_instr()
1526 op->val = regs->gpr[rd] ^ (unsigned short) word; in analyse_instr()
1531 op->val = regs->gpr[rd] ^ (imm << 16); in analyse_instr()
1535 op->val = regs->gpr[rd] & (unsigned short) word; in analyse_instr()
1536 set_cr0(regs, op); in analyse_instr()
1541 op->val = regs->gpr[rd] & (imm << 16); in analyse_instr()
1542 set_cr0(regs, op); in analyse_instr()
1567 op->val = val; in analyse_instr()
1574 op->val = val & MASK64_L(mb); in analyse_instr()
1577 op->val = val & MASK64_R(mb); in analyse_instr()
1582 op->type = UNKNOWN; /* illegal instruction */ in analyse_instr()
1592 op->val = (val) ? val2 : regs->gpr[rb]; in analyse_instr()
1612 op->type = MFMSR; in analyse_instr()
1613 op->reg = rd; in analyse_instr()
1618 op->type = MTMSR; in analyse_instr()
1619 op->reg = rd; in analyse_instr()
1620 op->val = 0xffffffff & ~(MSR_ME | MSR_LE); in analyse_instr()
1626 op->type = MTMSR; in analyse_instr()
1627 op->reg = rd; in analyse_instr()
1631 op->val = imm; in analyse_instr()
1645 op->val = regs->ccr & imm; in analyse_instr()
1649 op->type = COMPUTE + SETCC; in analyse_instr()
1652 op->ccval = regs->ccr; in analyse_instr()
1655 op->ccval = (op->ccval & ~imm) | in analyse_instr()
1663 op->type = MFSPR; in analyse_instr()
1664 op->reg = rd; in analyse_instr()
1665 op->spr = spr; in analyse_instr()
1673 op->type = MTSPR; in analyse_instr()
1674 op->val = regs->gpr[rd]; in analyse_instr()
1675 op->spr = spr; in analyse_instr()
1694 do_cmp_signed(regs, op, val, val2, rd >> 2); in analyse_instr()
1707 do_cmp_unsigned(regs, op, val, val2, rd >> 2); in analyse_instr()
1711 do_cmpb(regs, op, regs->gpr[rd], regs->gpr[rb]); in analyse_instr()
1718 add_with_carry(regs, op, rd, ~regs->gpr[ra], in analyse_instr()
1723 asm("mulhdu %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1728 add_with_carry(regs, op, rd, regs->gpr[ra], in analyse_instr()
1733 asm("mulhwu %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1738 op->val = regs->gpr[rb] - regs->gpr[ra]; in analyse_instr()
1742 asm("mulhd %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1747 asm("mulhw %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1752 op->val = -regs->gpr[ra]; in analyse_instr()
1756 add_with_carry(regs, op, rd, ~regs->gpr[ra], in analyse_instr()
1761 add_with_carry(regs, op, rd, regs->gpr[ra], in analyse_instr()
1766 add_with_carry(regs, op, rd, ~regs->gpr[ra], 0L, in analyse_instr()
1771 add_with_carry(regs, op, rd, regs->gpr[ra], 0L, in analyse_instr()
1776 add_with_carry(regs, op, rd, ~regs->gpr[ra], -1L, in analyse_instr()
1781 op->val = regs->gpr[ra] * regs->gpr[rb]; in analyse_instr()
1785 add_with_carry(regs, op, rd, regs->gpr[ra], -1L, in analyse_instr()
1790 op->val = (long)(int) regs->gpr[ra] * in analyse_instr()
1798 op->val = regs->gpr[ra] % regs->gpr[rb]; in analyse_instr()
1802 op->val = regs->gpr[ra] + regs->gpr[rb]; in analyse_instr()
1808 op->val = (unsigned int) regs->gpr[ra] % in analyse_instr()
1813 op->val = regs->gpr[ra] / regs->gpr[rb]; in analyse_instr()
1817 op->val = (unsigned int) regs->gpr[ra] / in analyse_instr()
1822 op->val = (long int) regs->gpr[ra] / in analyse_instr()
1827 op->val = (int) regs->gpr[ra] / in analyse_instr()
1833 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1838 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1848 asm volatile(PPC_DARN(%0, 0) : "=r" (op->val)); in analyse_instr()
1853 asm volatile(PPC_DARN(%0, 1) : "=r" (op->val)); in analyse_instr()
1858 asm volatile(PPC_DARN(%0, 2) : "=r" (op->val)); in analyse_instr()
1867 op->val = (long int) regs->gpr[ra] % in analyse_instr()
1874 op->val = (int) regs->gpr[ra] % in analyse_instr()
1884 op->val = ( val ? __builtin_clz(val) : 32 ); in analyse_instr()
1889 op->val = ( val ? __builtin_clzl(val) : 64 ); in analyse_instr()
1893 op->val = regs->gpr[rd] & regs->gpr[rb]; in analyse_instr()
1897 op->val = regs->gpr[rd] & ~regs->gpr[rb]; in analyse_instr()
1901 do_popcnt(regs, op, regs->gpr[rd], 8); in analyse_instr()
1905 op->val = ~(regs->gpr[rd] | regs->gpr[rb]); in analyse_instr()
1909 do_prty(regs, op, regs->gpr[rd], 32); in analyse_instr()
1913 do_prty(regs, op, regs->gpr[rd], 64); in analyse_instr()
1917 do_bpermd(regs, op, regs->gpr[rd], regs->gpr[rb]); in analyse_instr()
1921 op->val = ~(regs->gpr[rd] ^ regs->gpr[rb]); in analyse_instr()
1925 op->val = regs->gpr[rd] ^ regs->gpr[rb]; in analyse_instr()
1929 do_popcnt(regs, op, regs->gpr[rd], 32); in analyse_instr()
1933 op->val = regs->gpr[rd] | ~regs->gpr[rb]; in analyse_instr()
1937 op->val = regs->gpr[rd] | regs->gpr[rb]; in analyse_instr()
1941 op->val = ~(regs->gpr[rd] & regs->gpr[rb]); in analyse_instr()
1945 do_popcnt(regs, op, regs->gpr[rd], 64); in analyse_instr()
1952 op->val = (val ? __builtin_ctz(val) : 32); in analyse_instr()
1959 op->val = (val ? __builtin_ctzl(val) : 64); in analyse_instr()
1963 op->val = (signed short) regs->gpr[rd]; in analyse_instr()
1967 op->val = (signed char) regs->gpr[rd]; in analyse_instr()
1971 op->val = (signed int) regs->gpr[rd]; in analyse_instr()
1981 op->val = (regs->gpr[rd] << sh) & 0xffffffffUL; in analyse_instr()
1983 op->val = 0; in analyse_instr()
1989 op->val = (regs->gpr[rd] & 0xffffffffUL) >> sh; in analyse_instr()
1991 op->val = 0; in analyse_instr()
1995 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1998 op->val = ival >> (sh < 32 ? sh : 31); in analyse_instr()
1999 op->xerval = regs->xer; in analyse_instr()
2001 op->xerval |= XER_CA; in analyse_instr()
2003 op->xerval &= ~XER_CA; in analyse_instr()
2004 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
2008 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
2011 op->val = ival >> sh; in analyse_instr()
2012 op->xerval = regs->xer; in analyse_instr()
2014 op->xerval |= XER_CA; in analyse_instr()
2016 op->xerval &= ~XER_CA; in analyse_instr()
2017 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
2024 op->val = regs->gpr[rd] << sh; in analyse_instr()
2026 op->val = 0; in analyse_instr()
2032 op->val = regs->gpr[rd] >> sh; in analyse_instr()
2034 op->val = 0; in analyse_instr()
2038 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
2041 op->val = ival >> (sh < 64 ? sh : 63); in analyse_instr()
2042 op->xerval = regs->xer; in analyse_instr()
2044 op->xerval |= XER_CA; in analyse_instr()
2046 op->xerval &= ~XER_CA; in analyse_instr()
2047 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
2052 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
2055 op->val = ival >> sh; in analyse_instr()
2056 op->xerval = regs->xer; in analyse_instr()
2058 op->xerval |= XER_CA; in analyse_instr()
2060 op->xerval &= ~XER_CA; in analyse_instr()
2061 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
2068 op->type = COMPUTE + SETREG; in analyse_instr()
2072 op->val = ROTATE(val, sh) & MASK64(0, 63 - sh); in analyse_instr()
2074 op->val = val; in analyse_instr()
2083 op->type = MKOP(CACHEOP, DCBST, 0); in analyse_instr()
2084 op->ea = xform_ea(word, regs); in analyse_instr()
2088 op->type = MKOP(CACHEOP, DCBF, 0); in analyse_instr()
2089 op->ea = xform_ea(word, regs); in analyse_instr()
2093 op->type = MKOP(CACHEOP, DCBTST, 0); in analyse_instr()
2094 op->ea = xform_ea(word, regs); in analyse_instr()
2095 op->reg = rd; in analyse_instr()
2099 op->type = MKOP(CACHEOP, DCBTST, 0); in analyse_instr()
2100 op->ea = xform_ea(word, regs); in analyse_instr()
2101 op->reg = rd; in analyse_instr()
2105 op->type = MKOP(CACHEOP, ICBI, 0); in analyse_instr()
2106 op->ea = xform_ea(word, regs); in analyse_instr()
2110 op->type = MKOP(CACHEOP, DCBZ, 0); in analyse_instr()
2111 op->ea = xform_ea(word, regs); in analyse_instr()
2120 op->type = UNKNOWN; in analyse_instr()
2121 op->update_reg = ra; in analyse_instr()
2122 op->reg = rd; in analyse_instr()
2123 op->val = regs->gpr[rd]; in analyse_instr()
2125 op->vsx_flags = 0; in analyse_instr()
2130 op->ea = xform_ea(word, regs); in analyse_instr()
2133 op->type = MKOP(LARX, 0, 4); in analyse_instr()
2137 op->type = MKOP(STCX, 0, 4); in analyse_instr()
2142 op->type = MKOP(LARX, 0, 8); in analyse_instr()
2146 op->type = MKOP(STCX, 0, 8); in analyse_instr()
2150 op->type = MKOP(LARX, 0, 1); in analyse_instr()
2154 op->type = MKOP(STCX, 0, 1); in analyse_instr()
2158 op->type = MKOP(LARX, 0, 2); in analyse_instr()
2162 op->type = MKOP(STCX, 0, 2); in analyse_instr()
2167 op->type = MKOP(LARX, 0, 16); in analyse_instr()
2172 op->type = MKOP(STCX, 0, 16); in analyse_instr()
2178 op->type = MKOP(LOAD, u, 4); in analyse_instr()
2183 op->type = MKOP(LOAD, u, 1); in analyse_instr()
2192 op->type = MKOP(LOAD_VMX, 0, 1); in analyse_instr()
2193 op->element_size = 1; in analyse_instr()
2197 op->type = MKOP(LOAD_VMX, 0, 2); in analyse_instr()
2198 op->element_size = 2; in analyse_instr()
2202 op->type = MKOP(LOAD_VMX, 0, 4); in analyse_instr()
2203 op->element_size = 4; in analyse_instr()
2208 op->type = MKOP(LOAD_VMX, 0, 16); in analyse_instr()
2209 op->element_size = 16; in analyse_instr()
2213 op->type = MKOP(STORE_VMX, 0, 1); in analyse_instr()
2214 op->element_size = 1; in analyse_instr()
2218 op->type = MKOP(STORE_VMX, 0, 2); in analyse_instr()
2219 op->element_size = 2; in analyse_instr()
2223 op->type = MKOP(STORE_VMX, 0, 4); in analyse_instr()
2224 op->element_size = 4; in analyse_instr()
2229 op->type = MKOP(STORE_VMX, 0, 16); in analyse_instr()
2236 op->type = MKOP(LOAD, u, 8); in analyse_instr()
2241 op->type = MKOP(STORE, u, 8); in analyse_instr()
2247 op->type = MKOP(STORE, u, 4); in analyse_instr()
2252 op->type = MKOP(STORE, u, 1); in analyse_instr()
2257 op->type = MKOP(LOAD, u, 2); in analyse_instr()
2263 op->type = MKOP(LOAD, SIGNEXT | u, 4); in analyse_instr()
2269 op->type = MKOP(LOAD, SIGNEXT | u, 2); in analyse_instr()
2274 op->type = MKOP(STORE, u, 2); in analyse_instr()
2279 op->type = MKOP(LOAD, BYTEREV, 8); in analyse_instr()
2284 op->type = MKOP(LOAD_MULTI, 0, regs->xer & 0x7f); in analyse_instr()
2288 op->type = MKOP(LOAD, BYTEREV, 4); in analyse_instr()
2294 op->type = MKOP(LOAD_MULTI, 0, rb); in analyse_instr()
2295 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2301 op->type = MKOP(LOAD_FP, u | FPCONV, 4); in analyse_instr()
2306 op->type = MKOP(LOAD_FP, u, 8); in analyse_instr()
2311 op->type = MKOP(STORE_FP, u | FPCONV, 4); in analyse_instr()
2316 op->type = MKOP(STORE_FP, u, 8); in analyse_instr()
2321 op->type = MKOP(LOAD_FP, 0, 16); in analyse_instr()
2325 op->type = MKOP(LOAD_FP, SIGNEXT, 4); in analyse_instr()
2329 op->type = MKOP(LOAD_FP, 0, 4); in analyse_instr()
2333 op->type = MKOP(STORE_FP, 0, 16); in analyse_instr()
2337 op->type = MKOP(STORE_FP, 0, 4); in analyse_instr()
2344 op->type = MKOP(STORE, BYTEREV, 8); in analyse_instr()
2345 op->val = byterev_8(regs->gpr[rd]); in analyse_instr()
2350 op->type = MKOP(STORE_MULTI, 0, regs->xer & 0x7f); in analyse_instr()
2354 op->type = MKOP(STORE, BYTEREV, 4); in analyse_instr()
2355 op->val = byterev_4(regs->gpr[rd]); in analyse_instr()
2361 op->type = MKOP(STORE_MULTI, 0, rb); in analyse_instr()
2362 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2366 op->type = MKOP(LOAD, BYTEREV, 2); in analyse_instr()
2370 op->type = MKOP(STORE, BYTEREV, 2); in analyse_instr()
2371 op->val = byterev_2(regs->gpr[rd]); in analyse_instr()
2376 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2377 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2378 op->element_size = 8; in analyse_instr()
2382 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2383 op->type = MKOP(LOAD_VSX, SIGNEXT, 4); in analyse_instr()
2384 op->element_size = 8; in analyse_instr()
2388 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2389 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2390 op->element_size = 8; in analyse_instr()
2396 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2397 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2398 op->element_size = 16; in analyse_instr()
2399 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2407 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2408 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2412 op->type = MKOP(LOAD_VSX, 0, nb); in analyse_instr()
2413 op->element_size = 16; in analyse_instr()
2414 op->vsx_flags = ((word & 0x20) ? VSX_LDLEFT : 0) | in analyse_instr()
2419 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2420 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2421 op->element_size = 8; in analyse_instr()
2422 op->vsx_flags = VSX_SPLAT; in analyse_instr()
2428 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2429 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2430 op->element_size = 4; in analyse_instr()
2431 op->vsx_flags = VSX_SPLAT | VSX_CHECK_VEC; in analyse_instr()
2437 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2438 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2439 op->element_size = 16; in analyse_instr()
2440 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2448 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2449 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2453 op->type = MKOP(STORE_VSX, 0, nb); in analyse_instr()
2454 op->element_size = 16; in analyse_instr()
2455 op->vsx_flags = ((word & 0x20) ? VSX_LDLEFT : 0) | in analyse_instr()
2460 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2461 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2462 op->element_size = 8; in analyse_instr()
2463 op->vsx_flags = VSX_FPCONV; in analyse_instr()
2467 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2468 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2469 op->element_size = 8; in analyse_instr()
2473 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2474 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2475 op->element_size = 8; in analyse_instr()
2476 op->vsx_flags = VSX_FPCONV; in analyse_instr()
2480 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2481 op->type = MKOP(STORE_VSX, 0, 8); in analyse_instr()
2482 op->element_size = 8; in analyse_instr()
2486 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2487 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2488 op->element_size = 4; in analyse_instr()
2494 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2495 op->type = MKOP(LOAD_VSX, 0, 1); in analyse_instr()
2496 op->element_size = 8; in analyse_instr()
2497 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2503 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2504 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2505 op->element_size = 2; in analyse_instr()
2506 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2512 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2513 op->type = MKOP(LOAD_VSX, 0, 2); in analyse_instr()
2514 op->element_size = 8; in analyse_instr()
2515 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2519 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2520 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2521 op->element_size = 8; in analyse_instr()
2527 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2528 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2529 op->element_size = 1; in analyse_instr()
2530 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2534 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2535 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2536 op->element_size = 4; in analyse_instr()
2542 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2543 op->type = MKOP(STORE_VSX, 0, 1); in analyse_instr()
2544 op->element_size = 8; in analyse_instr()
2545 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2551 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2552 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2553 op->element_size = 2; in analyse_instr()
2554 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2560 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2561 op->type = MKOP(STORE_VSX, 0, 2); in analyse_instr()
2562 op->element_size = 8; in analyse_instr()
2563 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2567 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2568 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2569 op->element_size = 8; in analyse_instr()
2575 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2576 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2577 op->element_size = 1; in analyse_instr()
2578 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2587 op->type = MKOP(LOAD, u, 4); in analyse_instr()
2588 op->ea = dform_ea(word, regs); in analyse_instr()
2593 op->type = MKOP(LOAD, u, 1); in analyse_instr()
2594 op->ea = dform_ea(word, regs); in analyse_instr()
2599 op->type = MKOP(STORE, u, 4); in analyse_instr()
2600 op->ea = dform_ea(word, regs); in analyse_instr()
2605 op->type = MKOP(STORE, u, 1); in analyse_instr()
2606 op->ea = dform_ea(word, regs); in analyse_instr()
2611 op->type = MKOP(LOAD, u, 2); in analyse_instr()
2612 op->ea = dform_ea(word, regs); in analyse_instr()
2617 op->type = MKOP(LOAD, SIGNEXT | u, 2); in analyse_instr()
2618 op->ea = dform_ea(word, regs); in analyse_instr()
2623 op->type = MKOP(STORE, u, 2); in analyse_instr()
2624 op->ea = dform_ea(word, regs); in analyse_instr()
2630 op->type = MKOP(LOAD_MULTI, 0, 4 * (32 - rd)); in analyse_instr()
2631 op->ea = dform_ea(word, regs); in analyse_instr()
2635 op->type = MKOP(STORE_MULTI, 0, 4 * (32 - rd)); in analyse_instr()
2636 op->ea = dform_ea(word, regs); in analyse_instr()
2642 op->type = MKOP(LOAD_FP, u | FPCONV, 4); in analyse_instr()
2643 op->ea = dform_ea(word, regs); in analyse_instr()
2648 op->type = MKOP(LOAD_FP, u, 8); in analyse_instr()
2649 op->ea = dform_ea(word, regs); in analyse_instr()
2654 op->type = MKOP(STORE_FP, u | FPCONV, 4); in analyse_instr()
2655 op->ea = dform_ea(word, regs); in analyse_instr()
2660 op->type = MKOP(STORE_FP, u, 8); in analyse_instr()
2661 op->ea = dform_ea(word, regs); in analyse_instr()
2668 op->type = MKOP(LOAD, 0, 16); in analyse_instr()
2669 op->ea = dqform_ea(word, regs); in analyse_instr()
2675 op->ea = dsform_ea(word, regs); in analyse_instr()
2680 op->type = MKOP(LOAD_FP, 0, 16); in analyse_instr()
2685 op->reg = rd + 32; in analyse_instr()
2686 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2687 op->element_size = 8; in analyse_instr()
2688 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2693 op->reg = rd + 32; in analyse_instr()
2694 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2695 op->element_size = 8; in analyse_instr()
2696 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2704 op->ea = dsform_ea(word, regs); in analyse_instr()
2707 op->type = MKOP(LOAD, 0, 8); in analyse_instr()
2710 op->type = MKOP(LOAD, UPDATE, 8); in analyse_instr()
2713 op->type = MKOP(LOAD, SIGNEXT, 4); in analyse_instr()
2724 op->ea = dsform_ea(word, regs); in analyse_instr()
2725 op->type = MKOP(STORE_FP, 0, 16); in analyse_instr()
2731 op->ea = dqform_ea(word, regs); in analyse_instr()
2733 op->reg = rd + 32; in analyse_instr()
2734 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2735 op->element_size = 16; in analyse_instr()
2736 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2743 op->ea = dsform_ea(word, regs); in analyse_instr()
2744 op->reg = rd + 32; in analyse_instr()
2745 op->type = MKOP(STORE_VSX, 0, 8); in analyse_instr()
2746 op->element_size = 8; in analyse_instr()
2747 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2754 op->ea = dsform_ea(word, regs); in analyse_instr()
2755 op->reg = rd + 32; in analyse_instr()
2756 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2757 op->element_size = 8; in analyse_instr()
2758 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2764 op->ea = dqform_ea(word, regs); in analyse_instr()
2766 op->reg = rd + 32; in analyse_instr()
2767 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2768 op->element_size = 16; in analyse_instr()
2769 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2777 op->ea = dsform_ea(word, regs); in analyse_instr()
2780 op->type = MKOP(STORE, 0, 8); in analyse_instr()
2783 op->type = MKOP(STORE, UPDATE, 8); in analyse_instr()
2787 op->type = MKOP(STORE, 0, 16); in analyse_instr()
2797 op->update_reg = ra; in analyse_instr()
2799 op->reg = rd; in analyse_instr()
2800 op->val = regs->gpr[rd]; in analyse_instr()
2808 op->ea = mlsd_8lsd_ea(word, suffix, regs); in analyse_instr()
2811 op->type = MKOP(LOAD, PREFIXED | SIGNEXT, 4); in analyse_instr()
2815 op->reg = rd + 32; in analyse_instr()
2816 op->type = MKOP(LOAD_VSX, PREFIXED, 8); in analyse_instr()
2817 op->element_size = 8; in analyse_instr()
2818 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2821 op->reg = rd + 32; in analyse_instr()
2822 op->type = MKOP(LOAD_VSX, PREFIXED, 4); in analyse_instr()
2823 op->element_size = 8; in analyse_instr()
2824 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2827 op->reg = rd + 32; in analyse_instr()
2828 op->type = MKOP(STORE_VSX, PREFIXED, 8); in analyse_instr()
2829 op->element_size = 8; in analyse_instr()
2830 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2833 op->reg = rd + 32; in analyse_instr()
2834 op->type = MKOP(STORE_VSX, PREFIXED, 4); in analyse_instr()
2835 op->element_size = 8; in analyse_instr()
2836 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2839 op->reg += 32; in analyse_instr()
2842 op->type = MKOP(LOAD_VSX, PREFIXED, 16); in analyse_instr()
2843 op->element_size = 16; in analyse_instr()
2844 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2847 op->reg = rd + 32; in analyse_instr()
2850 op->type = MKOP(STORE_VSX, PREFIXED, 16); in analyse_instr()
2851 op->element_size = 16; in analyse_instr()
2852 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2856 op->type = MKOP(LOAD, PREFIXED, 16); in analyse_instr()
2859 op->type = MKOP(LOAD, PREFIXED, 8); in analyse_instr()
2862 op->type = MKOP(STORE, PREFIXED, 16); in analyse_instr()
2865 op->type = MKOP(STORE, PREFIXED, 8); in analyse_instr()
2874 op->ea = mlsd_8lsd_ea(word, suffix, regs); in analyse_instr()
2877 op->type = MKOP(LOAD, PREFIXED, 4); in analyse_instr()
2880 op->type = MKOP(LOAD, PREFIXED, 1); in analyse_instr()
2883 op->type = MKOP(STORE, PREFIXED, 4); in analyse_instr()
2886 op->type = MKOP(STORE, PREFIXED, 1); in analyse_instr()
2889 op->type = MKOP(LOAD, PREFIXED, 2); in analyse_instr()
2892 op->type = MKOP(LOAD, PREFIXED | SIGNEXT, 2); in analyse_instr()
2895 op->type = MKOP(STORE, PREFIXED, 2); in analyse_instr()
2898 op->type = MKOP(LOAD_FP, PREFIXED | FPCONV, 4); in analyse_instr()
2901 op->type = MKOP(LOAD_FP, PREFIXED, 8); in analyse_instr()
2904 op->type = MKOP(STORE_FP, PREFIXED | FPCONV, 4); in analyse_instr()
2907 op->type = MKOP(STORE_FP, PREFIXED, 8); in analyse_instr()
2918 if (OP_IS_LOAD_STORE(op->type) && (op->type & UPDATE)) { in analyse_instr()
2919 switch (GETTYPE(op->type)) { in analyse_instr()
2933 if ((GETTYPE(op->type) == LOAD_VSX || in analyse_instr()
2934 GETTYPE(op->type) == STORE_VSX) && in analyse_instr()
2943 op->type = UNKNOWN; in analyse_instr()
2948 set_cr0(regs, op); in analyse_instr()
2950 op->reg = ra; in analyse_instr()
2951 op->type |= SETREG; in analyse_instr()
2956 set_cr0(regs, op); in analyse_instr()
2958 op->reg = rd; in analyse_instr()
2959 op->type |= SETREG; in analyse_instr()
2963 op->type = INTERRUPT | 0x700; in analyse_instr()
2964 op->val = SRR1_PROGPRIV; in analyse_instr()
2968 op->type = INTERRUPT | 0x700; in analyse_instr()
2969 op->val = SRR1_PROGTRAP; in analyse_instr()
3036 void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op) in emulate_update_regs() argument
3040 next_pc = truncate_if_32bit(regs->msr, regs->nip + GETLENGTH(op->type)); in emulate_update_regs()
3041 switch (GETTYPE(op->type)) { in emulate_update_regs()
3043 if (op->type & SETREG) in emulate_update_regs()
3044 regs->gpr[op->reg] = op->val; in emulate_update_regs()
3045 if (op->type & SETCC) in emulate_update_regs()
3046 regs->ccr = op->ccval; in emulate_update_regs()
3047 if (op->type & SETXER) in emulate_update_regs()
3048 regs->xer = op->xerval; in emulate_update_regs()
3052 if (op->type & SETLK) in emulate_update_regs()
3054 if (op->type & BRTAKEN) in emulate_update_regs()
3055 next_pc = op->val; in emulate_update_regs()
3056 if (op->type & DECCTR) in emulate_update_regs()
3061 switch (op->type & BARRIER_MASK) { in emulate_update_regs()
3083 switch (op->spr) { in emulate_update_regs()
3085 regs->gpr[op->reg] = regs->xer & 0xffffffffUL; in emulate_update_regs()
3088 regs->gpr[op->reg] = regs->link; in emulate_update_regs()
3091 regs->gpr[op->reg] = regs->ctr; in emulate_update_regs()
3099 switch (op->spr) { in emulate_update_regs()
3101 regs->xer = op->val & 0xffffffffUL; in emulate_update_regs()
3104 regs->link = op->val; in emulate_update_regs()
3107 regs->ctr = op->val; in emulate_update_regs()
3130 int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op) in emulate_loadstore() argument
3140 size = GETSIZE(op->type); in emulate_loadstore()
3141 type = GETTYPE(op->type); in emulate_loadstore()
3143 ea = truncate_if_32bit(regs->msr, op->ea); in emulate_loadstore()
3170 err = do_lqarx(ea, ®s->gpr[op->reg]); in emulate_loadstore()
3181 regs->gpr[op->reg] = val; in emulate_loadstore()
3193 __put_user_asmx(op->val, ea, err, "stbcx.", cr); in emulate_loadstore()
3196 __put_user_asmx(op->val, ea, err, "sthcx.", cr); in emulate_loadstore()
3200 __put_user_asmx(op->val, ea, err, "stwcx.", cr); in emulate_loadstore()
3204 __put_user_asmx(op->val, ea, err, "stdcx.", cr); in emulate_loadstore()
3207 err = do_stqcx(ea, regs->gpr[op->reg], in emulate_loadstore()
3208 regs->gpr[op->reg + 1], &cr); in emulate_loadstore()
3225 err = emulate_lq(regs, ea, op->reg, cross_endian); in emulate_loadstore()
3229 err = read_mem(®s->gpr[op->reg], ea, size, regs); in emulate_loadstore()
3231 if (op->type & SIGNEXT) in emulate_loadstore()
3232 do_signext(®s->gpr[op->reg], size); in emulate_loadstore()
3233 if ((op->type & BYTEREV) == (cross_endian ? 0 : BYTEREV)) in emulate_loadstore()
3234 do_byterev(®s->gpr[op->reg], size); in emulate_loadstore()
3248 err = do_fp_load(op, ea, regs, cross_endian); in emulate_loadstore()
3255 err = do_vec_load(op->reg, ea, size, regs, cross_endian); in emulate_loadstore()
3266 if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC)) in emulate_loadstore()
3270 err = do_vsx_load(op, ea, regs, cross_endian); in emulate_loadstore()
3277 rd = op->reg; in emulate_loadstore()
3299 err = emulate_stq(regs, ea, op->reg, cross_endian); in emulate_loadstore()
3303 if ((op->type & UPDATE) && size == sizeof(long) && in emulate_loadstore()
3304 op->reg == 1 && op->update_reg == 1 && in emulate_loadstore()
3311 do_byterev(&op->val, size); in emulate_loadstore()
3312 err = write_mem(op->val, ea, size, regs); in emulate_loadstore()
3319 err = do_fp_store(op, ea, regs, cross_endian); in emulate_loadstore()
3326 err = do_vec_store(op->reg, ea, size, regs, cross_endian); in emulate_loadstore()
3337 if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC)) in emulate_loadstore()
3341 err = do_vsx_store(op, ea, regs, cross_endian); in emulate_loadstore()
3348 rd = op->reg; in emulate_loadstore()
3373 if (op->type & UPDATE) in emulate_loadstore()
3374 regs->gpr[op->update_reg] = op->ea; in emulate_loadstore()
3389 struct instruction_op op; in emulate_step() local
3394 r = analyse_instr(&op, regs, instr); in emulate_step()
3398 emulate_update_regs(regs, &op); in emulate_step()
3403 type = GETTYPE(op.type); in emulate_step()
3406 err = emulate_loadstore(regs, &op); in emulate_step()
3414 ea = truncate_if_32bit(regs->msr, op.ea); in emulate_step()
3417 switch (op.type & CACHEOP_MASK) { in emulate_step()
3425 if (op.reg == 0) in emulate_step()
3429 if (op.reg == 0) in emulate_step()
3446 regs->gpr[op.reg] = regs->msr & MSR_MASK; in emulate_step()
3450 val = regs->gpr[op.reg]; in emulate_step()
3455 regs->msr = (regs->msr & ~op.val) | (val & op.val); in emulate_step()
3499 regs->nip = truncate_if_32bit(regs->msr, regs->nip + GETLENGTH(op.type)); in emulate_step()