Lines Matching refs:op

90 					struct instruction_op *op)  in branch_taken()  argument
97 op->type |= DECCTR; in branch_taken()
518 static int do_fp_load(struct instruction_op *op, unsigned long ea, in do_fp_load() argument
531 nb = GETSIZE(op->type); in do_fp_load()
534 rn = op->reg; in do_fp_load()
545 if (op->type & FPCONV) in do_fp_load()
547 else if (op->type & SIGNEXT) in do_fp_load()
569 static int do_fp_store(struct instruction_op *op, unsigned long ea, in do_fp_store() argument
581 nb = GETSIZE(op->type); in do_fp_store()
584 rn = op->reg; in do_fp_store()
591 if (op->type & FPCONV) in do_fp_store()
716 void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg, in emulate_vsx_load() argument
725 size = GETSIZE(op->type); in emulate_vsx_load()
728 switch (op->element_size) { in emulate_vsx_load()
736 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) in emulate_vsx_load()
749 if (op->type & SIGNEXT) { in emulate_vsx_load()
752 } else if (op->vsx_flags & VSX_FPCONV) { in emulate_vsx_load()
762 } else if (op->vsx_flags & VSX_SPLAT) in emulate_vsx_load()
773 if (op->vsx_flags & VSX_SPLAT) { in emulate_vsx_load()
802 void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg, in emulate_vsx_store() argument
812 size = GETSIZE(op->type); in emulate_vsx_store()
814 switch (op->element_size) { in emulate_vsx_store()
835 if (IS_LE && (op->vsx_flags & VSX_LDLEFT)) in emulate_vsx_store()
849 if (size < 8 && op->vsx_flags & VSX_FPCONV) { in emulate_vsx_store()
894 static nokprobe_inline int do_vsx_load(struct instruction_op *op, in do_vsx_load() argument
898 int reg = op->reg; in do_vsx_load()
902 int size = GETSIZE(op->type); in do_vsx_load()
908 emulate_vsx_load(op, buf, mem, cross_endian); in do_vsx_load()
941 static nokprobe_inline int do_vsx_store(struct instruction_op *op, in do_vsx_store() argument
945 int reg = op->reg; in do_vsx_store()
949 int size = GETSIZE(op->type); in do_vsx_store()
984 emulate_vsx_store(op, buf, mem, cross_endian); in do_vsx_store()
1015 #define __put_user_asmx(x, addr, err, op, cr) \ argument
1017 "1: " op " %2,0,%3\n" \
1028 #define __get_user_asmx(x, addr, err, op) \ argument
1030 "1: "op" %1,0,%2\n" \
1040 #define __cacheop_user_asmx(addr, err, op) \ argument
1042 "1: "op" 0,%1\n" \
1053 struct instruction_op *op) in set_cr0() argument
1055 long val = op->val; in set_cr0()
1057 op->type |= SETCC; in set_cr0()
1058 op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000); in set_cr0()
1064 op->ccval |= 0x80000000; in set_cr0()
1066 op->ccval |= 0x40000000; in set_cr0()
1068 op->ccval |= 0x20000000; in set_cr0()
1071 static nokprobe_inline void set_ca32(struct instruction_op *op, bool val) in set_ca32() argument
1075 op->xerval |= XER_CA32; in set_ca32()
1077 op->xerval &= ~XER_CA32; in set_ca32()
1082 struct instruction_op *op, int rd, in add_with_carry() argument
1090 op->type = COMPUTE + SETREG + SETXER; in add_with_carry()
1091 op->reg = rd; in add_with_carry()
1092 op->val = val; in add_with_carry()
1099 op->xerval = regs->xer; in add_with_carry()
1101 op->xerval |= XER_CA; in add_with_carry()
1103 op->xerval &= ~XER_CA; in add_with_carry()
1105 set_ca32(op, (unsigned int)val < (unsigned int)val1 || in add_with_carry()
1110 struct instruction_op *op, in do_cmp_signed() argument
1115 op->type = COMPUTE + SETCC; in do_cmp_signed()
1124 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift); in do_cmp_signed()
1128 struct instruction_op *op, in do_cmp_unsigned() argument
1134 op->type = COMPUTE + SETCC; in do_cmp_unsigned()
1143 op->ccval = (regs->ccr & ~(0xf << shift)) | (crval << shift); in do_cmp_unsigned()
1147 struct instruction_op *op, in do_cmpb() argument
1159 op->val = out_val; in do_cmpb()
1167 struct instruction_op *op, in do_popcnt() argument
1178 op->val = out; in do_popcnt()
1184 op->val = out & 0x0000003f0000003fULL; in do_popcnt()
1189 op->val = out; /* popcntd */ in do_popcnt()
1194 struct instruction_op *op, in do_bpermd() argument
1207 op->val = perm; in do_bpermd()
1215 struct instruction_op *op, in do_prty() argument
1222 op->val = res & 0x0000000100000001ULL; in do_prty()
1227 op->val = res & 1; /*prtyd */ in do_prty()
1273 int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, in analyse_instr() argument
1289 op->type = COMPUTE; in analyse_instr()
1294 op->type = BRANCH; in analyse_instr()
1298 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1300 op->type |= SETLK; in analyse_instr()
1301 if (branch_taken(word, regs, op)) in analyse_instr()
1302 op->type |= BRTAKEN; in analyse_instr()
1307 op->type = SYSCALL; in analyse_instr()
1310 op->type = SYSCALL_VECTORED_0; in analyse_instr()
1314 op->type = UNKNOWN; in analyse_instr()
1318 op->type = BRANCH | BRTAKEN; in analyse_instr()
1324 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1326 op->type |= SETLK; in analyse_instr()
1331 op->type = COMPUTE + SETCC; in analyse_instr()
1337 op->ccval = (regs->ccr & ~(0xfUL << rd)) | (val << rd); in analyse_instr()
1342 op->type = BRANCH; in analyse_instr()
1344 op->val = truncate_if_32bit(regs->msr, imm); in analyse_instr()
1346 op->type |= SETLK; in analyse_instr()
1347 if (branch_taken(word, regs, op)) in analyse_instr()
1348 op->type |= BRTAKEN; in analyse_instr()
1354 op->type = RFI; in analyse_instr()
1358 op->type = BARRIER | BARRIER_ISYNC; in analyse_instr()
1369 op->type = COMPUTE + SETCC; in analyse_instr()
1376 op->ccval = (regs->ccr & ~(1UL << (31 - rd))) | in analyse_instr()
1384 op->type = BARRIER + BARRIER_SYNC; in analyse_instr()
1388 op->type = BARRIER + BARRIER_LWSYNC; in analyse_instr()
1391 op->type = BARRIER + BARRIER_PTESYNC; in analyse_instr()
1398 op->type = BARRIER + BARRIER_EIEIO; in analyse_instr()
1418 op->reg = rd; in analyse_instr()
1419 op->val = regs->gpr[rd]; in analyse_instr()
1428 op->type = COMPUTE | PREFIXED; in analyse_instr()
1429 op->val = mlsd_8lsd_ea(word, suffix, regs); in analyse_instr()
1457 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1463 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1469 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1482 op->val = regs->gpr[ra] * (short) word; in analyse_instr()
1487 add_with_carry(regs, op, rd, ~regs->gpr[ra], imm, 1); in analyse_instr()
1497 do_cmp_unsigned(regs, op, val, imm, rd >> 2); in analyse_instr()
1507 do_cmp_signed(regs, op, val, imm, rd >> 2); in analyse_instr()
1512 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); in analyse_instr()
1517 add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); in analyse_instr()
1518 set_cr0(regs, op); in analyse_instr()
1525 op->val = imm; in analyse_instr()
1532 op->val = imm; in analyse_instr()
1542 op->val = regs->nip + (imm << 16) + 4; in analyse_instr()
1545 op->type = UNKNOWN; in analyse_instr()
1553 op->val = (regs->gpr[ra] & ~imm) | (ROTATE(val, rb) & imm); in analyse_instr()
1560 op->val = ROTATE(val, rb) & MASK32(mb, me); in analyse_instr()
1568 op->val = ROTATE(val, rb) & MASK32(mb, me); in analyse_instr()
1572 op->val = regs->gpr[rd] | (unsigned short) word; in analyse_instr()
1577 op->val = regs->gpr[rd] | (imm << 16); in analyse_instr()
1581 op->val = regs->gpr[rd] ^ (unsigned short) word; in analyse_instr()
1586 op->val = regs->gpr[rd] ^ (imm << 16); in analyse_instr()
1590 op->val = regs->gpr[rd] & (unsigned short) word; in analyse_instr()
1591 set_cr0(regs, op); in analyse_instr()
1596 op->val = regs->gpr[rd] & (imm << 16); in analyse_instr()
1597 set_cr0(regs, op); in analyse_instr()
1622 op->val = val; in analyse_instr()
1629 op->val = val & MASK64_L(mb); in analyse_instr()
1632 op->val = val & MASK64_R(mb); in analyse_instr()
1637 op->type = UNKNOWN; /* illegal instruction */ in analyse_instr()
1647 op->val = (val) ? val2 : regs->gpr[rb]; in analyse_instr()
1667 op->type = MFMSR; in analyse_instr()
1668 op->reg = rd; in analyse_instr()
1673 op->type = MTMSR; in analyse_instr()
1674 op->reg = rd; in analyse_instr()
1675 op->val = 0xffffffff & ~(MSR_ME | MSR_LE); in analyse_instr()
1681 op->type = MTMSR; in analyse_instr()
1682 op->reg = rd; in analyse_instr()
1686 op->val = imm; in analyse_instr()
1700 op->val = regs->ccr & imm; in analyse_instr()
1717 op->val = -1; in analyse_instr()
1720 op->val = 1; in analyse_instr()
1722 op->val = 0; in analyse_instr()
1726 op->type = COMPUTE + SETCC; in analyse_instr()
1729 op->ccval = regs->ccr; in analyse_instr()
1732 op->ccval = (op->ccval & ~imm) | in analyse_instr()
1740 op->type = MFSPR; in analyse_instr()
1741 op->reg = rd; in analyse_instr()
1742 op->spr = spr; in analyse_instr()
1750 op->type = MTSPR; in analyse_instr()
1751 op->val = regs->gpr[rd]; in analyse_instr()
1752 op->spr = spr; in analyse_instr()
1771 do_cmp_signed(regs, op, val, val2, rd >> 2); in analyse_instr()
1784 do_cmp_unsigned(regs, op, val, val2, rd >> 2); in analyse_instr()
1788 do_cmpb(regs, op, regs->gpr[rd], regs->gpr[rb]); in analyse_instr()
1795 add_with_carry(regs, op, rd, ~regs->gpr[ra], in analyse_instr()
1800 asm("mulhdu %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1805 add_with_carry(regs, op, rd, regs->gpr[ra], in analyse_instr()
1810 asm("mulhwu %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1815 op->val = regs->gpr[rb] - regs->gpr[ra]; in analyse_instr()
1819 asm("mulhd %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1824 asm("mulhw %0,%1,%2" : "=r" (op->val) : in analyse_instr()
1829 op->val = -regs->gpr[ra]; in analyse_instr()
1833 add_with_carry(regs, op, rd, ~regs->gpr[ra], in analyse_instr()
1838 add_with_carry(regs, op, rd, regs->gpr[ra], in analyse_instr()
1843 add_with_carry(regs, op, rd, ~regs->gpr[ra], 0L, in analyse_instr()
1848 add_with_carry(regs, op, rd, regs->gpr[ra], 0L, in analyse_instr()
1853 add_with_carry(regs, op, rd, ~regs->gpr[ra], -1L, in analyse_instr()
1858 op->val = regs->gpr[ra] * regs->gpr[rb]; in analyse_instr()
1862 add_with_carry(regs, op, rd, regs->gpr[ra], -1L, in analyse_instr()
1867 op->val = (long)(int) regs->gpr[ra] * in analyse_instr()
1875 op->val = regs->gpr[ra] % regs->gpr[rb]; in analyse_instr()
1879 op->val = regs->gpr[ra] + regs->gpr[rb]; in analyse_instr()
1885 op->val = (unsigned int) regs->gpr[ra] % in analyse_instr()
1890 op->val = regs->gpr[ra] / regs->gpr[rb]; in analyse_instr()
1894 op->val = (unsigned int) regs->gpr[ra] / in analyse_instr()
1899 op->val = (long int) regs->gpr[ra] / in analyse_instr()
1904 op->val = (int) regs->gpr[ra] / in analyse_instr()
1910 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1915 "=r" (op->val) : "r" (regs->gpr[ra]), in analyse_instr()
1925 asm volatile(PPC_DARN(%0, 0) : "=r" (op->val)); in analyse_instr()
1930 asm volatile(PPC_DARN(%0, 1) : "=r" (op->val)); in analyse_instr()
1935 asm volatile(PPC_DARN(%0, 2) : "=r" (op->val)); in analyse_instr()
1944 op->val = (long int) regs->gpr[ra] % in analyse_instr()
1951 op->val = (int) regs->gpr[ra] % in analyse_instr()
1961 op->val = ( val ? __builtin_clz(val) : 32 ); in analyse_instr()
1966 op->val = ( val ? __builtin_clzl(val) : 64 ); in analyse_instr()
1970 op->val = regs->gpr[rd] & regs->gpr[rb]; in analyse_instr()
1974 op->val = regs->gpr[rd] & ~regs->gpr[rb]; in analyse_instr()
1978 do_popcnt(regs, op, regs->gpr[rd], 8); in analyse_instr()
1982 op->val = ~(regs->gpr[rd] | regs->gpr[rb]); in analyse_instr()
1986 do_prty(regs, op, regs->gpr[rd], 32); in analyse_instr()
1990 do_prty(regs, op, regs->gpr[rd], 64); in analyse_instr()
1994 do_bpermd(regs, op, regs->gpr[rd], regs->gpr[rb]); in analyse_instr()
1998 op->val = ~(regs->gpr[rd] ^ regs->gpr[rb]); in analyse_instr()
2002 op->val = regs->gpr[rd] ^ regs->gpr[rb]; in analyse_instr()
2006 do_popcnt(regs, op, regs->gpr[rd], 32); in analyse_instr()
2010 op->val = regs->gpr[rd] | ~regs->gpr[rb]; in analyse_instr()
2014 op->val = regs->gpr[rd] | regs->gpr[rb]; in analyse_instr()
2018 op->val = ~(regs->gpr[rd] & regs->gpr[rb]); in analyse_instr()
2022 do_popcnt(regs, op, regs->gpr[rd], 64); in analyse_instr()
2029 op->val = (val ? __builtin_ctz(val) : 32); in analyse_instr()
2036 op->val = (val ? __builtin_ctzl(val) : 64); in analyse_instr()
2040 op->val = (signed short) regs->gpr[rd]; in analyse_instr()
2044 op->val = (signed char) regs->gpr[rd]; in analyse_instr()
2048 op->val = (signed int) regs->gpr[rd]; in analyse_instr()
2058 op->val = (regs->gpr[rd] << sh) & 0xffffffffUL; in analyse_instr()
2060 op->val = 0; in analyse_instr()
2066 op->val = (regs->gpr[rd] & 0xffffffffUL) >> sh; in analyse_instr()
2068 op->val = 0; in analyse_instr()
2072 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
2075 op->val = ival >> (sh < 32 ? sh : 31); in analyse_instr()
2076 op->xerval = regs->xer; in analyse_instr()
2078 op->xerval |= XER_CA; in analyse_instr()
2080 op->xerval &= ~XER_CA; in analyse_instr()
2081 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
2085 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
2088 op->val = ival >> sh; in analyse_instr()
2089 op->xerval = regs->xer; in analyse_instr()
2091 op->xerval |= XER_CA; in analyse_instr()
2093 op->xerval &= ~XER_CA; in analyse_instr()
2094 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
2101 op->val = regs->gpr[rd] << sh; in analyse_instr()
2103 op->val = 0; in analyse_instr()
2109 op->val = regs->gpr[rd] >> sh; in analyse_instr()
2111 op->val = 0; in analyse_instr()
2115 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
2118 op->val = ival >> (sh < 64 ? sh : 63); in analyse_instr()
2119 op->xerval = regs->xer; in analyse_instr()
2121 op->xerval |= XER_CA; in analyse_instr()
2123 op->xerval &= ~XER_CA; in analyse_instr()
2124 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
2129 op->type = COMPUTE + SETREG + SETXER; in analyse_instr()
2132 op->val = ival >> sh; in analyse_instr()
2133 op->xerval = regs->xer; in analyse_instr()
2135 op->xerval |= XER_CA; in analyse_instr()
2137 op->xerval &= ~XER_CA; in analyse_instr()
2138 set_ca32(op, op->xerval & XER_CA); in analyse_instr()
2145 op->type = COMPUTE + SETREG; in analyse_instr()
2149 op->val = ROTATE(val, sh) & MASK64(0, 63 - sh); in analyse_instr()
2151 op->val = val; in analyse_instr()
2160 op->type = MKOP(CACHEOP, DCBST, 0); in analyse_instr()
2161 op->ea = xform_ea(word, regs); in analyse_instr()
2165 op->type = MKOP(CACHEOP, DCBF, 0); in analyse_instr()
2166 op->ea = xform_ea(word, regs); in analyse_instr()
2170 op->type = MKOP(CACHEOP, DCBTST, 0); in analyse_instr()
2171 op->ea = xform_ea(word, regs); in analyse_instr()
2172 op->reg = rd; in analyse_instr()
2176 op->type = MKOP(CACHEOP, DCBTST, 0); in analyse_instr()
2177 op->ea = xform_ea(word, regs); in analyse_instr()
2178 op->reg = rd; in analyse_instr()
2182 op->type = MKOP(CACHEOP, ICBI, 0); in analyse_instr()
2183 op->ea = xform_ea(word, regs); in analyse_instr()
2187 op->type = MKOP(CACHEOP, DCBZ, 0); in analyse_instr()
2188 op->ea = xform_ea(word, regs); in analyse_instr()
2197 op->type = UNKNOWN; in analyse_instr()
2198 op->update_reg = ra; in analyse_instr()
2199 op->reg = rd; in analyse_instr()
2200 op->val = regs->gpr[rd]; in analyse_instr()
2202 op->vsx_flags = 0; in analyse_instr()
2207 op->ea = xform_ea(word, regs); in analyse_instr()
2210 op->type = MKOP(LARX, 0, 4); in analyse_instr()
2214 op->type = MKOP(STCX, 0, 4); in analyse_instr()
2219 op->type = MKOP(LARX, 0, 8); in analyse_instr()
2223 op->type = MKOP(STCX, 0, 8); in analyse_instr()
2227 op->type = MKOP(LARX, 0, 1); in analyse_instr()
2231 op->type = MKOP(STCX, 0, 1); in analyse_instr()
2235 op->type = MKOP(LARX, 0, 2); in analyse_instr()
2239 op->type = MKOP(STCX, 0, 2); in analyse_instr()
2244 op->type = MKOP(LARX, 0, 16); in analyse_instr()
2249 op->type = MKOP(STCX, 0, 16); in analyse_instr()
2255 op->type = MKOP(LOAD, u, 4); in analyse_instr()
2260 op->type = MKOP(LOAD, u, 1); in analyse_instr()
2269 op->type = MKOP(LOAD_VMX, 0, 1); in analyse_instr()
2270 op->element_size = 1; in analyse_instr()
2274 op->type = MKOP(LOAD_VMX, 0, 2); in analyse_instr()
2275 op->element_size = 2; in analyse_instr()
2279 op->type = MKOP(LOAD_VMX, 0, 4); in analyse_instr()
2280 op->element_size = 4; in analyse_instr()
2285 op->type = MKOP(LOAD_VMX, 0, 16); in analyse_instr()
2286 op->element_size = 16; in analyse_instr()
2290 op->type = MKOP(STORE_VMX, 0, 1); in analyse_instr()
2291 op->element_size = 1; in analyse_instr()
2295 op->type = MKOP(STORE_VMX, 0, 2); in analyse_instr()
2296 op->element_size = 2; in analyse_instr()
2300 op->type = MKOP(STORE_VMX, 0, 4); in analyse_instr()
2301 op->element_size = 4; in analyse_instr()
2306 op->type = MKOP(STORE_VMX, 0, 16); in analyse_instr()
2313 op->type = MKOP(LOAD, u, 8); in analyse_instr()
2318 op->type = MKOP(STORE, u, 8); in analyse_instr()
2324 op->type = MKOP(STORE, u, 4); in analyse_instr()
2329 op->type = MKOP(STORE, u, 1); in analyse_instr()
2334 op->type = MKOP(LOAD, u, 2); in analyse_instr()
2340 op->type = MKOP(LOAD, SIGNEXT | u, 4); in analyse_instr()
2346 op->type = MKOP(LOAD, SIGNEXT | u, 2); in analyse_instr()
2351 op->type = MKOP(STORE, u, 2); in analyse_instr()
2356 op->type = MKOP(LOAD, BYTEREV, 8); in analyse_instr()
2361 op->type = MKOP(LOAD_MULTI, 0, regs->xer & 0x7f); in analyse_instr()
2365 op->type = MKOP(LOAD, BYTEREV, 4); in analyse_instr()
2371 op->type = MKOP(LOAD_MULTI, 0, rb); in analyse_instr()
2372 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2378 op->type = MKOP(LOAD_FP, u | FPCONV, 4); in analyse_instr()
2383 op->type = MKOP(LOAD_FP, u, 8); in analyse_instr()
2388 op->type = MKOP(STORE_FP, u | FPCONV, 4); in analyse_instr()
2393 op->type = MKOP(STORE_FP, u, 8); in analyse_instr()
2398 op->type = MKOP(LOAD_FP, 0, 16); in analyse_instr()
2402 op->type = MKOP(LOAD_FP, SIGNEXT, 4); in analyse_instr()
2406 op->type = MKOP(LOAD_FP, 0, 4); in analyse_instr()
2410 op->type = MKOP(STORE_FP, 0, 16); in analyse_instr()
2414 op->type = MKOP(STORE_FP, 0, 4); in analyse_instr()
2421 op->type = MKOP(STORE, BYTEREV, 8); in analyse_instr()
2422 op->val = byterev_8(regs->gpr[rd]); in analyse_instr()
2427 op->type = MKOP(STORE_MULTI, 0, regs->xer & 0x7f); in analyse_instr()
2431 op->type = MKOP(STORE, BYTEREV, 4); in analyse_instr()
2432 op->val = byterev_4(regs->gpr[rd]); in analyse_instr()
2438 op->type = MKOP(STORE_MULTI, 0, rb); in analyse_instr()
2439 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2443 op->type = MKOP(LOAD, BYTEREV, 2); in analyse_instr()
2447 op->type = MKOP(STORE, BYTEREV, 2); in analyse_instr()
2448 op->val = byterev_2(regs->gpr[rd]); in analyse_instr()
2453 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2454 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2455 op->element_size = 8; in analyse_instr()
2459 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2460 op->type = MKOP(LOAD_VSX, SIGNEXT, 4); in analyse_instr()
2461 op->element_size = 8; in analyse_instr()
2465 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2466 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2467 op->element_size = 8; in analyse_instr()
2473 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2474 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2475 op->element_size = 16; in analyse_instr()
2476 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2484 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2485 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2489 op->type = MKOP(LOAD_VSX, 0, nb); in analyse_instr()
2490 op->element_size = 16; in analyse_instr()
2491 op->vsx_flags = ((word & 0x20) ? VSX_LDLEFT : 0) | in analyse_instr()
2496 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2497 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2498 op->element_size = 8; in analyse_instr()
2499 op->vsx_flags = VSX_SPLAT; in analyse_instr()
2505 op->reg = VSX_REGISTER_XTP(rd); in analyse_instr()
2506 op->type = MKOP(LOAD_VSX, 0, 32); in analyse_instr()
2507 op->element_size = 32; in analyse_instr()
2513 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2514 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2515 op->element_size = 4; in analyse_instr()
2516 op->vsx_flags = VSX_SPLAT | VSX_CHECK_VEC; in analyse_instr()
2522 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2523 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2524 op->element_size = 16; in analyse_instr()
2525 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2533 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2534 op->ea = ra ? regs->gpr[ra] : 0; in analyse_instr()
2538 op->type = MKOP(STORE_VSX, 0, nb); in analyse_instr()
2539 op->element_size = 16; in analyse_instr()
2540 op->vsx_flags = ((word & 0x20) ? VSX_LDLEFT : 0) | in analyse_instr()
2547 op->reg = VSX_REGISTER_XTP(rd); in analyse_instr()
2548 op->type = MKOP(STORE_VSX, 0, 32); in analyse_instr()
2549 op->element_size = 32; in analyse_instr()
2552 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2553 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2554 op->element_size = 8; in analyse_instr()
2555 op->vsx_flags = VSX_FPCONV; in analyse_instr()
2559 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2560 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2561 op->element_size = 8; in analyse_instr()
2565 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2566 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2567 op->element_size = 8; in analyse_instr()
2568 op->vsx_flags = VSX_FPCONV; in analyse_instr()
2572 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2573 op->type = MKOP(STORE_VSX, 0, 8); in analyse_instr()
2574 op->element_size = 8; in analyse_instr()
2578 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2579 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2580 op->element_size = 4; in analyse_instr()
2586 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2587 op->type = MKOP(LOAD_VSX, 0, 1); in analyse_instr()
2588 op->element_size = 8; in analyse_instr()
2589 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2595 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2596 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2597 op->element_size = 2; in analyse_instr()
2598 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2604 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2605 op->type = MKOP(LOAD_VSX, 0, 2); in analyse_instr()
2606 op->element_size = 8; in analyse_instr()
2607 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2611 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2612 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2613 op->element_size = 8; in analyse_instr()
2619 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2620 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2621 op->element_size = 1; in analyse_instr()
2622 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2626 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2627 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2628 op->element_size = 4; in analyse_instr()
2634 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2635 op->type = MKOP(STORE_VSX, 0, 1); in analyse_instr()
2636 op->element_size = 8; in analyse_instr()
2637 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2643 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2644 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2645 op->element_size = 2; in analyse_instr()
2646 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2652 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2653 op->type = MKOP(STORE_VSX, 0, 2); in analyse_instr()
2654 op->element_size = 8; in analyse_instr()
2655 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2659 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2660 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2661 op->element_size = 8; in analyse_instr()
2667 op->reg = rd | ((word & 1) << 5); in analyse_instr()
2668 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2669 op->element_size = 1; in analyse_instr()
2670 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2679 op->type = MKOP(LOAD, u, 4); in analyse_instr()
2680 op->ea = dform_ea(word, regs); in analyse_instr()
2685 op->type = MKOP(LOAD, u, 1); in analyse_instr()
2686 op->ea = dform_ea(word, regs); in analyse_instr()
2691 op->type = MKOP(STORE, u, 4); in analyse_instr()
2692 op->ea = dform_ea(word, regs); in analyse_instr()
2697 op->type = MKOP(STORE, u, 1); in analyse_instr()
2698 op->ea = dform_ea(word, regs); in analyse_instr()
2703 op->type = MKOP(LOAD, u, 2); in analyse_instr()
2704 op->ea = dform_ea(word, regs); in analyse_instr()
2709 op->type = MKOP(LOAD, SIGNEXT | u, 2); in analyse_instr()
2710 op->ea = dform_ea(word, regs); in analyse_instr()
2715 op->type = MKOP(STORE, u, 2); in analyse_instr()
2716 op->ea = dform_ea(word, regs); in analyse_instr()
2722 op->type = MKOP(LOAD_MULTI, 0, 4 * (32 - rd)); in analyse_instr()
2723 op->ea = dform_ea(word, regs); in analyse_instr()
2727 op->type = MKOP(STORE_MULTI, 0, 4 * (32 - rd)); in analyse_instr()
2728 op->ea = dform_ea(word, regs); in analyse_instr()
2734 op->type = MKOP(LOAD_FP, u | FPCONV, 4); in analyse_instr()
2735 op->ea = dform_ea(word, regs); in analyse_instr()
2740 op->type = MKOP(LOAD_FP, u, 8); in analyse_instr()
2741 op->ea = dform_ea(word, regs); in analyse_instr()
2746 op->type = MKOP(STORE_FP, u | FPCONV, 4); in analyse_instr()
2747 op->ea = dform_ea(word, regs); in analyse_instr()
2752 op->type = MKOP(STORE_FP, u, 8); in analyse_instr()
2753 op->ea = dform_ea(word, regs); in analyse_instr()
2760 op->type = MKOP(LOAD, 0, 16); in analyse_instr()
2761 op->ea = dqform_ea(word, regs); in analyse_instr()
2767 op->ea = dsform_ea(word, regs); in analyse_instr()
2772 op->type = MKOP(LOAD_FP, 0, 16); in analyse_instr()
2777 op->reg = rd + 32; in analyse_instr()
2778 op->type = MKOP(LOAD_VSX, 0, 8); in analyse_instr()
2779 op->element_size = 8; in analyse_instr()
2780 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2785 op->reg = rd + 32; in analyse_instr()
2786 op->type = MKOP(LOAD_VSX, 0, 4); in analyse_instr()
2787 op->element_size = 8; in analyse_instr()
2788 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2796 op->ea = dsform_ea(word, regs); in analyse_instr()
2799 op->type = MKOP(LOAD, 0, 8); in analyse_instr()
2802 op->type = MKOP(LOAD, UPDATE, 8); in analyse_instr()
2805 op->type = MKOP(LOAD, SIGNEXT, 4); in analyse_instr()
2815 op->ea = dqform_ea(word, regs); in analyse_instr()
2816 op->reg = VSX_REGISTER_XTP(rd); in analyse_instr()
2817 op->element_size = 32; in analyse_instr()
2820 op->type = MKOP(LOAD_VSX, 0, 32); in analyse_instr()
2823 op->type = MKOP(STORE_VSX, 0, 32); in analyse_instr()
2832 op->ea = dsform_ea(word, regs); in analyse_instr()
2833 op->type = MKOP(STORE_FP, 0, 16); in analyse_instr()
2839 op->ea = dqform_ea(word, regs); in analyse_instr()
2841 op->reg = rd + 32; in analyse_instr()
2842 op->type = MKOP(LOAD_VSX, 0, 16); in analyse_instr()
2843 op->element_size = 16; in analyse_instr()
2844 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2851 op->ea = dsform_ea(word, regs); in analyse_instr()
2852 op->reg = rd + 32; in analyse_instr()
2853 op->type = MKOP(STORE_VSX, 0, 8); in analyse_instr()
2854 op->element_size = 8; in analyse_instr()
2855 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2862 op->ea = dsform_ea(word, regs); in analyse_instr()
2863 op->reg = rd + 32; in analyse_instr()
2864 op->type = MKOP(STORE_VSX, 0, 4); in analyse_instr()
2865 op->element_size = 8; in analyse_instr()
2866 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2872 op->ea = dqform_ea(word, regs); in analyse_instr()
2874 op->reg = rd + 32; in analyse_instr()
2875 op->type = MKOP(STORE_VSX, 0, 16); in analyse_instr()
2876 op->element_size = 16; in analyse_instr()
2877 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2885 op->ea = dsform_ea(word, regs); in analyse_instr()
2888 op->type = MKOP(STORE, 0, 8); in analyse_instr()
2891 op->type = MKOP(STORE, UPDATE, 8); in analyse_instr()
2895 op->type = MKOP(STORE, 0, 16); in analyse_instr()
2905 op->update_reg = ra; in analyse_instr()
2907 op->reg = rd; in analyse_instr()
2908 op->val = regs->gpr[rd]; in analyse_instr()
2916 op->ea = mlsd_8lsd_ea(word, suffix, regs); in analyse_instr()
2919 op->type = MKOP(LOAD, PREFIXED | SIGNEXT, 4); in analyse_instr()
2923 op->reg = rd + 32; in analyse_instr()
2924 op->type = MKOP(LOAD_VSX, PREFIXED, 8); in analyse_instr()
2925 op->element_size = 8; in analyse_instr()
2926 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2929 op->reg = rd + 32; in analyse_instr()
2930 op->type = MKOP(LOAD_VSX, PREFIXED, 4); in analyse_instr()
2931 op->element_size = 8; in analyse_instr()
2932 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2935 op->reg = rd + 32; in analyse_instr()
2936 op->type = MKOP(STORE_VSX, PREFIXED, 8); in analyse_instr()
2937 op->element_size = 8; in analyse_instr()
2938 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2941 op->reg = rd + 32; in analyse_instr()
2942 op->type = MKOP(STORE_VSX, PREFIXED, 4); in analyse_instr()
2943 op->element_size = 8; in analyse_instr()
2944 op->vsx_flags = VSX_FPCONV | VSX_CHECK_VEC; in analyse_instr()
2947 op->reg += 32; in analyse_instr()
2950 op->type = MKOP(LOAD_VSX, PREFIXED, 16); in analyse_instr()
2951 op->element_size = 16; in analyse_instr()
2952 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2955 op->reg = rd + 32; in analyse_instr()
2958 op->type = MKOP(STORE_VSX, PREFIXED, 16); in analyse_instr()
2959 op->element_size = 16; in analyse_instr()
2960 op->vsx_flags = VSX_CHECK_VEC; in analyse_instr()
2964 op->type = MKOP(LOAD, PREFIXED, 16); in analyse_instr()
2967 op->type = MKOP(LOAD, PREFIXED, 8); in analyse_instr()
2971 op->reg = VSX_REGISTER_XTP(rd); in analyse_instr()
2972 op->type = MKOP(LOAD_VSX, PREFIXED, 32); in analyse_instr()
2973 op->element_size = 32; in analyse_instr()
2977 op->type = MKOP(STORE, PREFIXED, 16); in analyse_instr()
2980 op->type = MKOP(STORE, PREFIXED, 8); in analyse_instr()
2984 op->reg = VSX_REGISTER_XTP(rd); in analyse_instr()
2985 op->type = MKOP(STORE_VSX, PREFIXED, 32); in analyse_instr()
2986 op->element_size = 32; in analyse_instr()
2996 op->ea = mlsd_8lsd_ea(word, suffix, regs); in analyse_instr()
2999 op->type = MKOP(LOAD, PREFIXED, 4); in analyse_instr()
3002 op->type = MKOP(LOAD, PREFIXED, 1); in analyse_instr()
3005 op->type = MKOP(STORE, PREFIXED, 4); in analyse_instr()
3008 op->type = MKOP(STORE, PREFIXED, 1); in analyse_instr()
3011 op->type = MKOP(LOAD, PREFIXED, 2); in analyse_instr()
3014 op->type = MKOP(LOAD, PREFIXED | SIGNEXT, 2); in analyse_instr()
3017 op->type = MKOP(STORE, PREFIXED, 2); in analyse_instr()
3020 op->type = MKOP(LOAD_FP, PREFIXED | FPCONV, 4); in analyse_instr()
3023 op->type = MKOP(LOAD_FP, PREFIXED, 8); in analyse_instr()
3026 op->type = MKOP(STORE_FP, PREFIXED | FPCONV, 4); in analyse_instr()
3029 op->type = MKOP(STORE_FP, PREFIXED, 8); in analyse_instr()
3040 if (OP_IS_LOAD_STORE(op->type) && (op->type & UPDATE)) { in analyse_instr()
3041 switch (GETTYPE(op->type)) { in analyse_instr()
3055 if ((GETTYPE(op->type) == LOAD_VSX || in analyse_instr()
3056 GETTYPE(op->type) == STORE_VSX) && in analyse_instr()
3065 op->type = UNKNOWN; in analyse_instr()
3070 set_cr0(regs, op); in analyse_instr()
3072 op->reg = ra; in analyse_instr()
3073 op->type |= SETREG; in analyse_instr()
3078 set_cr0(regs, op); in analyse_instr()
3080 op->reg = rd; in analyse_instr()
3081 op->type |= SETREG; in analyse_instr()
3085 op->type = INTERRUPT | 0x700; in analyse_instr()
3086 op->val = SRR1_PROGPRIV; in analyse_instr()
3090 op->type = INTERRUPT | 0x700; in analyse_instr()
3091 op->val = SRR1_PROGTRAP; in analyse_instr()
3149 void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op) in emulate_update_regs() argument
3153 next_pc = truncate_if_32bit(regs->msr, regs->nip + GETLENGTH(op->type)); in emulate_update_regs()
3154 switch (GETTYPE(op->type)) { in emulate_update_regs()
3156 if (op->type & SETREG) in emulate_update_regs()
3157 regs->gpr[op->reg] = op->val; in emulate_update_regs()
3158 if (op->type & SETCC) in emulate_update_regs()
3159 regs->ccr = op->ccval; in emulate_update_regs()
3160 if (op->type & SETXER) in emulate_update_regs()
3161 regs->xer = op->xerval; in emulate_update_regs()
3165 if (op->type & SETLK) in emulate_update_regs()
3167 if (op->type & BRTAKEN) in emulate_update_regs()
3168 next_pc = op->val; in emulate_update_regs()
3169 if (op->type & DECCTR) in emulate_update_regs()
3174 switch (op->type & BARRIER_MASK) { in emulate_update_regs()
3194 switch (op->spr) { in emulate_update_regs()
3196 regs->gpr[op->reg] = regs->xer & 0xffffffffUL; in emulate_update_regs()
3199 regs->gpr[op->reg] = regs->link; in emulate_update_regs()
3202 regs->gpr[op->reg] = regs->ctr; in emulate_update_regs()
3210 switch (op->spr) { in emulate_update_regs()
3212 regs->xer = op->val & 0xffffffffUL; in emulate_update_regs()
3215 regs->link = op->val; in emulate_update_regs()
3218 regs->ctr = op->val; in emulate_update_regs()
3241 int emulate_loadstore(struct pt_regs *regs, struct instruction_op *op) in emulate_loadstore() argument
3251 size = GETSIZE(op->type); in emulate_loadstore()
3252 type = GETTYPE(op->type); in emulate_loadstore()
3254 ea = truncate_if_32bit(regs->msr, op->ea); in emulate_loadstore()
3281 err = do_lqarx(ea, &regs->gpr[op->reg]); in emulate_loadstore()
3292 regs->gpr[op->reg] = val; in emulate_loadstore()
3304 __put_user_asmx(op->val, ea, err, "stbcx.", cr); in emulate_loadstore()
3307 __put_user_asmx(op->val, ea, err, "stbcx.", cr); in emulate_loadstore()
3311 __put_user_asmx(op->val, ea, err, "stwcx.", cr); in emulate_loadstore()
3315 __put_user_asmx(op->val, ea, err, "stdcx.", cr); in emulate_loadstore()
3318 err = do_stqcx(ea, regs->gpr[op->reg], in emulate_loadstore()
3319 regs->gpr[op->reg + 1], &cr); in emulate_loadstore()
3336 err = emulate_lq(regs, ea, op->reg, cross_endian); in emulate_loadstore()
3340 err = read_mem(&regs->gpr[op->reg], ea, size, regs); in emulate_loadstore()
3342 if (op->type & SIGNEXT) in emulate_loadstore()
3343 do_signext(&regs->gpr[op->reg], size); in emulate_loadstore()
3344 if ((op->type & BYTEREV) == (cross_endian ? 0 : BYTEREV)) in emulate_loadstore()
3345 do_byterev(&regs->gpr[op->reg], size); in emulate_loadstore()
3359 err = do_fp_load(op, ea, regs, cross_endian); in emulate_loadstore()
3366 err = do_vec_load(op->reg, ea, size, regs, cross_endian); in emulate_loadstore()
3377 if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC)) in emulate_loadstore()
3381 err = do_vsx_load(op, ea, regs, cross_endian); in emulate_loadstore()
3388 rd = op->reg; in emulate_loadstore()
3410 err = emulate_stq(regs, ea, op->reg, cross_endian); in emulate_loadstore()
3414 if ((op->type & UPDATE) && size == sizeof(long) && in emulate_loadstore()
3415 op->reg == 1 && op->update_reg == 1 && in emulate_loadstore()
3422 do_byterev(&op->val, size); in emulate_loadstore()
3423 err = write_mem(op->val, ea, size, regs); in emulate_loadstore()
3430 err = do_fp_store(op, ea, regs, cross_endian); in emulate_loadstore()
3437 err = do_vec_store(op->reg, ea, size, regs, cross_endian); in emulate_loadstore()
3448 if (op->reg >= 32 && (op->vsx_flags & VSX_CHECK_VEC)) in emulate_loadstore()
3452 err = do_vsx_store(op, ea, regs, cross_endian); in emulate_loadstore()
3459 rd = op->reg; in emulate_loadstore()
3484 if (op->type & UPDATE) in emulate_loadstore()
3485 regs->gpr[op->update_reg] = op->ea; in emulate_loadstore()
3500 struct instruction_op op; in emulate_step() local
3505 r = analyse_instr(&op, regs, instr); in emulate_step()
3509 emulate_update_regs(regs, &op); in emulate_step()
3514 type = GETTYPE(op.type); in emulate_step()
3517 err = emulate_loadstore(regs, &op); in emulate_step()
3525 ea = truncate_if_32bit(regs->msr, op.ea); in emulate_step()
3528 switch (op.type & CACHEOP_MASK) { in emulate_step()
3536 if (op.reg == 0) in emulate_step()
3540 if (op.reg == 0) in emulate_step()
3557 regs->gpr[op.reg] = regs->msr & MSR_MASK; in emulate_step()
3561 val = regs->gpr[op.reg]; in emulate_step()
3566 regs_set_return_msr(regs, (regs->msr & ~op.val) | (val & op.val)); in emulate_step()
3611 truncate_if_32bit(regs->msr, regs->nip + GETLENGTH(op.type))); in emulate_step()