Lines Matching refs:op
88 struct instruction_op *op) in branch_taken() argument
95 op->type |= DECCTR; in branch_taken()
462 static int do_fp_load(struct instruction_op *op, unsigned long ea, in do_fp_load() argument
475 nb = GETSIZE(op->type); in do_fp_load()
478 rn = op->reg; in do_fp_load()
489 if (op->type & FPCONV) in do_fp_load()
491 else if (op->type & SIGNEXT) in do_fp_load()
513 static int do_fp_store(struct instruction_op *op, unsigned long ea, in do_fp_store() argument
525 nb = GETSIZE(op->type); in do_fp_store()
528 rn = op->reg; in do_fp_store()
535 if (op->type & FPCONV) in do_fp_store()
660 void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg, in emulate_vsx_load() argument
669 size = GETSIZE(op->type); in emulate_vsx_load()
672 switch (op->element_size) { in emulate_vsx_load()
678 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) in emulate_vsx_load()
691 if (op->type & SIGNEXT) { in emulate_vsx_load()
694 } else if (op->vsx_flags & VSX_FPCONV) { in emulate_vsx_load()
704 } else if (op->vsx_flags & VSX_SPLAT) in emulate_vsx_load()
715 if (op->vsx_flags & VSX_SPLAT) { in emulate_vsx_load()
744 void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg, in emulate_vsx_store() argument
754 size = GETSIZE(op->type); in emulate_vsx_store()
756 switch (op->element_size) { in emulate_vsx_store()
761 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) in emulate_vsx_store()
775 if (size < 8 && op->vsx_flags & VSX_FPCONV) { in emulate_vsx_store()
820 static nokprobe_inline int do_vsx_load(struct instruction_op *op, in do_vsx_load() argument
824 int reg = op->reg; in do_vsx_load()
827 int size = GETSIZE(op->type); in do_vsx_load()
832 emulate_vsx_load(op, &buf, mem, cross_endian); in do_vsx_load()
852 static nokprobe_inline int do_vsx_store(struct instruction_op *op, in do_vsx_store() argument
856 int reg = op->reg; in do_vsx_store()
859 int size = GETSIZE(op->type); in do_vsx_store()
880 emulate_vsx_store(op, &buf, mem, cross_endian); in do_vsx_store()
911 #define __put_user_asmx(x, addr, err, op, cr) \ argument
913 "1: " op " %2,0,%3\n" \
924 #define __get_user_asmx(x, addr, err, op) \ argument
926 "1: "op" %1,0,%2\n" \
936 #define __cacheop_user_asmx(addr, err, op) \ argument
938 "1: "op" 0,%1\n" \
949 struct instruction_op *op) in set_cr0() argument
951 long val = op->val; in set_cr0()
953 op->type |= SETCC; in set_cr0()
954 op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000); in set_cr0()
960 op->ccval |= 0x80000000; in set_cr0()
962 op->ccval |= 0x40000000; in set_cr0()
964 op->ccval |= 0x20000000; in set_cr0()
967 static nokprobe_inline void set_ca32(struct instruction_op *op, bool val) in set_ca32() argument
971 op->xerval |= XER_CA32; in set_ca32()
973 op->xerval &= ~XER_CA32; in set_ca32()
978 struct instruction_op *op, int rd, in add_with_carry() argument
986 op->type = COMPUTE + SETREG + SETXER; in add_with_carry()
987 op->reg = rd; in add_with_carry()
988 op->val = val; in add_with_carry()
995 op->xerval = regs->xer; in add_with_carry()
997 op->xerval |= XER_CA; in add_with_carry()
999 op->xerval &= ~XER_CA; in add_with_carry()
1001 set_ca32(op, (unsigned int)val < (unsigned int)val1 || in add_with_carry()
1006 struct instruction_op *op, in do_cmp_signed() argument
1011 op->type = COMPUTE + SETCC; in do_cmp_signed()
1020 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift); in do_cmp_signed()
1024 struct instruction_op *op, in do_cmp_unsigned() argument
1030 op->type = COMPUTE + SETCC; in do_cmp_unsigned()
1039 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift); in do_cmp_unsigned()
1043 struct instruction_op *op, in do_cmpb() argument
1055 op->val = out_val; in do_cmpb()
1063 struct instruction_op *op, in do_popcnt() argument
1074 op->val = out; in do_popcnt()
1080 op->val = out & 0x0000003f0000003fULL; in do_popcnt()
1085 op->val = out; /* popcntd */ in do_popcnt()
1090 struct instruction_op *op, in do_bpermd() argument
1103 op->val = perm; in do_bpermd()
1111 struct instruction_op *op, in do_prty() argument
1118 op->val = res & 0x0000000100000001ULL; in do_prty()
1123 op->val = res & 1; /*prtyd */ in do_prty()
1169 int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, in analyse_instr() argument
1178 op->type = COMPUTE; in analyse_instr()
1183 op->type = BRANCH; in analyse_instr()
1187 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1189 op->type |= SETLK; in analyse_instr()
1190 if (branch_taken(instr, regs, op)) in analyse_instr()
1191 op->type |= BRTAKEN; in analyse_instr()
1196 op->type = SYSCALL; in analyse_instr()
1198 op->type = UNKNOWN; in analyse_instr()
1202 op->type = BRANCH | BRTAKEN; in analyse_instr()
1208 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1210 op->type |= SETLK; in analyse_instr()
1215 op->type = COMPUTE + SETCC; in analyse_instr()
1221 op->ccval = (regs->ccr & ~(0xfUL << rd)) | (val << rd); in analyse_instr()
1226 op->type = BRANCH; in analyse_instr()
1228 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1230 op->type |= SETLK; in analyse_instr()
1231 if (branch_taken(instr, regs, op)) in analyse_instr()
1232 op->type |= BRTAKEN; in analyse_instr()
1238 op->type = RFI; in analyse_instr()
1242 op->type = BARRIER | BARRIER_ISYNC; in analyse_instr()
1253 op->type = COMPUTE + SETCC; in analyse_instr()
1260 op->ccval = (regs->ccr & ~(1UL << (31 - rd))) | in analyse_instr()
1268 op->type = BARRIER + BARRIER_SYNC; in analyse_instr()
1272 op->type = BARRIER + BARRIER_LWSYNC; in analyse_instr()
1275 op->type = BARRIER + BARRIER_PTESYNC; in analyse_instr()
1282 op->type = BARRIER + BARRIER_EIEIO; in analyse_instr()
1309 op->val = regs->gpr[ra] * (short) instr; in analyse_instr()
1314 add_with_carry(regs, op, rd, ~regs->gpr[ra], imm, 1); in analyse_instr()
1324 do_cmp_unsigned(regs, op, val, imm, rd >> 2); in analyse_instr()
1334 do_cmp_signed(regs, op, val, imm, rd >> 2); in analyse_instr()
1339 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); in analyse_instr()
1344 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); in analyse_instr()
1345 set_cr0(regs, op); in analyse_instr()
1352 op->val = imm; in analyse_instr()
1359 op->val = imm; in analyse_instr()
1367 op->val = regs->nip + (imm << 16) + 4; in analyse_instr()
1370 op->type = UNKNOWN; in analyse_instr()
1378 op->val = (regs->gpr[ra] & ~imm) | (ROTATE(val, rb) & imm); in analyse_instr()
1385 op->val = ROTATE(val, rb) & MASK32(mb, me); in analyse_instr()
1393 op->val = ROTATE(val, rb) & MASK32(mb, me); in analyse_instr()
1397 op->val = regs->gpr[rd] | (unsigned short) instr; in analyse_instr()
1402 op->val = regs->gpr[rd] | (imm << 16); in analyse_instr()
1406 op->val = regs->gpr[rd] ^ (unsigned short) instr; in analyse_instr()
1411 op->val = regs->gpr[rd] ^ (imm << 16); in analyse_instr()
1415 op->val = regs->gpr[rd] & (unsigned short) instr; in analyse_instr()
1416 set_cr0(regs, op); in analyse_instr()
1421 op->val = regs->gpr[rd] & (imm << 16); in analyse_instr()
1422 set_cr0(regs, op); in analyse_instr()
1447 op->val = val; in analyse_instr()
1454 op->val = val & MASK64_L(mb); in analyse_instr()
1457 op->val = val & MASK64_R(mb); in analyse_instr()
1462 op->type = UNKNOWN; /* illegal instruction */ in analyse_instr()
1472 op->val = (val) ? val2 : regs->gpr[rb]; in analyse_instr()
1492 op->type = MFMSR; in analyse_instr()
1493 op->reg = rd; in analyse_instr()
1498 op->type = MTMSR; in analyse_instr()
1499 op->reg = rd; in analyse_instr()
1500 op->val = 0xffffffff & ~(MSR_ME | MSR_LE); in analyse_instr()
1506 op->type = MTMSR; in analyse_instr()
1507 op->reg = rd; in analyse_instr()
1511 op->val = imm; in analyse_instr()
1525 op->val = regs->ccr & imm; in analyse_instr()
1529 op->type = COMPUTE + SETCC; in analyse_instr()
1532 op->ccval = regs->ccr; in analyse_instr()
1535 op->ccval = (op->ccval & ~imm) | in analyse_instr()
1543 op->type = MFSPR; in analyse_instr()
1544 op->reg = rd; in analyse_instr()
1545 op->spr = spr; in analyse_instr()
1553 op->type = MTSPR; in analyse_instr()
1554 op->val = regs->gpr[rd]; in analyse_instr()
1555 op->spr = spr; in analyse_instr()
1574 do_cmp_signed(regs, op, val, val2, rd >> 2); in analyse_instr()
1587 do_cmp_unsigned(regs, op, val, val2, rd >> 2); in analyse_instr()
1591 do_cmpb(regs, op, regs->gpr[rd], regs->gpr[rb]); in analyse_instr()
1598 add_with_carry(regs, op, rd, ~regs->gpr[ra], in analyse_instr()
1603 asm("mulhdu %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1608 add_with_carry(regs, op, rd, regs->gpr[ra], in analyse_instr()
1613 asm("mulhwu %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1618 op->val = regs->gpr[rb] - regs->gpr[ra]; in analyse_instr()
1622 asm("mulhd %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1627 asm("mulhw %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1632 op->val = -regs->gpr[ra]; in analyse_instr()
1636 add_with_carry(regs, op, rd, ~regs->gpr[ra], in analyse_instr()
1641 add_with_carry(regs, op, rd, regs->gpr[ra], in analyse_instr()
1646 add_with_carry(regs, op, rd, ~regs->gpr[ra], 0L, in analyse_instr()
1651 add_with_carry(regs, op, rd, regs->gpr[ra], 0L, in analyse_instr()
1656 add_with_carry(regs, op, rd, ~regs->gpr[ra], -1L, in analyse_instr()
1661 op->val = regs->gpr[ra] * regs->gpr[rb]; in analyse_instr()
1665 add_with_carry(regs, op, rd, regs->gpr[ra], -1L, in analyse_instr()
1670 op->val = (long)(int) regs->gpr[ra] * in analyse_instr()
1676 op->val = regs->gpr[ra] + regs->gpr[rb]; in analyse_instr()
1680 op->val = regs->gpr[ra] / regs->gpr[rb]; in analyse_instr()
1684 op->val = (unsigned int) regs->gpr[ra] / in analyse_instr()
1689 op->val = (long int) regs->gpr[ra] / in analyse_instr()
1694 op->val = (int) regs->gpr[ra] / in analyse_instr()
1704 op->val = ( val ? __builtin_clz(val) : 32 ); in analyse_instr()
1709 op->val = ( val ? __builtin_clzl(val) : 64 ); in analyse_instr()
1713 op->val = regs->gpr[rd] & regs->gpr[rb]; in analyse_instr()
1717 op->val = regs->gpr[rd] & ~regs->gpr[rb]; in analyse_instr()
1721 do_popcnt(regs, op, regs->gpr[rd], 8); in analyse_instr()
1725 op->val = ~(regs->gpr[rd] | regs->gpr[rb]); in analyse_instr()
1729 do_prty(regs, op, regs->gpr[rd], 32); in analyse_instr()
1733 do_prty(regs, op, regs->gpr[rd], 64); in analyse_instr()
1737 do_bpermd(regs, op, regs->gpr[rd], regs->gpr[rb]); in analyse_instr()
1741 op->val = ~(regs->gpr[rd] ^ regs->gpr[rb]); in analyse_instr()
1745 op->val = regs->gpr[rd] ^ regs->gpr[rb]; in analyse_instr()
1749 do_popcnt(regs, op, regs->gpr[rd], 32); in analyse_instr()
1753 op->val = regs->gpr[rd] | ~regs->gpr[rb]; in analyse_instr()
1757 op->val = regs->gpr[rd] | regs->gpr[rb]; in analyse_instr()
1761 op->val = ~(regs->gpr[rd] & regs->gpr[rb]); in analyse_instr()
1765 do_popcnt(regs, op, regs->gpr[rd], 64); in analyse_instr()
1769 op->val = (signed short) regs->gpr[rd]; in analyse_instr()
1773 op->val = (signed char) regs->gpr[rd]; in analyse_instr()
1777 op->val = (signed int) regs->gpr[rd]; in analyse_instr()
1787 op->val = (regs->gpr[rd] << sh) & 0xffffffffUL; in analyse_instr()
1789 op->val = 0; in analyse_instr()
1795 op->val = (regs->gpr[rd] & 0xffffffffUL) >> sh; in analyse_instr()
1797 op->val = 0; in analyse_instr()
1801 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1804 op->val = ival >> (sh < 32 ? sh : 31); in analyse_instr()
1805 op->xerval = regs->xer; in analyse_instr()
1807 op->xerval |= XER_CA; in analyse_instr()
1809 op->xerval &= ~XER_CA; in analyse_instr()
1810 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
1814 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1817 op->val = ival >> sh; in analyse_instr()
1818 op->xerval = regs->xer; in analyse_instr()
1820 op->xerval |= XER_CA; in analyse_instr()
1822 op->xerval &= ~XER_CA; in analyse_instr()
1823 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
1830 op->val = regs->gpr[rd] << sh; in analyse_instr()
1832 op->val = 0; in analyse_instr()
1838 op->val = regs->gpr[rd] >> sh; in analyse_instr()
1840 op->val = 0; in analyse_instr()
1844 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1847 op->val = ival >> (sh < 64 ? sh : 63); in analyse_instr()
1848 op->xerval = regs->xer; in analyse_instr()
1850 op->xerval |= XER_CA; in analyse_instr()
1852 op->xerval &= ~XER_CA; in analyse_instr()
1853 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
1858 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
1861 op->val = ival >> sh; in analyse_instr()
1862 op->xerval = regs->xer; in analyse_instr()
1864 op->xerval |= XER_CA; in analyse_instr()
1866 op->xerval &= ~XER_CA; in analyse_instr()
1867 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
1875 op->type = MKOP(CACHEOP, DCBST, 0); in analyse_instr()
1876 op->ea = xform_ea(instr, regs); in analyse_instr()
1880 op->type = MKOP(CACHEOP, DCBF, 0); in analyse_instr()
1881 op->ea = xform_ea(instr, regs); in analyse_instr()
1885 op->type = MKOP(CACHEOP, DCBTST, 0); in analyse_instr()
1886 op->ea = xform_ea(instr, regs); in analyse_instr()
1887 op->reg = rd; in analyse_instr()
1891 op->type = MKOP(CACHEOP, DCBTST, 0); in analyse_instr()
1892 op->ea = xform_ea(instr, regs); in analyse_instr()
1893 op->reg = rd; in analyse_instr()
1897 op->type = MKOP(CACHEOP, ICBI, 0); in analyse_instr()
1898 op->ea = xform_ea(instr, regs); in analyse_instr()
1902 op->type = MKOP(CACHEOP, DCBZ, 0); in analyse_instr()
1903 op->ea = xform_ea(instr, regs); in analyse_instr()
1912 op->type = UNKNOWN; in analyse_instr()
1913 op->update_reg = ra; in analyse_instr()
1914 op->reg = rd; in analyse_instr()
1915 op->val = regs->gpr[rd]; in analyse_instr()
1917 op->vsx_flags = 0; in analyse_instr()
1922 op->ea = xform_ea(instr, regs); in analyse_instr()
1925 op->type = MKOP(LARX, 0, 4); in analyse_instr()
1929 op->type = MKOP(STCX, 0, 4); in analyse_instr()
1934 op->type = MKOP(LARX, 0, 8); in analyse_instr()
1938 op->type = MKOP(STCX, 0, 8); in analyse_instr()
1942 op->type = MKOP(LARX, 0, 1); in analyse_instr()
1946 op->type = MKOP(STCX, 0, 1); in analyse_instr()
1950 op->type = MKOP(LARX, 0, 2); in analyse_instr()
1954 op->type = MKOP(STCX, 0, 2); in analyse_instr()
1959 op->type = MKOP(LARX, 0, 16); in analyse_instr()
1964 op->type = MKOP(STCX, 0, 16); in analyse_instr()
1970 op->type = MKOP(LOAD, u, 4); in analyse_instr()
1975 op->type = MKOP(LOAD, u, 1); in analyse_instr()
1984 op->type = MKOP(LOAD_VMX, 0, 1); in analyse_instr()
1985 op->element_size = 1; in analyse_instr()
1989 op->type = MKOP(LOAD_VMX, 0, 2); in analyse_instr()
1990 op->element_size = 2; in analyse_instr()
1994 op->type = MKOP(LOAD_VMX, 0, 4); in analyse_instr()
1995 op->element_size = 4; in analyse_instr()
2000 op->type = MKOP(LOAD_VMX, 0, 16); in analyse_instr()
2001 op->element_size = 16; in analyse_instr()
2005 op->type = MKOP(STORE_VMX, 0, 1); in analyse_instr()
2006 op->element_size = 1; in analyse_instr()
2010 op->type = MKOP(STORE_VMX, 0, 2); in analyse_instr()
2011 op->element_size = 2; in analyse_instr()
2015 op->type = MKOP(STORE_VMX, 0, 4); in analyse_instr()
2016 op->element_size = 4; in analyse_instr()
2021 op->type = MKOP(STORE_VMX, 0, 16); in analyse_instr()
2028 op->type = MKOP(LOAD, u, 8); in analyse_instr()
2033 op->type = MKOP(STORE, u, 8); in analyse_instr()
2039 op->type = MKOP(STORE, u, 4); in analyse_instr()
2044 op->type = MKOP(STORE, u, 1); in analyse_instr()
2049 op->type = MKOP(LOAD, u, 2); in analyse_instr()
2055 op->type = MKOP(LOAD, SIGNEXT | u, 4); in analyse_instr()
2061 op->type = MKOP(LOAD, SIGNEXT | u, 2); in analyse_instr()
2066 op->type = MKOP(STORE, u, 2); in analyse_instr()
2071 op->type = MKOP(LOAD, BYTEREV, 8); in analyse_instr()
2076 op->type = MKOP(LOAD_MULTI, 0, regs->xer & 0x7f); in analyse_instr()
2080 op->type = MKOP(LOAD, BYTEREV, 4); in analyse_instr()
2086 op->type = MKOP(LOAD_MULTI, 0, rb); in analyse_instr()
2087 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2093 op->type = MKOP(LOAD_FP, u | FPCONV, 4); in analyse_instr()
2098 op->type = MKOP(LOAD_FP, u, 8); in analyse_instr()
2103 op->type = MKOP(STORE_FP, u | FPCONV, 4); in analyse_instr()
2108 op->type = MKOP(STORE_FP, u, 8); in analyse_instr()
2113 op->type = MKOP(LOAD_FP, 0, 16); in analyse_instr()
2117 op->type = MKOP(LOAD_FP, SIGNEXT, 4); in analyse_instr()
2121 op->type = MKOP(LOAD_FP, 0, 4); in analyse_instr()
2125 op->type = MKOP(STORE_FP, 0, 16); in analyse_instr()
2129 op->type = MKOP(STORE_FP, 0, 4); in analyse_instr()
2136 op->type = MKOP(STORE, BYTEREV, 8); in analyse_instr()
2137 op->val = byterev_8(regs->gpr[rd]); in analyse_instr()
2142 op->type = MKOP(STORE_MULTI, 0, regs->xer & 0x7f); in analyse_instr()
2146 op->type = MKOP(STORE, BYTEREV, 4); in analyse_instr()
2147 op->val = byterev_4(regs->gpr[rd]); in analyse_instr()
2153 op->type = MKOP(STORE_MULTI, 0, rb); in analyse_instr()
2154 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2158 op->type = MKOP(LOAD, BYTEREV, 2); in analyse_instr()
2162 op->type = MKOP(STORE, BYTEREV, 2); in analyse_instr()
2163 op->val = byterev_2(regs->gpr[rd]); in analyse_instr()
2168 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2169 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2170 op->element_size = 8; in analyse_instr()
2174 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2175 op->type = MKOP(LOAD_VSX, SIGNEXT, 4); in analyse_instr()
2176 op->element_size = 8; in analyse_instr()
2180 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2181 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2182 op->element_size = 8; in analyse_instr()
2186 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2187 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2188 op->element_size = 16; in analyse_instr()
2189 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2195 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2196 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2200 op->type = MKOP(LOAD_VSX, 0, nb); in analyse_instr()
2201 op->element_size = 16; in analyse_instr()
2202 op->vsx_flags = ((instr & 0x20) ? VSX_LDLEFT : 0) | in analyse_instr()
2207 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2208 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2209 op->element_size = 8; in analyse_instr()
2210 op->vsx_flags = VSX_SPLAT; in analyse_instr()
2214 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2215 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2216 op->element_size = 4; in analyse_instr()
2217 op->vsx_flags = VSX_SPLAT | VSX_CHECK_VEC; in analyse_instr()
2221 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2222 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2223 op->element_size = 16; in analyse_instr()
2224 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2230 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2231 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2235 op->type = MKOP(STORE_VSX, 0, nb); in analyse_instr()
2236 op->element_size = 16; in analyse_instr()
2237 op->vsx_flags = ((instr & 0x20) ? VSX_LDLEFT : 0) | in analyse_instr()
2242 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2243 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2244 op->element_size = 8; in analyse_instr()
2245 op->vsx_flags = VSX_FPCONV; in analyse_instr()
2249 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2250 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2251 op->element_size = 8; in analyse_instr()
2255 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2256 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2257 op->element_size = 8; in analyse_instr()
2258 op->vsx_flags = VSX_FPCONV; in analyse_instr()
2262 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2263 op->type = MKOP(STORE_VSX, 0, 8); in analyse_instr()
2264 op->element_size = 8; in analyse_instr()
2268 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2269 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2270 op->element_size = 4; in analyse_instr()
2274 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2275 op->type = MKOP(LOAD_VSX, 0, 1); in analyse_instr()
2276 op->element_size = 8; in analyse_instr()
2277 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2281 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2282 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2283 op->element_size = 2; in analyse_instr()
2284 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2288 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2289 op->type = MKOP(LOAD_VSX, 0, 2); in analyse_instr()
2290 op->element_size = 8; in analyse_instr()
2291 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2295 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2296 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2297 op->element_size = 8; in analyse_instr()
2301 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2302 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2303 op->element_size = 1; in analyse_instr()
2304 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2308 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2309 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2310 op->element_size = 4; in analyse_instr()
2314 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2315 op->type = MKOP(STORE_VSX, 0, 1); in analyse_instr()
2316 op->element_size = 8; in analyse_instr()
2317 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2321 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2322 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2323 op->element_size = 2; in analyse_instr()
2324 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2328 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2329 op->type = MKOP(STORE_VSX, 0, 2); in analyse_instr()
2330 op->element_size = 8; in analyse_instr()
2331 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2335 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2336 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2337 op->element_size = 8; in analyse_instr()
2341 op->reg = rd | ((instr & 1) << 5); in analyse_instr()
2342 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2343 op->element_size = 1; in analyse_instr()
2344 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2353 op->type = MKOP(LOAD, u, 4); in analyse_instr()
2354 op->ea = dform_ea(instr, regs); in analyse_instr()
2359 op->type = MKOP(LOAD, u, 1); in analyse_instr()
2360 op->ea = dform_ea(instr, regs); in analyse_instr()
2365 op->type = MKOP(STORE, u, 4); in analyse_instr()
2366 op->ea = dform_ea(instr, regs); in analyse_instr()
2371 op->type = MKOP(STORE, u, 1); in analyse_instr()
2372 op->ea = dform_ea(instr, regs); in analyse_instr()
2377 op->type = MKOP(LOAD, u, 2); in analyse_instr()
2378 op->ea = dform_ea(instr, regs); in analyse_instr()
2383 op->type = MKOP(LOAD, SIGNEXT | u, 2); in analyse_instr()
2384 op->ea = dform_ea(instr, regs); in analyse_instr()
2389 op->type = MKOP(STORE, u, 2); in analyse_instr()
2390 op->ea = dform_ea(instr, regs); in analyse_instr()
2396 op->type = MKOP(LOAD_MULTI, 0, 4 * (32 - rd)); in analyse_instr()
2397 op->ea = dform_ea(instr, regs); in analyse_instr()
2401 op->type = MKOP(STORE_MULTI, 0, 4 * (32 - rd)); in analyse_instr()
2402 op->ea = dform_ea(instr, regs); in analyse_instr()
2408 op->type = MKOP(LOAD_FP, u | FPCONV, 4); in analyse_instr()
2409 op->ea = dform_ea(instr, regs); in analyse_instr()
2414 op->type = MKOP(LOAD_FP, u, 8); in analyse_instr()
2415 op->ea = dform_ea(instr, regs); in analyse_instr()
2420 op->type = MKOP(STORE_FP, u | FPCONV, 4); in analyse_instr()
2421 op->ea = dform_ea(instr, regs); in analyse_instr()
2426 op->type = MKOP(STORE_FP, u, 8); in analyse_instr()
2427 op->ea = dform_ea(instr, regs); in analyse_instr()
2434 op->type = MKOP(LOAD, 0, 16); in analyse_instr()
2435 op->ea = dqform_ea(instr, regs); in analyse_instr()
2441 op->ea = dsform_ea(instr, regs); in analyse_instr()
2446 op->type = MKOP(LOAD_FP, 0, 16); in analyse_instr()
2449 op->reg = rd + 32; in analyse_instr()
2450 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2451 op->element_size = 8; in analyse_instr()
2452 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2455 op->reg = rd + 32; in analyse_instr()
2456 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2457 op->element_size = 8; in analyse_instr()
2458 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2466 op->ea = dsform_ea(instr, regs); in analyse_instr()
2469 op->type = MKOP(LOAD, 0, 8); in analyse_instr()
2472 op->type = MKOP(LOAD, UPDATE, 8); in analyse_instr()
2475 op->type = MKOP(LOAD, SIGNEXT, 4); in analyse_instr()
2486 op->ea = dsform_ea(instr, regs); in analyse_instr()
2487 op->type = MKOP(STORE_FP, 0, 16); in analyse_instr()
2491 op->ea = dqform_ea(instr, regs); in analyse_instr()
2493 op->reg = rd + 32; in analyse_instr()
2494 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2495 op->element_size = 16; in analyse_instr()
2496 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2501 op->ea = dsform_ea(instr, regs); in analyse_instr()
2502 op->reg = rd + 32; in analyse_instr()
2503 op->type = MKOP(STORE_VSX, 0, 8); in analyse_instr()
2504 op->element_size = 8; in analyse_instr()
2505 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2510 op->ea = dsform_ea(instr, regs); in analyse_instr()
2511 op->reg = rd + 32; in analyse_instr()
2512 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2513 op->element_size = 8; in analyse_instr()
2514 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2518 op->ea = dqform_ea(instr, regs); in analyse_instr()
2520 op->reg = rd + 32; in analyse_instr()
2521 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2522 op->element_size = 16; in analyse_instr()
2523 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2531 op->ea = dsform_ea(instr, regs); in analyse_instr()
2534 op->type = MKOP(STORE, 0, 8); in analyse_instr()
2537 op->type = MKOP(STORE, UPDATE, 8); in analyse_instr()
2541 op->type = MKOP(STORE, 0, 16); in analyse_instr()
2550 if ((GETTYPE(op->type) == LOAD_VSX || in analyse_instr()
2551 GETTYPE(op->type) == STORE_VSX) && in analyse_instr()
2561 set_cr0(regs, op); in analyse_instr()
2563 op->reg = ra; in analyse_instr()
2564 op->type |= SETREG; in analyse_instr()
2569 set_cr0(regs, op); in analyse_instr()
2571 op->reg = rd; in analyse_instr()
2572 op->type |= SETREG; in analyse_instr()
2576 op->type = INTERRUPT | 0x700; in analyse_instr()
2577 op->val = SRR1_PROGPRIV; in analyse_instr()
2581 op->type = INTERRUPT | 0x700; in analyse_instr()
2582 op->val = SRR1_PROGTRAP; in analyse_instr()
2649 void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op) in emulate_update_regs() argument
2654 switch (GETTYPE(op->type)) { in emulate_update_regs()
2656 if (op->type & SETREG) in emulate_update_regs()
2657 regs->gpr[op->reg] = op->val; in emulate_update_regs()
2658 if (op->type & SETCC) in emulate_update_regs()
2659 regs->ccr = op->ccval; in emulate_update_regs()
2660 if (op->type & SETXER) in emulate_update_regs()
2661 regs->xer = op->xerval; in emulate_update_regs()
2665 if (op->type & SETLK) in emulate_update_regs()
2667 if (op->type & BRTAKEN) in emulate_update_regs()
2668 next_pc = op->val; in emulate_update_regs()
2669 if (op->type & DECCTR) in emulate_update_regs()
2674 switch (op->type & BARRIER_MASK) { in emulate_update_regs()
2694 switch (op->spr) { in emulate_update_regs()
2696 regs->gpr[op->reg] = regs->xer & 0xffffffffUL; in emulate_update_regs()
2699 regs->gpr[op->reg] = regs->link; in emulate_update_regs()
2702 regs->gpr[op->reg] = regs->ctr; in emulate_update_regs()
2710 switch (op->spr) { in emulate_update_regs()
2712 regs->xer = op->val & 0xffffffffUL; in emulate_update_regs()
2715 regs->link = op->val; in emulate_update_regs()
2718 regs->ctr = op->val; in emulate_update_regs()
2741 int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op) in emulate_loadstore() argument
2751 size = GETSIZE(op->type); in emulate_loadstore()
2752 type = GETTYPE(op->type); in emulate_loadstore()
2754 ea = truncate_if_32bit(regs->msr, op->ea); in emulate_loadstore()
2781 err = do_lqarx(ea, ®s->gpr[op->reg]); in emulate_loadstore()
2792 regs->gpr[op->reg] = val; in emulate_loadstore()
2804 __put_user_asmx(op->val, ea, err, "stbcx.", cr); in emulate_loadstore()
2807 __put_user_asmx(op->val, ea, err, "stbcx.", cr); in emulate_loadstore()
2811 __put_user_asmx(op->val, ea, err, "stwcx.", cr); in emulate_loadstore()
2815 __put_user_asmx(op->val, ea, err, "stdcx.", cr); in emulate_loadstore()
2818 err = do_stqcx(ea, regs->gpr[op->reg], in emulate_loadstore()
2819 regs->gpr[op->reg + 1], &cr); in emulate_loadstore()
2836 err = emulate_lq(regs, ea, op->reg, cross_endian); in emulate_loadstore()
2840 err = read_mem(®s->gpr[op->reg], ea, size, regs); in emulate_loadstore()
2842 if (op->type & SIGNEXT) in emulate_loadstore()
2843 do_signext(®s->gpr[op->reg], size); in emulate_loadstore()
2844 if ((op->type & BYTEREV) == (cross_endian ? 0 : BYTEREV)) in emulate_loadstore()
2845 do_byterev(®s->gpr[op->reg], size); in emulate_loadstore()
2859 err = do_fp_load(op, ea, regs, cross_endian); in emulate_loadstore()
2866 err = do_vec_load(op->reg, ea, size, regs, cross_endian); in emulate_loadstore()
2877 if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC)) in emulate_loadstore()
2881 err = do_vsx_load(op, ea, regs, cross_endian); in emulate_loadstore()
2888 rd = op->reg; in emulate_loadstore()
2910 err = emulate_stq(regs, ea, op->reg, cross_endian); in emulate_loadstore()
2914 if ((op->type & UPDATE) && size == sizeof(long) && in emulate_loadstore()
2915 op->reg == 1 && op->update_reg == 1 && in emulate_loadstore()
2922 do_byterev(&op->val, size); in emulate_loadstore()
2923 err = write_mem(op->val, ea, size, regs); in emulate_loadstore()
2930 err = do_fp_store(op, ea, regs, cross_endian); in emulate_loadstore()
2937 err = do_vec_store(op->reg, ea, size, regs, cross_endian); in emulate_loadstore()
2948 if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC)) in emulate_loadstore()
2952 err = do_vsx_store(op, ea, regs, cross_endian); in emulate_loadstore()
2959 rd = op->reg; in emulate_loadstore()
2984 if (op->type & UPDATE) in emulate_loadstore()
2985 regs->gpr[op->update_reg] = op->ea; in emulate_loadstore()
3000 struct instruction_op op; in emulate_step() local
3005 r = analyse_instr(&op, regs, instr); in emulate_step()
3009 emulate_update_regs(regs, &op); in emulate_step()
3014 type = GETTYPE(op.type); in emulate_step()
3017 err = emulate_loadstore(regs, &op); in emulate_step()
3025 ea = truncate_if_32bit(regs->msr, op.ea); in emulate_step()
3028 switch (op.type & CACHEOP_MASK) { in emulate_step()
3036 if (op.reg == 0) in emulate_step()
3040 if (op.reg == 0) in emulate_step()
3057 regs->gpr[op.reg] = regs->msr & MSR_MASK; in emulate_step()
3061 val = regs->gpr[op.reg]; in emulate_step()
3066 regs->msr = (regs->msr & ~op.val) | (val & op.val); in emulate_step()