Lines Matching refs:op
84 struct instruction_op *op) in branch_taken() argument
91 op->type |= DECCTR; in branch_taken()
458 static int do_fp_load(struct instruction_op *op, unsigned long ea, in do_fp_load() argument
471 nb = GETSIZE(op->type); in do_fp_load()
474 rn = op->reg; in do_fp_load()
485 if (op->type & FPCONV) in do_fp_load()
487 else if (op->type & SIGNEXT) in do_fp_load()
509 static int do_fp_store(struct instruction_op *op, unsigned long ea, in do_fp_store() argument
521 nb = GETSIZE(op->type); in do_fp_store()
524 rn = op->reg; in do_fp_store()
531 if (op->type & FPCONV) in do_fp_store()
656 void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg, in emulate_vsx_load() argument
665 size = GETSIZE(op->type); in emulate_vsx_load()
668 switch (op->element_size) { in emulate_vsx_load()
674 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) in emulate_vsx_load()
687 if (op->type & SIGNEXT) { in emulate_vsx_load()
690 } else if (op->vsx_flags & VSX_FPCONV) { in emulate_vsx_load()
700 } else if (op->vsx_flags & VSX_SPLAT) in emulate_vsx_load()
711 if (op->vsx_flags & VSX_SPLAT) { in emulate_vsx_load()
740 void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg, in emulate_vsx_store() argument
750 size = GETSIZE(op->type); in emulate_vsx_store()
752 switch (op->element_size) { in emulate_vsx_store()
757 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) in emulate_vsx_store()
771 if (size < 8 && op->vsx_flags & VSX_FPCONV) { in emulate_vsx_store()
816 static nokprobe_inline int do_vsx_load(struct instruction_op *op, in do_vsx_load() argument
820 int reg = op->reg; in do_vsx_load()
823 int size = GETSIZE(op->type); in do_vsx_load()
828 emulate_vsx_load(op, &buf, mem, cross_endian); in do_vsx_load()
848 static nokprobe_inline int do_vsx_store(struct instruction_op *op, in do_vsx_store() argument
852 int reg = op->reg; in do_vsx_store()
855 int size = GETSIZE(op->type); in do_vsx_store()
876 emulate_vsx_store(op, &buf, mem, cross_endian); in do_vsx_store()
907 #define __put_user_asmx(x, addr, err, op, cr) \ argument
909 "1: " op " %2,0,%3\n" \
920 #define __get_user_asmx(x, addr, err, op) \ argument
922 "1: "op" %1,0,%2\n" \
932 #define __cacheop_user_asmx(addr, err, op) \ argument
934 "1: "op" 0,%1\n" \
945 struct instruction_op *op) in set_cr0() argument
947 long val = op->val; in set_cr0()
949 op->type |= SETCC; in set_cr0()
950 op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000); in set_cr0()
956 op->ccval |= 0x80000000; in set_cr0()
958 op->ccval |= 0x40000000; in set_cr0()
960 op->ccval |= 0x20000000; in set_cr0()
963 static nokprobe_inline void set_ca32(struct instruction_op *op, bool val) in set_ca32() argument
967 op->xerval |= XER_CA32; in set_ca32()
969 op->xerval &= ~XER_CA32; in set_ca32()
974 struct instruction_op *op, int rd, in add_with_carry() argument
982 op->type = COMPUTE + SETREG + SETXER; in add_with_carry()
983 op->reg = rd; in add_with_carry()
984 op->val = val; in add_with_carry()
991 op->xerval = regs->xer; in add_with_carry()
993 op->xerval |= XER_CA; in add_with_carry()
995 op->xerval &= ~XER_CA; in add_with_carry()
997 set_ca32(op, (unsigned int)val < (unsigned int)val1 || in add_with_carry()
1002 struct instruction_op *op, in do_cmp_signed() argument
1007 op->type = COMPUTE + SETCC; in do_cmp_signed()
1016 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift); in do_cmp_signed()
1020 struct instruction_op *op, in do_cmp_unsigned() argument
1026 op->type = COMPUTE + SETCC; in do_cmp_unsigned()
1035 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift); in do_cmp_unsigned()
1039 struct instruction_op *op, in do_cmpb() argument
1051 op->val = out_val; in do_cmpb()
1059 struct instruction_op *op, in do_popcnt() argument
1070 op->val = out; in do_popcnt()
1076 op->val = out & 0x0000003f0000003fULL; in do_popcnt()
1081 op->val = out; /* popcntd */ in do_popcnt()
1086 struct instruction_op *op, in do_bpermd() argument
1099 op->val = perm; in do_bpermd()
1107 struct instruction_op *op, in do_prty() argument
1114 op->val = res & 0x0000000100000001ULL; in do_prty()
1119 op->val = res & 1; /*prtyd */ in do_prty()
1165 int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, in analyse_instr() argument
1174 op->type = COMPUTE; in analyse_instr()
1179 op->type = BRANCH; in analyse_instr()
1183 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1185 op->type |= SETLK; in analyse_instr()
1186 if (branch_taken(instr, regs, op)) in analyse_instr()
1187 op->type |= BRTAKEN; in analyse_instr()
1192 op->type = SYSCALL; in analyse_instr()
1194 op->type = UNKNOWN; in analyse_instr()
1198 op->type = BRANCH | BRTAKEN; in analyse_instr()
1204 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1206 op->type |= SETLK; in analyse_instr()
1211 op->type = COMPUTE + SETCC; in analyse_instr()
1217 op->ccval = (regs->ccr & ~(0xfUL << rd)) | (val << rd); in analyse_instr()
1222 op->type = BRANCH; in analyse_instr()
1224 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1226 op->type |= SETLK; in analyse_instr()
1227 if (branch_taken(instr, regs, op)) in analyse_instr()
1228 op->type |= BRTAKEN; in analyse_instr()
1234 op->type = RFI; in analyse_instr()
1238 op->type = BARRIER | BARRIER_ISYNC; in analyse_instr()
1249 op->type = COMPUTE + SETCC; in analyse_instr()
1256 op->ccval = (regs->ccr & ~(1UL << (31 - rd))) | in analyse_instr()
1264 op->type = BARRIER + BARRIER_SYNC; in analyse_instr()
1268 op->type = BARRIER + BARRIER_LWSYNC; in analyse_instr()
1271 op->type = BARRIER + BARRIER_PTESYNC; in analyse_instr()
1278 op->type = BARRIER + BARRIER_EIEIO; in analyse_instr()
1313 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1319 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1325 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1338 op->val = regs->gpr[ra] * (short) instr; in analyse_instr()
1343 add_with_carry(regs, op, rd, ~regs->gpr[ra], imm, 1); in analyse_instr()
1353 do_cmp_unsigned(regs, op, val, imm, rd >> 2); in analyse_instr()
1363 do_cmp_signed(regs, op, val, imm, rd >> 2); in analyse_instr()
1368 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); in analyse_instr()
1373 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); in analyse_instr()
1374 set_cr0(regs, op); in analyse_instr()
1381 op->val = imm; in analyse_instr()
1388 op->val = imm; in analyse_instr()
1396 op->val = regs->nip + (imm << 16) + 4; in analyse_instr()
1399 op->type = UNKNOWN; in analyse_instr()
1407 op->val = (regs->gpr[ra] & ~imm) | (ROTATE(val, rb) & imm); in analyse_instr()
1414 op->val = ROTATE(val, rb) & MASK32(mb, me); in analyse_instr()
1422 op->val = ROTATE(val, rb) & MASK32(mb, me); in analyse_instr()
1426 op->val = regs->gpr[rd] | (unsigned short) instr; in analyse_instr()
1431 op->val = regs->gpr[rd] | (imm << 16); in analyse_instr()
1435 op->val = regs->gpr[rd] ^ (unsigned short) instr; in analyse_instr()
1440 op->val = regs->gpr[rd] ^ (imm << 16); in analyse_instr()
1444 op->val = regs->gpr[rd] & (unsigned short) instr; in analyse_instr()
1445 set_cr0(regs, op); in analyse_instr()
1450 op->val = regs->gpr[rd] & (imm << 16); in analyse_instr()
1451 set_cr0(regs, op); in analyse_instr()
1476 op->val = val; in analyse_instr()
1483 op->val = val & MASK64_L(mb); in analyse_instr()
1486 op->val = val & MASK64_R(mb); in analyse_instr()
1491 op->type = UNKNOWN; /* illegal instruction */ in analyse_instr()
1501 op->val = (val) ? val2 : regs->gpr[rb]; in analyse_instr()
1521 op->type = MFMSR; in analyse_instr()
1522 op->reg = rd; in analyse_instr()
1527 op->type = MTMSR; in analyse_instr()
1528 op->reg = rd; in analyse_instr()
1529 op->val = 0xffffffff & ~(MSR_ME | MSR_LE); in analyse_instr()
1535 op->type = MTMSR; in analyse_instr()
1536 op->reg = rd; in analyse_instr()
1540 op->val = imm; in analyse_instr()
1554 op->val = regs->ccr & imm; in analyse_instr()
1558 op->type = COMPUTE + SETCC; in analyse_instr()
1561 op->ccval = regs->ccr; in analyse_instr()
1564 op->ccval = (op->ccval & ~imm) | in analyse_instr()
1572 op->type = MFSPR; in analyse_instr()
1573 op->reg = rd; in analyse_instr()
1574 op->spr = spr; in analyse_instr()
1582 op->type = MTSPR; in analyse_instr()
1583 op->val = regs->gpr[rd]; in analyse_instr()
1584 op->spr = spr; in analyse_instr()
1603 do_cmp_signed(regs, op, val, val2, rd >> 2); in analyse_instr()
1616 do_cmp_unsigned(regs, op, val, val2, rd >> 2); in analyse_instr()
1620 do_cmpb(regs, op, regs->gpr[rd], regs->gpr[rb]); in analyse_instr()
1627 add_with_carry(regs, op, rd, ~regs->gpr[ra], in analyse_instr()
1632 asm("mulhdu %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1637 add_with_carry(regs, op, rd, regs->gpr[ra], in analyse_instr()
1642 asm("mulhwu %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1647 op->val = regs->gpr[rb] - regs->gpr[ra]; in analyse_instr()
1651 asm("mulhd %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1656 asm("mulhw %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1661 op->val = -regs->gpr[ra]; in analyse_instr()
1665 add_with_carry(regs, op, rd, ~regs->gpr[ra], in analyse_instr()
1670 add_with_carry(regs, op, rd, regs->gpr[ra], in analyse_instr()
1675 add_with_carry(regs, op, rd, ~regs->gpr[ra], 0L, in analyse_instr()
1680 add_with_carry(regs, op, rd, regs->gpr[ra], 0L, in analyse_instr()
1685 add_with_carry(regs, op, rd, ~regs->gpr[ra], -1L, in analyse_instr()
1690 op->val = regs->gpr[ra] * regs->gpr[rb]; in analyse_instr()
1694 add_with_carry(regs, op, rd, regs->gpr[ra], -1L, in analyse_instr()
1699 op->val = (long)(int) regs->gpr[ra] * in analyse_instr()
1707 op->val = regs->gpr[ra] % regs->gpr[rb]; in analyse_instr()
1711 op->val = regs->gpr[ra] + regs->gpr[rb]; in analyse_instr()
1717 op->val = (unsigned int) regs->gpr[ra] % in analyse_instr()
1722 op->val = regs->gpr[ra] / regs->gpr[rb]; in analyse_instr()
1726 op->val = (unsigned int) regs->gpr[ra] / in analyse_instr()
1731 op->val = (long int) regs->gpr[ra] / in analyse_instr()
1736 op->val = (int) regs->gpr[ra] / in analyse_instr()
1746 asm volatile(PPC_DARN(%0, 0) : "=r" (op->val)); in analyse_instr()
1751 asm volatile(PPC_DARN(%0, 1) : "=r" (op->val)); in analyse_instr()
1756 asm volatile(PPC_DARN(%0, 2) : "=r" (op->val)); in analyse_instr()
1765 op->val = (long int) regs->gpr[ra] % in analyse_instr()
1772 op->val = (int) regs->gpr[ra] % in analyse_instr()
1782 op->val = ( val ? __builtin_clz(val) : 32 ); in analyse_instr()
1787 op->val = ( val ? __builtin_clzl(val) : 64 ); in analyse_instr()
1791 op->val = regs->gpr[rd] & regs->gpr[rb]; in analyse_instr()
1795 op->val = regs->gpr[rd] & ~regs->gpr[rb]; in analyse_instr()
1799 do_popcnt(regs, op, regs->gpr[rd], 8); in analyse_instr()
1803 op->val = ~(regs->gpr[rd] | regs->gpr[rb]); in analyse_instr()
1807 do_prty(regs, op, regs->gpr[rd], 32); in analyse_instr()
1811 do_prty(regs, op, regs->gpr[rd], 64); in analyse_instr()
1815 do_bpermd(regs, op, regs->gpr[rd], regs->gpr[rb]); in analyse_instr()
1819 op->val = ~(regs->gpr[rd] ^ regs->gpr[rb]); in analyse_instr()
1823 op->val = regs->gpr[rd] ^ regs->gpr[rb]; in analyse_instr()
1827 do_popcnt(regs, op, regs->gpr[rd], 32); in analyse_instr()
1831 op->val = regs->gpr[rd] | ~regs->gpr[rb]; in analyse_instr()
1835 op->val = regs->gpr[rd] | regs->gpr[rb]; in analyse_instr()
1839 op->val = ~(regs->gpr[rd] & regs->gpr[rb]); in analyse_instr()
1843 do_popcnt(regs, op, regs->gpr[rd], 64); in analyse_instr()
1850 op->val = (val ? __builtin_ctz(val) : 32); in analyse_instr()
1857 op->val = (val ? __builtin_ctzl(val) : 64); in analyse_instr()
1861 op->val = (signed short) regs->gpr[rd]; in analyse_instr()
1865 op->val = (signed char) regs->gpr[rd]; in analyse_instr()
1869 op->val = (signed int) regs->gpr[rd]; in analyse_instr()
1879 op->val = (regs->gpr[rd] << sh) & 0xffffffffUL; in analyse_instr()
1881 op->val = 0; in analyse_instr()
1887 op->val = (regs->gpr[rd] & 0xffffffffUL) >> sh; in analyse_instr()
1889 op->val = 0; in analyse_instr()
1893 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1896 op->val = ival >> (sh < 32 ? sh : 31); in analyse_instr()
1897 op->xerval = regs->xer; in analyse_instr()
1899 op->xerval |= XER_CA; in analyse_instr()
1901 op->xerval &= ~XER_CA; in analyse_instr()
1902 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
1906 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1909 op->val = ival >> sh; in analyse_instr()
1910 op->xerval = regs->xer; in analyse_instr()
1912 op->xerval |= XER_CA; in analyse_instr()
1914 op->xerval &= ~XER_CA; in analyse_instr()
1915 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
1922 op->val = regs->gpr[rd] << sh; in analyse_instr()
1924 op->val = 0; in analyse_instr()
1930 op->val = regs->gpr[rd] >> sh; in analyse_instr()
1932 op->val = 0; in analyse_instr()
1936 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1939 op->val = ival >> (sh < 64 ? sh : 63); in analyse_instr()
1940 op->xerval = regs->xer; in analyse_instr()
1942 op->xerval |= XER_CA; in analyse_instr()
1944 op->xerval &= ~XER_CA; in analyse_instr()
1945 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
1950 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1953 op->val = ival >> sh; in analyse_instr()
1954 op->xerval = regs->xer; in analyse_instr()
1956 op->xerval |= XER_CA; in analyse_instr()
1958 op->xerval &= ~XER_CA; in analyse_instr()
1959 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
1966 op->type = COMPUTE + SETREG; in analyse_instr()
1970 op->val = ROTATE(val, sh) & MASK64(0, 63 - sh); in analyse_instr()
1972 op->val = val; in analyse_instr()
1981 op->type = MKOP(CACHEOP, DCBST, 0); in analyse_instr()
1982 op->ea = xform_ea(instr, regs); in analyse_instr()
1986 op->type = MKOP(CACHEOP, DCBF, 0); in analyse_instr()
1987 op->ea = xform_ea(instr, regs); in analyse_instr()
1991 op->type = MKOP(CACHEOP, DCBTST, 0); in analyse_instr()
1992 op->ea = xform_ea(instr, regs); in analyse_instr()
1993 op->reg = rd; in analyse_instr()
1997 op->type = MKOP(CACHEOP, DCBTST, 0); in analyse_instr()
1998 op->ea = xform_ea(instr, regs); in analyse_instr()
1999 op->reg = rd; in analyse_instr()
2003 op->type = MKOP(CACHEOP, ICBI, 0); in analyse_instr()
2004 op->ea = xform_ea(instr, regs); in analyse_instr()
2008 op->type = MKOP(CACHEOP, DCBZ, 0); in analyse_instr()
2009 op->ea = xform_ea(instr, regs); in analyse_instr()
2018 op->type = UNKNOWN; in analyse_instr()
2019 op->update_reg = ra; in analyse_instr()
2020 op->reg = rd; in analyse_instr()
2021 op->val = regs->gpr[rd]; in analyse_instr()
2023 op->vsx_flags = 0; in analyse_instr()
2028 op->ea = xform_ea(instr, regs); in analyse_instr()
2031 op->type = MKOP(LARX, 0, 4); in analyse_instr()
2035 op->type = MKOP(STCX, 0, 4); in analyse_instr()
2040 op->type = MKOP(LARX, 0, 8); in analyse_instr()
2044 op->type = MKOP(STCX, 0, 8); in analyse_instr()
2048 op->type = MKOP(LARX, 0, 1); in analyse_instr()
2052 op->type = MKOP(STCX, 0, 1); in analyse_instr()
2056 op->type = MKOP(LARX, 0, 2); in analyse_instr()
2060 op->type = MKOP(STCX, 0, 2); in analyse_instr()
2065 op->type = MKOP(LARX, 0, 16); in analyse_instr()
2070 op->type = MKOP(STCX, 0, 16); in analyse_instr()
2076 op->type = MKOP(LOAD, u, 4); in analyse_instr()
2081 op->type = MKOP(LOAD, u, 1); in analyse_instr()
2090 op->type = MKOP(LOAD_VMX, 0, 1); in analyse_instr()
2091 op->element_size = 1; in analyse_instr()
2095 op->type = MKOP(LOAD_VMX, 0, 2); in analyse_instr()
2096 op->element_size = 2; in analyse_instr()
2100 op->type = MKOP(LOAD_VMX, 0, 4); in analyse_instr()
2101 op->element_size = 4; in analyse_instr()
2106 op->type = MKOP(LOAD_VMX, 0, 16); in analyse_instr()
2107 op->element_size = 16; in analyse_instr()
2111 op->type = MKOP(STORE_VMX, 0, 1); in analyse_instr()
2112 op->element_size = 1; in analyse_instr()
2116 op->type = MKOP(STORE_VMX, 0, 2); in analyse_instr()
2117 op->element_size = 2; in analyse_instr()
2121 op->type = MKOP(STORE_VMX, 0, 4); in analyse_instr()
2122 op->element_size = 4; in analyse_instr()
2127 op->type = MKOP(STORE_VMX, 0, 16); in analyse_instr()
2134 op->type = MKOP(LOAD, u, 8); in analyse_instr()
2139 op->type = MKOP(STORE, u, 8); in analyse_instr()
2145 op->type = MKOP(STORE, u, 4); in analyse_instr()
2150 op->type = MKOP(STORE, u, 1); in analyse_instr()
2155 op->type = MKOP(LOAD, u, 2); in analyse_instr()
2161 op->type = MKOP(LOAD, SIGNEXT | u, 4); in analyse_instr()
2167 op->type = MKOP(LOAD, SIGNEXT | u, 2); in analyse_instr()
2172 op->type = MKOP(STORE, u, 2); in analyse_instr()
2177 op->type = MKOP(LOAD, BYTEREV, 8); in analyse_instr()
2182 op->type = MKOP(LOAD_MULTI, 0, regs->xer & 0x7f); in analyse_instr()
2186 op->type = MKOP(LOAD, BYTEREV, 4); in analyse_instr()
2192 op->type = MKOP(LOAD_MULTI, 0, rb); in analyse_instr()
2193 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2199 op->type = MKOP(LOAD_FP, u | FPCONV, 4); in analyse_instr()
2204 op->type = MKOP(LOAD_FP, u, 8); in analyse_instr()
2209 op->type = MKOP(STORE_FP, u | FPCONV, 4); in analyse_instr()
2214 op->type = MKOP(STORE_FP, u, 8); in analyse_instr()
2219 op->type = MKOP(LOAD_FP, 0, 16); in analyse_instr()
2223 op->type = MKOP(LOAD_FP, SIGNEXT, 4); in analyse_instr()
2227 op->type = MKOP(LOAD_FP, 0, 4); in analyse_instr()
2231 op->type = MKOP(STORE_FP, 0, 16); in analyse_instr()
2235 op->type = MKOP(STORE_FP, 0, 4); in analyse_instr()
2242 op->type = MKOP(STORE, BYTEREV, 8); in analyse_instr()
2243 op->val = byterev_8(regs->gpr[rd]); in analyse_instr()
2248 op->type = MKOP(STORE_MULTI, 0, regs->xer & 0x7f); in analyse_instr()
2252 op->type = MKOP(STORE, BYTEREV, 4); in analyse_instr()
2253 op->val = byterev_4(regs->gpr[rd]); in analyse_instr()
2259 op->type = MKOP(STORE_MULTI, 0, rb); in analyse_instr()
2260 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2264 op->type = MKOP(LOAD, BYTEREV, 2); in analyse_instr()
2268 op->type = MKOP(STORE, BYTEREV, 2); in analyse_instr()
2269 op->val = byterev_2(regs->gpr[rd]); in analyse_instr()
2274 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2275 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2276 op->element_size = 8; in analyse_instr()
2280 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2281 op->type = MKOP(LOAD_VSX, SIGNEXT, 4); in analyse_instr()
2282 op->element_size = 8; in analyse_instr()
2286 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2287 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2288 op->element_size = 8; in analyse_instr()
2292 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2293 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2294 op->element_size = 16; in analyse_instr()
2295 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2301 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2302 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2306 op->type = MKOP(LOAD_VSX, 0, nb); in analyse_instr()
2307 op->element_size = 16; in analyse_instr()
2308 op->vsx_flags = ((instr & 0x20) ? VSX_LDLEFT : 0) | in analyse_instr()
2313 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2314 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2315 op->element_size = 8; in analyse_instr()
2316 op->vsx_flags = VSX_SPLAT; in analyse_instr()
2320 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2321 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2322 op->element_size = 4; in analyse_instr()
2323 op->vsx_flags = VSX_SPLAT | VSX_CHECK_VEC; in analyse_instr()
2327 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2328 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2329 op->element_size = 16; in analyse_instr()
2330 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2336 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2337 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2341 op->type = MKOP(STORE_VSX, 0, nb); in analyse_instr()
2342 op->element_size = 16; in analyse_instr()
2343 op->vsx_flags = ((instr & 0x20) ? VSX_LDLEFT : 0) | in analyse_instr()
2348 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2349 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2350 op->element_size = 8; in analyse_instr()
2351 op->vsx_flags = VSX_FPCONV; in analyse_instr()
2355 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2356 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2357 op->element_size = 8; in analyse_instr()
2361 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2362 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2363 op->element_size = 8; in analyse_instr()
2364 op->vsx_flags = VSX_FPCONV; in analyse_instr()
2368 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2369 op->type = MKOP(STORE_VSX, 0, 8); in analyse_instr()
2370 op->element_size = 8; in analyse_instr()
2374 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2375 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2376 op->element_size = 4; in analyse_instr()
2380 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2381 op->type = MKOP(LOAD_VSX, 0, 1); in analyse_instr()
2382 op->element_size = 8; in analyse_instr()
2383 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2387 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2388 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2389 op->element_size = 2; in analyse_instr()
2390 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2394 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2395 op->type = MKOP(LOAD_VSX, 0, 2); in analyse_instr()
2396 op->element_size = 8; in analyse_instr()
2397 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2401 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2402 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2403 op->element_size = 8; in analyse_instr()
2407 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2408 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2409 op->element_size = 1; in analyse_instr()
2410 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2414 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2415 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2416 op->element_size = 4; in analyse_instr()
2420 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2421 op->type = MKOP(STORE_VSX, 0, 1); in analyse_instr()
2422 op->element_size = 8; in analyse_instr()
2423 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2427 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2428 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2429 op->element_size = 2; in analyse_instr()
2430 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2434 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2435 op->type = MKOP(STORE_VSX, 0, 2); in analyse_instr()
2436 op->element_size = 8; in analyse_instr()
2437 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2441 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2442 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2443 op->element_size = 8; in analyse_instr()
2447 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2448 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2449 op->element_size = 1; in analyse_instr()
2450 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2459 op->type = MKOP(LOAD, u, 4); in analyse_instr()
2460 op->ea = dform_ea(instr, regs); in analyse_instr()
2465 op->type = MKOP(LOAD, u, 1); in analyse_instr()
2466 op->ea = dform_ea(instr, regs); in analyse_instr()
2471 op->type = MKOP(STORE, u, 4); in analyse_instr()
2472 op->ea = dform_ea(instr, regs); in analyse_instr()
2477 op->type = MKOP(STORE, u, 1); in analyse_instr()
2478 op->ea = dform_ea(instr, regs); in analyse_instr()
2483 op->type = MKOP(LOAD, u, 2); in analyse_instr()
2484 op->ea = dform_ea(instr, regs); in analyse_instr()
2489 op->type = MKOP(LOAD, SIGNEXT | u, 2); in analyse_instr()
2490 op->ea = dform_ea(instr, regs); in analyse_instr()
2495 op->type = MKOP(STORE, u, 2); in analyse_instr()
2496 op->ea = dform_ea(instr, regs); in analyse_instr()
2502 op->type = MKOP(LOAD_MULTI, 0, 4 * (32 - rd)); in analyse_instr()
2503 op->ea = dform_ea(instr, regs); in analyse_instr()
2507 op->type = MKOP(STORE_MULTI, 0, 4 * (32 - rd)); in analyse_instr()
2508 op->ea = dform_ea(instr, regs); in analyse_instr()
2514 op->type = MKOP(LOAD_FP, u | FPCONV, 4); in analyse_instr()
2515 op->ea = dform_ea(instr, regs); in analyse_instr()
2520 op->type = MKOP(LOAD_FP, u, 8); in analyse_instr()
2521 op->ea = dform_ea(instr, regs); in analyse_instr()
2526 op->type = MKOP(STORE_FP, u | FPCONV, 4); in analyse_instr()
2527 op->ea = dform_ea(instr, regs); in analyse_instr()
2532 op->type = MKOP(STORE_FP, u, 8); in analyse_instr()
2533 op->ea = dform_ea(instr, regs); in analyse_instr()
2540 op->type = MKOP(LOAD, 0, 16); in analyse_instr()
2541 op->ea = dqform_ea(instr, regs); in analyse_instr()
2547 op->ea = dsform_ea(instr, regs); in analyse_instr()
2552 op->type = MKOP(LOAD_FP, 0, 16); in analyse_instr()
2555 op->reg = rd + 32; in analyse_instr()
2556 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2557 op->element_size = 8; in analyse_instr()
2558 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2561 op->reg = rd + 32; in analyse_instr()
2562 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2563 op->element_size = 8; in analyse_instr()
2564 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2572 op->ea = dsform_ea(instr, regs); in analyse_instr()
2575 op->type = MKOP(LOAD, 0, 8); in analyse_instr()
2578 op->type = MKOP(LOAD, UPDATE, 8); in analyse_instr()
2581 op->type = MKOP(LOAD, SIGNEXT, 4); in analyse_instr()
2592 op->ea = dsform_ea(instr, regs); in analyse_instr()
2593 op->type = MKOP(STORE_FP, 0, 16); in analyse_instr()
2597 op->ea = dqform_ea(instr, regs); in analyse_instr()
2599 op->reg = rd + 32; in analyse_instr()
2600 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2601 op->element_size = 16; in analyse_instr()
2602 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2607 op->ea = dsform_ea(instr, regs); in analyse_instr()
2608 op->reg = rd + 32; in analyse_instr()
2609 op->type = MKOP(STORE_VSX, 0, 8); in analyse_instr()
2610 op->element_size = 8; in analyse_instr()
2611 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2616 op->ea = dsform_ea(instr, regs); in analyse_instr()
2617 op->reg = rd + 32; in analyse_instr()
2618 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2619 op->element_size = 8; in analyse_instr()
2620 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2624 op->ea = dqform_ea(instr, regs); in analyse_instr()
2626 op->reg = rd + 32; in analyse_instr()
2627 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2628 op->element_size = 16; in analyse_instr()
2629 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2637 op->ea = dsform_ea(instr, regs); in analyse_instr()
2640 op->type = MKOP(STORE, 0, 8); in analyse_instr()
2643 op->type = MKOP(STORE, UPDATE, 8); in analyse_instr()
2647 op->type = MKOP(STORE, 0, 16); in analyse_instr()
2656 if ((GETTYPE(op->type) == LOAD_VSX || in analyse_instr()
2657 GETTYPE(op->type) == STORE_VSX) && in analyse_instr()
2667 set_cr0(regs, op); in analyse_instr()
2669 op->reg = ra; in analyse_instr()
2670 op->type |= SETREG; in analyse_instr()
2675 set_cr0(regs, op); in analyse_instr()
2677 op->reg = rd; in analyse_instr()
2678 op->type |= SETREG; in analyse_instr()
2682 op->type = INTERRUPT | 0x700; in analyse_instr()
2683 op->val = SRR1_PROGPRIV; in analyse_instr()
2687 op->type = INTERRUPT | 0x700; in analyse_instr()
2688 op->val = SRR1_PROGTRAP; in analyse_instr()
2755 void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op) in emulate_update_regs() argument
2760 switch (GETTYPE(op->type)) { in emulate_update_regs()
2762 if (op->type & SETREG) in emulate_update_regs()
2763 regs->gpr[op->reg] = op->val; in emulate_update_regs()
2764 if (op->type & SETCC) in emulate_update_regs()
2765 regs->ccr = op->ccval; in emulate_update_regs()
2766 if (op->type & SETXER) in emulate_update_regs()
2767 regs->xer = op->xerval; in emulate_update_regs()
2771 if (op->type & SETLK) in emulate_update_regs()
2773 if (op->type & BRTAKEN) in emulate_update_regs()
2774 next_pc = op->val; in emulate_update_regs()
2775 if (op->type & DECCTR) in emulate_update_regs()
2780 switch (op->type & BARRIER_MASK) { in emulate_update_regs()
2800 switch (op->spr) { in emulate_update_regs()
2802 regs->gpr[op->reg] = regs->xer & 0xffffffffUL; in emulate_update_regs()
2805 regs->gpr[op->reg] = regs->link; in emulate_update_regs()
2808 regs->gpr[op->reg] = regs->ctr; in emulate_update_regs()
2816 switch (op->spr) { in emulate_update_regs()
2818 regs->xer = op->val & 0xffffffffUL; in emulate_update_regs()
2821 regs->link = op->val; in emulate_update_regs()
2824 regs->ctr = op->val; in emulate_update_regs()
2847 int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op) in emulate_loadstore() argument
2857 size = GETSIZE(op->type); in emulate_loadstore()
2858 type = GETTYPE(op->type); in emulate_loadstore()
2860 ea = truncate_if_32bit(regs->msr, op->ea); in emulate_loadstore()
2887 err = do_lqarx(ea, ®s->gpr[op->reg]); in emulate_loadstore()
2898 regs->gpr[op->reg] = val; in emulate_loadstore()
2910 __put_user_asmx(op->val, ea, err, "stbcx.", cr); in emulate_loadstore()
2913 __put_user_asmx(op->val, ea, err, "stbcx.", cr); in emulate_loadstore()
2917 __put_user_asmx(op->val, ea, err, "stwcx.", cr); in emulate_loadstore()
2921 __put_user_asmx(op->val, ea, err, "stdcx.", cr); in emulate_loadstore()
2924 err = do_stqcx(ea, regs->gpr[op->reg], in emulate_loadstore()
2925 regs->gpr[op->reg + 1], &cr); in emulate_loadstore()
2942 err = emulate_lq(regs, ea, op->reg, cross_endian); in emulate_loadstore()
2946 err = read_mem(®s->gpr[op->reg], ea, size, regs); in emulate_loadstore()
2948 if (op->type & SIGNEXT) in emulate_loadstore()
2949 do_signext(®s->gpr[op->reg], size); in emulate_loadstore()
2950 if ((op->type & BYTEREV) == (cross_endian ? 0 : BYTEREV)) in emulate_loadstore()
2951 do_byterev(®s->gpr[op->reg], size); in emulate_loadstore()
2965 err = do_fp_load(op, ea, regs, cross_endian); in emulate_loadstore()
2972 err = do_vec_load(op->reg, ea, size, regs, cross_endian); in emulate_loadstore()
2983 if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC)) in emulate_loadstore()
2987 err = do_vsx_load(op, ea, regs, cross_endian); in emulate_loadstore()
2994 rd = op->reg; in emulate_loadstore()
3016 err = emulate_stq(regs, ea, op->reg, cross_endian); in emulate_loadstore()
3020 if ((op->type & UPDATE) && size == sizeof(long) && in emulate_loadstore()
3021 op->reg == 1 && op->update_reg == 1 && in emulate_loadstore()
3028 do_byterev(&op->val, size); in emulate_loadstore()
3029 err = write_mem(op->val, ea, size, regs); in emulate_loadstore()
3036 err = do_fp_store(op, ea, regs, cross_endian); in emulate_loadstore()
3043 err = do_vec_store(op->reg, ea, size, regs, cross_endian); in emulate_loadstore()
3054 if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC)) in emulate_loadstore()
3058 err = do_vsx_store(op, ea, regs, cross_endian); in emulate_loadstore()
3065 rd = op->reg; in emulate_loadstore()
3090 if (op->type & UPDATE) in emulate_loadstore()
3091 regs->gpr[op->update_reg] = op->ea; in emulate_loadstore()
3106 struct instruction_op op; in emulate_step() local
3111 r = analyse_instr(&op, regs, instr); in emulate_step()
3115 emulate_update_regs(regs, &op); in emulate_step()
3120 type = GETTYPE(op.type); in emulate_step()
3123 err = emulate_loadstore(regs, &op); in emulate_step()
3131 ea = truncate_if_32bit(regs->msr, op.ea); in emulate_step()
3134 switch (op.type & CACHEOP_MASK) { in emulate_step()
3142 if (op.reg == 0) in emulate_step()
3146 if (op.reg == 0) in emulate_step()
3163 regs->gpr[op.reg] = regs->msr & MSR_MASK; in emulate_step()
3167 val = regs->gpr[op.reg]; in emulate_step()
3172 regs->msr = (regs->msr & ~op.val) | (val & op.val); in emulate_step()