Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/disassembler: add vector instructions

Add the instruction introduced with the vector extension to the in-kernel
disassembler.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

+249 -9
+7 -6
arch/s390/include/asm/dis.h
··· 13 13 #define OPERAND_FPR 0x2 /* Operand printed as %fx */ 14 14 #define OPERAND_AR 0x4 /* Operand printed as %ax */ 15 15 #define OPERAND_CR 0x8 /* Operand printed as %cx */ 16 - #define OPERAND_DISP 0x10 /* Operand printed as displacement */ 17 - #define OPERAND_BASE 0x20 /* Operand printed as base register */ 18 - #define OPERAND_INDEX 0x40 /* Operand printed as index register */ 19 - #define OPERAND_PCREL 0x80 /* Operand printed as pc-relative symbol */ 20 - #define OPERAND_SIGNED 0x100 /* Operand printed as signed value */ 21 - #define OPERAND_LENGTH 0x200 /* Operand printed as length (+1) */ 16 + #define OPERAND_VR 0x10 /* Operand printed as %vx */ 17 + #define OPERAND_DISP 0x20 /* Operand printed as displacement */ 18 + #define OPERAND_BASE 0x40 /* Operand printed as base register */ 19 + #define OPERAND_INDEX 0x80 /* Operand printed as index register */ 20 + #define OPERAND_PCREL 0x100 /* Operand printed as pc-relative symbol */ 21 + #define OPERAND_SIGNED 0x200 /* Operand printed as signed value */ 22 + #define OPERAND_LENGTH 0x400 /* Operand printed as length (+1) */ 22 23 23 24 24 25 struct s390_operand {
+242 -3
arch/s390/kernel/dis.c
··· 60 60 A_28, /* Access reg. starting at position 28 */ 61 61 C_8, /* Control reg. starting at position 8 */ 62 62 C_12, /* Control reg. starting at position 12 */ 63 + V_8, /* Vector reg. starting at position 8, extension bit at 36 */ 64 + V_12, /* Vector reg. starting at position 12, extension bit at 37 */ 65 + V_16, /* Vector reg. starting at position 16, extension bit at 38 */ 66 + V_32, /* Vector reg. starting at position 32, extension bit at 39 */ 67 + W_12, /* Vector reg. at bit 12, extension at bit 37, used as index */ 63 68 B_16, /* Base register starting at position 16 */ 64 69 B_32, /* Base register starting at position 32 */ 65 70 X_12, /* Index register starting at position 12 */ ··· 87 82 U8_24, /* 8 bit unsigned value starting at 24 */ 88 83 U8_32, /* 8 bit unsigned value starting at 32 */ 89 84 I8_8, /* 8 bit signed value starting at 8 */ 85 + I8_16, /* 8 bit signed value starting at 16 */ 86 + I8_24, /* 8 bit signed value starting at 24 */ 90 87 I8_32, /* 8 bit signed value starting at 32 */ 91 88 J12_12, /* PC relative offset at 12 */ 92 89 I16_16, /* 16 bit signed value starting at 16 */ ··· 103 96 U32_16, /* 32 bit unsigned value starting at 16 */ 104 97 M_16, /* 4 bit optional mask starting at 16 */ 105 98 M_20, /* 4 bit optional mask starting at 20 */ 99 + M_24, /* 4 bit optional mask starting at 24 */ 100 + M_28, /* 4 bit optional mask starting at 28 */ 101 + M_32, /* 4 bit optional mask starting at 32 */ 106 102 RO_28, /* optional GPR starting at position 28 */ 107 103 }; 108 104 ··· 140 130 INSTR_RSY_RDRM, 141 131 INSTR_RS_AARD, INSTR_RS_CCRD, INSTR_RS_R0RD, INSTR_RS_RRRD, 142 132 INSTR_RS_RURD, 143 - INSTR_RXE_FRRD, INSTR_RXE_RRRD, 133 + INSTR_RXE_FRRD, INSTR_RXE_RRRD, INSTR_RXE_RRRDM, 144 134 INSTR_RXF_FRRDF, 145 135 INSTR_RXY_FRRD, INSTR_RXY_RRRD, INSTR_RXY_URRD, 146 136 INSTR_RX_FRRD, INSTR_RX_RRRD, INSTR_RX_URRD, ··· 153 143 INSTR_SS_L0RDRD, INSTR_SS_LIRDRD, INSTR_SS_LLRDRD, INSTR_SS_RRRDRD, 154 144 INSTR_SS_RRRDRD2, INSTR_SS_RRRDRD3, 155 145 INSTR_S_00, INSTR_S_RD, 146 + INSTR_VRI_V0IM, INSTR_VRI_V0I0, INSTR_VRI_V0IIM, INSTR_VRI_VVIM, 147 + INSTR_VRI_VVV0IM, INSTR_VRI_VVV0I0, INSTR_VRI_VVIMM, 148 + INSTR_VRR_VV00MMM, INSTR_VRR_VV000MM, INSTR_VRR_VV0000M, 149 + INSTR_VRR_VV00000, INSTR_VRR_VVV0M0M, INSTR_VRR_VV00M0M, 150 + INSTR_VRR_VVV000M, INSTR_VRR_VVV000V, INSTR_VRR_VVV0000, 151 + INSTR_VRR_VVV0MMM, INSTR_VRR_VVV00MM, INSTR_VRR_VVVMM0V, 152 + INSTR_VRR_VVVM0MV, INSTR_VRR_VVVM00V, INSTR_VRR_VRR0000, 153 + INSTR_VRS_VVRDM, INSTR_VRS_VVRD0, INSTR_VRS_VRRDM, INSTR_VRS_VRRD0, 154 + INSTR_VRS_RVRDM, 155 + INSTR_VRV_VVRDM, INSTR_VRV_VWRDM, 156 + INSTR_VRX_VRRDM, INSTR_VRX_VRRD0, 156 157 }; 157 158 158 159 static const struct s390_operand operands[] = ··· 189 168 [A_28] = { 4, 28, OPERAND_AR }, 190 169 [C_8] = { 4, 8, OPERAND_CR }, 191 170 [C_12] = { 4, 12, OPERAND_CR }, 171 + [V_8] = { 4, 8, OPERAND_VR }, 172 + [V_12] = { 4, 12, OPERAND_VR }, 173 + [V_16] = { 4, 16, OPERAND_VR }, 174 + [V_32] = { 4, 32, OPERAND_VR }, 175 + [W_12] = { 4, 12, OPERAND_INDEX | OPERAND_VR }, 192 176 [B_16] = { 4, 16, OPERAND_BASE | OPERAND_GPR }, 193 177 [B_32] = { 4, 32, OPERAND_BASE | OPERAND_GPR }, 194 178 [X_12] = { 4, 12, OPERAND_INDEX | OPERAND_GPR }, ··· 216 190 [U8_24] = { 8, 24, 0 }, 217 191 [U8_32] = { 8, 32, 0 }, 218 192 [J12_12] = { 12, 12, OPERAND_PCREL }, 193 + [I8_8] = { 8, 8, OPERAND_SIGNED }, 194 + [I8_16] = { 8, 16, OPERAND_SIGNED }, 195 + [I8_24] = { 8, 24, OPERAND_SIGNED }, 196 + [I8_32] = { 8, 32, OPERAND_SIGNED }, 197 + [I16_32] = { 16, 32, OPERAND_SIGNED }, 219 198 [I16_16] = { 16, 16, OPERAND_SIGNED }, 220 199 [U16_16] = { 16, 16, 0 }, 221 200 [U16_32] = { 16, 32, 0 }, ··· 233 202 [U32_16] = { 32, 16, 0 }, 234 203 [M_16] = { 4, 16, 0 }, 235 204 [M_20] = { 4, 20, 0 }, 205 + [M_24] = { 4, 24, 0 }, 206 + [M_28] = { 4, 28, 0 }, 207 + [M_32] = { 4, 32, 0 }, 236 208 [RO_28] = { 4, 28, OPERAND_GPR } 237 209 }; 238 210 ··· 317 283 [INSTR_RS_RURD] = { 0xff, R_8,U4_12,D_20,B_16,0,0 }, 318 284 [INSTR_RXE_FRRD] = { 0xff, F_8,D_20,X_12,B_16,0,0 }, 319 285 [INSTR_RXE_RRRD] = { 0xff, R_8,D_20,X_12,B_16,0,0 }, 286 + [INSTR_RXE_RRRDM] = { 0xff, R_8,D_20,X_12,B_16,M_32,0 }, 320 287 [INSTR_RXF_FRRDF] = { 0xff, F_32,F_8,D_20,X_12,B_16,0 }, 321 288 [INSTR_RXY_FRRD] = { 0xff, F_8,D20_20,X_12,B_16,0,0 }, 322 289 [INSTR_RXY_RRRD] = { 0xff, R_8,D20_20,X_12,B_16,0,0 }, ··· 342 307 [INSTR_SS_RRRDRD] = { 0xff, D_20,R_8,B_16,D_36,B_32,R_12 }, 343 308 [INSTR_S_00] = { 0xff, 0,0,0,0,0,0 }, 344 309 [INSTR_S_RD] = { 0xff, D_20,B_16,0,0,0,0 }, 310 + [INSTR_VRI_V0IM] = { 0xff, V_8,I16_16,M_32,0,0,0 }, 311 + [INSTR_VRI_V0I0] = { 0xff, V_8,I16_16,0,0,0,0 }, 312 + [INSTR_VRI_V0IIM] = { 0xff, V_8,I8_16,I8_24,M_32,0,0 }, 313 + [INSTR_VRI_VVIM] = { 0xff, V_8,I16_16,V_12,M_32,0,0 }, 314 + [INSTR_VRI_VVV0IM]= { 0xff, V_8,V_12,V_16,I8_24,M_32,0 }, 315 + [INSTR_VRI_VVV0I0]= { 0xff, V_8,V_12,V_16,I8_24,0,0 }, 316 + [INSTR_VRI_VVIMM] = { 0xff, V_8,V_12,I16_16,M_32,M_28,0 }, 317 + [INSTR_VRR_VV00MMM]={ 0xff, V_8,V_12,M_32,M_28,M_24,0 }, 318 + [INSTR_VRR_VV000MM]={ 0xff, V_8,V_12,M_32,M_28,0,0 }, 319 + [INSTR_VRR_VV0000M]={ 0xff, V_8,V_12,M_32,0,0,0 }, 320 + [INSTR_VRR_VV00000]={ 0xff, V_8,V_12,0,0,0,0 }, 321 + [INSTR_VRR_VVV0M0M]={ 0xff, V_8,V_12,V_16,M_32,M_24,0 }, 322 + [INSTR_VRR_VV00M0M]={ 0xff, V_8,V_12,M_32,M_24,0,0 }, 323 + [INSTR_VRR_VVV000M]={ 0xff, V_8,V_12,V_16,M_32,0,0 }, 324 + [INSTR_VRR_VVV000V]={ 0xff, V_8,V_12,V_16,V_32,0,0 }, 325 + [INSTR_VRR_VVV0000]={ 0xff, V_8,V_12,V_16,0,0,0 }, 326 + [INSTR_VRR_VVV0MMM]={ 0xff, V_8,V_12,V_16,M_32,M_28,M_24 }, 327 + [INSTR_VRR_VVV00MM]={ 0xff, V_8,V_12,V_16,M_32,M_28,0 }, 328 + [INSTR_VRR_VVVMM0V]={ 0xff, V_8,V_12,V_16,V_32,M_20,M_24 }, 329 + [INSTR_VRR_VVVM0MV]={ 0xff, V_8,V_12,V_16,V_32,M_28,M_20 }, 330 + [INSTR_VRR_VVVM00V]={ 0xff, V_8,V_12,V_16,V_32,M_20,0 }, 331 + [INSTR_VRR_VRR0000]={ 0xff, V_8,R_12,R_16,0,0,0 }, 332 + [INSTR_VRS_VVRDM] = { 0xff, V_8,V_12,D_20,B_16,M_32,0 }, 333 + [INSTR_VRS_VVRD0] = { 0xff, V_8,V_12,D_20,B_16,0,0 }, 334 + [INSTR_VRS_VRRDM] = { 0xff, V_8,R_12,D_20,B_16,M_32,0 }, 335 + [INSTR_VRS_VRRD0] = { 0xff, V_8,R_12,D_20,B_16,0,0 }, 336 + [INSTR_VRS_RVRDM] = { 0xff, R_8,V_12,D_20,B_16,M_32,0 }, 337 + [INSTR_VRV_VVRDM] = { 0xff, V_8,V_12,D_20,B_16,M_32,0 }, 338 + [INSTR_VRV_VWRDM] = { 0xff, V_8,D_20,W_12,B_16,M_32,0 }, 339 + [INSTR_VRX_VRRDM] = { 0xff, V_8,D_20,X_12,B_16,M_32,0 }, 340 + [INSTR_VRX_VRRD0] = { 0xff, V_8,D_20,X_12,B_16,0,0 }, 345 341 }; 346 342 347 343 enum { ··· 447 381 LONG_INSN_MPCIFC, 448 382 LONG_INSN_STPCIFC, 449 383 LONG_INSN_PCISTB, 384 + LONG_INSN_VPOPCT, 385 + LONG_INSN_VERLLV, 386 + LONG_INSN_VESRAV, 387 + LONG_INSN_VESRLV, 388 + LONG_INSN_VSBCBI 450 389 }; 451 390 452 391 static char *long_insn_name[] = { ··· 526 455 [LONG_INSN_MPCIFC] = "mpcifc", 527 456 [LONG_INSN_STPCIFC] = "stpcifc", 528 457 [LONG_INSN_PCISTB] = "pcistb", 458 + [LONG_INSN_VPOPCT] = "vpopct", 459 + [LONG_INSN_VERLLV] = "verllv", 460 + [LONG_INSN_VESRAV] = "vesrav", 461 + [LONG_INSN_VESRLV] = "vesrlv", 462 + [LONG_INSN_VSBCBI] = "vsbcbi", 529 463 }; 530 464 531 465 static struct s390_insn opcode[] = { ··· 1445 1369 { "", 0, INSTR_INVALID } 1446 1370 }; 1447 1371 1372 + static struct s390_insn opcode_e7[] = { 1373 + #ifdef CONFIG_64BIT 1374 + { "lcbb", 0x27, INSTR_RXE_RRRDM }, 1375 + { "vgef", 0x13, INSTR_VRV_VVRDM }, 1376 + { "vgeg", 0x12, INSTR_VRV_VVRDM }, 1377 + { "vgbm", 0x44, INSTR_VRI_V0I0 }, 1378 + { "vgm", 0x46, INSTR_VRI_V0IIM }, 1379 + { "vl", 0x06, INSTR_VRX_VRRD0 }, 1380 + { "vlr", 0x56, INSTR_VRR_VV00000 }, 1381 + { "vlrp", 0x05, INSTR_VRX_VRRDM }, 1382 + { "vleb", 0x00, INSTR_VRX_VRRDM }, 1383 + { "vleh", 0x01, INSTR_VRX_VRRDM }, 1384 + { "vlef", 0x03, INSTR_VRX_VRRDM }, 1385 + { "vleg", 0x02, INSTR_VRX_VRRDM }, 1386 + { "vleib", 0x40, INSTR_VRI_V0IM }, 1387 + { "vleih", 0x41, INSTR_VRI_V0IM }, 1388 + { "vleif", 0x43, INSTR_VRI_V0IM }, 1389 + { "vleig", 0x42, INSTR_VRI_V0IM }, 1390 + { "vlgv", 0x21, INSTR_VRS_RVRDM }, 1391 + { "vllez", 0x04, INSTR_VRX_VRRDM }, 1392 + { "vlm", 0x36, INSTR_VRS_VVRD0 }, 1393 + { "vlbb", 0x07, INSTR_VRX_VRRDM }, 1394 + { "vlvg", 0x22, INSTR_VRS_VRRDM }, 1395 + { "vlvgp", 0x62, INSTR_VRR_VRR0000 }, 1396 + { "vll", 0x37, INSTR_VRS_VRRD0 }, 1397 + { "vmrh", 0x61, INSTR_VRR_VVV000M }, 1398 + { "vmrl", 0x60, INSTR_VRR_VVV000M }, 1399 + { "vpk", 0x94, INSTR_VRR_VVV000M }, 1400 + { "vpks", 0x97, INSTR_VRR_VVV0M0M }, 1401 + { "vpkls", 0x95, INSTR_VRR_VVV0M0M }, 1402 + { "vperm", 0x8c, INSTR_VRR_VVV000V }, 1403 + { "vpdi", 0x84, INSTR_VRR_VVV000M }, 1404 + { "vrep", 0x4d, INSTR_VRI_VVIM }, 1405 + { "vrepi", 0x45, INSTR_VRI_V0IM }, 1406 + { "vscef", 0x1b, INSTR_VRV_VWRDM }, 1407 + { "vsceg", 0x1a, INSTR_VRV_VWRDM }, 1408 + { "vsel", 0x8d, INSTR_VRR_VVV000V }, 1409 + { "vseg", 0x5f, INSTR_VRR_VV0000M }, 1410 + { "vst", 0x0e, INSTR_VRX_VRRD0 }, 1411 + { "vsteb", 0x08, INSTR_VRX_VRRDM }, 1412 + { "vsteh", 0x09, INSTR_VRX_VRRDM }, 1413 + { "vstef", 0x0b, INSTR_VRX_VRRDM }, 1414 + { "vsteg", 0x0a, INSTR_VRX_VRRDM }, 1415 + { "vstm", 0x3e, INSTR_VRS_VVRD0 }, 1416 + { "vstl", 0x3f, INSTR_VRS_VRRD0 }, 1417 + { "vuph", 0xd7, INSTR_VRR_VV0000M }, 1418 + { "vuplh", 0xd5, INSTR_VRR_VV0000M }, 1419 + { "vupl", 0xd6, INSTR_VRR_VV0000M }, 1420 + { "vupll", 0xd4, INSTR_VRR_VV0000M }, 1421 + { "va", 0xf3, INSTR_VRR_VVV000M }, 1422 + { "vacc", 0xf1, INSTR_VRR_VVV000M }, 1423 + { "vac", 0xbb, INSTR_VRR_VVVM00V }, 1424 + { "vaccc", 0xb9, INSTR_VRR_VVVM00V }, 1425 + { "vn", 0x68, INSTR_VRR_VVV0000 }, 1426 + { "vnc", 0x69, INSTR_VRR_VVV0000 }, 1427 + { "vavg", 0xf2, INSTR_VRR_VVV000M }, 1428 + { "vavgl", 0xf0, INSTR_VRR_VVV000M }, 1429 + { "vcksm", 0x66, INSTR_VRR_VVV0000 }, 1430 + { "vec", 0xdb, INSTR_VRR_VV0000M }, 1431 + { "vecl", 0xd9, INSTR_VRR_VV0000M }, 1432 + { "vceq", 0xf8, INSTR_VRR_VVV0M0M }, 1433 + { "vch", 0xfb, INSTR_VRR_VVV0M0M }, 1434 + { "vchl", 0xf9, INSTR_VRR_VVV0M0M }, 1435 + { "vclz", 0x53, INSTR_VRR_VV0000M }, 1436 + { "vctz", 0x52, INSTR_VRR_VV0000M }, 1437 + { "vx", 0x6d, INSTR_VRR_VVV0000 }, 1438 + { "vgfm", 0xb4, INSTR_VRR_VVV000M }, 1439 + { "vgfma", 0xbc, INSTR_VRR_VVVM00V }, 1440 + { "vlc", 0xde, INSTR_VRR_VV0000M }, 1441 + { "vlp", 0xdf, INSTR_VRR_VV0000M }, 1442 + { "vmx", 0xff, INSTR_VRR_VVV000M }, 1443 + { "vmxl", 0xfd, INSTR_VRR_VVV000M }, 1444 + { "vmn", 0xfe, INSTR_VRR_VVV000M }, 1445 + { "vmnl", 0xfc, INSTR_VRR_VVV000M }, 1446 + { "vmal", 0xaa, INSTR_VRR_VVVM00V }, 1447 + { "vmae", 0xae, INSTR_VRR_VVVM00V }, 1448 + { "vmale", 0xac, INSTR_VRR_VVVM00V }, 1449 + { "vmah", 0xab, INSTR_VRR_VVVM00V }, 1450 + { "vmalh", 0xa9, INSTR_VRR_VVVM00V }, 1451 + { "vmao", 0xaf, INSTR_VRR_VVVM00V }, 1452 + { "vmalo", 0xad, INSTR_VRR_VVVM00V }, 1453 + { "vmh", 0xa3, INSTR_VRR_VVV000M }, 1454 + { "vmlh", 0xa1, INSTR_VRR_VVV000M }, 1455 + { "vml", 0xa2, INSTR_VRR_VVV000M }, 1456 + { "vme", 0xa6, INSTR_VRR_VVV000M }, 1457 + { "vmle", 0xa4, INSTR_VRR_VVV000M }, 1458 + { "vmo", 0xa7, INSTR_VRR_VVV000M }, 1459 + { "vmlo", 0xa5, INSTR_VRR_VVV000M }, 1460 + { "vno", 0x6b, INSTR_VRR_VVV0000 }, 1461 + { "vo", 0x6a, INSTR_VRR_VVV0000 }, 1462 + { { 0, LONG_INSN_VPOPCT }, 0x50, INSTR_VRR_VV0000M }, 1463 + { { 0, LONG_INSN_VERLLV }, 0x73, INSTR_VRR_VVV000M }, 1464 + { "verll", 0x33, INSTR_VRS_VVRDM }, 1465 + { "verim", 0x72, INSTR_VRI_VVV0IM }, 1466 + { "veslv", 0x70, INSTR_VRR_VVV000M }, 1467 + { "vesl", 0x30, INSTR_VRS_VVRDM }, 1468 + { { 0, LONG_INSN_VESRAV }, 0x7a, INSTR_VRR_VVV000M }, 1469 + { "vesra", 0x3a, INSTR_VRS_VVRDM }, 1470 + { { 0, LONG_INSN_VESRLV }, 0x78, INSTR_VRR_VVV000M }, 1471 + { "vesrl", 0x38, INSTR_VRS_VVRDM }, 1472 + { "vsl", 0x74, INSTR_VRR_VVV0000 }, 1473 + { "vslb", 0x75, INSTR_VRR_VVV0000 }, 1474 + { "vsldb", 0x77, INSTR_VRI_VVV0I0 }, 1475 + { "vsra", 0x7e, INSTR_VRR_VVV0000 }, 1476 + { "vsrab", 0x7f, INSTR_VRR_VVV0000 }, 1477 + { "vsrl", 0x7c, INSTR_VRR_VVV0000 }, 1478 + { "vsrlb", 0x7d, INSTR_VRR_VVV0000 }, 1479 + { "vs", 0xf7, INSTR_VRR_VVV000M }, 1480 + { "vscb", 0xf5, INSTR_VRR_VVV000M }, 1481 + { "vsb", 0xbf, INSTR_VRR_VVVM00V }, 1482 + { { 0, LONG_INSN_VSBCBI }, 0xbd, INSTR_VRR_VVVM00V }, 1483 + { "vsumg", 0x65, INSTR_VRR_VVV000M }, 1484 + { "vsumq", 0x67, INSTR_VRR_VVV000M }, 1485 + { "vsum", 0x64, INSTR_VRR_VVV000M }, 1486 + { "vtm", 0xd8, INSTR_VRR_VV00000 }, 1487 + { "vfae", 0x82, INSTR_VRR_VVV0M0M }, 1488 + { "vfee", 0x80, INSTR_VRR_VVV0M0M }, 1489 + { "vfene", 0x81, INSTR_VRR_VVV0M0M }, 1490 + { "vistr", 0x5c, INSTR_VRR_VV00M0M }, 1491 + { "vstrc", 0x8a, INSTR_VRR_VVVMM0V }, 1492 + { "vfa", 0xe3, INSTR_VRR_VVV00MM }, 1493 + { "wfc", 0xcb, INSTR_VRR_VV000MM }, 1494 + { "wfk", 0xca, INSTR_VRR_VV000MM }, 1495 + { "vfce", 0xe8, INSTR_VRR_VVV0MMM }, 1496 + { "vfch", 0xeb, INSTR_VRR_VVV0MMM }, 1497 + { "vfche", 0xea, INSTR_VRR_VVV0MMM }, 1498 + { "vcdg", 0xc3, INSTR_VRR_VV00MMM }, 1499 + { "vcdlg", 0xc1, INSTR_VRR_VV00MMM }, 1500 + { "vcgd", 0xc2, INSTR_VRR_VV00MMM }, 1501 + { "vclgd", 0xc0, INSTR_VRR_VV00MMM }, 1502 + { "vfd", 0xe5, INSTR_VRR_VVV00MM }, 1503 + { "vfi", 0xc7, INSTR_VRR_VV00MMM }, 1504 + { "vlde", 0xc4, INSTR_VRR_VV000MM }, 1505 + { "vled", 0xc5, INSTR_VRR_VV00MMM }, 1506 + { "vfm", 0xe7, INSTR_VRR_VVV00MM }, 1507 + { "vfma", 0x8f, INSTR_VRR_VVVM0MV }, 1508 + { "vfms", 0x8e, INSTR_VRR_VVVM0MV }, 1509 + { "vfpso", 0xcc, INSTR_VRR_VV00MMM }, 1510 + { "vfsq", 0xce, INSTR_VRR_VV000MM }, 1511 + { "vfs", 0xe2, INSTR_VRR_VVV00MM }, 1512 + { "vftci", 0x4a, INSTR_VRI_VVIMM }, 1513 + #endif 1514 + }; 1515 + 1448 1516 static struct s390_insn opcode_eb[] = { 1449 1517 #ifdef CONFIG_64BIT 1450 1518 { "lmg", 0x04, INSTR_RSY_RRRD }, ··· 1772 1552 static unsigned int extract_operand(unsigned char *code, 1773 1553 const struct s390_operand *operand) 1774 1554 { 1555 + unsigned char *cp; 1775 1556 unsigned int val; 1776 1557 int bits; 1777 1558 1778 1559 /* Extract fragments of the operand byte for byte. */ 1779 - code += operand->shift / 8; 1560 + cp = code + operand->shift / 8; 1780 1561 bits = (operand->shift & 7) + operand->bits; 1781 1562 val = 0; 1782 1563 do { 1783 1564 val <<= 8; 1784 - val |= (unsigned int) *code++; 1565 + val |= (unsigned int) *cp++; 1785 1566 bits -= 8; 1786 1567 } while (bits > 0); 1787 1568 val >>= -bits; ··· 1791 1570 /* Check for special long displacement case. */ 1792 1571 if (operand->bits == 20 && operand->shift == 20) 1793 1572 val = (val & 0xff) << 12 | (val & 0xfff00) >> 8; 1573 + 1574 + /* Check for register extensions bits for vector registers. */ 1575 + if (operand->flags & OPERAND_VR) { 1576 + if (operand->shift == 8) 1577 + val |= (code[4] & 8) << 1; 1578 + else if (operand->shift == 12) 1579 + val |= (code[4] & 4) << 2; 1580 + else if (operand->shift == 16) 1581 + val |= (code[4] & 2) << 3; 1582 + else if (operand->shift == 32) 1583 + val |= (code[4] & 1) << 4; 1584 + } 1794 1585 1795 1586 /* Sign extend value if the operand is signed or pc relative. */ 1796 1587 if ((operand->flags & (OPERAND_SIGNED | OPERAND_PCREL)) && ··· 1871 1638 break; 1872 1639 case 0xe5: 1873 1640 table = opcode_e5; 1641 + break; 1642 + case 0xe7: 1643 + table = opcode_e7; 1644 + opfrag = code[5]; 1874 1645 break; 1875 1646 case 0xeb: 1876 1647 table = opcode_eb; ··· 1971 1734 ptr += sprintf(ptr, "%%a%i", value); 1972 1735 else if (operand->flags & OPERAND_CR) 1973 1736 ptr += sprintf(ptr, "%%c%i", value); 1737 + else if (operand->flags & OPERAND_VR) 1738 + ptr += sprintf(ptr, "%%v%i", value); 1974 1739 else if (operand->flags & OPERAND_PCREL) 1975 1740 ptr += sprintf(ptr, "%lx", (signed int) value 1976 1741 + addr);