Peter Bergner - [PATCH, COMMITTED] Add full Power ISA 3.0 / POWER9 binutils support
COLLECTED BY
Crawl of outlinks from wikipedia.org started March, 2016. These files are currently not publicly accessible.
Properties of this collection.
It has been several years since the last time we did this.
For this collection, several things were done:
1. Turned off duplicate detection. This collection will be complete, as there is a
good chance we will share the data, and sharing data with pointers to random
other collections, is a complex problem.
2. For the first time, did all the different wikis. The original runs were just against the
enwiki. This one, the seed list was built from all 865 collections.
The Wayback Machine - https://web.archive.org/web/20160307013258/https://sourceware.org/ml/binutils/2015-11/msg00071.html
This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project .
[PATCH, COMMITTED] Add full Power ISA 3.0 / POWER9 binutils support
From : Peter Bergner <bergner at vnet dot ibm dot com>
To : "binutils at sourceware dot org" <binutils at sourceware dot org>
Cc : Alan Modra <amodra at gmail dot com>
Date : Wed, 11 Nov 2015 20:09:41 -0600
Subject : [PATCH, COMMITTED] Add full Power ISA 3.0 / POWER9 binutils support
Authentication-results : sourceware.org; auth=none
This patch by Alan and I, adds full support for Power ISA 3.0 / POWER9
to binutils. This has passed bootstrap and make check. Committed.
Peter
include/opcode/
* ppc.h (PPC_OPCODE_POWER9): New define.
(PPC_OPCODE_VSX3): Likewise.
opcodes/
* ppc-dis.c (ppc_opts): Add "power9" and "pwr9" entries.
Add PPC_OPCODE_VSX3 to the vsx entry.
(powerpc_init_dialect): Set default dialect to power9.
* ppc-opc.c (insert_dcmxs, extract_dcmxs, insert_dxd, extract_dxd,
insert_dxdn, extract_dxdn, insert_l0, extract_l0, insert_l1,
extract_l1 insert_xtq6, extract_xtq6): New static functions.
(insert_esync): Test for illegal L operand value.
(DCMX, DCMXS, DXD, NDXD, L0, L1, RC, FC, UIM6, X_R, RIC, PRS, XSQ6,
XTQ6, LRAND, IMM8, DQX, DQX_MASK, DX, DX_MASK, VXVAPS_MASK, VXVA,XVA,
XX2VA, XVARC, XBF_MASK, XX2UIM4_MASK, XX2BFD_MASK, XX2DCMXS_MASK,
XVA_MASK, XRLA_MASK, XBFRARB_MASK, XLRAND_MASK, POWER9, PPCVEC3,
PPCVSX3): New defines.
(powerpc_opcodes) <ps_cmpu0, ps_cmpo0, ps_cmpu1, ps_cmpo1, fcmpu,
fcmpo, ftdiv, ftsqrt>: Use XBF_MASK.
<mcrxr>: Use XBFRARB_MASK.
<addpcis, bcdcfn., bcdcfsq., bcdcfz., bcdcpsgn., bcdctn., bcdctsq.,
bcdctz., bcds., bcdsetsgn., bcdsr., bcdtrunc., bcdus., bcdutrunc.,
cmpeqb, cmprb, cnttzd, cnttzd., cnttzw, cnttzw., copy, copy_first,
cp_abort, darn, dtstsfi, dtstsfiq, extswsli, extswsli., ldat, ldmx,
lwat, lxsd, lxsibzx, lxsihzx, lxssp, lxv, lxvb16x, lxvh8x, lxvl, lxvll,
lxvwsx, lxvx, maddhd, maddhdu, maddld, mcrxrx, mfvsrld, modsd, modsw,
modud, moduw, msgsync, mtvsrdd, mtvsrws, paste, paste., paste_last,
rmieg, setb, slbieg, slbsync, stdat, stop, stwat, stxsd, stxsibx,
stxsihx, stxssp, stxv, stxvb16x, stxvh8x, stxvl, stxvll, stxvx,
subpcis, urfid, vbpermd, vclzlsbb, vcmpneb, vcmpneb., vcmpneh,
vcmpneh., vcmpnew, vcmpnew., vcmpnezb, vcmpnezb., vcmpnezh, vcmpnezh.,
vcmpnezw, vcmpnezw., vctzb, vctzd, vctzh, vctzlsbb, vctzw, vextractd,
vextractub, vextractuh, vextractuw, vextsb2d, vextsb2w, vextsh2d,
vextsh2w, vextsw2d, vextublx, vextubrx, vextuhlx, vextuhrx, vextuwlx,
vextuwrx, vinsertb, vinsertd, vinserth, vinsertw, vmul10cuq,
vmul10ecuq, vmul10euq, vmul10uq, vnegd, vnegw, vpermr, vprtybd,
vprtybq, vprtybw, vrldmi, vrldnm, vrlwmi, vrlwnm, vslv, vsrv, wait,
xsabsqp, xsaddqp, xsaddqpo, xscmpeqdp, xscmpexpdp, xscmpexpqp,
xscmpgedp, xscmpgtdp, xscmpnedp, xscmpoqp, xscmpuqp, xscpsgnqp,
xscvdphp, xscvdpqp, xscvhpdp, xscvqpdp, xscvqpdpo, xscvqpsdz,
xscvqpswz, xscvqpudz, xscvqpuwz, xscvsdqp, xscvudqp, xsdivqp,
xsdivqpo, xsiexpdp, xsiexpqp, xsmaddqp, xsmaddqpo, xsmaxcdp,
xsmaxjdp, xsmincdp, xsminjdp, xsmsubqp, xsmsubqpo, xsmulqp, xsmulqpo,
xsnabsqp, xsnegqp, xsnmaddqp, xsnmaddqpo, xsnmsubqp, xsnmsubqpo,
xsrqpi, xsrqpix, xsrqpxp, xssqrtqp, xssqrtqpo, xssubqp, xssubqpo,
xststdcdp, xststdcqp, xststdcsp, xsxexpdp, xsxexpqp, xsxsigdp,
xsxsigqp, xvcmpnedp, xvcmpnedp., xvcmpnesp, xvcmpnesp., xvcvhpsp,
xvcvsphp, xviexpdp, xviexpsp, xvtstdcdp, xvtstdcsp, xvxexpdp,
xvxexpsp, xvxsigdp, xvxsigsp, xxbrd, xxbrh, xxbrq, xxbrw, xxextractuw,
xxinsertw, xxperm, xxpermr, xxspltib>: New instructions.
<doze, nap, sleep, rvwinkle, waitasec, lxvx, stxvx>: Disable on POWER9.
<tlbiel, tlbie, sync, slbmfev, slbmfee>: Add additional operands.
include/elf/
* ppc.h (R_PPC_REL16DX_HA): New reloction.
* ppc64.h (R_PPC64_REL16DX_HA): Likewise.
bfd/
* elf32-ppc.c (ppc_elf_howto_raw): Add R_PPC_REL16DX_HA.
(ppc_elf_reloc_type_lookup): Handle R_PPC_REL16DX_HA.
(ppc_elf_addr16_ha_reloc): Likewise.
(ppc_elf_check_relocs): Likewise.
(ppc_elf_relocate_section): Likewise.
(is_insn_dq_form): Handle lxv and stxv instructions.
* elf64-ppc.c (ppc64_elf_howto_raw): Add R_PPC64_REL16DX_HA.
(ppc64_elf_reloc_type_lookup): Handle R_PPC64_REL16DX_HA.
(ppc64_elf_ha_reloc): Likewise.
(ppc64_elf_check_relocs): Likewise.
(ppc64_elf_relocate_section): Likewise.
* bfd-in2.h: Regenerate.
* libbfd.h: Likewise.
* reloc.c (BFD_RELOC_PPC_REL16DX_HA): New.
elfcpp/
* powerpc.h (R_POWERPC_REL16DX_HA): Define.
gas/
* doc/as.texinfo (Target PowerPC): Document -mpower9 and -mpwr9.
* doc/c-ppc.texi (PowerPC-Opts): Likewise.
* config/tc-ppc.c (md_show_usage): Likewise.
(md_assemble): Handle BFD_RELOC_PPC_REL16DX_HA.
(md_apply_fix): Likewise.
(ppc_handle_align): Handle power9's group ending nop.
gas/testsuite/
* gas/ppc/altivec3.s: New test.
* gas/ppc/altivec3.d: Likewise.
* gas/ppc/vsx3.s: Likewise.
* gas/ppc/vsx3.d: Likewise.
* gas/ppc/power9.s: Likewise.
* gas/ppc/power9.d: Likewise.
* gas/ppc/ppc.exp: Run them.
* gas/ppc/power8.s <lxvx, lxvd2x, stxvx, stxvd2x>: Add new tests.
* gas/ppc/power8.d: Likewise.
* gas/ppc/vsx.s: <lxvx, stxvx>: Rename invalid mnemonics ...
<lxvd2x, stxvd2x>: ...to this.
* gas/ppc/vsx.d: Likewise.
gold/
* gold/powerpc.cc (Powerpc_relocate_functions::addr16_dq): New function.
(Powerpc_relocate_functions::addr16dx_ha): Likewise.
(Target_powerpc::Scan::local): Handle R_POWERPC_REL16DX_HA.
(Target_powerpc::Scan::global): Likewise.
(Target_powerpc::Relocate::relocate): Likewise.
ld/testsuite/
* ld-powerpc/addpcis.d: New test.
* ld-powerpc/addpcis.s: New test.
* ld-powerpc/powerpc.exp: Run it.
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 900b45c..3780ba2 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -3303,6 +3303,7 @@ instruction. */
BFD_RELOC_PPC_VLE_SDAREL_HI16D,
BFD_RELOC_PPC_VLE_SDAREL_HA16A,
BFD_RELOC_PPC_VLE_SDAREL_HA16D,
+ BFD_RELOC_PPC_REL16DX_HA,
BFD_RELOC_PPC64_HIGHER,
BFD_RELOC_PPC64_HIGHER_S,
BFD_RELOC_PPC64_HIGHEST,
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 5c26077..017de65 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -1731,6 +1731,21 @@ static reloc_howto_type ppc_elf_howto_raw[] = {
0xffff, /* dst_mask */
TRUE), /* pcrel_offset */
+ /* Like R_PPC_REL16_HA but for split field in addpcis. */
+ HOWTO (R_PPC_REL16DX_HA, /* type */
+ 16, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ ppc_elf_addr16_ha_reloc, /* special_function */
+ "R_PPC_REL16DX_HA", /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0x1fffc1, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
/* GNU extension to record C++ vtable hierarchy. */
HOWTO (R_PPC_GNU_VTINHERIT, /* type */
0, /* rightshift */
@@ -1989,6 +2004,7 @@ ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
case BFD_RELOC_LO16_PCREL: r = R_PPC_REL16_LO; break;
case BFD_RELOC_HI16_PCREL: r = R_PPC_REL16_HI; break;
case BFD_RELOC_HI16_S_PCREL: r = R_PPC_REL16_HA; break;
+ case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC_REL16DX_HA; break;
case BFD_RELOC_VTABLE_INHERIT: r = R_PPC_GNU_VTINHERIT; break;
case BFD_RELOC_VTABLE_ENTRY: r = R_PPC_GNU_VTENTRY; break;
}
@@ -2058,7 +2074,10 @@ ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
bfd *output_bfd,
char **error_message ATTRIBUTE_UNUSED)
{
- bfd_vma relocation;
+ enum elf_ppc_reloc_type r_type;
+ long insn;
+ bfd_size_type octets;
+ bfd_vma value;
if (output_bfd != NULL)
{
@@ -2066,20 +2085,28 @@ ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
return bfd_reloc_ok;
}
- if (bfd_is_com_section (symbol->section))
- relocation = 0;
- else
- relocation = symbol->value;
-
- relocation += symbol->section->output_section->vma;
- relocation += symbol->section->output_offset;
- relocation += reloc_entry->addend;
- if (reloc_entry->howto->pc_relative)
- relocation -= reloc_entry->address;
-
- reloc_entry->addend += (relocation & 0x8000) << 1;
-
- return bfd_reloc_continue;
+ reloc_entry->addend += 0x8000;
+ r_type = reloc_entry->howto->type;
+ if (r_type != R_PPC_REL16DX_HA)
+ return bfd_reloc_continue;
+
+ value = 0;
+ if (!bfd_is_com_section (symbol->section))
+ value = symbol->value;
+ value += (reloc_entry->addend
+ + symbol->section->output_offset
+ + symbol->section->output_section->vma);
+ value -= (reloc_entry->address
+ + input_section->output_offset
+ + input_section->output_section->vma);
+ value >>= 16;
+
+ octets = reloc_entry->address * bfd_octets_per_byte (abfd);
+ insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
+ insn &= ~0x1fffc1;
+ insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
+ bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
+ return bfd_reloc_ok;
}
static bfd_reloc_status_type
@@ -4247,6 +4274,7 @@ ppc_elf_check_relocs (bfd *abfd,
case R_PPC_REL16_LO:
case R_PPC_REL16_HI:
case R_PPC_REL16_HA:
+ case R_PPC_REL16DX_HA:
ppc_elf_tdata (abfd)->has_rel16 = 1;
break;
@@ -7604,7 +7632,9 @@ is_insn_ds_form (unsigned int insn)
static bfd_boolean
is_insn_dq_form (unsigned int insn)
{
- return (insn & (0x3f << 26)) == 56u << 26; /* lq */
+ return ((insn & (0x3f << 26)) == 56u << 26 /* lq */
+ || ((insn & (0x3f << 26)) == (61u << 26) /* lxv, stxv */
+ && (insn & 3) == 1));
}
/* The RELOCATE_SECTION function is called by the ELF backend linker
@@ -8605,6 +8635,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
case R_PPC_REL16_LO:
case R_PPC_REL16_HI:
case R_PPC_REL16_HA:
+ case R_PPC_REL16DX_HA:
break;
case R_PPC_REL32:
@@ -9311,6 +9342,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
case R_PPC_ADDR16_HA:
case R_PPC_REL16_HA:
+ case R_PPC_REL16DX_HA:
case R_PPC_SECTOFF_HA:
case R_PPC_TPREL16_HA:
case R_PPC_DTPREL16_HA:
@@ -9369,10 +9401,12 @@ ppc_elf_relocate_section (bfd *output_bfd,
mask = 15;
else
break;
- lobit = mask & (relocation + addend);
+ relocation += addend;
+ addend = insn & mask;
+ lobit = mask & relocation;
if (lobit != 0)
{
- addend -= lobit;
+ relocation ^= lobit;
info->callbacks->einfo
(_("%P: %H: error: %s against `%s' not a multiple of %u\n"),
input_bfd, input_section, rel->r_offset,
@@ -9380,7 +9414,6 @@ ppc_elf_relocate_section (bfd *output_bfd,
bfd_set_error (bfd_error_bad_value);
ret = FALSE;
}
- addend += insn & mask;
}
break;
}
@@ -9439,8 +9472,30 @@ ppc_elf_relocate_section (bfd *output_bfd,
}
}
- r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
- rel->r_offset, relocation, addend);
+ if (r_type == R_PPC_REL16DX_HA)
+ {
+ /* Split field reloc isn't handled by _bfd_final_link_relocate. */
+ if (rel->r_offset + 4 > input_section->size)
+ r = bfd_reloc_outofrange;
+ else
+ {
+ unsigned int insn;
+
+ relocation += addend;
+ relocation -= (rel->r_offset
+ + input_section->output_offset
+ + input_section->output_section->vma);
+ relocation >>= 16;
+ insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
+ insn &= ~0x1fffc1;
+ insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
+ bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
+ r = bfd_reloc_ok;
+ }
+ }
+ else
+ r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
+ rel->r_offset, relocation, addend);
if (r != bfd_reloc_ok)
{
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index f491a09..42356d8 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -2022,6 +2022,21 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
0xffff, /* dst_mask */
TRUE), /* pcrel_offset */
+ /* Like R_PPC64_REL16_HA but for split field in addpcis. */
+ HOWTO (R_PPC64_REL16DX_HA, /* type */
+ 16, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ ppc64_elf_ha_reloc, /* special_function */
+ "R_PPC64_REL16DX_HA", /* name */
+ FALSE, /* partial_inplace */
+ 0, /* src_mask */
+ 0x1fffc1, /* dst_mask */
+ TRUE), /* pcrel_offset */
+
/* Like R_PPC64_ADDR16_HI, but no overflow. */
HOWTO (R_PPC64_ADDR16_HIGH, /* type */
16, /* rightshift */
@@ -2412,6 +2427,8 @@ ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
break;
case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
break;
+ case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
+ break;
case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
break;
case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
@@ -2466,6 +2483,11 @@ ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
void *data, asection *input_section,
bfd *output_bfd, char **error_message)
{
+ enum elf_ppc64_reloc_type r_type;
+ long insn;
+ bfd_size_type octets;
+ bfd_vma value;
+
/* If this is a relocatable link (output_bfd test tells us), just
call the generic function. Any adjustment will be done at final
link time. */
@@ -2477,7 +2499,29 @@ ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
We won't actually be using the low 16 bits, so trashing them
doesn't matter. */
reloc_entry->addend += 0x8000;
- return bfd_reloc_continue;
+ r_type = reloc_entry->howto->type;
+ if (r_type != R_PPC64_REL16DX_HA)
+ return bfd_reloc_continue;
+
+ value = 0;
+ if (!bfd_is_com_section (symbol->section))
+ value = symbol->value;
+ value += (reloc_entry->addend
+ + symbol->section->output_offset
+ + symbol->section->output_section->vma);
+ value -= (reloc_entry->address
+ + input_section->output_offset
+ + input_section->output_section->vma);
+ value = (bfd_signed_vma) value >> 16;
+
+ octets = reloc_entry->address * bfd_octets_per_byte (abfd);
+ insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
+ insn &= ~0x1fffc1;
+ insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
+ bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
+ if (value + 0x8000 > 0xffff)
+ return bfd_reloc_overflow;
+ return bfd_reloc_ok;
}
static bfd_reloc_status_type
@@ -5502,6 +5546,7 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_PPC64_REL16_LO:
case R_PPC64_REL16_HI:
case R_PPC64_REL16_HA:
+ case R_PPC64_REL16DX_HA:
break;
/* Not supported as a dynamic relocation. */
@@ -14430,6 +14475,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
case R_PPC64_REL16_LO:
case R_PPC64_REL16_HI:
case R_PPC64_REL16_HA:
+ case R_PPC64_REL16DX_HA:
break;
case R_PPC64_REL14:
@@ -14842,6 +14888,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
break;
case R_PPC64_REL16_HA:
+ case R_PPC64_REL16DX_HA:
case R_PPC64_ADDR16_HA:
case R_PPC64_ADDR16_HIGHA:
case R_PPC64_ADDR16_HIGHERA:
@@ -14897,16 +14944,20 @@ ppc64_elf_relocate_section (bfd *output_bfd,
case R_PPC64_DTPREL16_LO_DS:
insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
mask = 3;
- /* If this reloc is against an lq insn, then the value must be
- a multiple of 16. This is somewhat of a hack, but the
- "correct" way to do this by defining _DQ forms of all the
- _DS relocs bloats all reloc switches in this file. It
- doesn't seem to make much sense to use any of these relocs
- in data, so testing the insn should be safe. */
- if ((insn & (0x3f << 26)) == (56u << 26))
+ /* If this reloc is against an lq, lxv, or stxv insn, then
+ the value must be a multiple of 16. This is somewhat of
+ a hack, but the "correct" way to do this by defining _DQ
+ forms of all the _DS relocs bloats all reloc switches in
+ this file. It doesn't make much sense to use these
+ relocs in data, so testing the insn should be safe. */
+ if ((insn & (0x3f << 26)) == (56u << 26)
+ || ((insn & (0x3f << 26)) == (61u << 26) && (insn & 3) == 1))
mask = 15;
- if (((relocation + addend) & mask) != 0)
+ relocation += addend;
+ addend = insn & (mask ^ 3);
+ if ((relocation & mask) != 0)
{
+ relocation ^= relocation & mask;
info->callbacks->einfo
(_("%P: %H: error: %s not a multiple of %u\n"),
input_bfd, input_section, rel->r_offset,
@@ -14964,8 +15015,30 @@ ppc64_elf_relocate_section (bfd *output_bfd,
}
}
- r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
- rel->r_offset, relocation, addend);
+ if (r_type == R_PPC64_REL16DX_HA)
+ {
+ /* Split field reloc isn't handled by _bfd_final_link_relocate. */
+ if (rel->r_offset + 4 > input_section->size)
+ r = bfd_reloc_outofrange;
+ else
+ {
+ relocation += addend;
+ relocation -= (rel->r_offset
+ + input_section->output_offset
+ + input_section->output_section->vma);
+ relocation = (bfd_signed_vma) relocation >> 16;
+ insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
+ insn &= ~0x1fffc1;
+ insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
+ bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
+ r = bfd_reloc_ok;
+ if (relocation + 0x8000 > 0xffff)
+ r = bfd_reloc_overflow;
+ }
+ }
+ else
+ r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
+ rel->r_offset, relocation, addend);
if (r != bfd_reloc_ok)
{
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index eef13c5..a095d7c 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -1391,6 +1391,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_PPC_VLE_SDAREL_HI16D",
"BFD_RELOC_PPC_VLE_SDAREL_HA16A",
"BFD_RELOC_PPC_VLE_SDAREL_HA16D",
+ "BFD_RELOC_PPC_REL16DX_HA",
"BFD_RELOC_PPC64_HIGHER",
"BFD_RELOC_PPC64_HIGHER_S",
"BFD_RELOC_PPC64_HIGHEST",
diff --git a/bfd/reloc.c b/bfd/reloc.c
index fad9d21..bbc376e 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -2890,6 +2890,8 @@ ENUMX
ENUMX
BFD_RELOC_PPC_VLE_SDAREL_HA16D
ENUMX
+ BFD_RELOC_PPC_REL16DX_HA
+ENUMX
BFD_RELOC_PPC64_HIGHER
ENUMX
BFD_RELOC_PPC64_HIGHER_S
diff --git a/elfcpp/powerpc.h b/elfcpp/powerpc.h
index d52a832..ae30c8a 100644
--- a/elfcpp/powerpc.h
+++ b/elfcpp/powerpc.h
@@ -197,6 +197,7 @@ enum
R_PPC_VLE_SDAREL_HA16A = 231,
R_PPC_VLE_SDAREL_HA16D = 232,
+ R_POWERPC_REL16DX_HA = 246,
R_PPC64_JMP_IREL = 247,
R_POWERPC_IRELATIVE = 248,
R_POWERPC_REL16 = 249,
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index b4c00c4..03eaa92 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -1294,6 +1294,7 @@ PowerPC options:\n\
-mpower6, -mpwr6 generate code for Power6 architecture\n\
-mpower7, -mpwr7 generate code for Power7 architecture\n\
-mpower8, -mpwr8 generate code for Power8 architecture\n\
+-mpower9, -mpwr9 generate code for Power9 architecture\n\
-mcell generate code for Cell Broadband Engine architecture\n\
-mcom generate code Power/PowerPC common instructions\n\
-many generate code for any architecture (PWR/PWRX/PPC)\n"));
@@ -3085,6 +3086,11 @@ md_assemble (char *str)
break;
}
+ /* addpcis. */
+ if (opcode->opcode == (19 << 26) + (2 << 1)
+ && reloc == BFD_RELOC_HI16_S)
+ reloc = BFD_RELOC_PPC_REL16DX_HA;
+
/* If VLE-mode convert LO/HI/HA relocations. */
if (opcode->flags & PPC_OPCODE_VLE)
{
@@ -6415,13 +6421,14 @@ ppc_handle_align (struct frag *fragP)
if ((ppc_cpu & PPC_OPCODE_POWER6) != 0
|| (ppc_cpu & PPC_OPCODE_POWER7) != 0
- || (ppc_cpu & PPC_OPCODE_POWER8) != 0)
+ || (ppc_cpu & PPC_OPCODE_POWER8) != 0
+ || (ppc_cpu & PPC_OPCODE_POWER9) != 0)
{
- /* For power6, power7 and power8, we want the last nop to be a group
- terminating one. Do this by inserting an rs_fill frag immediately
- after this one, with its address set to the last nop location.
- This will automatically reduce the number of nops in the current
- frag by one. */
+ /* For power6, power7, power8 and power9, we want the last nop to be
+ a group terminating one. Do this by inserting an rs_fill frag
+ immediately after this one, with its address set to the last nop
+ location. This will automatically reduce the number of nops in
+ the current frag by one. */
if (count > 4)
{
struct frag *group_nop = xmalloc (SIZEOF_STRUCT_FRAG + 4);
@@ -6436,13 +6443,14 @@ ppc_handle_align (struct frag *fragP)
}
if ((ppc_cpu & PPC_OPCODE_POWER7) != 0
- || (ppc_cpu & PPC_OPCODE_POWER8) != 0)
+ || (ppc_cpu & PPC_OPCODE_POWER8) != 0
+ || (ppc_cpu & PPC_OPCODE_POWER9) != 0)
{
if (ppc_cpu & PPC_OPCODE_E500MC)
/* e500mc group terminating nop: "ori 0,0,0". */
md_number_to_chars (dest, 0x60000000, 4);
else
- /* power7/power8 group terminating nop: "ori 2,2,0". */
+ /* power7/power8/power9 group terminating nop: "ori 2,2,0". */
md_number_to_chars (dest, 0x60420000, 4);
}
else
@@ -6460,6 +6468,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
{
valueT value = * valP;
offsetT fieldval;
+ unsigned long insn = 0;
const struct powerpc_operand *operand;
#ifdef OBJ_ELF
@@ -6468,6 +6477,9 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
/* Hack around bfd_install_relocation brain damage. */
if (fixP->fx_pcrel)
value += fixP->fx_frag->fr_address + fixP->fx_where;
+
+ if (fixP->fx_addsy == abs_section_sym)
+ fixP->fx_done = 1;
}
else
fixP->fx_done = 1;
@@ -6578,6 +6590,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
case BFD_RELOC_HI16_S:
case BFD_RELOC_HI16_S_PCREL:
+ case BFD_RELOC_PPC_REL16DX_HA:
#ifdef OBJ_ELF
if (REPORT_OVERFLOW_HI && ppc_obj64)
{
@@ -6624,7 +6637,6 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
{
/* Handle relocs in an insn. */
char *where;
- unsigned long insn;
switch (fixP->fx_r_type)
{
@@ -7037,6 +7049,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg)
case BFD_RELOC_LO16_PCREL:
case BFD_RELOC_HI16_PCREL:
case BFD_RELOC_HI16_S_PCREL:
+ case BFD_RELOC_PPC_REL16DX_HA:
case BFD_RELOC_64_PCREL:
case BFD_RELOC_32_PCREL:
case BFD_RELOC_16_PCREL:
diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo
index e04281d..41efee9 100644
--- a/gas/doc/as.texinfo
+++ b/gas/doc/as.texinfo
@@ -478,7 +478,8 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
@b{-m440}|@b{-m464}|@b{-m476}|@b{-m7400}|@b{-m7410}|@b{-m7450}|@b{-m7455}|@b{-m750cl}|@b{-mppc64}|
@b{-m620}|@b{-me500}|@b{-e500x2}|@b{-me500mc}|@b{-me500mc64}|@b{-me5500}|@b{-me6500}|@b{-mppc64bridge}|
@b{-mbooke}|@b{-mpower4}|@b{-mpwr4}|@b{-mpower5}|@b{-mpwr5}|@b{-mpwr5x}|@b{-mpower6}|@b{-mpwr6}|
- @b{-mpower7}|@b{-mpwr7}|@b{-mpower8}|@b{-mpwr8}|@b{-ma2}|@b{-mcell}|@b{-mspe}|@b{-mtitan}|@b{-me300}|@b{-mcom}]
+ @b{-mpower7}|@b{-mpwr7}|@b{-mpower8}|@b{-mpwr8}|@b{-mpower9}|@b{-mpwr9}@b{-ma2}|
+ @b{-mcell}|@b{-mspe}|@b{-mtitan}|@b{-me300}|@b{-mcom}]
[@b{-many}] [@b{-maltivec}|@b{-mvsx}|@b{-mhtm}|@b{-mvle}]
[@b{-mregnames}|@b{-mno-regnames}]
[@b{-mrelocatable}|@b{-mrelocatable-lib}|@b{-K PIC}] [@b{-memb}]
diff --git a/gas/doc/c-ppc.texi b/gas/doc/c-ppc.texi
index d318c96..4fac2b0 100644
--- a/gas/doc/c-ppc.texi
+++ b/gas/doc/c-ppc.texi
@@ -141,6 +141,9 @@ Generate code for Power7 architecture.
@item -mpower8, -mpwr8
Generate code for Power8 architecture.
+@item -mpower9, -mpwr9
+Generate code for Power9 architecture.
+
@item -mcell
@item -mcell
Generate code for Cell Broadband Engine architecture.
diff --git a/gas/testsuite/gas/ppc/altivec3.d b/gas/testsuite/gas/ppc/altivec3.d
new file mode 100644
index 0000000..58a8313
--- /dev/null
+++ b/gas/testsuite/gas/ppc/altivec3.d
@@ -0,0 +1,78 @@
+#as: -mpower9
+#objdump: -dr -Mpower9
+#name: Altivec ISA 3.0 instructions
+
+.*
+
+
+Disassembly of section \.text:
+
+0+00 <start>:
+
+.*: (11 7e 00 01|01 00 7e 11) vmul10cuq v11,v30
+.*: (13 c1 b8 07|07 b8 c1 13) vcmpneb v30,v1,v23
+.*: (13 d3 f7 7b|7b f7 d3 13) vpermr v30,v19,v30,v29
+.*: (12 94 88 41|41 88 94 12) vmul10ecuq v20,v20,v17
+.*: (13 73 f8 47|47 f8 73 13) vcmpneh v27,v19,v31
+.*: (10 c9 b8 85|85 b8 c9 10) vrlwmi v6,v9,v23
+.*: (12 da 08 87|87 08 da 12) vcmpnew v22,v26,v1
+.*: (13 1e c8 c5|c5 c8 1e 13) vrldmi v24,v30,v25
+.*: (12 7d b1 07|07 b1 7d 12) vcmpnezb v19,v29,v22
+.*: (11 17 99 47|47 99 17 11) vcmpnezh v8,v23,v19
+.*: (13 78 59 85|85 59 78 13) vrlwnm v27,v24,v11
+.*: (12 ad 51 87|87 51 ad 12) vcmpnezw v21,v13,v10
+.*: (10 b4 e9 c5|c5 e9 b4 10) vrldnm v5,v20,v29
+.*: (13 d3 02 01|01 02 d3 13) vmul10uq v30,v19
+.*: (13 0c aa 0d|0d aa 0c 13) vextractub v24,v21,12
+.*: (10 13 e2 41|41 e2 13 10) vmul10euq v0,v19,v28
+.*: (11 4c 1a 4d|4d 1a 4c 11) vextractuh v10,v3,12
+.*: (13 87 62 8d|8d 62 87 13) vextractuw v28,v12,7
+.*: (13 c1 da cd|cd da c1 13) vextractd v30,v27,1
+.*: (13 24 fb 0d|0d fb 24 13) vinsertb v25,v31,4
+.*: (12 ae f3 41|41 f3 ae 12) bcdcpsgn\. v21,v14,v30
+.*: (12 c5 93 4d|4d 93 c5 12) vinserth v22,v18,5
+.*: (13 a1 b3 8d|8d b3 a1 13) vinsertw v29,v22,1
+.*: (13 a7 6b cd|cd 6b a7 13) vinsertd v29,v13,7
+.*: (12 d9 44 07|07 44 d9 12) vcmpneb\. v22,v25,v8
+.*: (12 0f ac 47|47 ac 0f 12) vcmpneh\. v16,v15,v21
+.*: (12 d5 fc 81|81 fc d5 12) bcdus\. v22,v21,v31
+.*: (10 2c 64 87|87 64 2c 10) vcmpnew\. v1,v12,v12
+.*: (10 a3 46 c1|c1 46 a3 10) bcds\. v5,v3,v8,1
+.*: (13 76 0d 01|01 0d 76 13) bcdtrunc\. v27,v22,v1,0
+.*: (10 5a 05 07|07 05 5a 10) vcmpnezb\. v2,v26,v0
+.*: (13 4e 3d 41|41 3d 4e 13) bcdutrunc\. v26,v14,v7
+.*: (12 05 65 47|47 65 05 12) vcmpnezh\. v16,v5,v12
+.*: (13 00 2d 81|81 2d 00 13) bcdctsq\. v24,v5
+.*: (10 e2 05 81|81 05 e2 10) bcdcfsq\. v7,v0,0
+.*: (13 c4 67 81|81 67 c4 13) bcdctz\. v30,v12,1
+.*: (12 25 bd 81|81 bd 25 12) bcdctn\. v17,v23
+.*: (10 86 7f 81|81 7f 86 10) bcdcfz\. v4,v15,1
+.*: (13 a7 2f 81|81 2f a7 13) bcdcfn\. v29,v5,1
+.*: (13 7f 65 81|81 65 7f 13) bcdsetsgn\. v27,v12,0
+.*: (11 dc cd 87|87 cd dc 11) vcmpnezw\. v14,v28,v25
+.*: (10 42 37 c1|c1 37 42 10) bcdsr\. v2,v2,v6,1
+.*: (13 20 2d cc|cc 2d 20 13) vbpermd v25,v0,v5
+.*: (13 80 ce 02|02 ce 80 13) vclzlsbb r28,v25
+.*: (10 41 c6 02|02 c6 41 10) vctzlsbb r2,v24
+.*: (12 a6 5e 02|02 5e a6 12) vnegw v21,v11
+.*: (12 27 de 02|02 de 27 12) vnegd v17,v27
+.*: (13 e8 be 02|02 be e8 13) vprtybw v31,v23
+.*: (12 a9 be 02|02 be a9 12) vprtybd v21,v23
+.*: (12 aa 96 02|02 96 aa 12) vprtybq v21,v18
+.*: (13 d0 26 02|02 26 d0 13) vextsb2w v30,v4
+.*: (10 71 d6 02|02 d6 71 10) vextsh2w v3,v26
+.*: (11 78 8e 02|02 8e 78 11) vextsb2d v11,v17
+.*: (10 b9 56 02|02 56 b9 10) vextsh2d v5,v10
+.*: (11 ba ce 02|02 ce ba 11) vextsw2d v13,v25
+.*: (13 3c 16 02|02 16 3c 13) vctzb v25,v2
+.*: (10 1d 1e 02|02 1e 1d 10) vctzh v0,v3
+.*: (12 de 36 02|02 36 de 12) vctzw v22,v6
+.*: (13 5f c6 02|02 c6 5f 13) vctzd v26,v24
+.*: (10 df 16 0d|0d 16 df 10) vextublx r6,r31,v2
+.*: (11 a0 96 4d|4d 96 a0 11) vextuhlx r13,r0,v18
+.*: (11 de fe 8d|8d fe de 11) vextuwlx r14,r30,v31
+.*: (11 ec 77 04|04 77 ec 11) vsrv v15,v12,v14
+.*: (12 8a f7 0d|0d f7 8a 12) vextubrx r20,r10,v30
+.*: (12 b5 17 44|44 17 b5 12) vslv v21,v21,v2
+.*: (11 e9 0f 4d|4d 0f e9 11) vextuhrx r15,r9,v1
+.*: (12 b1 87 8d|8d 87 b1 12) vextuwrx r21,r17,v16
diff --git a/gas/testsuite/gas/ppc/altivec3.s b/gas/testsuite/gas/ppc/altivec3.s
new file mode 100644
index 0000000..6217da5
--- /dev/null
+++ b/gas/testsuite/gas/ppc/altivec3.s
@@ -0,0 +1,69 @@
+ .text
+start:
+ vmul10cuq 11,30
+ vcmpneb 30,1,23
+ vpermr 30,19,30,29
+ vmul10ecuq 20,20,17
+ vcmpneh 27,19,31
+ vrlwmi 6,9,23
+ vcmpnew 22,26,1
+ vrldmi 24,30,25
+ vcmpnezb 19,29,22
+ vcmpnezh 8,23,19
+ vrlwnm 27,24,11
+ vcmpnezw 21,13,10
+ vrldnm 5,20,29
+ vmul10uq 30,19
+ vextractub 24,21,12
+ vmul10euq 0,19,28
+ vextractuh 10,3,12
+ vextractuw 28,12,7
+ vextractd 30,27,1
+ vinsertb 25,31,4
+ bcdcpsgn. 21,14,30
+ vinserth 22,18,5
+ vinsertw 29,22,1
+ vinsertd 29,13,7
+ vcmpneb. 22,25,8
+ vcmpneh. 16,15,21
+ bcdus. 22,21,31
+ vcmpnew. 1,12,12
+ bcds. 5,3,8,1
+ bcdtrunc. 27,22,1,0
+ vcmpnezb. 2,26,0
+ bcdutrunc. 26,14,7
+ vcmpnezh. 16,5,12
+ bcdctsq. 24,5
+ bcdcfsq. 7,0,0
+ bcdctz. 30,12,1
+ bcdctn. 17,23
+ bcdcfz. 4,15,1
+ bcdcfn. 29,5,1
+ bcdsetsgn. 27,12,0
+ vcmpnezw. 14,28,25
+ bcdsr. 2,2,6,1
+ vbpermd 25,0,5
+ vclzlsbb 28,25
+ vctzlsbb 2,24
+ vnegw 21,11
+ vnegd 17,27
+ vprtybw 31,23
+ vprtybd 21,23
+ vprtybq 21,18
+ vextsb2w 30,4
+ vextsh2w 3,26
+ vextsb2d 11,17
+ vextsh2d 5,10
+ vextsw2d 13,25
+ vctzb 25,2
+ vctzh 0,3
+ vctzw 22,6
+ vctzd 26,24
+ vextublx 6,31,2
+ vextuhlx 13,0,18
+ vextuwlx 14,30,31
+ vsrv 15,12,14
+ vextubrx 20,10,30
+ vslv 21,21,2
+ vextuhrx 15,9,1
+ vextuwrx 21,17,16
diff --git a/gas/testsuite/gas/ppc/power8.d b/gas/testsuite/gas/ppc/power8.d
index 61e1cab..aaa64c8 100644
--- a/gas/testsuite/gas/ppc/power8.d
+++ b/gas/testsuite/gas/ppc/power8.d
@@ -152,4 +152,12 @@ Disassembly of section \.text:
238: (fe c7 2f 8c|8c 2f c7 fe) fmrgew f22,f7,f5
23c: (7c 00 71 9c|9c 71 00 7c) msgsnd r14
240: (7c 00 b9 dc|dc b9 00 7c) msgclr r23
+.*: (7d 00 2e 99|99 2e 00 7d) lxvd2x vs40,0,r5
+.*: (7d 00 2e 99|99 2e 00 7d) lxvd2x vs40,0,r5
+.*: (7d 54 36 98|98 36 54 7d) lxvd2x vs10,r20,r6
+.*: (7d 54 36 98|98 36 54 7d) lxvd2x vs10,r20,r6
+.*: (7d 20 3f 99|99 3f 20 7d) stxvd2x vs41,0,r7
+.*: (7d 20 3f 99|99 3f 20 7d) stxvd2x vs41,0,r7
+.*: (7d 75 47 98|98 47 75 7d) stxvd2x vs11,r21,r8
+.*: (7d 75 47 98|98 47 75 7d) stxvd2x vs11,r21,r8
#pass
diff --git a/gas/testsuite/gas/ppc/power8.s b/gas/testsuite/gas/ppc/power8.s
index 09dbe43..0b350eb 100644
--- a/gas/testsuite/gas/ppc/power8.s
+++ b/gas/testsuite/gas/ppc/power8.s
@@ -144,3 +144,11 @@ power8:
fmrgew 22,7,5
msgsnd 14
msgclr 23
+ lxvx 40,0,5
+ lxvd2x 40,0,5
+ lxvx 10,20,6
+ lxvd2x 10,20,6
+ stxvx 41,0,7
+ stxvd2x 41,0,7
+ stxvx 11,21,8
+ stxvd2x 11,21,8
diff --git a/gas/testsuite/gas/ppc/power9.d b/gas/testsuite/gas/ppc/power9.d
new file mode 100644
index 0000000..950af6c
--- /dev/null
+++ b/gas/testsuite/gas/ppc/power9.d
@@ -0,0 +1,388 @@
+#as: -mpower9
+#objdump: -dr -Mpower9
+#name: POWER9 tests
+
+.*
+
+
+Disassembly of section \.text:
+
+0+00 <power9>:
+
+.*: (7d a3 04 74|74 04 a3 7d) cnttzd r3,r13
+.*: (7d c4 04 75|75 04 c4 7d) cnttzd\. r4,r14
+.*: (7d e5 04 34|34 04 e5 7d) cnttzw r5,r15
+.*: (7e 06 04 35|35 04 06 7e) cnttzw\. r6,r16
+.*: (7d 54 ae 12|12 ae 54 7d) modsd r10,r20,r21
+.*: (7d 75 b6 16|16 b6 75 7d) modsw r11,r21,r22
+.*: (7d 96 ba 12|12 ba 96 7d) modud r12,r22,r23
+.*: (7d b7 c2 16|16 c2 b7 7d) moduw r13,r23,r24
+.*: (10 67 25 81|81 25 67 10) bcdcfn\. v3,v4,0
+.*: (10 67 27 81|81 27 67 10) bcdcfn\. v3,v4,1
+.*: (10 82 2d 81|81 2d 82 10) bcdcfsq\. v4,v5,0
+.*: (10 82 2f 81|81 2f 82 10) bcdcfsq\. v4,v5,1
+.*: (10 a6 35 81|81 35 a6 10) bcdcfz\. v5,v6,0
+.*: (10 a6 37 81|81 37 a6 10) bcdcfz\. v5,v6,1
+.*: (10 c7 43 41|41 43 c7 10) bcdcpsgn\. v6,v7,v8
+.*: (10 e5 45 81|81 45 e5 10) bcdctn\. v7,v8
+.*: (11 00 4d 81|81 4d 00 11) bcdctsq\. v8,v9
+.*: (11 24 55 81|81 55 24 11) bcdctz\. v9,v10,0
+.*: (11 24 57 81|81 57 24 11) bcdctz\. v9,v10,1
+.*: (11 5f 5d 81|81 5d 5f 11) bcdsetsgn\. v10,v11,0
+.*: (11 5f 5f 81|81 5f 5f 11) bcdsetsgn\. v10,v11,1
+.*: (11 6c 6d c1|c1 6d 6c 11) bcdsr\. v11,v12,v13,0
+.*: (11 6c 6f c1|c1 6f 6c 11) bcdsr\. v11,v12,v13,1
+.*: (11 8d 74 c1|c1 74 8d 11) bcds\. v12,v13,v14,0
+.*: (11 8d 76 c1|c1 76 8d 11) bcds\. v12,v13,v14,1
+.*: (11 ae 7d 01|01 7d ae 11) bcdtrunc\. v13,v14,v15,0
+.*: (11 ae 7f 01|01 7f ae 11) bcdtrunc\. v13,v14,v15,1
+.*: (11 cf 84 81|81 84 cf 11) bcdus\. v14,v15,v16
+.*: (11 f0 8d 41|41 8d f0 11) bcdutrunc\. v15,v16,v17
+.*: (7e 80 aa 5a|5a aa 80 7e) lxvll vs20,0,r21
+.*: (7e 8a aa 5a|5a aa 8a 7e) lxvll vs20,r10,r21
+.*: (7e a0 5b 5a|5a 5b a0 7e) stxvll vs21,0,r11
+.*: (7e aa 5b 5a|5a 5b aa 7e) stxvll vs21,r10,r11
+.*: (12 d7 00 01|01 00 d7 12) vmul10cuq v22,v23
+.*: (12 f8 c8 41|41 c8 f8 12) vmul10ecuq v23,v24,v25
+.*: (13 19 d2 41|41 d2 19 13) vmul10euq v24,v25,v26
+.*: (13 3a 02 01|01 02 3a 13) vmul10uq v25,v26
+.*: (fd 4b 60 08|08 60 4b fd) xsaddqp v10,v11,v12
+.*: (fd 6c 60 09|09 60 6c fd) xsaddqpo v11,v12,v12
+.*: (fe 80 f0 0a|0a f0 80 fe) xsrqpi 0,v20,v30,0
+.*: (fe 81 f0 0a|0a f0 81 fe) xsrqpi 1,v20,v30,0
+.*: (fe 80 f6 0a|0a f6 80 fe) xsrqpi 0,v20,v30,3
+.*: (fe 81 f6 0a|0a f6 81 fe) xsrqpi 1,v20,v30,3
+.*: (fe a0 f8 0b|0b f8 a0 fe) xsrqpix 0,v21,v31,0
+.*: (fe a1 f8 0b|0b f8 a1 fe) xsrqpix 1,v21,v31,0
+.*: (fe a0 fe 0b|0b fe a0 fe) xsrqpix 0,v21,v31,3
+.*: (fe a1 fe 0b|0b fe a1 fe) xsrqpix 1,v21,v31,3
+.*: (fd 8d 70 48|48 70 8d fd) xsmulqp v12,v13,v14
+.*: (fd ae 78 49|49 78 ae fd) xsmulqpo v13,v14,v15
+.*: (fe c0 b8 4a|4a b8 c0 fe) xsrqpxp 0,v22,v23,0
+.*: (fe c1 b8 4a|4a b8 c1 fe) xsrqpxp 1,v22,v23,0
+.*: (fe c0 be 4a|4a be c0 fe) xsrqpxp 0,v22,v23,3
+.*: (fe c1 be 4a|4a be c1 fe) xsrqpxp 1,v22,v23,3
+.*: (fd cf 80 c8|c8 80 cf fd) xscpsgnqp v14,v15,v16
+.*: (fc 0f 81 08|08 81 0f fc) xscmpoqp cr0,v15,v16
+.*: (ff 8f 81 08|08 81 8f ff) xscmpoqp cr7,v15,v16
+.*: (fc 10 89 48|48 89 10 fc) xscmpexpqp cr0,v16,v17
+.*: (ff 90 89 48|48 89 90 ff) xscmpexpqp cr7,v16,v17
+.*: (fe 32 9b 08|08 9b 32 fe) xsmaddqp v17,v18,v19
+.*: (fe 53 a3 09|09 a3 53 fe) xsmaddqpo v18,v19,v20
+.*: (fe 74 ab 48|48 ab 74 fe) xsmsubqp v19,v20,v21
+.*: (fe 95 b3 49|49 b3 95 fe) xsmsubqpo v20,v21,v22
+.*: (fe b6 bb 88|88 bb b6 fe) xsnmaddqp v21,v22,v23
+.*: (fe d7 c3 89|89 c3 d7 fe) xsnmaddqpo v22,v23,v24
+.*: (fe f8 cb c8|c8 cb f8 fe) xsnmsubqp v23,v24,v25
+.*: (ff 19 d3 c9|c9 d3 19 ff) xsnmsubqpo v24,v25,v26
+.*: (ff 3a dc 08|08 dc 3a ff) xssubqp v25,v26,v27
+.*: (ff 5b e4 09|09 e4 5b ff) xssubqpo v26,v27,v28
+.*: (ff 7c ec 48|48 ec 7c ff) xsdivqp v27,v28,v29
+.*: (ff 9d f4 49|49 f4 9d ff) xsdivqpo v28,v29,v30
+.*: (fc 1d f5 08|08 f5 1d fc) xscmpuqp cr0,v29,v30
+.*: (ff 9d f5 08|08 f5 9d ff) xscmpuqp cr7,v29,v30
+.*: (fc 00 f5 88|88 f5 00 fc) xststdcqp cr0,v30,0
+.*: (ff 80 f5 88|88 f5 80 ff) xststdcqp cr7,v30,0
+.*: (fc 7f fd 88|88 fd 7f fc) xststdcqp cr0,v31,127
+.*: (ff ff fd 88|88 fd ff ff) xststdcqp cr7,v31,127
+.*: (fd 40 5e 48|48 5e 40 fd) xsabsqp v10,v11
+.*: (fd 62 66 48|48 66 62 fd) xsxexpqp v11,v12
+.*: (fd 88 6e 48|48 6e 88 fd) xsnabsqp v12,v13
+.*: (fd b0 76 48|48 76 b0 fd) xsnegqp v13,v14
+.*: (fd d2 7e 48|48 7e d2 fd) xsxsigqp v14,v15
+.*: (fd fb 86 48|48 86 fb fd) xssqrtqp v15,v16
+.*: (fe 1b 8e 49|49 8e 1b fe) xssqrtqpo v16,v17
+.*: (fe 21 96 88|88 96 21 fe) xscvqpuwz v17,v18
+.*: (fe 42 9e 88|88 9e 42 fe) xscvudqp v18,v19
+.*: (fe 69 a6 88|88 a6 69 fe) xscvqpswz v19,v20
+.*: (fe 8a ae 88|88 ae 8a fe) xscvsdqp v20,v21
+.*: (fe b1 b6 88|88 b6 b1 fe) xscvqpudz v21,v22
+.*: (fe d4 be 88|88 be d4 fe) xscvqpdp v22,v23
+.*: (fe f4 c6 89|89 c6 f4 fe) xscvqpdpo v23,v24
+.*: (ff 16 ce 88|88 ce 16 ff) xscvdpqp v24,v25
+.*: (ff 39 d6 88|88 d6 39 ff) xscvqpsdz v25,v26
+.*: (ff 5b e6 c8|c8 e6 5b ff) xsiexpqp v26,v27,v28
+.*: (10 85 31 fb|fb 31 85 10) vpermr v4,v5,v6,v7
+.*: (10 a0 32 0d|0d 32 a0 10) vextractub v5,v6,0
+.*: (10 af 32 0d|0d 32 af 10) vextractub v5,v6,15
+.*: (10 c0 3a 4d|4d 3a c0 10) vextractuh v6,v7,0
+.*: (10 cf 3a 4d|4d 3a cf 10) vextractuh v6,v7,15
+.*: (10 e0 42 8d|8d 42 e0 10) vextractuw v7,v8,0
+.*: (10 ef 42 8d|8d 42 ef 10) vextractuw v7,v8,15
+.*: (11 00 4a cd|cd 4a 00 11) vextractd v8,v9,0
+.*: (11 0f 4a cd|cd 4a 0f 11) vextractd v8,v9,15
+.*: (11 20 53 0d|0d 53 20 11) vinsertb v9,v10,0
+.*: (11 2f 53 0d|0d 53 2f 11) vinsertb v9,v10,15
+.*: (11 40 5b 4d|4d 5b 40 11) vinserth v10,v11,0
+.*: (11 4f 5b 4d|4d 5b 4f 11) vinserth v10,v11,15
+.*: (11 60 63 8d|8d 63 60 11) vinsertw v11,v12,0
+.*: (11 6f 63 8d|8d 63 6f 11) vinsertw v11,v12,15
+.*: (11 80 6b cd|cd 6b 80 11) vinsertd v12,v13,0
+.*: (11 8f 6b cd|cd 6b 8f 11) vinsertd v12,v13,15
+.*: (7d b4 02 67|67 02 b4 7d) mfvsrld r20,vs45
+.*: (7d d5 03 27|27 03 d5 7d) mtvsrws vs46,r21
+.*: (7d e0 bb 67|67 bb e0 7d) mtvsrdd vs47,0,r23
+.*: (7d f6 bb 67|67 bb f6 7d) mtvsrdd vs47,r22,r23
+.*: (7e 40 5a 19|19 5a 40 7e) lxvx vs50,0,r11
+.*: (7c 0a 5a 18|18 5a 0a 7c) lxvx vs0,r10,r11
+.*: (7e 60 62 d9|d9 62 60 7e) lxvwsx vs51,0,r12
+.*: (7c 2a 62 d8|d8 62 2a 7c) lxvwsx vs1,r10,r12
+.*: (7e 80 6e 59|59 6e 80 7e) lxvh8x vs52,0,r13
+.*: (7c 4a 6e 58|58 6e 4a 7c) lxvh8x vs2,r10,r13
+.*: (7e a0 76 d9|d9 76 a0 7e) lxvb16x vs53,0,r14
+.*: (7c 6a 76 d8|d8 76 6a 7c) lxvb16x vs3,r10,r14
+.*: (7e c0 7b 19|19 7b c0 7e) stxvx vs54,0,r15
+.*: (7c 94 7b 18|18 7b 94 7c) stxvx vs4,r20,r15
+.*: (7e e0 87 59|59 87 e0 7e) stxvh8x vs55,0,r16
+.*: (7c b4 87 58|58 87 b4 7c) stxvh8x vs5,r20,r16
+.*: (7f 00 8f d9|d9 8f 00 7f) stxvb16x vs56,0,r17
+.*: (7c d4 8f d8|d8 8f d4 7c) stxvb16x vs6,r20,r17
+.*: (f0 80 2a 94|94 2a 80 f0) xxextractuw vs4,vs5,0
+.*: (f1 0f 92 97|97 92 0f f1) xxextractuw vs40,vs50,15
+.*: (f0 80 02 d0|d0 02 80 f0) xxspltib vs4,0
+.*: (f1 27 fa d1|d1 fa 27 f1) xxspltib vs41,255
+.*: (f0 a0 32 d4|d4 32 a0 f0) xxinsertw vs5,vs6,0
+.*: (f2 4f e2 d7|d7 e2 4f f2) xxinsertw vs50,vs60,15
+.*: (f0 c7 3f 6c|6c 3f c7 f0) xxbrh vs6,vs7
+.*: (f3 07 cf 6f|6f cf 07 f3) xxbrh vs56,vs57
+.*: (f0 ef 47 6c|6c 47 ef f0) xxbrw vs7,vs8
+.*: (f3 2f d7 6f|6f d7 2f f3) xxbrw vs57,vs58
+.*: (f1 17 4f 6c|6c 4f 17 f1) xxbrd vs8,vs9
+.*: (f3 57 df 6f|6f df 57 f3) xxbrd vs58,vs59
+.*: (f1 3f 57 6c|6c 57 3f f1) xxbrq vs9,vs10
+.*: (f3 7f e7 6f|6f e7 7f f3) xxbrq vs59,vs60
+.*: (e6 80 00 02|02 00 80 e6) lxsd v20,0\(0\)
+.*: (e6 8a 00 02|02 00 8a e6) lxsd v20,0\(r10\)
+.*: (e6 80 00 0a|0a 00 80 e6) lxsd v20,8\(0\)
+.*: (e6 8a 00 0a|0a 00 8a e6) lxsd v20,8\(r10\)
+.*: (e6 80 ff fa|fa ff 80 e6) lxsd v20,-8\(0\)
+.*: (e6 8a ff fa|fa ff 8a e6) lxsd v20,-8\(r10\)
+.*: (e6 80 7f fe|fe 7f 80 e6) lxsd v20,32764\(0\)
+.*: (e6 8a 7f fe|fe 7f 8a e6) lxsd v20,32764\(r10\)
+.*: (e6 80 80 02|02 80 80 e6) lxsd v20,-32768\(0\)
+.*: (e6 8a 80 02|02 80 8a e6) lxsd v20,-32768\(r10\)
+.*: (e7 c0 00 03|03 00 c0 e7) lxssp v30,0\(0\)
+.*: (e7 cb 00 03|03 00 cb e7) lxssp v30,0\(r11\)
+.*: (e7 c0 00 0b|0b 00 c0 e7) lxssp v30,8\(0\)
+.*: (e7 cb 00 0b|0b 00 cb e7) lxssp v30,8\(r11\)
+.*: (e7 c0 ff fb|fb ff c0 e7) lxssp v30,-8\(0\)
+.*: (e7 cb ff fb|fb ff cb e7) lxssp v30,-8\(r11\)
+.*: (e7 c0 7f ff|ff 7f c0 e7) lxssp v30,32764\(0\)
+.*: (e7 cb 7f ff|ff 7f cb e7) lxssp v30,32764\(r11\)
+.*: (e7 c0 80 03|03 80 c0 e7) lxssp v30,-32768\(0\)
+.*: (e7 cb 80 03|03 80 cb e7) lxssp v30,-32768\(r11\)
+.*: (f5 00 00 09|09 00 00 f5) lxv vs40,0\(0\)
+.*: (f5 0c 00 09|09 00 0c f5) lxv vs40,0\(r12\)
+.*: (f5 00 00 19|19 00 00 f5) lxv vs40,16\(0\)
+.*: (f5 0c 00 19|19 00 0c f5) lxv vs40,16\(r12\)
+.*: (f5 00 ff f9|f9 ff 00 f5) lxv vs40,-16\(0\)
+.*: (f5 4c ff f1|f1 ff 4c f5) lxv vs10,-16\(r12\)
+.*: (f5 40 7f f1|f1 7f 40 f5) lxv vs10,32752\(0\)
+.*: (f5 4c 7f f1|f1 7f 4c f5) lxv vs10,32752\(r12\)
+.*: (f5 40 80 01|01 80 40 f5) lxv vs10,-32768\(0\)
+.*: (f5 4c 80 01|01 80 4c f5) lxv vs10,-32768\(r12\)
+.*: (f6 a0 00 02|02 00 a0 f6) stxsd v21,0\(0\)
+.*: (f6 aa 00 02|02 00 aa f6) stxsd v21,0\(r10\)
+.*: (f6 a0 00 0a|0a 00 a0 f6) stxsd v21,8\(0\)
+.*: (f6 aa 00 0a|0a 00 aa f6) stxsd v21,8\(r10\)
+.*: (f6 a0 ff fa|fa ff a0 f6) stxsd v21,-8\(0\)
+.*: (f6 aa ff fa|fa ff aa f6) stxsd v21,-8\(r10\)
+.*: (f6 a0 7f fe|fe 7f a0 f6) stxsd v21,32764\(0\)
+.*: (f6 aa 7f fe|fe 7f aa f6) stxsd v21,32764\(r10\)
+.*: (f6 a0 80 02|02 80 a0 f6) stxsd v21,-32768\(0\)
+.*: (f6 aa 80 02|02 80 aa f6) stxsd v21,-32768\(r10\)
+.*: (f7 e0 00 03|03 00 e0 f7) stxssp v31,0\(0\)
+.*: (f7 eb 00 03|03 00 eb f7) stxssp v31,0\(r11\)
+.*: (f7 e0 00 0b|0b 00 e0 f7) stxssp v31,8\(0\)
+.*: (f7 eb 00 0b|0b 00 eb f7) stxssp v31,8\(r11\)
+.*: (f7 e0 ff fb|fb ff e0 f7) stxssp v31,-8\(0\)
+.*: (f7 eb ff fb|fb ff eb f7) stxssp v31,-8\(r11\)
+.*: (f7 e0 7f ff|ff 7f e0 f7) stxssp v31,32764\(0\)
+.*: (f7 eb 7f ff|ff 7f eb f7) stxssp v31,32764\(r11\)
+.*: (f7 e0 80 03|03 80 e0 f7) stxssp v31,-32768\(0\)
+.*: (f7 eb 80 03|03 80 eb f7) stxssp v31,-32768\(r11\)
+.*: (f5 20 00 0d|0d 00 20 f5) stxv vs41,0\(0\)
+.*: (f5 2c 00 0d|0d 00 2c f5) stxv vs41,0\(r12\)
+.*: (f5 20 00 1d|1d 00 20 f5) stxv vs41,16\(0\)
+.*: (f5 2c 00 1d|1d 00 2c f5) stxv vs41,16\(r12\)
+.*: (f5 20 ff fd|fd ff 20 f5) stxv vs41,-16\(0\)
+.*: (f5 6c ff f5|f5 ff 6c f5) stxv vs11,-16\(r12\)
+.*: (f5 60 7f f5|f5 7f 60 f5) stxv vs11,32752\(0\)
+.*: (f5 6c 7f f5|f5 7f 6c f5) stxv vs11,32752\(r12\)
+.*: (f5 60 80 05|05 80 60 f5) stxv vs11,-32768\(0\)
+.*: (f5 6c 80 05|05 80 6c f5) stxv vs11,-32768\(r12\)
+.*: (f2 96 c0 d0|d0 c0 96 f2) xxperm vs20,vs22,vs24
+.*: (f1 0a 60 d7|d7 60 0a f1) xxperm vs40,vs42,vs44
+.*: (f2 b7 c9 d0|d0 c9 b7 f2) xxpermr vs21,vs23,vs25
+.*: (f1 2b 69 d7|d7 69 2b f1) xxpermr vs41,vs43,vs45
+.*: (7e 8c 06 f4|f4 06 8c 7e) extswsli r12,r20,0
+.*: (7e 8c 0e f4|f4 0e 8c 7e) extswsli r12,r20,1
+.*: (7e 8c fe f6|f6 fe 8c 7e) extswsli r12,r20,63
+.*: (7e ad 06 f5|f5 06 ad 7e) extswsli\. r13,r21,0
+.*: (7e ad 0e f5|f5 0e ad 7e) extswsli\. r13,r21,1
+.*: (7e ad fe f7|f7 fe ad 7e) extswsli\. r13,r21,63
+.*: (11 d6 b8 85|85 b8 d6 11) vrlwmi v14,v22,v23
+.*: (11 f7 c0 c5|c5 c0 f7 11) vrldmi v15,v23,v24
+.*: (12 18 c9 85|85 c9 18 12) vrlwnm v16,v24,v25
+.*: (12 39 d1 c5|c5 d1 39 12) vrldnm v17,v25,v26
+.*: (12 5a dd cc|cc dd 5a 12) vbpermd v18,v26,v27
+.*: (12 66 a6 02|02 a6 66 12) vnegw v19,v20
+.*: (12 87 ae 02|02 ae 87 12) vnegd v20,v21
+.*: (12 a8 b6 02|02 b6 a8 12) vprtybw v21,v22
+.*: (12 c9 be 02|02 be c9 12) vprtybd v22,v23
+.*: (12 ea c6 02|02 c6 ea 12) vprtybq v23,v24
+.*: (13 10 ce 02|02 ce 10 13) vextsb2w v24,v25
+.*: (13 31 d6 02|02 d6 31 13) vextsh2w v25,v26
+.*: (13 58 de 02|02 de 58 13) vextsb2d v26,v27
+.*: (13 79 e6 02|02 e6 79 13) vextsh2d v27,v28
+.*: (13 9a ee 02|02 ee 9a 13) vextsw2d v28,v29
+.*: (13 bc f6 02|02 f6 bc 13) vctzb v29,v30
+.*: (13 dd fe 02|02 fe dd 13) vctzh v30,v31
+.*: (13 fe f6 02|02 f6 fe 13) vctzw v31,v30
+.*: (13 df ee 02|02 ee df 13) vctzd v30,v29
+.*: (7d 40 a6 1a|1a a6 40 7d) lxsibzx vs10,0,r20
+.*: (7e 4a a6 1b|1b a6 4a 7e) lxsibzx vs50,r10,r20
+.*: (7d 60 ae 5a|5a ae 60 7d) lxsihzx vs11,0,r21
+.*: (7e 6b ae 5b|5b ae 6b 7e) lxsihzx vs51,r11,r21
+.*: (7d 80 b7 1a|1a b7 80 7d) stxsibx vs12,0,r22
+.*: (7e 8c b7 1b|1b b7 8c 7e) stxsibx vs52,r12,r22
+.*: (7d a0 bf 5a|5a bf a0 7d) stxsihx vs13,0,r23
+.*: (7e ad bf 5b|5b bf ad 7e) stxsihx vs53,r13,r23
+.*: (11 4b 63 70|70 63 4b 11) maddhd r10,r11,r12,r13
+.*: (12 95 b5 f1|f1 b5 95 12) maddhdu r20,r21,r22,r23
+.*: (10 43 21 73|73 21 43 10) maddld r2,r3,r4,r5
+.*: (f0 0a a1 d8|d8 a1 0a f0) xscmpexpdp cr0,vs10,vs20
+.*: (f3 88 91 de|de 91 88 f3) xscmpexpdp cr7,vs40,vs50
+.*: (f1 2b af 2d|2d af 2b f1) xsiexpdp vs41,r11,r21
+.*: (f0 7f 5d a8|a8 5d 7f f0) xststdcdp cr0,vs11,127
+.*: (f3 ff 4d aa|aa 4d ff f3) xststdcdp cr7,vs41,127
+.*: (f0 7f 5c a8|a8 5c 7f f0) xststdcsp cr0,vs11,127
+.*: (f3 ff 4c aa|aa 4c ff f3) xststdcsp cr7,vs41,127
+.*: (f1 a0 5d 6e|6e 5d a0 f1) xsxexpdp r13,vs43
+.*: (f1 c1 65 6e|6e 65 c1 f1) xsxsigdp r14,vs44
+.*: (f1 ae 7f c7|c7 7f ae f1) xviexpdp vs45,vs46,vs47
+.*: (f1 cf 86 c7|c7 86 cf f1) xviexpsp vs46,vs47,vs48
+.*: (f2 c0 bf ab|ab bf c0 f2) xvtstdcdp vs54,vs55,0
+.*: (f2 df bf ef|ef bf df f2) xvtstdcdp vs54,vs55,127
+.*: (f2 e0 c6 ab|ab c6 e0 f2) xvtstdcsp vs55,vs56,0
+.*: (f2 ff c6 ef|ef c6 ff f2) xvtstdcsp vs55,vs56,127
+.*: (f3 20 d7 6f|6f d7 20 f3) xvxexpdp vs57,vs58
+.*: (f3 48 df 6f|6f df 48 f3) xvxexpsp vs58,vs59
+.*: (f3 61 e7 6f|6f e7 61 f3) xvxsigdp vs59,vs60
+.*: (f3 89 ef 6f|6f ef 89 f3) xvxsigsp vs60,vs61
+.*: (7c 06 39 c0|c0 39 06 7c) cmpeqb cr0,r6,r7
+.*: (7f 86 39 c0|c0 39 86 7f) cmpeqb cr7,r6,r7
+.*: (7c 08 49 80|80 49 08 7c) cmprb cr0,r8,r9
+.*: (7f 88 49 80|80 49 88 7f) cmprb cr7,r8,r9
+.*: (7c 28 49 80|80 49 28 7c) cmprb cr0,1,r8,r9
+.*: (7f a8 49 80|80 49 a8 7f) cmprb cr7,1,r8,r9
+.*: (7d e0 01 00|00 01 e0 7d) setb r15,cr0
+.*: (7d fc 01 00|00 01 fc 7d) setb r15,cr7
+.*: (7f 40 52 1a|1a 52 40 7f) lxvl vs26,0,r10
+.*: (7f 14 52 1b|1b 52 14 7f) lxvl vs56,r20,r10
+.*: (7f 60 5b 1a|1a 5b 60 7f) stxvl vs27,0,r11
+.*: (7f 35 5b 1b|1b 5b 35 7f) stxvl vs57,r21,r11
+.*: (12 80 f6 02|02 f6 80 12) vclzlsbb r20,v30
+.*: (12 a1 fe 02|02 fe a1 12) vctzlsbb r21,v31
+.*: (11 4b 60 07|07 60 4b 11) vcmpneb v10,v11,v12
+.*: (12 95 b4 07|07 b4 95 12) vcmpneb\. v20,v21,v22
+.*: (11 6c 68 47|47 68 6c 11) vcmpneh v11,v12,v13
+.*: (12 b6 bc 47|47 bc b6 12) vcmpneh\. v21,v22,v23
+.*: (11 8d 70 87|87 70 8d 11) vcmpnew v12,v13,v14
+.*: (12 d7 c4 87|87 c4 d7 12) vcmpnew\. v22,v23,v24
+.*: (11 ae 79 07|07 79 ae 11) vcmpnezb v13,v14,v15
+.*: (12 f8 cd 07|07 cd f8 12) vcmpnezb\. v23,v24,v25
+.*: (11 cf 81 47|47 81 cf 11) vcmpnezh v14,v15,v16
+.*: (13 19 d5 47|47 d5 19 13) vcmpnezh\. v24,v25,v26
+.*: (11 f0 89 87|87 89 f0 11) vcmpnezw v15,v16,v17
+.*: (13 3a dd 87|87 dd 3a 13) vcmpnezw\. v25,v26,v27
+.*: (12 11 56 0d|0d 56 11 12) vextublx r16,r17,v10
+.*: (12 32 5f 0d|0d 5f 32 12) vextubrx r17,r18,v11
+.*: (12 53 66 4d|4d 66 53 12) vextuhlx r18,r19,v12
+.*: (12 74 6f 4d|4d 6f 74 12) vextuhrx r19,r20,v13
+.*: (12 95 76 8d|8d 76 95 12) vextuwlx r20,r21,v14
+.*: (12 b6 7f 8d|8d 7f b6 12) vextuwrx r21,r22,v15
+.*: (ec 00 1d 46|46 1d 00 ec) dtstsfi cr0,0,f3
+.*: (ef bf 1d 46|46 1d bf ef) dtstsfi cr7,63,f3
+.*: (fc 00 25 46|46 25 00 fc) dtstsfiq cr0,0,f4
+.*: (ff bf 25 46|46 25 bf ff) dtstsfiq cr7,63,f4
+.*: (f1 10 95 6f|6f 95 10 f1) xscvhpdp vs40,vs50
+.*: (f1 31 9d 6f|6f 9d 31 f1) xscvdphp vs41,vs51
+.*: (f1 58 a7 6f|6f a7 58 f1) xvcvhpsp vs42,vs52
+.*: (f1 79 af 6f|6f af 79 f1) xvcvsphp vs43,vs53
+.*: (4c 60 00 04|04 00 60 4c) addpcis r3,0
+.*: (4c 60 00 04|04 00 60 4c) addpcis r3,0
+.*: (4c 80 00 05|05 00 80 4c) addpcis r4,1
+.*: (4c 80 00 05|05 00 80 4c) addpcis r4,1
+.*: (4c bf ff c4|c4 ff bf 4c) addpcis r5,-2
+.*: (4c bf ff c4|c4 ff bf 4c) addpcis r5,-2
+.*: (4c df 7f c5|c5 7f df 4c) addpcis r6,32767
+.*: (4c df 7f c5|c5 7f df 4c) addpcis r6,32767
+.*: (4c e0 80 04|04 80 e0 4c) addpcis r7,-32768
+.*: (4c e0 80 04|04 80 e0 4c) addpcis r7,-32768
+.*: (7c 00 02 a4|a4 02 00 7c) slbsync
+.*: (7d 40 5b a4|a4 5b 40 7d) slbieg r10,r11
+.*: (7c 60 27 26|26 27 60 7c) slbmfee r3,r4
+.*: (7c 60 27 26|26 27 60 7c) slbmfee r3,r4
+.*: (7c 61 27 26|26 27 61 7c) slbmfee r3,r4,1
+.*: (7c 80 2e a6|a6 2e 80 7c) slbmfev r4,r5
+.*: (7c 80 2e a6|a6 2e 80 7c) slbmfev r4,r5
+.*: (7c 81 2e a6|a6 2e 81 7c) slbmfev r4,r5,1
+.*: (7c 80 1a 64|64 1a 80 7c) tlbie r3,r4
+.*: (7c 80 1a 64|64 1a 80 7c) tlbie r3,r4
+.*: (7c 8f 1a 64|64 1a 8f 7c) tlbie r3,r4,3,1,1
+.*: (7c 00 1a 24|24 1a 00 7c) tlbiel r3
+.*: (7c 00 1a 24|24 1a 00 7c) tlbiel r3
+.*: (7c 8f 1a 24|24 1a 8f 7c) tlbiel r3,r4,3,1,1
+.*: (7c 0c 6e 0c|0c 6e 0c 7c) copy r12,r13
+.*: (7c 2c 6e 0c|0c 6e 2c 7c) copy_first r12,r13
+.*: (7c 2c 6e 0c|0c 6e 2c 7c) copy_first r12,r13
+.*: (7c 0a 5f 0c|0c 5f 0a 7c) paste r10,r11
+.*: (7c 0a 5f 0c|0c 5f 0a 7c) paste r10,r11
+.*: (7c 2a 5f 0d|0d 5f 2a 7c) paste_last r10,r11
+.*: (7c 2a 5f 0d|0d 5f 2a 7c) paste_last r10,r11
+.*: (7c 00 06 8c|8c 06 00 7c) cp_abort
+.*: (7c 00 04 ac|ac 04 00 7c) hwsync
+.*: (7c 00 04 ac|ac 04 00 7c) hwsync
+.*: (7c 00 04 ac|ac 04 00 7c) hwsync
+.*: (7c 20 04 ac|ac 04 20 7c) lwsync
+.*: (7c 20 04 ac|ac 04 20 7c) lwsync
+.*: (7c 40 04 ac|ac 04 40 7c) ptesync
+.*: (7c 40 04 ac|ac 04 40 7c) ptesync
+.*: (7c 07 04 ac|ac 04 07 7c) sync 0,7
+.*: (7c 28 04 ac|ac 04 28 7c) sync 1,8
+.*: (7e 80 04 cc|cc 04 80 7e) ldat r20,0,0
+.*: (7e 8a e4 cc|cc e4 8a 7e) ldat r20,r10,28
+.*: (7e a0 04 8c|8c 04 a0 7e) lwat r21,0,0
+.*: (7e ab e4 8c|8c e4 ab 7e) lwat r21,r11,28
+.*: (7e c0 05 cc|cc 05 c0 7e) stdat r22,0,0
+.*: (7e cc e5 cc|cc e5 cc 7e) stdat r22,r12,28
+.*: (7e e0 05 8c|8c 05 e0 7e) stwat r23,0,0
+.*: (7e ed e5 8c|8c e5 ed 7e) stwat r23,r13,28
+.*: (4c 00 02 64|64 02 00 4c) urfid
+.*: (7c 00 f6 e4|e4 f6 00 7c) rmieg r30
+.*: (7d 40 7a 6a|6a 7a 40 7d) ldmx r10,0,r15
+.*: (7d 43 7a 6a|6a 7a 43 7d) ldmx r10,r3,r15
+.*: (4c 00 02 e4|e4 02 00 4c) stop
+.*: (7c 00 00 3c|3c 00 00 7c) wait
+.*: (7c 00 00 3c|3c 00 00 7c) wait
+.*: (7c 60 05 e6|e6 05 60 7c) darn r3,0
+.*: (7c 61 05 e6|e6 05 61 7c) darn r3,1
+.*: (7c 62 05 e6|e6 05 62 7c) darn r3,2
+.*: (7c 00 04 80|80 04 00 7c) mcrxrx cr0
+.*: (7f 80 04 80|80 04 80 7f) mcrxrx cr7
+.*: (12 95 b7 44|44 b7 95 12) vslv v20,v21,v22
+.*: (12 f8 cf 04|04 cf f8 12) vsrv v23,v24,v25
+.*: (7c 00 06 ec|ec 06 00 7c) msgsync
+.*: (f3 c8 90 1e|1e 90 c8 f3) xscmpeqdp vs30,vs40,vs50
+.*: (f3 e9 98 5e|5e 98 e9 f3) xscmpgtdp vs31,vs41,vs51
+.*: (f0 0a a0 9f|9f a0 0a f0) xscmpgedp vs32,vs42,vs52
+.*: (f0 2b a8 df|df a8 2b f0) xscmpnedp vs33,vs43,vs53
+.*: (f0 4c b4 47|47 b4 4c f0) xsmincdp vs34,vs44,vs54
+.*: (f0 6d bc 07|07 bc 6d f0) xsmaxcdp vs35,vs45,vs55
+.*: (f0 8e c4 c7|c7 c4 8e f0) xsminjdp vs36,vs46,vs56
+.*: (f0 af cc 87|87 cc af f0) xsmaxjdp vs37,vs47,vs57
+.*: (f0 d0 d3 df|df d3 d0 f0) xvcmpnedp vs38,vs48,vs58
+.*: (f0 f1 df df|df df f1 f0) xvcmpnedp\. vs39,vs49,vs59
+.*: (f1 12 e2 df|df e2 12 f1) xvcmpnesp vs40,vs50,vs60
+.*: (f1 33 ee df|df ee 33 f1) xvcmpnesp\. vs41,vs51,vs61
diff --git a/gas/testsuite/gas/ppc/power9.s b/gas/testsuite/gas/ppc/power9.s
new file mode 100644
index 0000000..7ab9e3b
--- /dev/null
+++ b/gas/testsuite/gas/ppc/power9.s
@@ -0,0 +1,379 @@
+ .text
+power9:
+ cnttzd 3,13
+ cnttzd. 4,14
+ cnttzw 5,15
+ cnttzw. 6,16
+ modsd 10,20,21
+ modsw 11,21,22
+ modud 12,22,23
+ moduw 13,23,24
+ bcdcfn. 3,4,0
+ bcdcfn. 3,4,1
+ bcdcfsq. 4,5,0
+ bcdcfsq. 4,5,1
+ bcdcfz. 5,6,0
+ bcdcfz. 5,6,1
+ bcdcpsgn. 6,7,8
+ bcdctn. 7,8
+ bcdctsq. 8,9
+ bcdctz. 9,10,0
+ bcdctz. 9,10,1
+ bcdsetsgn. 10,11,0
+ bcdsetsgn. 10,11,1
+ bcdsr. 11,12,13,0
+ bcdsr. 11,12,13,1
+ bcds. 12,13,14,0
+ bcds. 12,13,14,1
+ bcdtrunc. 13,14,15,0
+ bcdtrunc. 13,14,15,1
+ bcdus. 14,15,16
+ bcdutrunc. 15,16,17
+ lxvll 20,0,21
+ lxvll 20,10,21
+ stxvll 21,0,11
+ stxvll 21,10,11
+ vmul10cuq 22,23
+ vmul10ecuq 23,24,25
+ vmul10euq 24,25,26
+ vmul10uq 25,26
+ xsaddqp 10,11,12
+ xsaddqpo 11,12,12
+ xsrqpi 0,20,30,0
+ xsrqpi 1,20,30,0
+ xsrqpi 0,20,30,3
+ xsrqpi 1,20,30,3
+ xsrqpix 0,21,31,0
+ xsrqpix 1,21,31,0
+ xsrqpix 0,21,31,3
+ xsrqpix 1,21,31,3
+ xsmulqp 12,13,14
+ xsmulqpo 13,14,15
+ xsrqpxp 0,22,23,0
+ xsrqpxp 1,22,23,0
+ xsrqpxp 0,22,23,3
+ xsrqpxp 1,22,23,3
+ xscpsgnqp 14,15,16
+ xscmpoqp 0,15,16
+ xscmpoqp 7,15,16
+ xscmpexpqp 0,16,17
+ xscmpexpqp 7,16,17
+ xsmaddqp 17,18,19
+ xsmaddqpo 18,19,20
+ xsmsubqp 19,20,21
+ xsmsubqpo 20,21,22
+ xsnmaddqp 21,22,23
+ xsnmaddqpo 22,23,24
+ xsnmsubqp 23,24,25
+ xsnmsubqpo 24,25,26
+ xssubqp 25,26,27
+ xssubqpo 26,27,28
+ xsdivqp 27,28,29
+ xsdivqpo 28,29,30
+ xscmpuqp 0,29,30
+ xscmpuqp 7,29,30
+ xststdcqp 0,30,0
+ xststdcqp 7,30,0
+ xststdcqp 0,31,0x7f
+ xststdcqp 7,31,0x7f
+ xsabsqp 10,11
+ xsxexpqp 11,12
+ xsnabsqp 12,13
+ xsnegqp 13,14
+ xsxsigqp 14,15
+ xssqrtqp 15,16
+ xssqrtqpo 16,17
+ xscvqpuwz 17,18
+ xscvudqp 18,19
+ xscvqpswz 19,20
+ xscvsdqp 20,21
+ xscvqpudz 21,22
+ xscvqpdp 22,23
+ xscvqpdpo 23,24
+ xscvdpqp 24,25
+ xscvqpsdz 25,26
+ xsiexpqp 26,27,28
+ vpermr 4,5,6,7
+ vextractub 5,6,0
+ vextractub 5,6,0xf
+ vextractuh 6,7,0
+ vextractuh 6,7,0xf
+ vextractuw 7,8,0
+ vextractuw 7,8,0xf
+ vextractd 8,9,0
+ vextractd 8,9,0xf
+ vinsertb 9,10,0
+ vinsertb 9,10,0xf
+ vinserth 10,11,0
+ vinserth 10,11,0xf
+ vinsertw 11,12,0
+ vinsertw 11,12,0xf
+ vinsertd 12,13,0
+ vinsertd 12,13,0xf
+ mfvsrld 20,45
+ mtvsrws 46,21
+ mtvsrdd 47,0,23
+ mtvsrdd 47,22,23
+ lxvx 50,0,11
+ lxvx 0,10,11
+ lxvwsx 51,0,12
+ lxvwsx 1,10,12
+ lxvh8x 52,0,13
+ lxvh8x 2,10,13
+ lxvb16x 53,0,14
+ lxvb16x 3,10,14
+ stxvx 54,0,15
+ stxvx 4,20,15
+ stxvh8x 55,0,16
+ stxvh8x 5,20,16
+ stxvb16x 56,0,17
+ stxvb16x 6,20,17
+ xxextractuw 4,5,0x0
+ xxextractuw 40,50,0xf
+ xxspltib 4,0x0
+ xxspltib 41,255
+ xxinsertw 5,6,0
+ xxinsertw 50,60,0xf
+ xxbrh 6,7
+ xxbrh 56,57
+ xxbrw 7,8
+ xxbrw 57,58
+ xxbrd 8,9
+ xxbrd 58,59
+ xxbrq 9,10
+ xxbrq 59,60
+ lxsd 20,0(0)
+ lxsd 20,0(10)
+ lxsd 20,8(0)
+ lxsd 20,8(10)
+ lxsd 20,-8(0)
+ lxsd 20,-8(10)
+ lxsd 20,32764(0)
+ lxsd 20,32764(10)
+ lxsd 20,-32768(0)
+ lxsd 20,-32768(10)
+ lxssp 30,0(0)
+ lxssp 30,0(11)
+ lxssp 30,8(0)
+ lxssp 30,8(11)
+ lxssp 30,-8(0)
+ lxssp 30,-8(11)
+ lxssp 30,32764(0)
+ lxssp 30,32764(11)
+ lxssp 30,-32768(0)
+ lxssp 30,-32768(11)
+ lxv 40,0(0)
+ lxv 40,0(12)
+ lxv 40,16(0)
+ lxv 40,16(12)
+ lxv 40,-16(0)
+ lxv 10,-16(12)
+ lxv 10,32752(0)
+ lxv 10,32752(12)
+ lxv 10,-32768(0)
+ lxv 10,-32768(12)
+ stxsd 21,0(0)
+ stxsd 21,0(10)
+ stxsd 21,8(0)
+ stxsd 21,8(10)
+ stxsd 21,-8(0)
+ stxsd 21,-8(10)
+ stxsd 21,32764(0)
+ stxsd 21,32764(10)
+ stxsd 21,-32768(0)
+ stxsd 21,-32768(10)
+ stxssp 31,0(0)
+ stxssp 31,0(11)
+ stxssp 31,8(0)
+ stxssp 31,8(11)
+ stxssp 31,-8(0)
+ stxssp 31,-8(11)
+ stxssp 31,32764(0)
+ stxssp 31,32764(11)
+ stxssp 31,-32768(0)
+ stxssp 31,-32768(11)
+ stxv 41,0(0)
+ stxv 41,0(12)
+ stxv 41,16(0)
+ stxv 41,16(12)
+ stxv 41,-16(0)
+ stxv 11,-16(12)
+ stxv 11,32752(0)
+ stxv 11,32752(12)
+ stxv 11,-32768(0)
+ stxv 11,-32768(12)
+ xxperm 20,22,24
+ xxperm 40,42,44
+ xxpermr 21,23,25
+ xxpermr 41,43,45
+ extswsli 12,20,0
+ extswsli 12,20,1
+ extswsli 12,20,63
+ extswsli. 13,21,0
+ extswsli. 13,21,1
+ extswsli. 13,21,63
+ vrlwmi 14,22,23
+ vrldmi 15,23,24
+ vrlwnm 16,24,25
+ vrldnm 17,25,26
+ vbpermd 18,26,27
+ vnegw 19,20
+ vnegd 20,21
+ vprtybw 21,22
+ vprtybd 22,23
+ vprtybq 23,24
+ vextsb2w 24,25
+ vextsh2w 25,26
+ vextsb2d 26,27
+ vextsh2d 27,28
+ vextsw2d 28,29
+ vctzb 29,30
+ vctzh 30,31
+ vctzw 31,30
+ vctzd 30,29
+ lxsibzx 10,0,20
+ lxsibzx 50,10,20
+ lxsihzx 11,0,21
+ lxsihzx 51,11,21
+ stxsibx 12,0,22
+ stxsibx 52,12,22
+ stxsihx 13,0,23
+ stxsihx 53,13,23
+ maddhd 10,11,12,13
+ maddhdu 20,21,22,23
+ maddld 2,3,4,5
+ xscmpexpdp 0,10,20
+ xscmpexpdp 7,40,50
+ xsiexpdp 41,11,21
+ xststdcdp 0,11,0x7f
+ xststdcdp 7,41,0x7f
+ xststdcsp 0,11,0x7f
+ xststdcsp 7,41,0x7f
+ xsxexpdp 13,43
+ xsxsigdp 14,44
+ xviexpdp 45,46,47
+ xviexpsp 46,47,48
+ xvtstdcdp 54,55,0
+ xvtstdcdp 54,55,0x7f
+ xvtstdcsp 55,56,0
+ xvtstdcsp 55,56,0x7f
+ xvxexpdp 57,58
+ xvxexpsp 58,59
+ xvxsigdp 59,60
+ xvxsigsp 60,61
+ cmpeqb 0,6,7
+ cmpeqb 7,6,7
+ cmprb 0,0,8,9
+ cmprb 7,0,8,9
+ cmprb 0,1,8,9
+ cmprb 7,1,8,9
+ setb 15,0
+ setb 15,7
+ lxvl 26,0,10
+ lxvl 56,20,10
+ stxvl 27,0,11
+ stxvl 57,21,11
+ vclzlsbb 20,30
+ vctzlsbb 21,31
+ vcmpneb 10,11,12
+ vcmpneb. 20,21,22
+ vcmpneh 11,12,13
+ vcmpneh. 21,22,23
+ vcmpnew 12,13,14
+ vcmpnew. 22,23,24
+ vcmpnezb 13,14,15
+ vcmpnezb. 23,24,25
+ vcmpnezh 14,15,16
+ vcmpnezh. 24,25,26
+ vcmpnezw 15,16,17
+ vcmpnezw. 25,26,27
+ vextublx 16,17,10
+ vextubrx 17,18,11
+ vextuhlx 18,19,12
+ vextuhrx 19,20,13
+ vextuwlx 20,21,14
+ vextuwrx 21,22,15
+ dtstsfi 0,0,3
+ dtstsfi 7,0x3f,3
+ dtstsfiq 0,0,4
+ dtstsfiq 7,0x3f,4
+ xscvhpdp 40,50
+ xscvdphp 41,51
+ xvcvhpsp 42,52
+ xvcvsphp 43,53
+ addpcis 3,0
+ subpcis 3,0
+ addpcis 4,1
+ subpcis 4,-1
+ addpcis 5,-2
+ subpcis 5,2
+ addpcis 6,0x7fff
+ subpcis 6,-0x7fff
+ addpcis 7,-0x8000
+ subpcis 7,0x8000
+ slbsync
+ slbieg 10,11
+ slbmfee 3,4
+ slbmfee 3,4,0
+ slbmfee 3,4,1
+ slbmfev 4,5
+ slbmfev 4,5,0
+ slbmfev 4,5,1
+ tlbie 3,4
+ tlbie 3,4,0,0,0
+ tlbie 3,4,3,1,1
+ tlbiel 3
+ tlbiel 3,0,0,0,0
+ tlbiel 3,4,3,1,1
+ copy 12,13,0
+ copy_first 12,13
+ copy 12,13,1
+ paste 10,11,0
+ paste 10,11
+ paste. 10,11,1
+ paste_last 10,11
+ cp_abort
+ hwsync
+ sync
+ sync 0,0x0
+ lwsync
+ sync 1,0x0
+ ptesync
+ sync 2,0x0
+ sync 0,0x7
+ sync 1,0x8
+ ldat 20,0,0x0
+ ldat 20,10,0x1c
+ lwat 21,0,0x0
+ lwat 21,11,0x1c
+ stdat 22,0,0x0
+ stdat 22,12,0x1c
+ stwat 23,0,0x0
+ stwat 23,13,0x1c
+ urfid
+ rmieg 30
+ ldmx 10,0,15
+ ldmx 10,3,15
+ stop
+ wait
+ wait 0
+ darn 3,0
+ darn 3,1
+ darn 3,2
+ mcrxrx 0
+ mcrxrx 7
+ vslv 20,21,22
+ vsrv 23,24,25
+ msgsync
+ xscmpeqdp 30,40,50
+ xscmpgtdp 31,41,51
+ xscmpgedp 32,42,52
+ xscmpnedp 33,43,53
+ xsmincdp 34,44,54
+ xsmaxcdp 35,45,55
+ xsminjdp 36,46,56
+ xsmaxjdp 37,47,57
+ xvcmpnedp 38,48,58
+ xvcmpnedp. 39,49,59
+ xvcmpnesp 40,50,60
+ xvcmpnesp. 41,51,61
diff --git a/gas/testsuite/gas/ppc/ppc.exp b/gas/testsuite/gas/ppc/ppc.exp
index 06d061b..dcafde6 100644
--- a/gas/testsuite/gas/ppc/ppc.exp
+++ b/gas/testsuite/gas/ppc/ppc.exp
@@ -69,6 +69,7 @@ if { [istarget powerpc*-*-*] } then {
run_dump_test "simpshft"
run_dump_test "altivec"
run_dump_test "altivec2"
+ run_dump_test "altivec3"
run_dump_test "altivec_and_spe"
run_dump_test "booke"
run_dump_test "e500"
@@ -85,8 +86,10 @@ if { [istarget powerpc*-*-*] } then {
run_dump_test "power6"
run_dump_test "power7"
run_dump_test "power8"
+ run_dump_test "power9"
run_dump_test "vsx"
run_dump_test "vsx2"
+ run_dump_test "vsx3"
run_dump_test "htm"
run_dump_test "titan"
}
diff --git a/gas/testsuite/gas/ppc/vsx.d b/gas/testsuite/gas/ppc/vsx.d
index f5a6a14..0fbbf75 100644
--- a/gas/testsuite/gas/ppc/vsx.d
+++ b/gas/testsuite/gas/ppc/vsx.d
@@ -166,8 +166,8 @@ Disassembly of section \.text:
26c: (f1 12 e7 bf|bf e7 12 f1) xxsel vs40,vs50,vs60,vs62
270: (f1 12 e2 17|17 e2 12 f1) xxsldwi vs40,vs50,vs60,2
274: (f1 02 e2 93|93 e2 02 f1) xxspltw vs40,vs60,2
- 278: (7d 00 a6 99|99 a6 00 7d) lxvd2x vs40,0,r20
- 27c: (7d 0a a6 99|99 a6 0a 7d) lxvd2x vs40,r10,r20
- 280: (7d 00 a7 99|99 a7 00 7d) stxvd2x vs40,0,r20
- 284: (7d 0a a7 99|99 a7 0a 7d) stxvd2x vs40,r10,r20
+.*: (7d 00 a6 99|99 a6 00 7d) lxvd2x vs40,0,r20
+.*: (7d 0a a6 99|99 a6 0a 7d) lxvd2x vs40,r10,r20
+.*: (7d 00 a7 99|99 a7 00 7d) stxvd2x vs40,0,r20
+.*: (7d 0a a7 99|99 a7 0a 7d) stxvd2x vs40,r10,r20
#pass
diff --git a/gas/testsuite/gas/ppc/vsx.s b/gas/testsuite/gas/ppc/vsx.s
index bcc9c2d..716174c 100644
--- a/gas/testsuite/gas/ppc/vsx.s
+++ b/gas/testsuite/gas/ppc/vsx.s
@@ -158,7 +158,7 @@ start:
xxsel 40,50,60,62
xxsldwi 40,50,60,2
xxspltw 40,60,2
- lxvx 40,0,20
- lxvx 40,10,20
- stxvx 40,0,20
- stxvx 40,10,20
+ lxvd2x 40,0,20
+ lxvd2x 40,10,20
+ stxvd2x 40,0,20
+ stxvd2x 40,10,20
diff --git a/gas/testsuite/gas/ppc/vsx2.d b/gas/testsuite/gas/ppc/vsx2.d
index 04e4294..e7ea585 100644
--- a/gas/testsuite/gas/ppc/vsx2.d
+++ b/gas/testsuite/gas/ppc/vsx2.d
@@ -1,5 +1,5 @@
-#as: -mvsx
-#objdump: -dr -Mvsx
+#as: -mpower8
+#objdump: -dr -Mpower8
#name: VSX ISA 2.07 instructions
.*
diff --git a/gas/testsuite/gas/ppc/vsx3.d b/gas/testsuite/gas/ppc/vsx3.d
new file mode 100644
index 0000000..d226e12
--- /dev/null
+++ b/gas/testsuite/gas/ppc/vsx3.d
@@ -0,0 +1,137 @@
+#as: -mpower9
+#objdump: -dr -Mpower9
+#name: VSX ISA 3.0 instructions
+
+.*
+
+
+Disassembly of section \.text:
+
+0+00 <vsx3>:
+
+.*: (7c 46 ca 19|19 ca 46 7c) lxvx vs34,r6,r25
+.*: (7e 80 52 18|18 52 80 7e) lxvx vs20,0,r10
+.*: (7e 98 52 1a|1a 52 98 7e) lxvl vs20,r24,r10
+.*: (7e c0 ea 1b|1b ea c0 7e) lxvl vs54,0,r29
+.*: (7f 14 9a 5a|5a 9a 14 7f) lxvll vs24,r20,r19
+.*: (7c 40 72 5b|5b 72 40 7c) lxvll vs34,0,r14
+.*: (7e c2 02 66|66 02 c2 7e) mfvsrld r2,vs22
+.*: (7f 5a ca d9|d9 ca 5a 7f) lxvwsx vs58,r26,r25
+.*: (7e e0 ea d9|d9 ea e0 7e) lxvwsx vs55,0,r29
+.*: (7d d5 23 18|18 23 d5 7d) stxvx vs14,r21,r4
+.*: (7f c0 b3 18|18 b3 c0 7f) stxvx vs30,0,r22
+.*: (7c 1a 23 1a|1a 23 1a 7c) stxvl vs0,r26,r4
+.*: (7c a0 b3 1b|1b b3 a0 7c) stxvl vs37,0,r22
+.*: (7f 0a 03 26|26 03 0a 7f) mtvsrws vs24,r10
+.*: (7f d5 7b 5a|5a 7b d5 7f) stxvll vs30,r21,r15
+.*: (7c e0 73 5b|5b 73 e0 7c) stxvll vs39,0,r14
+.*: (7d 86 2b 66|66 2b 86 7d) mtvsrdd vs12,r6,r5
+.*: (7c c0 ab 67|67 ab c0 7c) mtvsrdd vs38,0,r21
+.*: (7f 7c 36 1b|1b 36 7c 7f) lxsibzx vs59,r28,r6
+.*: (7f c0 46 1a|1a 46 c0 7f) lxsibzx vs30,0,r8
+.*: (7d 57 8e 59|59 8e 57 7d) lxvh8x vs42,r23,r17
+.*: (7c 80 2e 59|59 2e 80 7c) lxvh8x vs36,0,r5
+.*: (7d 89 5e 5a|5a 5e 89 7d) lxsihzx vs12,r9,r11
+.*: (7e 20 6e 5b|5b 6e 20 7e) lxsihzx vs49,0,r13
+.*: (7c a3 9e d9|d9 9e a3 7c) lxvb16x vs37,r3,r19
+.*: (7c 00 f6 d8|d8 f6 00 7c) lxvb16x vs0,0,r30
+.*: (7c 5e 37 1a|1a 37 5e 7c) stxsibx vs2,r30,r6
+.*: (7d 80 6f 1a|1a 6f 80 7d) stxsibx vs12,0,r13
+.*: (7e 1d 47 58|58 47 1d 7e) stxvh8x vs16,r29,r8
+.*: (7e e0 57 59|59 57 e0 7e) stxvh8x vs55,0,r10
+.*: (7c 42 bf 5b|5b bf 42 7c) stxsihx vs34,r2,r23
+.*: (7f 80 bf 5b|5b bf 80 7f) stxsihx vs60,0,r23
+.*: (7e ee 67 d8|d8 67 ee 7e) stxvb16x vs23,r14,r12
+.*: (7e 60 2f d8|d8 2f 60 7e) stxvb16x vs19,0,r5
+.*: (e7 00 00 02|02 00 00 e7) lxsd v24,0\(0\)
+.*: (e5 f5 00 12|12 00 f5 e5) lxsd v15,16\(r21\)
+.*: (e4 c0 00 03|03 00 c0 e4) lxssp v6,0\(0\)
+.*: (e6 e9 00 13|13 00 e9 e6) lxssp v23,16\(r9\)
+.*: (f2 53 08 1e|1e 08 53 f2) xscmpeqdp vs18,vs51,vs33
+.*: (f0 5a 10 5a|5a 10 5a f0) xscmpgtdp vs2,vs26,vs34
+.*: (f0 ba a0 98|98 a0 ba f0) xscmpgedp vs5,vs26,vs20
+.*: (f1 8a 58 d3|d3 58 8a f1) xxperm vs44,vs10,vs43
+.*: (f0 b5 10 da|da 10 b5 f0) xscmpnedp vs5,vs21,vs34
+.*: (f1 34 29 d1|d1 29 34 f1) xxpermr vs41,vs20,vs5
+.*: (f2 12 b9 da|da b9 12 f2) xscmpexpdp cr4,vs18,vs55
+.*: (f2 e3 2a 96|96 2a e3 f2) xxextractuw vs23,vs37,3
+.*: (f2 c7 5a d1|d1 5a c7 f2) xxspltib vs54,235
+.*: (f1 e4 f2 d4|d4 f2 e4 f1) xxinsertw vs15,vs30,4
+.*: (f0 e8 7a dd|dd 7a e8 f0) xvcmpnesp vs39,vs40,vs15
+.*: (f0 17 96 de|de 96 17 f0) xvcmpnesp\. vs0,vs55,vs50
+.*: (f3 8c 73 db|db 73 8c f3) xvcmpnedp vs60,vs12,vs46
+.*: (f0 95 cf d9|d9 cf 95 f0) xvcmpnedp\. vs36,vs21,vs25
+.*: (f1 8b 3c 00|00 3c 8b f1) xsmaxcdp vs12,vs11,vs7
+.*: (f0 19 c4 41|41 c4 19 f0) xsmincdp vs32,vs25,vs24
+.*: (f3 35 64 84|84 64 35 f3) xsmaxjdp vs25,vs53,vs12
+.*: (f1 7f 24 aa|aa 24 7f f1) xststdcsp cr2,vs36,127
+.*: (f0 15 6c c3|c3 6c 15 f0) xsminjdp vs32,vs21,vs45
+.*: (f2 20 95 6e|6e 95 20 f2) xsxexpdp r17,vs50
+.*: (f0 e1 45 6e|6e 45 e1 f0) xsxsigdp r7,vs40
+.*: (f2 d0 15 6f|6f 15 d0 f2) xscvhpdp vs54,vs34
+.*: (f3 51 b5 6f|6f b5 51 f3) xscvdphp vs58,vs54
+.*: (f0 7f 35 aa|aa 35 7f f0) xststdcdp cr0,vs38,127
+.*: (f3 1f ae ef|ef ae 1f f3) xvtstdcsp vs56,vs53,127
+.*: (f2 d4 a6 c3|c3 a6 d4 f2) xviexpsp vs54,vs20,vs52
+.*: (f3 3c ef 2d|2d ef 3c f3) xsiexpdp vs57,r28,r29
+.*: (f0 20 a7 6c|6c a7 20 f0) xvxexpdp vs1,vs20
+.*: (f2 c1 df 6f|6f df c1 f2) xvxsigdp vs54,vs59
+.*: (f2 47 2f 6e|6e 2f 47 f2) xxbrh vs18,vs37
+.*: (f1 c8 0f 6c|6c 0f c8 f1) xvxexpsp vs14,vs1
+.*: (f2 89 6f 6d|6d 6f 89 f2) xvxsigsp vs52,vs13
+.*: (f2 6f 2f 6c|6c 2f 6f f2) xxbrw vs19,vs5
+.*: (f2 77 bf 6f|6f bf 77 f2) xxbrd vs51,vs55
+.*: (f0 78 8f 6d|6d 8f 78 f0) xvcvhpsp vs35,vs17
+.*: (f1 f9 6f 6e|6e 6f f9 f1) xvcvsphp vs15,vs45
+.*: (f2 3f ff 6c|6c ff 3f f2) xxbrq vs17,vs31
+.*: (f2 1f 67 ec|ec 67 1f f2) xvtstdcdp vs16,vs12,127
+.*: (f3 69 47 c0|c0 47 69 f3) xviexpdp vs27,vs9,vs8
+.*: (f4 80 00 01|01 00 80 f4) lxv vs4,0\(0\)
+.*: (f5 14 00 19|19 00 14 f5) lxv vs40,16\(r20\)
+.*: (f6 40 00 0d|0d 00 40 f6) stxv vs50,0\(0\)
+.*: (f5 10 00 15|15 00 10 f5) stxv vs8,16\(r16\)
+.*: (f4 60 00 02|02 00 60 f4) stxsd v3,0\(0\)
+.*: (f6 22 00 12|12 00 22 f6) stxsd v17,16\(r2\)
+.*: (f5 a0 00 03|03 00 a0 f5) stxssp v13,0\(0\)
+.*: (f6 2d 00 13|13 00 2d f6) stxssp v17,16\(r13\)
+.*: (fd 0a 90 08|08 90 0a fd) xsaddqp v8,v10,v18
+.*: (fc a1 e8 09|09 e8 a1 fc) xsaddqpo v5,v1,v29
+.*: (fd 80 96 0a|0a 96 80 fd) xsrqpi 0,v12,v18,3
+.*: (ff e1 98 0b|0b 98 e1 ff) xsrqpix 1,v31,v19,0
+.*: (fd c1 30 48|48 30 c1 fd) xsmulqp v14,v1,v6
+.*: (fe 27 d8 49|49 d8 27 fe) xsmulqpo v17,v7,v27
+.*: (fc 80 58 4a|4a 58 80 fc) xsrqpxp 0,v4,v11,0
+.*: (ff b7 e0 c8|c8 e0 b7 ff) xscpsgnqp v29,v23,v28
+.*: (ff 8d d9 08|08 d9 8d ff) xscmpoqp cr7,v13,v27
+.*: (fe 95 31 48|48 31 95 fe) xscmpexpqp cr5,v21,v6
+.*: (fc 53 23 08|08 23 53 fc) xsmaddqp v2,v19,v4
+.*: (ff c7 83 09|09 83 c7 ff) xsmaddqpo v30,v7,v16
+.*: (fe be 7b 48|48 7b be fe) xsmsubqp v21,v30,v15
+.*: (fd 91 f3 49|49 f3 91 fd) xsmsubqpo v12,v17,v30
+.*: (fc de 63 88|88 63 de fc) xsnmaddqp v6,v30,v12
+.*: (fd 96 63 89|89 63 96 fd) xsnmaddqpo v12,v22,v12
+.*: (fd 5d db c8|c8 db 5d fd) xsnmsubqp v10,v29,v27
+.*: (ff bd 6b c9|c9 6b bd ff) xsnmsubqpo v29,v29,v13
+.*: (fe 7b 24 08|08 24 7b fe) xssubqp v19,v27,v4
+.*: (fd a8 0c 09|09 0c a8 fd) xssubqpo v13,v8,v1
+.*: (fd 03 dc 48|48 dc 03 fd) xsdivqp v8,v3,v27
+.*: (ff 14 dc 49|49 dc 14 ff) xsdivqpo v24,v20,v27
+.*: (ff 8e 25 08|08 25 8e ff) xscmpuqp cr7,v14,v4
+.*: (fe 7f 15 88|88 15 7f fe) xststdcqp cr4,v2,127
+.*: (ff e0 b6 48|48 b6 e0 ff) xsabsqp v31,v22
+.*: (ff 22 1e 48|48 1e 22 ff) xsxexpqp v25,v3
+.*: (fd 48 e6 48|48 e6 48 fd) xsnabsqp v10,v28
+.*: (fe 70 fe 48|48 fe 70 fe) xsnegqp v19,v31
+.*: (fd 72 6e 48|48 6e 72 fd) xsxsigqp v11,v13
+.*: (fd bb 76 48|48 76 bb fd) xssqrtqp v13,v14
+.*: (fc 3b de 49|49 de 3b fc) xssqrtqpo v1,v27
+.*: (fc 61 3e 88|88 3e 61 fc) xscvqpuwz v3,v7
+.*: (fe 82 96 88|88 96 82 fe) xscvudqp v20,v18
+.*: (ff a9 ee 88|88 ee a9 ff) xscvqpswz v29,v29
+.*: (fc 4a e6 88|88 e6 4a fc) xscvsdqp v2,v28
+.*: (fe f1 26 88|88 26 f1 fe) xscvqpudz v23,v4
+.*: (fc 74 a6 88|88 a6 74 fc) xscvqpdp v3,v20
+.*: (fc 34 1e 89|89 1e 34 fc) xscvqpdpo v1,v3
+.*: (fe 76 66 88|88 66 76 fe) xscvdpqp v19,v12
+.*: (fd b9 26 88|88 26 b9 fd) xscvqpsdz v13,v4
+.*: (fc f8 3e c8|c8 3e f8 fc) xsiexpqp v7,v24,v7
diff --git a/gas/testsuite/gas/ppc/vsx3.s b/gas/testsuite/gas/ppc/vsx3.s
new file mode 100644
index 0000000..1084ebb
--- /dev/null
+++ b/gas/testsuite/gas/ppc/vsx3.s
@@ -0,0 +1,128 @@
+ .text
+vsx3:
+ lxvx 34,6,25
+ lxvx 20,0,10
+ lxvl 20,24,10
+ lxvl 54,0,29
+ lxvll 24,20,19
+ lxvll 34,0,14
+ mfvsrld 2,22
+ lxvwsx 58,26,25
+ lxvwsx 55,0,29
+ stxvx 14,21,4
+ stxvx 30,0,22
+ stxvl 0,26,4
+ stxvl 37,0,22
+ mtvsrws 24,10
+ stxvll 30,21,15
+ stxvll 39,0,14
+ mtvsrdd 12,6,5
+ mtvsrdd 38,0,21
+ lxsibzx 59,28,6
+ lxsibzx 30,0,8
+ lxvh8x 42,23,17
+ lxvh8x 36,0,5
+ lxsihzx 12,9,11
+ lxsihzx 49,0,13
+ lxvb16x 37,3,19
+ lxvb16x 0,0,30
+ stxsibx 2,30,6
+ stxsibx 12,0,13
+ stxvh8x 16,29,8
+ stxvh8x 55,0,10
+ stxsihx 34,2,23
+ stxsihx 60,0,23
+ stxvb16x 23,14,12
+ stxvb16x 19,0,5
+ lxsd 24,0(0)
+ lxsd 15,16(21)
+ lxssp 6,0(0)
+ lxssp 23,16(9)
+ xscmpeqdp 18,51,33
+ xscmpgtdp 2,26,34
+ xscmpgedp 5,26,20
+ xxperm 44,10,43
+ xscmpnedp 5,21,34
+ xxpermr 41,20,5
+ xscmpexpdp 4,18,55
+ xxextractuw 23,37,3
+ xxspltib 54,235
+ xxinsertw 15,30,4
+ xvcmpnesp 39,40,15
+ xvcmpnesp. 0,55,50
+ xvcmpnedp 60,12,46
+ xvcmpnedp. 36,21,25
+ xsmaxcdp 12,11,7
+ xsmincdp 32,25,24
+ xsmaxjdp 25,53,12
+ xststdcsp 2,36,127
+ xsminjdp 32,21,45
+ xsxexpdp 17,50
+ xsxsigdp 7,40
+ xscvhpdp 54,34
+ xscvdphp 58,54
+ xststdcdp 0,38,127
+ xvtstdcsp 56,53,127
+ xviexpsp 54,20,52
+ xsiexpdp 57,28,29
+ xvxexpdp 1,20
+ xvxsigdp 54,59
+ xxbrh 18,37
+ xvxexpsp 14,1
+ xvxsigsp 52,13
+ xxbrw 19,5
+ xxbrd 51,55
+ xvcvhpsp 35,17
+ xvcvsphp 15,45
+ xxbrq 17,31
+ xvtstdcdp 16,12,127
+ xviexpdp 27,9,8
+ lxv 4,0(0)
+ lxv 40,16(20)
+ stxv 50,0(0)
+ stxv 8,16(16)
+ stxsd 3,0(0)
+ stxsd 17,16(2)
+ stxssp 13,0(0)
+ stxssp 17,16(13)
+ xsaddqp 8,10,18
+ xsaddqpo 5,1,29
+ xsrqpi 0,12,18,3
+ xsrqpix 1,31,19,0
+ xsmulqp 14,1,6
+ xsmulqpo 17,7,27
+ xsrqpxp 0,4,11,0
+ xscpsgnqp 29,23,28
+ xscmpoqp 7,13,27
+ xscmpexpqp 5,21,6
+ xsmaddqp 2,19,4
+ xsmaddqpo 30,7,16
+ xsmsubqp 21,30,15
+ xsmsubqpo 12,17,30
+ xsnmaddqp 6,30,12
+ xsnmaddqpo 12,22,12
+ xsnmsubqp 10,29,27
+ xsnmsubqpo 29,29,13
+ xssubqp 19,27,4
+ xssubqpo 13,8,1
+ xsdivqp 8,3,27
+ xsdivqpo 24,20,27
+ xscmpuqp 7,14,4
+ xststdcqp 4,2,127
+ xsabsqp 31,22
+ xsxexpqp 25,3
+ xsnabsqp 10,28
+ xsnegqp 19,31
+ xsxsigqp 11,13
+ xssqrtqp 13,14
+ xssqrtqpo 1,27
+ xscvqpuwz 3,7
+ xscvudqp 20,18
+ xscvqpswz 29,29
+ xscvsdqp 2,28
+ xscvqpudz 23,4
+ xscvqpdp 3,20
+ xscvqpdpo 1,3
+ xscvdpqp 19,12
+ xscvqpsdz 13,4
+ xsiexpqp 7,24,7
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index e991371..3a013ef 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -1520,6 +1520,7 @@ public:
private:
typedef Powerpc_relocate_functions<size, big_endian> This;
typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
+ typedef typename elfcpp::Elf_types<size>::Elf_Swxword SignedAddress;
template<int valsize>
static inline bool
@@ -1680,6 +1681,16 @@ public:
return stat;
}
+ // R_POWERPC_ADDR16_DQ: (Symbol + Addend) & 0xfff0
+ static inline Status
+ addr16_dq(unsigned char* view, Address value, Overflow_check overflow)
+ {
+ Status stat = This::template rela<16,16>(view, 0, 0xfff0, value, overflow);
+ if ((value & 15) != 0)
+ stat = STATUS_OVERFLOW;
+ return stat;
+ }
+
// R_POWERPC_ADDR16_HI: ((Symbol + Addend) >> 16) & 0xffff
static inline void
addr16_hi(unsigned char* view, Address value)
@@ -1719,6 +1730,20 @@ public:
stat = STATUS_OVERFLOW;
return stat;
}
+
+ // R_POWERPC_REL16DX_HA
+ static inline Status
+ addr16dx_ha(unsigned char *view, Address value, Overflow_check overflow)
+ {
+ typedef typename elfcpp::Swap<32, big_endian>::Valtype Valtype;
+ Valtype* wv = reinterpret_cast<Valtype*>(view);
+ Valtype val = elfcpp::Swap<32, big_endian>::readval(wv);
+ value += 0x8000;
+ value = static_cast<SignedAddress>(value) >> 16;
+ val |= (value & 0xffc1) | ((value & 0x3e) << 15);
+ elfcpp::Swap<32, big_endian>::writeval(wv, val);
+ return overflowed<16>(value, overflow);
+ }
};
// Set ABI version for input and output.
@@ -5689,6 +5714,7 @@ Target_powerpc<size, big_endian>::Scan::local(
case elfcpp::R_POWERPC_REL16_LO:
case elfcpp::R_POWERPC_REL16_HI:
case elfcpp::R_POWERPC_REL16_HA:
+ case elfcpp::R_POWERPC_REL16DX_HA:
case elfcpp::R_POWERPC_SECTOFF:
case elfcpp::R_POWERPC_SECTOFF_LO:
case elfcpp::R_POWERPC_SECTOFF_HI:
@@ -6138,6 +6164,7 @@ Target_powerpc<size, big_endian>::Scan::global(
case elfcpp::R_POWERPC_REL16_LO:
case elfcpp::R_POWERPC_REL16_HI:
case elfcpp::R_POWERPC_REL16_HA:
+ case elfcpp::R_POWERPC_REL16DX_HA:
case elfcpp::R_POWERPC_SECTOFF:
case elfcpp::R_POWERPC_SECTOFF_LO:
case elfcpp::R_POWERPC_SECTOFF_HI:
@@ -7441,6 +7468,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
case elfcpp::R_POWERPC_REL16_LO:
case elfcpp::R_POWERPC_REL16_HI:
case elfcpp::R_POWERPC_REL16_HA:
+ case elfcpp::R_POWERPC_REL16DX_HA:
case elfcpp::R_POWERPC_REL14:
case elfcpp::R_POWERPC_REL14_BRTAKEN:
case elfcpp::R_POWERPC_REL14_BRNTAKEN:
@@ -7639,6 +7667,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
break;
case elfcpp::R_POWERPC_REL32:
+ case elfcpp::R_POWERPC_REL16DX_HA:
if (size == 64)
overflow = Reloc::CHECK_SIGNED;
break;
@@ -7719,11 +7748,13 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
break;
}
+ Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian);
+ Insn insn = 0;
+
if (overflow == Reloc::CHECK_LOW_INSN
|| overflow == Reloc::CHECK_HIGH_INSN)
{
- Insn* iview = reinterpret_cast<Insn*>(view - 2 * big_endian);
- Insn insn = elfcpp::Swap<32, big_endian>::readval(iview);
+ insn = elfcpp::Swap<32, big_endian>::readval(iview);
if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
overflow = Reloc::CHECK_BITFIELD;
@@ -7739,6 +7770,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
overflow = Reloc::CHECK_SIGNED;
}
+ bool maybe_dq_reloc = false;
typename Powerpc_relocate_functions<size, big_endian>::Status status
= Powerpc_relocate_functions<size, big_endian>::STATUS_OK;
switch (r_type)
@@ -7791,7 +7823,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
if (size == 64)
{
// On ppc64 these are all ds form
- status = Reloc::addr16_ds(view, value, overflow);
+ maybe_dq_reloc = true;
break;
}
case elfcpp::R_POWERPC_ADDR16:
@@ -7812,7 +7844,10 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
case elfcpp::R_POWERPC_DTPREL16_LO:
case elfcpp::R_POWERPC_GOT_TLSGD16_LO:
case elfcpp::R_POWERPC_GOT_TLSLD16_LO:
- status = Reloc::addr16(view, value, overflow);
+ if (size == 64)
+ status = Reloc::addr16(view, value, overflow);
+ else
+ maybe_dq_reloc = true;
break;
case elfcpp::R_POWERPC_UADDR16:
@@ -7859,6 +7894,10 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
Reloc::addr16_ha(view, value);
break;
+ case elfcpp::R_POWERPC_REL16DX_HA:
+ status = Reloc::addr16dx_ha(view, value, overflow);
+ break;
+
case elfcpp::R_PPC64_DTPREL16_HIGHER:
if (size == 32)
// R_PPC_EMB_NADDR16_LO
@@ -7913,7 +7952,7 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
case elfcpp::R_PPC64_GOT16_LO_DS:
case elfcpp::R_PPC64_SECTOFF_DS:
case elfcpp::R_PPC64_SECTOFF_LO_DS:
- status = Reloc::addr16_ds(view, value, overflow);
+ maybe_dq_reloc = true;
break;
case elfcpp::R_POWERPC_ADDR14:
@@ -7978,6 +8017,26 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
r_type);
break;
}
+
+ if (maybe_dq_reloc)
+ {
+ if (insn == 0)
+ insn = elfcpp::Swap<32, big_endian>::readval(iview);
+
+ if ((insn & (0x3f << 26)) == 56u << 26 /* lq */
+ || ((insn & (0x3f << 26)) == (61u << 26) /* lxv, stxv */
+ && (insn & 3) == 1))
+ status = Reloc::addr16_dq(view, value, overflow);
+ else if (size == 64
+ || (insn & (0x3f << 26)) == 58u << 26 /* ld,ldu,lwa */
+ || (insn & (0x3f << 26)) == 62u << 26 /* std,stdu,stq */
+ || (insn & (0x3f << 26)) == 57u << 26 /* lfdp */
+ || (insn & (0x3f << 26)) == 61u << 26 /* stfdp */)
+ status = Reloc::addr16_ds(view, value, overflow);
+ else
+ status = Reloc::addr16(view, value, overflow);
+ }
+
if (status != Powerpc_relocate_functions<size, big_endian>::STATUS_OK
&& (has_stub_value
|| !(gsym != NULL
diff --git a/include/elf/ppc.h b/include/elf/ppc.h
index c8d7c1f..b4c73fe 100644
--- a/include/elf/ppc.h
+++ b/include/elf/ppc.h
@@ -149,6 +149,9 @@ START_RELOC_NUMBERS (elf_ppc_reloc_type)
RELOC_NUMBER (R_PPC_VLE_SDAREL_HA16A, 231)
RELOC_NUMBER (R_PPC_VLE_SDAREL_HA16D, 232)
+/* Power9 split rel16 for addpcis. */
+ RELOC_NUMBER (R_PPC_REL16DX_HA, 246)
+
/* Support STT_GNU_IFUNC plt calls. */
RELOC_NUMBER (R_PPC_IRELATIVE, 248)
diff --git a/include/elf/ppc64.h b/include/elf/ppc64.h
index 7d6311d..2cc24cc 100644
--- a/include/elf/ppc64.h
+++ b/include/elf/ppc64.h
@@ -157,6 +157,10 @@ START_RELOC_NUMBERS (elf_ppc64_reloc_type)
/* Fake relocation only used internally by ld. */
RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128)
#endif
+
+/* Power9 split rel16 for addpcis. */
+ RELOC_NUMBER (R_PPC64_REL16DX_HA, 246)
+
/* Support STT_GNU_IFUNC plt calls. */
RELOC_NUMBER (R_PPC64_JMP_IREL, 247)
RELOC_NUMBER (R_PPC64_IRELATIVE, 248)
diff --git a/include/opcode/ppc.h b/include/opcode/ppc.h
index 8f87e68..44d2d6c 100644
--- a/include/opcode/ppc.h
+++ b/include/opcode/ppc.h
@@ -204,6 +204,12 @@ extern const int vle_num_opcodes;
/* Opcode is supported by ppc821/850/860. */
#define PPC_OPCODE_860 0x10000000000ull
+/* Opcode is only supported by Power9 architecture. */
+#define PPC_OPCODE_POWER9 0x20000000000ull
+
+/* Opcode is supported by Vector-Scalar (VSX) Unit from ISA 2.08. */
+#define PPC_OPCODE_VSX3 0x40000000000ull
+
/* A macro to extract the major opcode from an instruction. */
#define PPC_OP(i) (((i) >> 26) & 0x3f)
diff --git a/ld/testsuite/ld-powerpc/addpcis.d b/ld/testsuite/ld-powerpc/addpcis.d
new file mode 100644
index 0000000..c0e2679
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/addpcis.d
@@ -0,0 +1,20 @@
+#source: addpcis.s
+#as: -a64 -mpower9
+#ld: -melf64ppc -Ttext=0x10000000 --defsym ext1=0 --defsym ext2=0x8fff0000
+#objdump: -d -Mpower9
+
+.*: file format .*
+
+Disassembly of section \.text:
+
+0+10000000 <_start>:
+ 10000000: (4c 60 f0 04|04 f0 60 4c) addpcis r3,-4096
+ 10000004: (38 63 ff fc|fc ff 63 38) addi r3,r3,-4
+ 10000008: (4c 9f 7f c5|c5 7f 9f 4c) addpcis r4,32767
+ 1000000c: (38 84 ff f4|f4 ff 84 38) addi r4,r4,-12
+ 10000010: (4c a0 00 05|05 00 a0 4c) addpcis r5,1
+ 10000014: (38 a5 80 00|00 80 a5 38) addi r5,r5,-32768
+ \.\.\.
+
+0+10008014 <forw>:
+ 10008014: (60 00 00 00|00 00 00 60) nop
diff --git a/ld/testsuite/ld-powerpc/addpcis.s b/ld/testsuite/ld-powerpc/addpcis.s
new file mode 100644
index 0000000..d535e63
--- /dev/null
+++ b/ld/testsuite/ld-powerpc/addpcis.s
@@ -0,0 +1,12 @@
+ .text
+ .global _start
+_start:
+ addpcis 3,(ext1-0f)@ha
+0: addi 3,3,(ext1-0b)@l
+ addpcis 4,(ext2-0f)@ha
+0: addi 4,4,(ext2-0b)@l
+ addpcis 5,(forw-0f)@ha
+0: addi 5,5,(forw-0b)@l
+ .space 32764
+forw:
+ nop
diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp
index 4211063..efb4026 100644
--- a/ld/testsuite/ld-powerpc/powerpc.exp
+++ b/ld/testsuite/ld-powerpc/powerpc.exp
@@ -288,6 +288,7 @@ if [ supports_ppc64 ] then {
run_dump_test "tocnovar"
run_dump_test "tlsld"
run_dump_test "relocsort"
+ run_dump_test "addpcis"
}
run_dump_test "tlsld32"
diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c
index dab9af2..6e91e91 100644
--- a/opcodes/ppc-dis.c
+++ b/opcodes/ppc-dis.c
@@ -157,6 +157,12 @@ struct ppc_mopt ppc_opts[] = {
| PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_HTM
| PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_VSX),
0 },
+ { "power9", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64
+ | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
+ | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9
+ | PPC_OPCODE_HTM | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2
+ | PPC_OPCODE_VSX | PPC_OPCODE_VSX3 ),
+ 0 },
{ "ppc", (PPC_OPCODE_PPC),
0 },
{ "ppc32", (PPC_OPCODE_PPC),
@@ -191,6 +197,12 @@ struct ppc_mopt ppc_opts[] = {
| PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_HTM
| PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_VSX),
0 },
+ { "pwr9", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64
+ | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
+ | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9
+ | PPC_OPCODE_HTM | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2
+ | PPC_OPCODE_VSX | PPC_OPCODE_VSX3 ),
+ 0 },
{ "pwrx", (PPC_OPCODE_POWER | PPC_OPCODE_POWER2),
0 },
{ "spe", (PPC_OPCODE_PPC | PPC_OPCODE_EFS),
@@ -201,7 +213,7 @@ struct ppc_mopt ppc_opts[] = {
{ "vle", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_VLE),
PPC_OPCODE_VLE },
{ "vsx", (PPC_OPCODE_PPC),
- PPC_OPCODE_VSX },
+ PPC_OPCODE_VSX | PPC_OPCODE_VSX3 },
{ "htm", (PPC_OPCODE_PPC),
PPC_OPCODE_HTM },
};
@@ -303,7 +315,7 @@ powerpc_init_dialect (struct disassemble_info *info)
dialect = ppc_parse_cpu (dialect, &sticky, "vle");
break;
default:
- dialect = ppc_parse_cpu (dialect, &sticky, "power8") | PPC_OPCODE_ANY;
+ dialect = ppc_parse_cpu (dialect, &sticky, "power9") | PPC_OPCODE_ANY;
}
arg = info->disassembler_options;
diff --git a/opcodes/ppc-opc.c b/opcodes/ppc-opc.c
index e9d24c8..0ea8d95 100644
--- a/opcodes/ppc-opc.c
+++ b/opcodes/ppc-opc.c
@@ -54,8 +54,18 @@ static long extract_bo (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_boe (unsigned long, long, ppc_cpu_t, const char **);
static long extract_boe (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_esync (unsigned long, long, ppc_cpu_t, const char **);
+static unsigned long insert_dcmxs (unsigned long, long, ppc_cpu_t, const char **);
+static long extract_dcmxs (unsigned long, ppc_cpu_t, int *);
+static unsigned long insert_dxd (unsigned long, long, ppc_cpu_t, const char **);
+static long extract_dxd (unsigned long, ppc_cpu_t, int *);
+static unsigned long insert_dxdn (unsigned long, long, ppc_cpu_t, const char **);
+static long extract_dxdn (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_fxm (unsigned long, long, ppc_cpu_t, const char **);
static long extract_fxm (unsigned long, ppc_cpu_t, int *);
+static unsigned long insert_l0 (unsigned long, long, ppc_cpu_t, const char **);
+static long extract_l0 (unsigned long, ppc_cpu_t, int *);
+static unsigned long insert_l1 (unsigned long, long, ppc_cpu_t, const char **);
+static long extract_l1 (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_li20 (unsigned long, long, ppc_cpu_t, const char **);
static long extract_li20 (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_ls (unsigned long, long, ppc_cpu_t, const char **);
@@ -98,6 +108,8 @@ static unsigned long insert_tbr (unsigned long, long, ppc_cpu_t, const char **);
static long extract_tbr (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_xt6 (unsigned long, long, ppc_cpu_t, const char **);
static long extract_xt6 (unsigned long, ppc_cpu_t, int *);
+static unsigned long insert_xtq6 (unsigned long, long, ppc_cpu_t, const char **);
+static long extract_xtq6 (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_xa6 (unsigned long, long, ppc_cpu_t, const char **);
static long extract_xa6 (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_xb6 (unsigned long, long, ppc_cpu_t, const char **);
@@ -302,9 +314,17 @@ const struct powerpc_operand powerpc_operands[] =
#define D8 D + 1
{ 0xff, 0, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED },
+ /* The DCMX field in an X form instruction. */
+#define DCMX D8 + 1
+ { 0x7f, 16, NULL, NULL, 0 },
+
+ /* The split DCMX field in an X form instruction. */
+#define DCMXS DCMX + 1
+ { 0x7f, PPC_OPSHIFT_INV, insert_dcmxs, extract_dcmxs, 0 },
+
/* The DQ field in a DQ form instruction. This is like D, but the
lower four bits are forced to zero. */
-#define DQ D8 + 1
+#define DQ DCMXS + 1
{ 0xfff0, 0, NULL, NULL,
PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DQ },
@@ -320,10 +340,21 @@ const struct powerpc_operand powerpc_operands[] =
#define BHRBE DUIS
{ 0x3ff, 11, NULL, NULL, 0 },
+ /* The split D field in a DX form instruction. */
+#define DXD DUIS + 1
+ { 0xffff, PPC_OPSHIFT_INV, insert_dxd, extract_dxd,
+ PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT},
+
+ /* The split ND field in a DX form instruction.
+ This is the same as the DX field, only negated. */
+#define NDXD DXD + 1
+ { 0xffff, PPC_OPSHIFT_INV, insert_dxdn, extract_dxdn,
+ PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT},
+
/* The E field in a wrteei instruction. */
/* And the W bit in the pair singles instructions. */
/* And the ST field in a VX form instruction. */
-#define E DUIS + 1
+#define E NDXD + 1
#define PSW E
#define ST E
{ 0x1, 15, NULL, NULL, 0 },
@@ -397,8 +428,16 @@ const struct powerpc_operand powerpc_operands[] =
#define HTM_R L
{ 0x1, 21, NULL, NULL, PPC_OPERAND_OPTIONAL },
+ /* The L field in an X form instruction which must be zero. */
+#define L0 L + 1
+ { 0x1, 21, insert_l0, extract_l0, PPC_OPERAND_OPTIONAL },
+
+ /* The L field in an X form instruction which must be one. */
+#define L1 L0 + 1
+ { 0x1, 21, insert_l1, extract_l1, 0 },
+
/* The LEV field in a POWER SVC form instruction. */
-#define SVC_LEV L + 1
+#define SVC_LEV L1 + 1
{ 0x7f, 5, NULL, NULL, 0 },
/* The LEV field in an SC form instruction. */
@@ -513,10 +552,14 @@ const struct powerpc_operand powerpc_operands[] =
#define RBOPT RBX + 1
{ 0x1f, 11, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL },
+ /* The RC register field in an maddld, maddhd or maddhdu instruction. */
+#define RC RBOPT + 1
+ { 0x1f, 6, NULL, NULL, PPC_OPERAND_GPR },
+
/* The RS field in a D, DS, X, XFX, XS, M, MD or MDS form
instruction or the RT field in a D, DS, X, XFX or XO form
instruction. */
-#define RS RBOPT + 1
+#define RS RC + 1
#define RT RS
#define RT_MASK (0x1f << 21)
#define RD RS
@@ -577,6 +620,8 @@ const struct powerpc_operand powerpc_operands[] =
#define SH_MASK (0x1f << 11)
/* The other UIMM field in a EVX form instruction. */
#define EVUIMM SH
+ /* The FC field in an atomic X form instruction. */
+#define FC SH
{ 0x1f, 11, NULL, NULL, 0 },
/* The SI field in a HTM X form instruction. */
@@ -705,8 +750,12 @@ const struct powerpc_operand powerpc_operands[] =
#define UIMM3 UIMM + 1
{ 0x7, 16, NULL, NULL, 0 },
+ /* The 6-bit UIM field in a X form instruction. */
+#define UIM6 UIMM3 + 1
+ { 0x3f, 16, NULL, NULL, 0 },
+
/* The SIX field in a VX form instruction. */
-#define SIX UIMM3 + 1
+#define SIX UIM6 + 1
{ 0xf, 11, NULL, NULL, 0 },
/* The PS field in a VX form instruction. */
@@ -752,9 +801,10 @@ const struct powerpc_operand powerpc_operands[] =
#define PSD PSQM + 1
{ 0xfff, 0, 0, 0, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED },
- /* The L field in an mtmsrd or A form instruction or W in an X form. */
+ /* The L field in an mtmsrd or A form instruction or R or W in an X form. */
#define A_L PSD + 1
#define W A_L
+#define X_R A_L
{ 0x1, 16, NULL, NULL, PPC_OPERAND_OPTIONAL },
#define RMC A_L + 1
@@ -763,7 +813,13 @@ const struct powerpc_operand powerpc_operands[] =
#define R RMC + 1
{ 0x1, 16, NULL, NULL, 0 },
-#define SP R + 1
+#define RIC R + 1
+ { 0x3, 18, NULL, NULL, PPC_OPERAND_OPTIONAL },
+
+#define PRS RIC + 1
+ { 0x1, 17, NULL, NULL, PPC_OPERAND_OPTIONAL },
+
+#define SP PRS + 1
{ 0x3, 19, NULL, NULL, 0 },
#define S SP + 1
@@ -838,8 +894,13 @@ const struct powerpc_operand powerpc_operands[] =
#define XT6 XS6
{ 0x3f, PPC_OPSHIFT_INV, insert_xt6, extract_xt6, PPC_OPERAND_VSR },
+ /* The XT and XS fields in an DQ form VSX instruction. This is split. */
+#define XSQ6 XT6 + 1
+#define XTQ6 XSQ6
+ { 0x3f, PPC_OPSHIFT_INV, insert_xtq6, extract_xtq6, PPC_OPERAND_VSR },
+
/* The XA field in an XX3 form instruction. This is split. */
-#define XA6 XT6 + 1
+#define XA6 XTQ6 + 1
{ 0x3f, PPC_OPSHIFT_INV, insert_xa6, extract_xa6, PPC_OPERAND_VSR },
/* The XB field in an XX2 or XX3 form instruction. This is split. */
@@ -869,6 +930,8 @@ const struct powerpc_operand powerpc_operands[] =
#define UIM DMEX + 1
/* The 2-bit UIMM field in a VX form instruction. */
#define UIMM2 UIM
+ /* The 2-bit L field in a darn instruction. */
+#define LRAND UIM
{ 0x3, 16, NULL, NULL, 0 },
#define ERAT_T UIM + 1
@@ -876,6 +939,10 @@ const struct powerpc_operand powerpc_operands[] =
#define IH ERAT_T + 1
{ 0x7, 21, NULL, NULL, PPC_OPERAND_OPTIONAL },
+
+ /* The 8-bit IMM8 field in a XX1 form instruction. */
+#define IMM8 IH + 1
+ { 0xff, 11, NULL, NULL, 0 },
};
const unsigned int num_powerpc_operands = (sizeof (powerpc_operands)
@@ -1272,6 +1339,64 @@ extract_boe (unsigned long insn,
return value & 0x1e;
}
+/* The DCMX field in a X form instruction when the field is split
+ into separate DC, DM and DX fields. */
+
+static unsigned long
+insert_dcmxs (unsigned long insn,
+ long value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insn | ((value & 0x1f) << 16) | ((value & 0x20) >> 3) | (value & 0x40);
+}
+
+static long
+extract_dcmxs (unsigned long insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid ATTRIBUTE_UNUSED)
+{
+ return (insn & 0x40) | ((insn << 3) & 0x20) | ((insn >> 16) & 0x1f);
+}
+
+/* The D field in a DX form instruction when the field is split
+ into separate D0, D1 and D2 fields. */
+
+static unsigned long
+insert_dxd (unsigned long insn,
+ long value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insn | (value & 0xffc1) | ((value & 0x3e) << 15);
+}
+
+static long
+extract_dxd (unsigned long insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid ATTRIBUTE_UNUSED)
+{
+ unsigned long dxd = (insn & 0xffc1) | ((insn >> 15) & 0x3e);
+ return (dxd ^ 0x8000) - 0x8000;
+}
+
+static unsigned long
+insert_dxdn (unsigned long insn,
+ long value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insert_dxd (insn, -value, dialect, errmsg);
+}
+
+static long
+extract_dxdn (unsigned long insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid ATTRIBUTE_UNUSED)
+{
+ return -extract_dxd (insn, dialect, invalid);
+}
+
/* FXM mask in mfcr and mtcrf instructions. */
static unsigned long
@@ -1343,6 +1468,58 @@ extract_fxm (unsigned long insn,
return mask;
}
+/* The L field in an X form instruction which must have the value zero. */
+
+static unsigned long
+insert_l0 (unsigned long insn,
+ long value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg)
+{
+ if (value != 0)
+ *errmsg = _("invalid operand constant");
+ return insn & ~(0x1 << 21);
+}
+
+static long
+extract_l0 (unsigned long insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid)
+{
+ long value;
+
+ value = (insn >> 21) & 0x1;
+ if (value != 0)
+ *invalid = 1;
+ return value;
+}
+
+/* The L field in an X form instruction which must have the value one. */
+
+static unsigned long
+insert_l1 (unsigned long insn,
+ long value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg)
+{
+ if (value != 1)
+ *errmsg = _("invalid operand constant");
+ return insn | (0x1 << 21);
+}
+
+static long
+extract_l1 (unsigned long insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid)
+{
+ long value;
+
+ value = (insn >> 21) & 0x1;
+ if (value != 1)
+ *invalid = 1;
+ return value;
+}
+
static unsigned long
insert_li20 (unsigned long insn,
long value,
@@ -1398,16 +1575,16 @@ insert_ls (unsigned long insn,
static unsigned long
insert_esync (unsigned long insn,
long value,
- ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ ppc_cpu_t dialect,
const char **errmsg)
{
- unsigned long ls;
+ unsigned long ls = (insn >> 21) & 0x03;
- ls = (insn >> 21) & 0x03;
if (value == 0)
{
- if (ls > 1)
- *errmsg = _("illegal L operand value");
+ if (((dialect & PPC_OPCODE_E6500) != 0 && ls > 1)
+ || ((dialect & PPC_OPCODE_POWER9) != 0 && ls > 2))
+ *errmsg = _("illegal L operand value");
return insn;
}
@@ -1945,6 +2122,24 @@ extract_xt6 (unsigned long insn,
return ((insn << 5) & 0x20) | ((insn >> 21) & 0x1f);
}
+/* The XT and XS fields in an DQ form VSX instruction. This is split. */
+static unsigned long
+insert_xtq6 (unsigned long insn,
+ long value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insn | ((value & 0x1f) << 21) | ((value & 0x20) >> 2);
+}
+
+static long
+extract_xtq6 (unsigned long insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid ATTRIBUTE_UNUSED)
+{
+ return ((insn << 2) & 0x20) | ((insn >> 21) & 0x1f);
+}
+
/* The XA field in an XX3 form instruction. This is split. */
static unsigned long
@@ -2258,10 +2453,18 @@ extract_vleil (unsigned long insn,
/* The main opcode mask with the RA field clear. */
#define DRA_MASK (OP_MASK | RA_MASK)
+/* A DQ form VSX instruction. */
+#define DQX(op, xop) (OP (op) | ((xop) & 0x7))
+#define DQX_MASK DQX (0x3f, 7)
+
/* A DS form instruction. */
#define DSO(op, xop) (OP (op) | ((xop) & 0x3))
#define DS_MASK DSO (0x3f, 3)
+/* An DX form instruction. */
+#define DX(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 1))
+#define DX_MASK DX (0x3f, 0x1f)
+
/* An EVSEL form instruction. */
#define EVSEL(op, xop) (OP (op) | (((unsigned long)(xop)) & 0xff) << 3)
#define EVSEL_MASK EVSEL(0x3f, 0xff)
@@ -2374,6 +2577,9 @@ extract_vleil (unsigned long insn,
/* A VX_MASK with a PS field. */
#define VXPS_MASK (VX_MASK & ~(0x1 << 9))
+/* A VX_MASK with the VA field fixed with a PS field. */
+#define VXVAPS_MASK ((VX_MASK | (0x1f << 16)) & ~(0x1 << 9))
+
/* A VA form instruction. */
#define VXA(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x03f))
@@ -2389,9 +2595,15 @@ extract_vleil (unsigned long insn,
/* The mask for a VXR form instruction. */
#define VXR_MASK VXR(0x3f, 0x3ff, 1)
+/* A VX form instruction with a VA tertiary opcode. */
+#define VXVA(op, xop, vaop) (VX(op,xop) | (((vaop) & 0x1f) << 16))
+
/* An X form instruction. */
#define X(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1))
+/* A X form instruction for Quad-Precision FP Instructions. */
+#define XVA(op, xop, vaop) (X(op,xop) | (((vaop) & 0x1f) << 16))
+
/* An EX form instruction. */
#define EX(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x7ff))
@@ -2401,6 +2613,9 @@ extract_vleil (unsigned long insn,
/* An XX2 form instruction. */
#define XX2(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 2))
+/* A XX2 form instruction with the VA bits specified. */
+#define XX2VA(op, xop, vaop) (XX2(op,xop) | (((vaop) & 0x1f) << 16))
+
/* An XX3 form instruction. */
#define XX3(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0xff) << 3))
@@ -2416,12 +2631,18 @@ extract_vleil (unsigned long insn,
/* An X form instruction with the RC bit specified. */
#define XRC(op, xop, rc) (X ((op), (xop)) | ((rc) & 1))
+/* A X form instruction for Quad-Precision FP Instructions with RC bit. */
+#define XVARC(op, xop, vaop, rc) (XVA ((op), (xop), (vaop)) | ((rc) & 1))
+
/* A Z form instruction with the RC bit specified. */
#define ZRC(op, xop, rc) (Z ((op), (xop)) | ((rc) & 1))
/* The mask for an X form instruction. */
#define X_MASK XRC (0x3f, 0x3ff, 1)
+/* The mask for an X form instruction with the BF bits specified. */
+#define XBF_MASK (X_MASK | (3 << 21))
+
/* An X form wait instruction with everything filled in except the WC field. */
#define XWC_MASK (XRC (0x3f, 0x3ff, 1) | (7 << 23) | RA_MASK | RB_MASK)
@@ -2437,9 +2658,18 @@ extract_vleil (unsigned long insn,
/* The mask for an XX2 form instruction with the UIM bits specified. */
#define XX2UIM_MASK (XX2 (0x3f, 0x1ff) | (7 << 18))
+/* The mask for an XX2 form instruction with the 4 UIM bits specified. */
+#define XX2UIM4_MASK (XX2 (0x3f, 0x1ff) | (1 << 20))
+
/* The mask for an XX2 form instruction with the BF bits specified. */
#define XX2BF_MASK (XX2_MASK | (3 << 21) | (1))
+/* The mask for an XX2 form instruction with the BF and DCMX bits specified. */
+#define XX2BFD_MASK (XX2 (0x3f, 0x1ff) | 1)
+
+/* The mask for an XX2 form instruction with a split DCMX bits specified. */
+#define XX2DCMXS_MASK XX2 (0x3f, 0x1ee)
+
/* The mask for an XX3 form instruction. */
#define XX3_MASK XX3 (0x3f, 0xff)
@@ -2460,11 +2690,13 @@ extract_vleil (unsigned long insn,
#define Z_MASK ZRC (0x3f, 0x1ff, 1)
#define Z2_MASK ZRC (0x3f, 0xff, 1)
-/* An X_MASK with the RA field fixed. */
+/* An X_MASK with the RA/VA field fixed. */
#define XRA_MASK (X_MASK | RA_MASK)
+#define XVA_MASK XRA_MASK
-/* An XRA_MASK with the W field clear. */
+/* An XRA_MASK with the A_L/W field clear. */
#define XWRA_MASK (XRA_MASK & ~((unsigned long) 1 << 16))
+#define XRLA_MASK XWRA_MASK
/* An X_MASK with the RB field fixed. */
#define XRB_MASK (X_MASK | RB_MASK)
@@ -2478,9 +2710,15 @@ extract_vleil (unsigned long insn,
/* An X_MASK with the RA and RB fields fixed. */
#define XRARB_MASK (X_MASK | RA_MASK | RB_MASK)
+/* An XBF_MASK with the RA and RB fields fixed. */
+#define XBFRARB_MASK (XBF_MASK | RA_MASK | RB_MASK)
+
/* An XRARB_MASK, but with the L bit clear. */
#define XRLARB_MASK (XRARB_MASK & ~((unsigned long) 1 << 16))
+/* An XRARB_MASK, but with the L bits in a darn instruction clear. */
+#define XLRAND_MASK (XRARB_MASK & ~((unsigned long) 3 << 16))
+
/* An X_MASK with the RT and RA fields fixed. */
#define XRTRA_MASK (X_MASK | RT_MASK | RA_MASK)
@@ -2738,6 +2976,7 @@ extract_vleil (unsigned long insn,
#define POWER6 PPC_OPCODE_POWER6
#define POWER7 PPC_OPCODE_POWER7
#define POWER8 PPC_OPCODE_POWER8
+#define POWER9 PPC_OPCODE_POWER9
#define CELL PPC_OPCODE_CELL
#define PPC64 PPC_OPCODE_64 | PPC_OPCODE_64_BRIDGE
#define NON32 (PPC_OPCODE_64 | PPC_OPCODE_POWER4 \
@@ -2753,8 +2992,10 @@ extract_vleil (unsigned long insn,
#define PPCPS PPC_OPCODE_PPCPS
#define PPCVEC PPC_OPCODE_ALTIVEC
#define PPCVEC2 PPC_OPCODE_ALTIVEC2
+#define PPCVEC3 PPC_OPCODE_ALTIVEC2
#define PPCVSX PPC_OPCODE_VSX
#define PPCVSX2 PPC_OPCODE_VSX
+#define PPCVSX3 PPC_OPCODE_VSX3
#define POWER PPC_OPCODE_POWER
#define POWER2 PPC_OPCODE_POWER | PPC_OPCODE_POWER2
#define PWR2COM PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_COMMON
@@ -2864,11 +3105,13 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"twi", OP(3), OP_MASK, PPCCOM, PPCNONE, {TO, RA, SI}},
{"ti", OP(3), OP_MASK, PWRCOM, PPCNONE, {TO, RA, SI}},
-{"ps_cmpu0", X (4, 0), X_MASK|(3<<21), PPCPS, PPCNONE, {BF, FRA, FRB}},
+{"ps_cmpu0", X (4, 0), XBF_MASK, PPCPS, PPCNONE, {BF, FRA, FRB}},
{"vaddubm", VX (4, 0), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vmul10cuq", VX (4, 1), VXVB_MASK, PPCVEC3, PPCNONE, {VD, VA}},
{"vmaxub", VX (4, 2), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vrlb", VX (4, 4), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vcmpequb", VXR(4, 6,0), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vcmpneb", VXR(4, 7,0), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vmuloub", VX (4, 8), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vaddfp", VX (4, 10), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"psq_lx", XW (4, 6,0), XW_MASK, PPCPS, PPCNONE, {FRT,RA,RB,PSWM,PSQM}},
@@ -2914,6 +3157,9 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vmaddfp", VXA(4, 46), VXA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VC, VB}},
{"ps_sel.", A (4, 23,1), A_MASK, PPCPS, PPCNONE, {FRT, FRA, FRC, FRB}},
{"vnmsubfp", VXA(4, 47), VXA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VC, VB}},
+{"maddhd", VXA(4, 48), VXA_MASK, POWER9, PPCNONE, {RT, RA, RB, RC}},
+{"maddhdu", VXA(4, 49), VXA_MASK, POWER9, PPCNONE, {RT, RA, RB, RC}},
+{"maddld", VXA(4, 51), VXA_MASK, POWER9, PPCNONE, {RT, RA, RB, RC}},
{"ps_res", A (4, 24,0), AFRAFRC_MASK, PPCPS, PPCNONE, {FRT, FRB}},
{"ps_res.", A (4, 24,1), AFRAFRC_MASK, PPCPS, PPCNONE, {FRT, FRB}},
{"ps_mul", A (4, 25,0), AFRB_MASK, PPCPS, PPCNONE, {FRT, FRA, FRC}},
@@ -2928,15 +3174,18 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"ps_nmsub.", A (4, 30,1), A_MASK, PPCPS, PPCNONE, {FRT, FRA, FRC, FRB}},
{"ps_nmadd", A (4, 31,0), A_MASK, PPCPS, PPCNONE, {FRT, FRA, FRC, FRB}},
{"ps_nmadd.", A (4, 31,1), A_MASK, PPCPS, PPCNONE, {FRT, FRA, FRC, FRB}},
-{"ps_cmpo0", X (4, 32), X_MASK|(3<<21), PPCPS, PPCNONE, {BF, FRA, FRB}},
+{"ps_cmpo0", X (4, 32), XBF_MASK, PPCPS, PPCNONE, {BF, FRA, FRB}},
+{"vpermr", VXA(4, 59), VXA_MASK, PPCVEC3, PPCNONE, {VD, VA, VB, VC}},
{"vaddeuqm", VXA(4, 60), VXA_MASK, PPCVEC2, PPCNONE, {VD, VA, VB, VC}},
{"vaddecuq", VXA(4, 61), VXA_MASK, PPCVEC2, PPCNONE, {VD, VA, VB, VC}},
{"vsubeuqm", VXA(4, 62), VXA_MASK, PPCVEC2, PPCNONE, {VD, VA, VB, VC}},
{"vsubecuq", VXA(4, 63), VXA_MASK, PPCVEC2, PPCNONE, {VD, VA, VB, VC}},
{"vadduhm", VX (4, 64), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vmul10ecuq", VX (4, 65), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vmaxuh", VX (4, 66), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vrlh", VX (4, 68), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vcmpequh", VXR(4, 70,0), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vcmpneh", VXR(4, 71,0), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vmulouh", VX (4, 72), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vsubfp", VX (4, 74), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"psq_lux", XW (4, 38,0), XW_MASK, PPCPS, PPCNONE, {FRT,RA,RB,PSWM,PSQM}},
@@ -2951,11 +3200,13 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"machhw.", XO (4, 44,0,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"nmachhw", XO (4, 46,0,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"nmachhw.", XO (4, 46,0,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
-{"ps_cmpu1", X (4, 64), X_MASK|(3<<21), PPCPS, PPCNONE, {BF, FRA, FRB}},
+{"ps_cmpu1", X (4, 64), XBF_MASK, PPCPS, PPCNONE, {BF, FRA, FRB}},
{"vadduwm", VX (4, 128), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vmaxuw", VX (4, 130), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vrlw", VX (4, 132), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vrlwmi", VX (4, 133), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vcmpequw", VXR(4, 134,0), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vcmpnew", VXR(4, 135,0), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vmulouw", VX (4, 136), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vmuluwm", VX (4, 137), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vmrghw", VX (4, 140), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -2964,10 +3215,11 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"ps_mr.", XRC(4, 72,1), XRA_MASK, PPCPS, PPCNONE, {FRT, FRB}},
{"machhwsu", XO (4, 76,0,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"machhwsu.", XO (4, 76,0,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
-{"ps_cmpo1", X (4, 96), X_MASK|(3<<21), PPCPS, PPCNONE, {BF, FRA, FRB}},
+{"ps_cmpo1", X (4, 96), XBF_MASK, PPCPS, PPCNONE, {BF, FRA, FRB}},
{"vaddudm", VX (4, 192), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vmaxud", VX (4, 194), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vrld", VX (4, 196), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
+{"vrldmi", VX (4, 197), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vcmpeqfp", VXR(4, 198,0), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vcmpequd", VXR(4, 199,0), VXR_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vpkuwus", VX (4, 206), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -2977,6 +3229,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"nmachhws.", XO (4, 110,0,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"vadduqm", VX (4, 256), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vmaxsb", VX (4, 258), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vcmpnezb", VXR(4, 263,0), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vslb", VX (4, 260), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vmulosb", VX (4, 264), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vrefp", VX (4, 266), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
@@ -2991,6 +3244,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vaddcuq", VX (4, 320), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vmaxsh", VX (4, 322), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vslh", VX (4, 324), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vcmpnezh", VXR(4, 327,0), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vmulosh", VX (4, 328), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vrsqrtefp", VX (4, 330), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"vmrglh", VX (4, 332), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -3004,6 +3258,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vaddcuw", VX (4, 384), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vmaxsw", VX (4, 386), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vslw", VX (4, 388), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vrlwnm", VX (4, 389), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
+{"vcmpnezw", VXR(4, 391,0), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vmulosw", VX (4, 392), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vexptefp", VX (4, 394), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"vmrglw", VX (4, 396), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -3012,6 +3268,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"macchwsu.", XO (4, 204,0,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"vmaxsd", VX (4, 450), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vsl", VX (4, 452), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vrldnm", VX (4, 453), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vcmpgefp", VXR(4, 454,0), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vlogefp", VX (4, 458), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"vpkswss", VX (4, 462), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -3021,6 +3278,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"nmacchws.", XO (4, 238,0,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"evaddw", VX (4, 512), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vaddubs", VX (4, 512), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vmul10uq", VX (4, 513), VXVB_MASK, PPCVEC3, PPCNONE, {VD, VA}},
{"evaddiw", VX (4, 514), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RB, UIMM}},
{"vminub", VX (4, 514), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"evsubfw", VX (4, 516), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
@@ -3037,6 +3295,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evextsh", VX (4, 523), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA}},
{"evrndw", VX (4, 524), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA}},
{"vspltb", VX (4, 524), VXUIMM4_MASK,PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM4}},
+{"vextractub", VX (4, 525), VXUIMM4_MASK,PPCVEC3, PPCNONE, {VD, VB, UIMM4}},
{"evcntlzw", VX (4, 525), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA}},
{"evcntlsw", VX (4, 526), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA}},
{"vupkhsb", VX (4, 526), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
@@ -3075,12 +3334,14 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evcmpeq", VX (4, 564), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {CRFD, RA, RB}},
{"cget", APU(4, 284,0), APU_RA_MASK, PPC405, PPCNONE, {RT, FSL}},
{"vadduhs", VX (4, 576), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vmul10euq", VX (4, 577), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vminuh", VX (4, 578), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vsrh", VX (4, 580), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vcmpgtuh", VXR(4, 582,0), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vmuleuh", VX (4, 584), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vrfiz", VX (4, 586), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"vsplth", VX (4, 588), VXUIMM3_MASK,PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM3}},
+{"vextractuh", VX (4, 589), VXUIMM4_MASK,PPCVEC3, PPCNONE, {VD, VB, UIMM4}},
{"vupkhsh", VX (4, 590), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"nget", APU(4, 300,0), APU_RA_MASK, PPC405, PPCNONE, {RT, FSL}},
{"evsel", EVSEL(4,79), EVSEL_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB, CRFS}},
@@ -3100,6 +3361,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vrfip", VX (4, 650), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"evfscmpgt", VX (4, 652), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {CRFD, RA, RB}},
{"vspltw", VX (4, 652), VXUIMM2_MASK,PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM2}},
+{"vextractuw", VX (4, 653), VXUIMM4_MASK,PPCVEC3, PPCNONE, {VD, VB, UIMM4}},
{"evfscmplt", VX (4, 653), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {CRFD, RA, RB}},
{"evfscmpeq", VX (4, 654), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {CRFD, RA, RB}},
{"vupklsb", VX (4, 654), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
@@ -3131,6 +3393,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"efsdiv", VX (4, 713), VX_MASK, PPCEFS|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vrfim", VX (4, 714), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"efscmpgt", VX (4, 716), VX_MASK, PPCEFS|PPCVLE, PPCNONE, {CRFD, RA, RB}},
+{"vextractd", VX (4, 717), VXUIMM4_MASK,PPCVEC3, PPCNONE, {VD, VB, UIMM4}},
{"efscmplt", VX (4, 717), VX_MASK, PPCEFS|PPCVLE, PPCNONE, {CRFD, RA, RB}},
{"efscmpeq", VX (4, 718), VX_MASK, PPCEFS|PPCVLE, PPCNONE, {CRFD, RA, RB}},
{"vupklsh", VX (4, 718), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
@@ -3195,6 +3458,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vcuxwfp", VX (4, 778), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM}},
{"evlhhousplatx",VX(4, 780), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vspltisb", VX (4, 780), VXVB_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, SIMM}},
+{"vinsertb", VX (4, 781), VXUIMM4_MASK,PPCVEC3, PPCNONE, {VD, VB, UIMM4}},
{"evlhhousplat",VX (4, 781), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, EVUIMM_2, RA}},
{"evlhhossplatx",VX(4, 782), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vpkpx", VX (4, 782), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -3228,6 +3492,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evstwwox", VX (4, 828), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"evstwwo", VX (4, 829), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, EVUIMM_4, RA}},
{"vaddshs", VX (4, 832), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"bcdcpsgn.", VX (4, 833), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vminsh", VX (4, 834), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vsrah", VX (4, 836), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vcmpgtsh", VXR(4, 838,0), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -3235,6 +3500,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vcfsx", VX (4, 842), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM}},
{"vcsxwfp", VX (4, 842), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM}},
{"vspltish", VX (4, 844), VXVB_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, SIMM}},
+{"vinserth", VX (4, 845), VXUIMM4_MASK,PPCVEC3, PPCNONE, {VD, VB, UIMM4}},
{"vupkhpx", VX (4, 846), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"mullhw", XRC(4, 424,0), X_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"mullhw.", XRC(4, 424,1), X_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
@@ -3250,6 +3516,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vctuxs", VX (4, 906), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM}},
{"vcfpuxws", VX (4, 906), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM}},
{"vspltisw", VX (4, 908), VXVB_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, SIMM}},
+{"vinsertw", VX (4, 909), VXUIMM4_MASK,PPCVEC3, PPCNONE, {VD, VB, UIMM4}},
{"maclhwsu", XO (4, 460,0,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"maclhwsu.", XO (4, 460,0,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"vminsd", VX (4, 962), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
@@ -3258,6 +3525,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vcmpgtsd", VXR(4, 967,0), VXR_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vctsxs", VX (4, 970), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM}},
{"vcfpsxws", VX (4, 970), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB, UIMM}},
+{"vinsertd", VX (4, 973), VXUIMM4_MASK,PPCVEC3, PPCNONE, {VD, VB, UIMM4}},
{"vupklpx", VX (4, 974), VXVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VB}},
{"maclhws", XO (4, 492,0,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"maclhws.", XO (4, 492,0,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
@@ -3270,6 +3538,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evmhessf", VX (4,1027), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vand", VX (4,1028), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vcmpequb.", VXR(4, 6,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vcmpneb.", VXR(4, 7,1), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"udi0fcm.", APU(4, 515,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
{"udi0fcm", APU(4, 515,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
{"evmhossf", VX (4,1031), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
@@ -3302,6 +3571,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vcmpequh.", VXR(4, 70,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"udi1fcm.", APU(4, 547,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
{"udi1fcm", APU(4, 547,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
+{"vcmpneh.", VXR(4, 71,1), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"evmwhssf", VX (4,1095), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vpmsumh", VX (4,1096), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"evmwlumi", VX (4,1096), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
@@ -3331,10 +3601,12 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evmwsmia", VX (4,1145), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"evmwsmfa", VX (4,1147), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vsubuwm", VX (4,1152), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"bcdus.", VX (4,1153), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vavguw", VX (4,1154), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vabsduw", VX (4,1155), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vmr", VX (4,1156), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VBA}},
{"vor", VX (4,1156), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vcmpnew.", VXR(4, 135,1), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vpmsumw", VX (4,1160), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vcmpequw.", VXR(4, 134,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"udi2fcm.", APU(4, 579,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
@@ -3345,6 +3617,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"ps_merge10.", XOPS(4,592,1), XOPS_MASK, PPCPS, PPCNONE, {FRT, FRA, FRB}},
{"vsubudm", VX (4,1216), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"evaddusiaaw", VX (4,1216), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA}},
+{"bcds.", VX (4,1217), VXPS_MASK, PPCVEC3, PPCNONE, {VD, VA, VB, PS}},
{"evaddssiaaw", VX (4,1217), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA}},
{"evsubfusiaaw",VX (4,1218), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA}},
{"evsubfssiaaw",VX (4,1219), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA}},
@@ -3370,6 +3643,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"ps_merge11.", XOPS(4,624,1), XOPS_MASK, PPCPS, PPCNONE, {FRT, FRA, FRB}},
{"vsubuqm", VX (4,1280), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"evmheusiaaw", VX (4,1280), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
+{"bcdtrunc.", VX (4,1281), VXPS_MASK, PPCVEC3, PPCNONE, {VD, VA, VB, PS}},
{"evmhessiaaw", VX (4,1281), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vavgsb", VX (4,1282), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"evmhessfaaw", VX (4,1283), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
@@ -3379,6 +3653,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evmhossiaaw", VX (4,1285), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"udi4fcm.", APU(4, 643,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
{"udi4fcm", APU(4, 643,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
+{"vcmpnezb.", VXR(4, 263,1), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"evmhossfaaw", VX (4,1287), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"evmheumiaaw", VX (4,1288), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vcipher", VX (4,1288), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
@@ -3399,11 +3674,13 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evmhogsmfaa", VX (4,1327), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vsubcuq", VX (4,1344), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"evmwlusiaaw", VX (4,1344), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
+{"bcdutrunc.", VX (4,1345), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"evmwlssiaaw", VX (4,1345), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vavgsh", VX (4,1346), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vorc", VX (4,1348), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"udi5fcm.", APU(4, 675,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
{"udi5fcm", APU(4, 675,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
+{"vcmpnezh.", VXR(4, 327,1), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vncipher", VX (4,1352), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"evmwlumiaaw", VX (4,1352), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vncipherlast",VX (4,1353), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
@@ -3421,6 +3698,13 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evmheusianw", VX (4,1408), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vsubcuw", VX (4,1408), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"evmhessianw", VX (4,1409), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
+{"bcdctsq.", VXVA(4,1409,0), VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"bcdcfsq.", VXVA(4,1409,2), VXVAPS_MASK, PPCVEC3, PPCNONE, {VD, VB, PS}},
+{"bcdctz.", VXVA(4,1409,4), VXVAPS_MASK, PPCVEC3, PPCNONE, {VD, VB, PS}},
+{"bcdctn.", VXVA(4,1409,5), VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"bcdcfz.", VXVA(4,1409,6), VXVAPS_MASK, PPCVEC3, PPCNONE, {VD, VB, PS}},
+{"bcdcfn.", VXVA(4,1409,7), VXVAPS_MASK, PPCVEC3, PPCNONE, {VD, VB, PS}},
+{"bcdsetsgn.", VXVA(4,1409,31),VXVAPS_MASK, PPCVEC3, PPCNONE, {VD, VB, PS}},
{"vavgsw", VX (4,1410), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"evmhessfanw", VX (4,1411), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vnand", VX (4,1412), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
@@ -3428,6 +3712,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evmhossianw", VX (4,1413), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"udi6fcm.", APU(4, 707,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
{"udi6fcm", APU(4, 707,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}},
+{"vcmpnezw.", VXR(4, 391,1), VXR_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"evmhossfanw", VX (4,1415), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"evmheumianw", VX (4,1416), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"evmhesmianw", VX (4,1417), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
@@ -3444,6 +3729,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"evmhogsmian", VX (4,1453), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"evmhogsmfan", VX (4,1455), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"evmwlusianw", VX (4,1472), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
+{"bcdsr.", VX (4,1473), VXPS_MASK, PPCVEC3, PPCNONE, {VD, VA, VB, PS}},
{"evmwlssianw", VX (4,1473), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"vsld", VX (4,1476), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vcmpgefp.", VXR(4, 454,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -3452,6 +3738,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vsbox", VX (4,1480), VXVB_MASK, PPCVEC2, PPCNONE, {VD, VA}},
{"evmwlumianw", VX (4,1480), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"evmwlsmianw", VX (4,1481), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
+{"vbpermd", VX (4,1484), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vpksdss", VX (4,1486), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"evmwssfan", VX (4,1491), VX_MASK, PPCSPE|PPCVLE, PPCNONE, {RS, RA, RB}},
{"macchwso", XO (4, 236,1,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
@@ -3462,17 +3749,35 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"nmacchwso", XO (4, 238,1,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"nmacchwso.", XO (4, 238,1,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"vsububs", VX (4,1536), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vclzlsbb", VXVA(4,1538,0), VXVA_MASK, PPCVEC3, PPCNONE, {RT, VB}},
+{"vctzlsbb", VXVA(4,1538,1), VXVA_MASK, PPCVEC3, PPCNONE, {RT, VB}},
+{"vnegw", VXVA(4,1538,6), VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vnegd", VXVA(4,1538,7), VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vprtybw", VXVA(4,1538,8), VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vprtybd", VXVA(4,1538,9), VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vprtybq", VXVA(4,1538,10),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vextsb2w", VXVA(4,1538,16),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vextsh2w", VXVA(4,1538,17),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vextsb2d", VXVA(4,1538,24),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vextsh2d", VXVA(4,1538,25),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vextsw2d", VXVA(4,1538,26),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vctzb", VXVA(4,1538,28),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vctzh", VXVA(4,1538,29),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vctzw", VXVA(4,1538,30),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
+{"vctzd", VXVA(4,1538,31),VXVA_MASK, PPCVEC3, PPCNONE, {VD, VB}},
{"mfvscr", VX (4,1540), VXVAVB_MASK, PPCVEC|PPCVLE, PPCNONE, {VD}},
{"vcmpgtub.", VXR(4, 518,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"udi8fcm.", APU(4, 771,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"udi8fcm", APU(4, 771,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"vsum4ubs", VX (4,1544), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vextublx", VX (4,1549), VX_MASK, PPCVEC3, PPCNONE, {RT, RA, VB}},
{"vsubuhs", VX (4,1600), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"mtvscr", VX (4,1604), VXVDVA_MASK, PPCVEC|PPCVLE, PPCNONE, {VB}},
{"vcmpgtuh.", VXR(4, 582,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vsum4shs", VX (4,1608), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"udi9fcm.", APU(4, 804,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"udi9fcm", APU(4, 804,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
+{"vextuhlx", VX (4,1613), VX_MASK, PPCVEC3, PPCNONE, {RT, RA, VB}},
{"vupkhsw", VX (4,1614), VXVA_MASK, PPCVEC2, PPCNONE, {VD, VB}},
{"vsubuws", VX (4,1664), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vshasigmaw", VX (4,1666), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, ST, SIX}},
@@ -3482,6 +3787,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"udi10fcm", APU(4, 835,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"vsum2sws", VX (4,1672), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vmrgow", VX (4,1676), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
+{"vextuwlx", VX (4,1677), VX_MASK, PPCVEC3, PPCNONE, {RT, RA, VB}},
{"vshasigmad", VX (4,1730), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, ST, SIX}},
{"vsrd", VX (4,1732), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
{"vcmpgtfp.", VXR(4, 710,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
@@ -3492,16 +3798,20 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"vsubsbs", VX (4,1792), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vclzb", VX (4,1794), VXVA_MASK, PPCVEC2, PPCNONE, {VD, VB}},
{"vpopcntb", VX (4,1795), VXVA_MASK, PPCVEC2, PPCNONE, {VD, VB}},
+{"vsrv", VX (4,1796), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vcmpgtsb.", VXR(4, 774,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"udi12fcm.", APU(4, 899,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"udi12fcm", APU(4, 899,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"vsum4sbs", VX (4,1800), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vextubrx", VX (4,1805), VX_MASK, PPCVEC3, PPCNONE, {RT, RA, VB}},
{"maclhwuo", XO (4, 396,1,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"maclhwuo.", XO (4, 396,1,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"vsubshs", VX (4,1856), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vclzh", VX (4,1858), VXVA_MASK, PPCVEC2, PPCNONE, {VD, VB}},
{"vpopcnth", VX (4,1859), VXVA_MASK, PPCVEC2, PPCNONE, {VD, VB}},
+{"vslv", VX (4,1860), VX_MASK, PPCVEC3, PPCNONE, {VD, VA, VB}},
{"vcmpgtsh.", VXR(4, 838,1), VXR_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
+{"vextuhrx", VX (4,1869), VX_MASK, PPCVEC3, PPCNONE, {RT, RA, VB}},
{"udi13fcm.", APU(4, 931,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"udi13fcm", APU(4, 931,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"maclhwo", XO (4, 428,1,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
@@ -3516,6 +3826,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"udi14fcm", APU(4, 963,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}},
{"vsumsws", VX (4,1928), VX_MASK, PPCVEC|PPCVLE, PPCNONE, {VD, VA, VB}},
{"vmrgew", VX (4,1932), VX_MASK, PPCVEC2, PPCNONE, {VD, VA, VB}},
+{"vextuwrx", VX (4,1933), VX_MASK, PPCVEC3, PPCNONE, {RT, RA, VB}},
{"maclhwsuo", XO (4, 460,1,0),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"maclhwsuo.", XO (4, 460,1,1),XO_MASK, MULHW|PPCVLE, PPCNONE, {RT, RA, RB}},
{"vclzd", VX (4,1986), VXVA_MASK, PPCVEC2, PPCNONE, {VD, VB}},
@@ -3854,6 +4165,9 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"mcrf", XL(19,0), XLBB_MASK|(3<<21)|(3<<16), COM, PPCNONE, {BF, BFA}},
+{"addpcis", DX(19,2), DX_MASK, POWER9, PPCNONE, {RT, DXD}},
+{"subpcis", DX(19,2), DX_MASK, POWER9, PPCNONE, {RT, NDXD}},
+
{"bdnzlr", XLO(19,BODNZ,16,0), XLBOBIBB_MASK, PPCCOM, PPCNONE, {0}},
{"bdnzlr-", XLO(19,BODNZ,16,0), XLBOBIBB_MASK, PPCCOM, ISA_V2, {0}},
{"bdnzlrl", XLO(19,BODNZ,16,1), XLBOBIBB_MASK, PPCCOM, PPCNONE, {0}},
@@ -4113,17 +4427,20 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"crset", XL(19,289), XL_MASK, PPCCOM, PPCNONE, {BT, BAT, BBA}},
{"creqv", XL(19,289), XL_MASK, COM, PPCNONE, {BT, BA, BB}},
-{"doze", XL(19,402), 0xffffffff, POWER6, PPCNONE, {0}},
+{"urfid", XL(19,306), 0xffffffff, POWER9, PPCNONE, {0}},
+{"stop", XL(19,370), 0xffffffff, POWER9, PPCNONE, {0}},
+
+{"doze", XL(19,402), 0xffffffff, POWER6, POWER9, {0}},
{"crorc", XL(19,417), XL_MASK, COM, PPCNONE, {BT, BA, BB}},
-{"nap", XL(19,434), 0xffffffff, POWER6, PPCNONE, {0}},
+{"nap", XL(19,434), 0xffffffff, POWER6, POWER9, {0}},
{"crmove", XL(19,449), XL_MASK, PPCCOM, PPCNONE, {BT, BA, BBA}},
{"cror", XL(19,449), XL_MASK, COM, PPCNONE, {BT, BA, BB}},
-{"sleep", XL(19,466), 0xffffffff, POWER6, PPCNONE, {0}},
-{"rvwinkle", XL(19,498), 0xffffffff, POWER6, PPCNONE, {0}},
+{"sleep", XL(19,466), 0xffffffff, POWER6, POWER9, {0}},
+{"rvwinkle", XL(19,498), 0xffffffff, POWER6, POWER9, {0}},
{"bctr", XLO(19,BOU,528,0), XLBOBIBB_MASK, COM, PPCNONE, {0}},
{"bctrl", XLO(19,BOU,528,1), XLBOBIBB_MASK, COM, PPCNONE, {0}},
@@ -4459,7 +4776,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"ldepx", X(31,29), X_MASK, E500MC|PPCA2|PPCVLE, PPCNONE, {RT, RA0, RB}},
-{"waitasec", X(31,30), XRTRARB_MASK,POWER8, PPCNONE, {0}},
+{"waitasec", X(31,30), XRTRARB_MASK,POWER8, POWER9, {0}},
+{"wait", X(31,30), XWC_MASK, POWER9, PPCNONE, {WC}},
{"lwepx", X(31,31), X_MASK, E500MC|PPCA2|PPCVLE, PPCNONE, {RT, RA0, RB}},
@@ -4591,6 +4909,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"dcbfep", XRT(31,127,0), XRT_MASK, E500MC|PPCA2|PPCVLE, PPCNONE, {RA0, RB}},
+{"setb", X(31,128), XRB_MASK|(3<<16), POWER9, PPCNONE, {RT, BFA}},
+
{"wrtee", X(31,131), XRARB_MASK, PPC403|BOOKE|PPCA2|PPC476|PPCVLE, PPCNONE, {RS}},
{"dcbtstls", X(31,134), X_MASK, PPCCHLK|PPC476|TITAN|PPCVLE, PPCNONE, {CT, RA0, RB}},
@@ -4673,6 +4993,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"prtyd", X(31,186), XRB_MASK, POWER6|PPCA2, PPCNONE, {RA, RS}},
+{"cmprb", X(31,192), XCMP_MASK, POWER9, PPCNONE, {BF, L, RA, RB}},
+
{"icblq.", XRC(31,198,1), X_MASK, E6500, PPCNONE, {CT, RA0, RB}},
{"stvewx", X(31,199), X_MASK, PPCVEC, PPCNONE, {VS, RA0, RB}},
@@ -4711,6 +5033,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"stbepx", X(31,223), X_MASK, E500MC|PPCA2|PPCVLE, PPCNONE, {RS, RA0, RB}},
+{"cmpeqb", X(31,224), XCMPL_MASK, POWER9, PPCNONE, {BF, RA, RB}},
+
{"icblc", X(31,230), X_MASK, PPCCHLK|PPC476|TITAN|PPCVLE, PPCNONE, {CT, RA0, RB}},
{"stvx", X(31,231), X_MASK, PPCVEC|PPCVLE, PPCNONE, {VS, RA0, RB}},
@@ -4770,14 +5094,22 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"doz", XO(31,264,0,0), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
{"doz.", XO(31,264,0,1), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
+{"modud", X(31,265), X_MASK, POWER9, PPCNONE, {RT, RA, RB}},
+
{"add", XO(31,266,0,0), XO_MASK, PPCCOM|PPCVLE, PPCNONE, {RT, RA, RB}},
{"cax", XO(31,266,0,0), XO_MASK, PWRCOM, PPCNONE, {RT, RA, RB}},
{"add.", XO(31,266,0,1), XO_MASK, PPCCOM|PPCVLE, PPCNONE, {RT, RA, RB}},
{"cax.", XO(31,266,0,1), XO_MASK, PWRCOM, PPCNONE, {RT, RA, RB}},
+{"moduw", X(31,267), X_MASK, POWER9, PPCNONE, {RT, RA, RB}},
+
+{"lxvx", X(31,268), XX1_MASK|1<<6, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
+{"lxvl", X(31,269), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
+
{"ehpriv", X(31,270), 0xffffffff, E500MC|PPCA2|PPCVLE, PPCNONE, {0}},
-{"tlbiel", X(31,274), XRTLRA_MASK, POWER4, PPC476, {RB, L}},
+{"tlbiel", X(31,274), X_MASK|1<<20,POWER9, PPC476, {RB, RSO, RIC, PRS, X_R}},
+{"tlbiel", X(31,274), XRTLRA_MASK, POWER4, POWER9|PPC476, {RB, L}},
{"mfapidi", X(31,275), X_MASK, BOOKE, E500|TITAN, {RT, RA}},
@@ -4805,12 +5137,19 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"lvexhx", X(31,293), X_MASK, PPCVEC2, PPCNONE, {VD, RA0, RB}},
{"lvepx", X(31,295), X_MASK, PPCVEC2|PPCVLE, PPCNONE, {VD, RA0, RB}},
+{"lxvll", X(31,301), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
+
{"mfbhrbe", X(31,302), X_MASK, POWER8, PPCNONE, {RT, BHRBE}},
-{"tlbie", X(31,306), XRA_MASK, POWER7, TITAN, {RB, RS}},
+{"tlbie", X(31,306), X_MASK|1<<20,POWER9, TITAN, {RB, RS, RIC, PRS, X_R}},
+{"tlbie", X(31,306), XRA_MASK, POWER7, POWER9|TITAN, {RB, RS}},
{"tlbie", X(31,306), XRTLRA_MASK, PPC, E500|POWER7|TITAN, {RB, L}},
{"tlbi", X(31,306), XRT_MASK, POWER, PPCNONE, {RA0, RB}},
+{"mfvsrld", X(31,307), XX1RB_MASK, PPCVSX3, PPCNONE, {RA, XS6}},
+
+{"ldmx", X(31,309), X_MASK, POWER9, PPCNONE, {RT, RA0, RB}},
+
{"eciwx", X(31,310), X_MASK, PPC, E500|TITAN, {RT, RA0, RB}},
{"lhzux", X(31,311), X_MASK, COM|PPCVLE, PPCNONE, {RT, RAL, RB}},
@@ -4871,6 +5210,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"mfpmr", X(31,334), X_MASK, PPCPMR|PPCE300|PPCVLE, PPCNONE, {RT, PMR}},
{"mftmr", X(31,366), X_MASK, PPCTMR|E6500, PPCNONE, {RT, TMR}},
+{"slbsync", X(31,338), 0xffffffff, POWER9, PPCNONE, {0}},
+
{"mfmq", XSPR(31,339, 0), XSPR_MASK, M601, PPCNONE, {RT}},
{"mfxer", XSPR(31,339, 1), XSPR_MASK, COM|PPCVLE, PPCNONE, {RT}},
{"mfrtcu", XSPR(31,339, 4), XSPR_MASK, COM, TITAN, {RT}},
@@ -5087,6 +5428,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"divs", XO(31,363,0,0), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
{"divs.", XO(31,363,0,1), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
+{"lxvwsx", X(31,364), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
+
{"tlbia", X(31,370), 0xffffffff, PPC, E500|TITAN, {0}},
{"mftbu", XSPR(31,371,269), XSPR_MASK, PPC, NO371|POWER4, {RT}},
@@ -5114,10 +5457,15 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"divweu", XO(31,395,0,0), XO_MASK, POWER7|PPCA2, PPCNONE, {RT, RA, RB}},
{"divweu.", XO(31,395,0,1), XO_MASK, POWER7|PPCA2, PPCNONE, {RT, RA, RB}},
+{"stxvx", X(31,396), XX1_MASK, PPCVSX3, PPCNONE, {XS6, RA0, RB}},
+{"stxvl", X(31,397), XX1_MASK, PPCVSX3, PPCNONE, {XS6, RA0, RB}},
+
{"dcblce", X(31,398), X_MASK, PPCCHLK, E500MC, {CT, RA, RB}},
{"slbmte", X(31,402), XRA_MASK, PPC64, PPCNONE, {RS, RB}},
+{"mtvsrws", X(31,403), XX1RB_MASK, PPCVSX3, PPCNONE, {XT6, RA}},
+
{"pbt.", XRC(31,404,1), X_MASK, POWER8, PPCNONE, {RS, RA0, RB}},
{"icswx", XRC(31,406,0), X_MASK, POWER7|PPCA2, PPCNONE, {RS, RA, RB}},
@@ -5141,10 +5489,14 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"divwe", XO(31,427,0,0), XO_MASK, POWER7|PPCA2, PPCNONE, {RT, RA, RB}},
{"divwe.", XO(31,427,0,1), XO_MASK, POWER7|PPCA2, PPCNONE, {RT, RA, RB}},
+{"stxvll", X(31,429), XX1_MASK, PPCVSX3, PPCNONE, {XS6, RA0, RB}},
+
{"clrbhrb", X(31,430), 0xffffffff, POWER8, PPCNONE, {0}},
{"slbie", X(31,434), XRTRA_MASK, PPC64, PPCNONE, {RB}},
+{"mtvsrdd", X(31,435), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
+
{"ecowx", X(31,438), X_MASK, PPC, E500|TITAN, {RT, RA0, RB}},
{"sthux", X(31,439), X_MASK, COM|PPCVLE, PPCNONE, {RS, RAS, RB}},
@@ -5214,6 +5566,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"mtpmr", X(31,462), X_MASK, PPCPMR|PPCE300|PPCVLE, PPCNONE, {PMR, RS}},
{"mttmr", X(31,494), X_MASK, PPCTMR|E6500, PPCNONE, {TMR, RS}},
+{"slbieg", X(31,466), XRA_MASK, POWER9, PPCNONE, {RS, RB}},
+
{"mtmq", XSPR(31,467, 0), XSPR_MASK, M601, PPCNONE, {RS}},
{"mtxer", XSPR(31,467, 1), XSPR_MASK, COM|PPCVLE, PPCNONE, {RS}},
{"mtlr", XSPR(31,467, 8), XSPR_MASK, COM|PPCVLE, PPCNONE, {RS}},
@@ -5413,7 +5767,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"cmpb", X(31,508), X_MASK, POWER6|PPCA2|PPC476, PPCNONE, {RA, RS, RB}},
-{"mcrxr", X(31,512), XRARB_MASK|(3<<21), COM|PPCVLE, POWER7, {BF}},
+{"mcrxr", X(31,512), XBFRARB_MASK, COM|PPCVLE, POWER7, {BF}},
{"lbdx", X(31,515), X_MASK, E500MC|PPCVLE, PPCNONE, {RT, RA, RB}},
@@ -5456,6 +5810,9 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"rrib", XRC(31,537,0), X_MASK, M601, PPCNONE, {RA, RS, RB}},
{"rrib.", XRC(31,537,1), X_MASK, M601, PPCNONE, {RA, RS, RB}},
+{"cnttzw", XRC(31,538,0), XRB_MASK, POWER9, PPCNONE, {RA, RS}},
+{"cnttzw.", XRC(31,538,1), XRB_MASK, POWER9, PPCNONE, {RA, RS}},
+
{"srd", XRC(31,539,0), X_MASK, PPC64, PPCNONE, {RA, RS, RB}},
{"srd.", XRC(31,539,1), X_MASK, PPC64, PPCNONE, {RA, RS, RB}},
@@ -5480,10 +5837,17 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"lfsux", X(31,567), X_MASK, COM, PPCEFS, {FRT, RAS, RB}},
+{"cnttzd", XRC(31,570,0), XRB_MASK, POWER9, PPCNONE, {RA, RS}},
+{"cnttzd.", XRC(31,570,1), XRB_MASK, POWER9, PPCNONE, {RA, RS}},
+
+{"mcrxrx", X(31,576), XBFRARB_MASK, POWER9, PPCNONE, {BF}},
+
{"lwdx", X(31,579), X_MASK, E500MC|PPCVLE, PPCNONE, {RT, RA, RB}},
{"lvtlx", X(31,581), X_MASK, PPCVEC2, PPCNONE, {VD, RA0, RB}},
+{"lwat", X(31,582), X_MASK, POWER9, PPCNONE, {RT, RA0, FC}},
+
{"lwfcmux", APU(31,583,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
{"lxsdx", X(31,588), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA0, RB}},
@@ -5496,8 +5860,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"hwsync", XSYNC(31,598,0), 0xffffffff, POWER4, BOOKE|PPC476, {0}},
{"lwsync", XSYNC(31,598,1), 0xffffffff, PPC, E500, {0}},
{"ptesync", XSYNC(31,598,2), 0xffffffff, PPC64, PPCNONE, {0}},
-{"sync", X(31,598), XSYNCLE_MASK,E6500, PPCNONE, {LS, ESYNC}},
-{"sync", X(31,598), XSYNC_MASK, PPCCOM|PPCVLE, BOOKE|PPC476, {LS}},
+{"sync", X(31,598), XSYNCLE_MASK,POWER9|E6500, PPCNONE, {LS, ESYNC}},
+{"sync", X(31,598), XSYNC_MASK, PPCCOM|PPCVLE, BOOKE|PPC476|POWER9, {LS}},
{"msync", X(31,598), 0xffffffff, BOOKE|PPCA2|PPC476, PPCNONE, {0}},
{"sync", X(31,598), 0xffffffff, BOOKE|PPC476, E6500, {0}},
{"lwsync", X(31,598), 0xffffffff, E500, PPCNONE, {0}},
@@ -5512,6 +5876,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"lvswx", X(31,613), X_MASK, PPCVEC2, PPCNONE, {VD, RA0, RB}},
+{"ldat", X(31,614), X_MASK, POWER9, PPCNONE, {RT, RA0, FC}},
+
{"lqfcmux", APU(31,615,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
{"nego", XO(31,104,1,0), XORB_MASK, COM|PPCVLE, PPCNONE, {RT, RA}},
@@ -5584,6 +5950,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"stvflx", X(31,709), X_MASK, PPCVEC2, PPCNONE, {VS, RA0, RB}},
+{"stwat", X(31,710), X_MASK, POWER9, PPCNONE, {RS, RA0, FC}},
+
{"stwfcmux", APU(31,711,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
{"stxsdx", X(31,716), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA0, RB}},
@@ -5620,6 +5988,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"stvswx", X(31,741), X_MASK, PPCVEC2, PPCNONE, {VS, RA0, RB}},
+{"stdat", X(31,742), X_MASK, POWER9, PPCNONE, {RS, RA0, FC}},
+
{"stqfcmux", APU(31,743,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
{"subfmeo", XO(31,232,1,0), XORB_MASK, PPCCOM, PPCNONE, {RT, RA}},
@@ -5644,6 +6014,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"tresume.", XRCL(31,750,1,1), XRTRARB_MASK,PPCHTM, PPCNONE, {0}},
{"tsr.", XRC(31,750,1), XRTLRARB_MASK,PPCHTM, PPCNONE, {L}},
+{"darn", X(31,755), XLRAND_MASK, POWER9, PPCNONE, {RT, LRAND}},
+
{"dcba", X(31,758), XRT_MASK, PPC405|PPC7450|BOOKE|PPCA2|PPC476|PPCVLE, PPCNONE, {RA0, RB}},
{"dcbal", XOPL(31,758,1), XRT_MASK, E500MC, PPCNONE, {RA0, RB}},
@@ -5653,6 +6025,10 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"srliq.", XRC(31,760,1), X_MASK, M601, PPCNONE, {RA, RS, SH}},
{"lvsm", X(31,773), X_MASK, PPCVEC2, PPCNONE, {VD, RA0, RB}},
+
+{"copy_first", XOPL(31,774,1), XRT_MASK, POWER9, PPCNONE, {RA0, RB}},
+{"copy", X(31,774), XLRT_MASK, POWER9, PPCNONE, {RA0, RB, L}},
+
{"stvepxl", X(31,775), X_MASK, PPCVEC2, PPCNONE, {VS, RA0, RB}},
{"lvlxl", X(31,775), X_MASK, CELL, PPCNONE, {VD, RA0, RB}},
{"ldfcmux", APU(31,775,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
@@ -5665,7 +6041,11 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"addo.", XO(31,266,1,1), XO_MASK, PPCCOM|PPCVLE, PPCNONE, {RT, RA, RB}},
{"caxo.", XO(31,266,1,1), XO_MASK, PWRCOM, PPCNONE, {RT, RA, RB}},
+{"modsd", X(31,777), X_MASK, POWER9, PPCNONE, {RT, RA, RB}},
+{"modsw", X(31,779), X_MASK, POWER9, PPCNONE, {RT, RA, RB}},
+
{"lxvw4x", X(31,780), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA0, RB}},
+{"lxsibzx", X(31,781), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
{"tabortwc.", XRC(31,782,1), X_MASK, PPCHTM, PPCNONE, {TO, RA, RB}},
@@ -5692,6 +6072,9 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"stvepx", X(31,807), X_MASK, PPCVEC2, PPCNONE, {VS, RA0, RB}},
{"lvrxl", X(31,807), X_MASK, CELL, PPCNONE, {VD, RA0, RB}},
+{"lxvh8x", X(31,812), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
+{"lxsihzx", X(31,813), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
+
{"tabortdc.", XRC(31,814,1), X_MASK, PPCHTM, PPCNONE, {TO, RA, RB}},
{"rac", X(31,818), X_MASK, M601, PPCNONE, {RT, RA, RB}},
@@ -5714,17 +6097,20 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"lvtlxl", X(31,837), X_MASK, PPCVEC2, PPCNONE, {VD, RA0, RB}},
+{"cp_abort", X(31,838), XRTRARB_MASK,POWER9, PPCNONE, {0}},
+
{"divo", XO(31,331,1,0), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
{"divo.", XO(31,331,1,1), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
{"lxvd2x", X(31,844), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA0, RB}},
-{"lxvx", X(31,844), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA0, RB}},
+{"lxvx", X(31,844), XX1_MASK, POWER8, POWER9|PPCVSX3, {XT6, RA0, RB}},
{"tabortwci.", XRC(31,846,1), X_MASK, PPCHTM, PPCNONE, {TO, RA, HTM_SI}},
{"tlbsrx.", XRC(31,850,1), XRT_MASK, PPCA2, PPCNONE, {RA0, RB}},
-{"slbmfev", X(31,851), XRA_MASK, PPC64, PPCNONE, {RT, RB}},
+{"slbmfev", X(31,851), XRLA_MASK, POWER9, PPCNONE, {RT, RB, A_L}},
+{"slbmfev", X(31,851), XRA_MASK, PPC64, POWER9, {RT, RB}},
{"lbzcix", X(31,853), X_MASK, POWER6, PPCNONE, {RT, RA0, RB}},
@@ -5743,12 +6129,25 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"divso", XO(31,363,1,0), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
{"divso.", XO(31,363,1,1), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
+{"lxvb16x", X(31,876), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA0, RB}},
+
{"tabortdci.", XRC(31,878,1), X_MASK, PPCHTM, PPCNONE, {TO, RA, HTM_SI}},
+{"rmieg", X(31,882), XRTRA_MASK, POWER9, PPCNONE, {RB}},
+
{"ldcix", X(31,885), X_MASK, POWER6, PPCNONE, {RT, RA0, RB}},
+{"msgsync", X(31,886), 0xffffffff, POWER9, PPCNONE, {0}},
+
{"lfiwzx", X(31,887), X_MASK, POWER7|PPCA2, PPCNONE, {FRT, RA0, RB}},
+{"extswsli", XS(31,445,0), XS_MASK, POWER9, PPCNONE, {RA, RS, SH6}},
+{"extswsli.", XS(31,445,1), XS_MASK, POWER9, PPCNONE, {RA, RS, SH6}},
+
+{"paste", XRC(31,902,0), XLRT_MASK, POWER9, PPCNONE, {RA0, RB, L0}},
+{"paste_last", XRCL(31,902,1,1),XRT_MASK, POWER9, PPCNONE, {RA0, RB}},
+{"paste.", XRC(31,902,1), XLRT_MASK, POWER9, PPCNONE, {RA0, RB, L1}},
+
{"stvlxl", X(31,903), X_MASK, CELL, PPCNONE, {VS, RA0, RB}},
{"stdfcmux", APU(31,903,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
@@ -5758,13 +6157,15 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"divweuo.", XO(31,395,1,1), XO_MASK, POWER7|PPCA2, PPCNONE, {RT, RA, RB}},
{"stxvw4x", X(31,908), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA0, RB}},
+{"stxsibx", X(31,909), XX1_MASK, PPCVSX3, PPCNONE, {XS6, RA0, RB}},
{"tabort.", XRC(31,910,1), XRTRB_MASK, PPCHTM, PPCNONE, {RA}},
{"tlbsx", XRC(31,914,0), X_MASK, PPC403|BOOKE|PPCA2|PPC476, PPCNONE, {RTO, RA0, RB}},
{"tlbsx.", XRC(31,914,1), X_MASK, PPC403|BOOKE|PPCA2|PPC476, PPCNONE, {RTO, RA0, RB}},
-{"slbmfee", X(31,915), XRA_MASK, PPC64, PPCNONE, {RT, RB}},
+{"slbmfee", X(31,915), XRLA_MASK, POWER9, PPCNONE, {RT, RB, A_L}},
+{"slbmfee", X(31,915), XRA_MASK, PPC64, POWER9, {RT, RB}},
{"stwcix", X(31,917), X_MASK, POWER6, PPCNONE, {RS, RA0, RB}},
@@ -5799,6 +6200,9 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"divweo", XO(31,427,1,0), XO_MASK, POWER7|PPCA2, PPCNONE, {RT, RA, RB}},
{"divweo.", XO(31,427,1,1), XO_MASK, POWER7|PPCA2, PPCNONE, {RT, RA, RB}},
+{"stxvh8x", X(31,940), XX1_MASK, PPCVSX3, PPCNONE, {XS6, RA0, RB}},
+{"stxsihx", X(31,941), XX1_MASK, PPCVSX3, PPCNONE, {XS6, RA0, RB}},
+
{"treclaim.", XRC(31,942,1), XRTRB_MASK, PPCHTM, PPCNONE, {RA}},
{"tlbrehi", XTLB(31,946,0), XTLB_MASK, PPC403, PPCA2, {RT, RA}},
@@ -5830,7 +6234,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"divwuo.", XO(31,459,1,1), XO_MASK, PPC|PPCVLE, PPCNONE, {RT, RA, RB}},
{"stxvd2x", X(31,972), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA0, RB}},
-{"stxvx", X(31,972), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA0, RB}},
+{"stxvx", X(31,972), XX1_MASK, POWER8, POWER9|PPCVSX3, {XS6, RA0, RB}},
{"tlbld", X(31,978), XRTRA_MASK, PPC, PPC403|BOOKE|PPCA2|PPC476, {RB}},
{"tlbwehi", XTLB(31,978,0), XTLB_MASK, PPC403, PPCNONE, {RT, RA}},
@@ -5863,6 +6267,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"divwo", XO(31,491,1,0), XO_MASK, PPC|PPCVLE, PPCNONE, {RT, RA, RB}},
{"divwo.", XO(31,491,1,1), XO_MASK, PPC|PPCVLE, PPCNONE, {RT, RA, RB}},
+{"stxvb16x", X(31,1004), XX1_MASK, PPCVSX3, PPCNONE, {XS6, RA0, RB}},
+
{"trechkpt.", XRC(31,1006,1), XRTRARB_MASK,PPCHTM, PPCNONE, {0}},
{"tlbli", X(31,1010), XRTRA_MASK, PPC, TITAN, {RB}},
@@ -5947,6 +6353,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"psq_l", OP(56), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}},
{"lfq", OP(56), OP_MASK, POWER2, PPCNONE, {FRT, D, RA0}},
+{"lxsd", DSO(57,2), DS_MASK, PPCVSX3, PPCNONE, {VD, DS, RA0}},
+{"lxssp", DSO(57,3), DS_MASK, PPCVSX3, PPCNONE, {VD, DS, RA0}},
{"lfdp", OP(57), OP_MASK, POWER6, POWER7, {FRTp, DS, RA0}},
{"psq_lu", OP(57), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}},
{"lfqu", OP(57), OP_MASK, POWER2, PPCNONE, {FRT, D, RA0}},
@@ -6046,6 +6454,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"dcmpu", X(59,642), X_MASK, POWER6, PPCNONE, {BF, FRA, FRB}},
{"dtstsf", X(59,674), X_MASK, POWER6, PPCNONE, {BF, FRA, FRB}},
+{"dtstsfi", X(59,675), X_MASK|1<<22,POWER9, PPCNONE, {BF, UIM6, FRB}},
{"drsp", XRC(59,770,0), X_MASK, POWER6, PPCNONE, {FRT, FRB}},
{"drsp.", XRC(59,770,1), X_MASK, POWER6, PPCNONE, {FRT, FRB}},
@@ -6068,6 +6477,9 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"xsaddsp", XX3(60,0), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
{"xsmaddasp", XX3(60,1), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
{"xxsldwi", XX3(60,2), XX3SHW_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6, SHW}},
+{"xscmpeqdp", XX3(60,3), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xsrsqrtesp", XX2(60,10), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
+{"xssqrtsp", XX2(60,11), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
{"xxsel", XX4(60,3), XX4_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6, XC6}},
{"xssubsp", XX3(60,8), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
{"xsmaddmsp", XX3(60,9), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
@@ -6076,163 +6488,203 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"xxswapd", XX3(60,10)|(2<<8), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6S}},
{"xxmrgld", XX3(60,10)|(3<<8), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xxpermdi", XX3(60,10), XX3DM_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6, DM}},
-{"xsrsqrtesp", XX2(60,10), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
-{"xssqrtsp", XX2(60,11), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
+{"xscmpgtdp", XX3(60,11), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xsresp", XX2(60,26), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
{"xsmulsp", XX3(60,16), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
{"xsmsubasp", XX3(60,17), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
{"xxmrghw", XX3(60,18), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xscmpgedp", XX3(60,19), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
{"xsdivsp", XX3(60,24), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
{"xsmsubmsp", XX3(60,25), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
-{"xsresp", XX2(60,26), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
+{"xxperm", XX3(60,26), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xscmpnedp", XX3(60,27), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
{"xsadddp", XX3(60,32), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xsmaddadp", XX3(60,33), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xscmpudp", XX3(60,35), XX3BF_MASK, PPCVSX, PPCNONE, {BF, XA6, XB6}},
+{"xscvdpuxws", XX2(60,72), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsrdpi", XX2(60,73), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsrsqrtedp", XX2(60,74), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xssqrtdp", XX2(60,75), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xssubdp", XX3(60,40), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xsmaddmdp", XX3(60,41), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xscmpodp", XX3(60,43), XX3BF_MASK, PPCVSX, PPCNONE, {BF, XA6, XB6}},
+{"xscvdpsxws", XX2(60,88), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsrdpiz", XX2(60,89), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsredp", XX2(60,90), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xsmuldp", XX3(60,48), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xsmsubadp", XX3(60,49), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xxmrglw", XX3(60,50), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xsrdpip", XX2(60,105), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xstsqrtdp", XX2(60,106), XX2BF_MASK, PPCVSX, PPCNONE, {BF, XB6}},
+{"xsrdpic", XX2(60,107), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xsdivdp", XX3(60,56), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xsmsubmdp", XX3(60,57), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xxpermr", XX3(60,58), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xscmpexpdp", XX3(60,59), XX3BF_MASK, PPCVSX3, PPCNONE, {BF, XA6, XB6}},
+{"xsrdpim", XX2(60,121), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xstdivdp", XX3(60,61), XX3BF_MASK, PPCVSX, PPCNONE, {BF, XA6, XB6}},
{"xvaddsp", XX3(60,64), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvmaddasp", XX3(60,65), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpeqsp", XX3RC(60,67,0), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpeqsp.", XX3RC(60,67,1), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvspuxws", XX2(60,136), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrspi", XX2(60,137), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrsqrtesp", XX2(60,138), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvsqrtsp", XX2(60,139), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvsubsp", XX3(60,72), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xscvdpuxws", XX2(60,72), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvmaddmsp", XX3(60,73), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xsrdpi", XX2(60,73), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xsrsqrtedp", XX2(60,74), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xssqrtdp", XX2(60,75), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvcmpgtsp", XX3RC(60,75,0), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpgtsp.", XX3RC(60,75,1), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvspsxws", XX2(60,152), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrspiz", XX2(60,153), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvresp", XX2(60,154), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvmulsp", XX3(60,80), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvmsubasp", XX3(60,81), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xxspltw", XX2(60,164), XX2UIM_MASK, PPCVSX, PPCNONE, {XT6, XB6, UIM}},
+{"xxextractuw", XX2(60,165), XX2UIM4_MASK,PPCVSX3, PPCNONE, {XT6, XB6, UIMM4}},
{"xvcmpgesp", XX3RC(60,83,0), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpgesp.", XX3RC(60,83,1), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvuxwsp", XX2(60,168), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrspip", XX2(60,169), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvtsqrtsp", XX2(60,170), XX2BF_MASK, PPCVSX, PPCNONE, {BF, XB6}},
+{"xvrspic", XX2(60,171), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvdivsp", XX3(60,88), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xscvdpsxws", XX2(60,88), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvmsubmsp", XX3(60,89), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xsrdpiz", XX2(60,89), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xsredp", XX2(60,90), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xxspltib", X(60,360), XX1_MASK|3<<19, PPCVSX3,PPCNONE, {XT6, IMM8}},
+{"xxinsertw", XX2(60,181), XX2UIM4_MASK,PPCVSX3, PPCNONE, {XT6, XB6, UIMM4}},
+{"xvcmpnesp", XX3RC(60,91,0), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xvcmpnesp.", XX3RC(60,91,1), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvsxwsp", XX2(60,184), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrspim", XX2(60,185), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvtdivsp", XX3(60,93), XX3BF_MASK, PPCVSX, PPCNONE, {BF, XA6, XB6}},
{"xvadddp", XX3(60,96), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvmaddadp", XX3(60,97), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpeqdp", XX3RC(60,99,0), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpeqdp.", XX3RC(60,99,1), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvdpuxws", XX2(60,200), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrdpi", XX2(60,201), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrsqrtedp", XX2(60,202), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvsqrtdp", XX2(60,203), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvsubdp", XX3(60,104), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvmaddmdp", XX3(60,105), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xsrdpip", XX2(60,105), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xstsqrtdp", XX2(60,106), XX2BF_MASK, PPCVSX, PPCNONE, {BF, XB6}},
-{"xsrdpic", XX2(60,107), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvcmpgtdp", XX3RC(60,107,0), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpgtdp.", XX3RC(60,107,1), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvdpsxws", XX2(60,216), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrdpiz", XX2(60,217), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvredp", XX2(60,218), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvmuldp", XX3(60,112), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvmsubadp", XX3(60,113), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpgedp", XX3RC(60,115,0), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcmpgedp.", XX3RC(60,115,1), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvuxwdp", XX2(60,232), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrdpip", XX2(60,233), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvtsqrtdp", XX2(60,234), XX2BF_MASK, PPCVSX, PPCNONE, {BF, XB6}},
+{"xvrdpic", XX2(60,235), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvdivdp", XX3(60,120), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvmsubmdp", XX3(60,121), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xsrdpim", XX2(60,121), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvcmpnedp", XX3RC(60,123,0), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xvcmpnedp.", XX3RC(60,123,1), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvsxwdp", XX2(60,248), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvrdpim", XX2(60,249), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvtdivdp", XX3(60,125), XX3BF_MASK, PPCVSX, PPCNONE, {BF, XA6, XB6}},
+{"xsmaxcdp", XX3(60,128), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
{"xsnmaddasp", XX3(60,129), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
{"xxland", XX3(60,130), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvcvspuxws", XX2(60,136), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xscvdpsp", XX2(60,265), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xscvdpspn", XX2(60,267), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
+{"xsmincdp", XX3(60,136), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
{"xsnmaddmsp", XX3(60,137), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
-{"xvrspi", XX2(60,137), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xxlandc", XX3(60,138), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvrsqrtesp", XX2(60,138), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvsqrtsp", XX2(60,139), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsrsp", XX2(60,281), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
+{"xsmaxjdp", XX3(60,144), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
{"xsnmsubasp", XX3(60,145), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
{"xxlor", XX3(60,146), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvcvspsxws", XX2(60,152), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xscvuxdsp", XX2(60,296), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
+{"xststdcsp", XX2(60,298), XX2BFD_MASK, PPCVSX3, PPCNONE, {BF, XB6, DCMX}},
+{"xsminjdp", XX3(60,152), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
{"xsnmsubmsp", XX3(60,153), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
-{"xvrspiz", XX2(60,153), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xxlxor", XX3(60,154), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvresp", XX2(60,154), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xscvsxdsp", XX2(60,312), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
{"xsmaxdp", XX3(60,160), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xsnmaddadp", XX3(60,161), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xxlnor", XX3(60,162), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xxspltw", XX2(60,164), XX2UIM_MASK, PPCVSX, PPCNONE, {XT6, XB6, UIM}},
+{"xscvdpuxds", XX2(60,328), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xscvspdp", XX2(60,329), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xscvspdpn", XX2(60,331), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
{"xsmindp", XX3(60,168), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvcvuxwsp", XX2(60,168), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xsnmaddmdp", XX3(60,169), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvrspip", XX2(60,169), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvtsqrtsp", XX2(60,170), XX2BF_MASK, PPCVSX, PPCNONE, {BF, XB6}},
{"xxlorc", XX3(60,170), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
-{"xvrspic", XX2(60,171), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xscvdpsxds", XX2(60,344), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsabsdp", XX2(60,345), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsxexpdp", XX2VA(60,347,0),XX2_MASK|1, PPCVSX3, PPCNONE, {RT, XB6}},
+{"xsxsigdp", XX2VA(60,347,1),XX2_MASK|1, PPCVSX3, PPCNONE, {RT, XB6}},
+{"xscvhpdp", XX2VA(60,347,16),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xscvdphp", XX2VA(60,347,17),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
{"xscpsgndp", XX3(60,176), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xsnmsubadp", XX3(60,177), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xxlnand", XX3(60,178), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
-{"xvcvsxwsp", XX2(60,184), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xscvuxddp", XX2(60,360), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsnabsdp", XX2(60,361), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xststdcdp", XX2(60,362), XX2BFD_MASK, PPCVSX3, PPCNONE, {BF, XB6, DCMX}},
{"xsnmsubmdp", XX3(60,185), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvrspim", XX2(60,185), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xxleqv", XX3(60,186), XX3_MASK, PPCVSX2, PPCNONE, {XT6, XA6, XB6}},
+{"xscvsxddp", XX2(60,376), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsnegdp", XX2(60,377), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvmaxsp", XX3(60,192), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvnmaddasp", XX3(60,193), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvcvspuxds", XX2(60,392), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvcvdpsp", XX2(60,393), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvminsp", XX3(60,200), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvcvdpuxws", XX2(60,200), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvnmaddmsp", XX3(60,201), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvrdpi", XX2(60,201), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvrsqrtedp", XX2(60,202), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvsqrtdp", XX2(60,203), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvcvspsxds", XX2(60,408), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvabssp", XX2(60,409), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvmovsp", XX3(60,208), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6S}},
{"xvcpsgnsp", XX3(60,208), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvnmsubasp", XX3(60,209), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvcvdpsxws", XX2(60,216), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvnmsubmsp", XX3(60,217), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvrdpiz", XX2(60,217), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvredp", XX2(60,218), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvmaxdp", XX3(60,224), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvnmaddadp", XX3(60,225), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvmindp", XX3(60,232), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvnmaddmdp", XX3(60,233), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvcvuxwdp", XX2(60,232), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvrdpip", XX2(60,233), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvtsqrtdp", XX2(60,234), XX2BF_MASK, PPCVSX, PPCNONE, {BF, XB6}},
-{"xvrdpic", XX2(60,235), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvmovdp", XX3(60,240), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6S}},
-{"xvcpsgndp", XX3(60,240), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvnmsubadp", XX3(60,241), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvcvsxwdp", XX2(60,248), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvnmsubmdp", XX3(60,249), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
-{"xvrdpim", XX2(60,249), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xscvdpsp", XX2(60,265), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xscvdpspn", XX2(60,267), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
-{"xsrsp", XX2(60,281), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
-{"xscvuxdsp", XX2(60,296), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
-{"xscvsxdsp", XX2(60,312), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
-{"xscvdpuxds", XX2(60,328), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xscvspdp", XX2(60,329), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xscvspdpn", XX2(60,331), XX2_MASK, PPCVSX2, PPCNONE, {XT6, XB6}},
-{"xscvdpsxds", XX2(60,344), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xsabsdp", XX2(60,345), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xscvuxddp", XX2(60,360), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xsnabsdp", XX2(60,361), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xscvsxddp", XX2(60,376), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xsnegdp", XX2(60,377), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvcvspuxds", XX2(60,392), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvcvdpsp", XX2(60,393), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvcvspsxds", XX2(60,408), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
-{"xvabssp", XX2(60,409), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvcvuxdsp", XX2(60,424), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvnabssp", XX2(60,425), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvtstdcsp", XX2(60,426), XX2DCMXS_MASK,PPCVSX3, PPCNONE, {XT6, XB6, DCMXS}},
+{"xviexpsp", XX3(60,216), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xvnmsubmsp", XX3(60,217), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcvsxdsp", XX2(60,440), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvnegsp", XX2(60,441), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvmaxdp", XX3(60,224), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvnmaddadp", XX3(60,225), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcvdpuxds", XX2(60,456), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvcvspdp", XX2(60,457), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xsiexpdp", X(60,918), XX1_MASK, PPCVSX3, PPCNONE, {XT6, RA, RB}},
+{"xvmindp", XX3(60,232), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvnmaddmdp", XX3(60,233), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcvdpsxds", XX2(60,472), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvabsdp", XX2(60,473), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvxexpdp", XX2VA(60,475,0),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xvxsigdp", XX2VA(60,475,1),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xxbrh", XX2VA(60,475,7),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xvxexpsp", XX2VA(60,475,8),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xvxsigsp", XX2VA(60,475,9),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xxbrw", XX2VA(60,475,15),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xxbrd", XX2VA(60,475,23),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xvcvhpsp", XX2VA(60,475,24),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xvcvsphp", XX2VA(60,475,25),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xxbrq", XX2VA(60,475,31),XX2_MASK, PPCVSX3, PPCNONE, {XT6, XB6}},
+{"xvmovdp", XX3(60,240), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6S}},
+{"xvcpsgndp", XX3(60,240), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+{"xvnmsubadp", XX3(60,241), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcvuxddp", XX2(60,488), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvnabsdp", XX2(60,489), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+{"xvtstdcdp", XX2(60,490), XX2DCMXS_MASK,PPCVSX3, PPCNONE, {XT6, XB6, DCMXS}},
+{"xviexpdp", XX3(60,248), XX3_MASK, PPCVSX3, PPCNONE, {XT6, XA6, XB6}},
+{"xvnmsubmdp", XX3(60,249), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"xvcvsxddp", XX2(60,504), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"xvnegdp", XX2(60,505), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
{"psq_st", OP(60), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}},
{"stfq", OP(60), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}},
+{"lxv", DQX(61,1), DQX_MASK, PPCVSX3, PPCNONE, {XTQ6, DQ, RA0}},
+{"stxv", DQX(61,5), DQX_MASK, PPCVSX3, PPCNONE, {XSQ6, DQ, RA0}},
+{"stxsd", DSO(61,2), DS_MASK, PPCVSX3, PPCNONE, {VS, DS, RA0}},
+{"stxssp", DSO(61,3), DS_MASK, PPCVSX3, PPCNONE, {VS, DS, RA0}},
{"stfdp", OP(61), OP_MASK, POWER6, POWER7, {FRSp, DS, RA0}},
{"psq_stu", OP(61), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}},
{"stfqu", OP(61), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}},
@@ -6241,7 +6693,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"stdu", DSO(62,1), DS_MASK, PPC64, PPCNONE, {RS, DS, RAS}},
{"stq", DSO(62,2), DS_MASK, POWER4, PPC476, {RSQ, DS, RA0}},
-{"fcmpu", X(63,0), X_MASK|(3<<21), COM, PPCEFS, {BF, FRA, FRB}},
+{"fcmpu", X(63,0), XBF_MASK, COM, PPCEFS, {BF, FRA, FRB}},
{"daddq", XRC(63,2,0), X_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp}},
{"daddq.", XRC(63,2,1), X_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp}},
@@ -6249,6 +6701,12 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"dquaq", ZRC(63,3,0), Z2_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp, RMC}},
{"dquaq.", ZRC(63,3,1), Z2_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp, RMC}},
+{"xsaddqp", XRC(63,4,0), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+{"xsaddqpo", XRC(63,4,1), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
+{"xsrqpi", ZRC(63,5,0), Z2_MASK, PPCVSX3, PPCNONE, {R, VD, VB, RMC}},
+{"xsrqpix", ZRC(63,5,1), Z2_MASK, PPCVSX3, PPCNONE, {R, VD, VB, RMC}},
+
{"fcpsgn", XRC(63,8,0), X_MASK, POWER6|PPCA2|PPC476, PPCNONE, {FRT, FRA, FRB}},
{"fcpsgn.", XRC(63,8,1), X_MASK, POWER6|PPCA2|PPC476, PPCNONE, {FRT, FRA, FRB}},
@@ -6321,7 +6779,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"fnmadd.", A(63,31,1), A_MASK, PPCCOM, PPCEFS, {FRT, FRA, FRC, FRB}},
{"fnma.", A(63,31,1), A_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC, FRB}},
-{"fcmpo", X(63,32), X_MASK|(3<<21), COM, PPCEFS, {BF, FRA, FRB}},
+{"fcmpo", X(63,32), XBF_MASK, COM, PPCEFS, {BF, FRA, FRB}},
{"dmulq", XRC(63,34,0), X_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp}},
{"dmulq.", XRC(63,34,1), X_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp}},
@@ -6329,6 +6787,11 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"drrndq", ZRC(63,35,0), Z2_MASK, POWER6, PPCNONE, {FRTp, FRA, FRBp, RMC}},
{"drrndq.", ZRC(63,35,1), Z2_MASK, POWER6, PPCNONE, {FRTp, FRA, FRBp, RMC}},
+{"xsmulqp", XRC(63,36,0), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+{"xsmulqpo", XRC(63,36,1), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
+{"xsrqpxp", Z(63,37), Z2_MASK, PPCVSX3, PPCNONE, {R, VD, VB, RMC}},
+
{"mtfsb1", XRC(63,38,0), XRARB_MASK, COM, PPCNONE, {BT}},
{"mtfsb1.", XRC(63,38,1), XRARB_MASK, COM, PPCNONE, {BT}},
@@ -6355,10 +6818,14 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"drintxq", ZRC(63,99,0), Z2_MASK, POWER6, PPCNONE, {R, FRTp, FRBp, RMC}},
{"drintxq.", ZRC(63,99,1), Z2_MASK, POWER6, PPCNONE, {R, FRTp, FRBp, RMC}},
-{"ftdiv", X(63,128), X_MASK|(3<<21), POWER7, PPCNONE, {BF, FRA, FRB}},
+{"xscpsgnqp", X(63,100), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
+{"ftdiv", X(63,128), XBF_MASK, POWER7, PPCNONE, {BF, FRA, FRB}},
{"dcmpoq", X(63,130), X_MASK, POWER6, PPCNONE, {BF, FRAp, FRBp}},
+{"xscmpoqp", X(63,132), XBF_MASK, PPCVSX3, PPCNONE, {BF, VA, VB}},
+
{"mtfsfi", XRC(63,134,0), XWRA_MASK|(3<<21)|(1<<11), POWER6|PPCA2|PPC476, PPCNONE, {BFF, U, W}},
{"mtfsfi", XRC(63,134,0), XRA_MASK|(3<<21)|(1<<11), COM, POWER6|PPCA2|PPC476, {BFF, U}},
{"mtfsfi.", XRC(63,134,1), XWRA_MASK|(3<<21)|(1<<11), POWER6|PPCA2|PPC476, PPCNONE, {BFF, U, W}},
@@ -6372,9 +6839,12 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"fctiwuz", XRC(63,143,0), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
{"fctiwuz.", XRC(63,143,1), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
-{"ftsqrt", X(63,160), X_MASK|(3<<21|FRA_MASK), POWER7, PPCNONE, {BF, FRB}},
+{"ftsqrt", X(63,160), XBF_MASK|FRA_MASK, POWER7, PPCNONE, {BF, FRB}},
{"dtstexq", X(63,162), X_MASK, POWER6, PPCNONE, {BF, FRAp, FRBp}},
+
+{"xscmpexpqp", X(63,164), XBF_MASK, PPCVSX3, PPCNONE, {BF, VA, VB}},
+
{"dtstdcq", Z(63,194), Z_MASK, POWER6, PPCNONE, {BF, FRAp, DCM}},
{"dtstdgq", Z(63,226), Z_MASK, POWER6, PPCNONE, {BF, FRAp, DGM}},
@@ -6396,27 +6866,53 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"dxexq", XRC(63,354,0), X_MASK, POWER6, PPCNONE, {FRT, FRBp}},
{"dxexq.", XRC(63,354,1), X_MASK, POWER6, PPCNONE, {FRT, FRBp}},
+{"xsmaddqp", XRC(63,388,0), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+{"xsmaddqpo", XRC(63,388,1), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
{"frin", XRC(63,392,0), XRA_MASK, POWER5, PPCNONE, {FRT, FRB}},
{"frin.", XRC(63,392,1), XRA_MASK, POWER5, PPCNONE, {FRT, FRB}},
+
+{"xsmsubqp", XRC(63,420,0), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+{"xsmsubqpo", XRC(63,420,1), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
{"friz", XRC(63,424,0), XRA_MASK, POWER5, PPCNONE, {FRT, FRB}},
{"friz.", XRC(63,424,1), XRA_MASK, POWER5, PPCNONE, {FRT, FRB}},
+
+{"xsnmaddqp", XRC(63,452,0), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+{"xsnmaddqpo", XRC(63,452,1), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
{"frip", XRC(63,456,0), XRA_MASK, POWER5, PPCNONE, {FRT, FRB}},
{"frip.", XRC(63,456,1), XRA_MASK, POWER5, PPCNONE, {FRT, FRB}},
+
+{"xsnmsubqp", XRC(63,484,0), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+{"xsnmsubqpo", XRC(63,484,1), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
{"frim", XRC(63,488,0), XRA_MASK, POWER5, PPCNONE, {FRT, FRB}},
{"frim.", XRC(63,488,1), XRA_MASK, POWER5, PPCNONE, {FRT, FRB}},
{"dsubq", XRC(63,514,0), X_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp}},
{"dsubq.", XRC(63,514,1), X_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp}},
+{"xssubqp", XRC(63,516,0), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+{"xssubqpo", XRC(63,516,1), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
{"ddivq", XRC(63,546,0), X_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp}},
{"ddivq.", XRC(63,546,1), X_MASK, POWER6, PPCNONE, {FRTp, FRAp, FRBp}},
+{"xsdivqp", XRC(63,548,0), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+{"xsdivqpo", XRC(63,548,1), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
{"mffs", XRC(63,583,0), XRARB_MASK, COM, PPCEFS, {FRT}},
{"mffs.", XRC(63,583,1), XRARB_MASK, COM, PPCEFS, {FRT}},
{"dcmpuq", X(63,642), X_MASK, POWER6, PPCNONE, {BF, FRAp, FRBp}},
+{"xscmpuqp", X(63,644), XBF_MASK, PPCVSX3, PPCNONE, {BF, VA, VB}},
+
{"dtstsfq", X(63,674), X_MASK, POWER6, PPCNONE, {BF, FRA, FRBp}},
+{"dtstsfiq", X(63,675), X_MASK|1<<22,POWER9, PPCNONE, {BF, UIM6, FRBp}},
+
+{"xststdcqp", X(63,708), X_MASK, PPCVSX3, PPCNONE, {BF, VB, DCMX}},
{"mtfsf", XFL(63,711,0), XFL_MASK, POWER6|PPCA2|PPC476, PPCNONE, {FLM, FRB, XFL_L, W}},
{"mtfsf", XFL(63,711,0), XFL_MASK, COM, POWER6|PPCA2|PPC476|PPCEFS, {FLM, FRB}},
@@ -6429,6 +6925,14 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"dcffixq", XRC(63,802,0), X_MASK, POWER6, PPCNONE, {FRTp, FRB}},
{"dcffixq.", XRC(63,802,1), X_MASK, POWER6, PPCNONE, {FRTp, FRB}},
+{"xsabsqp", XVA(63,804,0), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xsxexpqp", XVA(63,804,2), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xsnabsqp", XVA(63,804,8), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xsnegqp", XVA(63,804,16), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xsxsigqp", XVA(63,804,18), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xssqrtqp", XVARC(63,804,27,0), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xssqrtqpo", XVARC(63,804,27,1), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+
{"fctid", XRC(63,814,0), XRA_MASK, PPC64, PPCNONE, {FRT, FRB}},
{"fctid", XRC(63,814,0), XRA_MASK, PPC476, PPCNONE, {FRT, FRB}},
{"fctid.", XRC(63,814,1), XRA_MASK, PPC64, PPCNONE, {FRT, FRB}},
@@ -6442,6 +6946,16 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"denbcdq", XRC(63,834,0), X_MASK, POWER6, PPCNONE, {S, FRTp, FRBp}},
{"denbcdq.", XRC(63,834,1), X_MASK, POWER6, PPCNONE, {S, FRTp, FRBp}},
+{"xscvqpuwz", XVA(63,836,1), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xscvudqp", XVA(63,836,2), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xscvqpswz", XVA(63,836,9), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xscvsdqp", XVA(63,836,10), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xscvqpudz", XVA(63,836,17), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xscvqpdp", XVARC(63,836,20,0), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xscvqpdpo", XVARC(63,836,20,1), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xscvdpqp", XVA(63,836,22), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+{"xscvqpsdz", XVA(63,836,25), XVA_MASK, PPCVSX3, PPCNONE, {VD, VB}},
+
{"fmrgow", X(63,838), X_MASK, PPCVSX2, PPCNONE, {FRT, FRA, FRB}},
{"fcfid", XRC(63,846,0), XRA_MASK, PPC64, PPCNONE, {FRT, FRB}},
@@ -6452,6 +6966,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{"diexq", XRC(63,866,0), X_MASK, POWER6, PPCNONE, {FRTp, FRA, FRBp}},
{"diexq.", XRC(63,866,1), X_MASK, POWER6, PPCNONE, {FRTp, FRA, FRBp}},
+{"xsiexpqp", X(63,868), X_MASK, PPCVSX3, PPCNONE, {VD, VA, VB}},
+
{"fctidu", XRC(63,942,0), XRA_MASK, POWER7|PPCA2, PPCNONE, {FRT, FRB}},
{"fctidu.", XRC(63,942,1), XRA_MASK, POWER7|PPCA2, PPCNONE, {FRT, FRB}},