binutils/binutils-2.19.51.0.2-IBM.patch
2009-03-05 13:09:53 +00:00

3301 lines
115 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff -rcp ../binutils-2.19.51.0.2.15/bfd/elf32-lm32.c ./bfd/elf32-lm32.c
*** ../binutils-2.19.51.0.2.15/bfd/elf32-lm32.c 2009-03-02 14:05:10.000000000 +0000
--- ./bfd/elf32-lm32.c 2009-03-05 12:12:25.000000000 +0000
*************** lm32_elf_relocate_section (bfd *output_b
*** 888,898 ****
/* It's a global symbol. */
bfd_boolean unresolved_reloc;
bfd_boolean warned;
RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
r_symndx, symtab_hdr, sym_hashes,
h, sec, relocation,
! unresolved_reloc, warned);
osec = sec;
name = h->root.root.string;
}
--- 888,899 ----
/* It's a global symbol. */
bfd_boolean unresolved_reloc;
bfd_boolean warned;
+ bfd_boolean ignored;
RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
r_symndx, symtab_hdr, sym_hashes,
h, sec, relocation,
! unresolved_reloc, warned, ignored);
osec = sec;
name = h->root.root.string;
}
diff -rcp ../binutils-2.19.51.0.2.15/bfd/elf32-ppc.c ./bfd/elf32-ppc.c
*** ../binutils-2.19.51.0.2.15/bfd/elf32-ppc.c 2009-03-02 14:05:10.000000000 +0000
--- ./bfd/elf32-ppc.c 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,6 ****
/* PowerPC-specific support for 32-bit ELF
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
! 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
--- 1,6 ----
/* PowerPC-specific support for 32-bit ELF
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
! 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
*************** ppc_elf_gc_sweep_hook (bfd *abfd,
*** 4301,4307 ****
return TRUE;
}
! /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
asection *
ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
--- 4301,4308 ----
return TRUE;
}
! /* Set plt output section type, htab->tls_get_addr, and call the
! generic ELF tls_setup function. */
asection *
ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
*************** ppc_elf_tls_setup (bfd *obfd, struct bfd
*** 4322,4327 ****
--- 4323,4365 ----
return _bfd_elf_tls_setup (obfd, info);
}
+ /* Return TRUE iff REL is a branch reloc with a global symbol matching
+ HASH. */
+
+ static bfd_boolean
+ branch_reloc_hash_match (const bfd *ibfd,
+ const Elf_Internal_Rela *rel,
+ const struct elf_link_hash_entry *hash)
+ {
+ Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
+ enum elf_ppc_reloc_type r_type = ELF32_R_TYPE (rel->r_info);
+ unsigned int r_symndx = ELF32_R_SYM (rel->r_info);
+
+ if (r_symndx >= symtab_hdr->sh_info
+ && (r_type == R_PPC_PLTREL24
+ || r_type == R_PPC_LOCAL24PC
+ || r_type == R_PPC_REL14
+ || r_type == R_PPC_REL14_BRTAKEN
+ || r_type == R_PPC_REL14_BRNTAKEN
+ || r_type == R_PPC_REL24
+ || r_type == R_PPC_ADDR24
+ || r_type == R_PPC_ADDR14
+ || r_type == R_PPC_ADDR14_BRTAKEN
+ || r_type == R_PPC_ADDR14_BRNTAKEN))
+ {
+ struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
+ struct elf_link_hash_entry *h;
+
+ h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ while (h->root.type == bfd_link_hash_indirect
+ || h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+ if (h == hash)
+ return TRUE;
+ }
+ return FALSE;
+ }
+
/* Run through all the TLS relocs looking for optimization
opportunities. */
*************** ppc_elf_tls_optimize (bfd *obfd ATTRIBUT
*** 4449,4483 ****
if (!expecting_tls_get_addr)
continue;
! if (rel + 1 < relend)
! {
! enum elf_ppc_reloc_type r_type2;
! unsigned long r_symndx2;
! struct elf_link_hash_entry *h2;
!
! /* The next instruction should be a call to
! __tls_get_addr. Peek at the reloc to be sure. */
! r_type2 = ELF32_R_TYPE (rel[1].r_info);
! r_symndx2 = ELF32_R_SYM (rel[1].r_info);
! if (r_symndx2 >= symtab_hdr->sh_info
! && (r_type2 == R_PPC_REL14
! || r_type2 == R_PPC_REL14_BRTAKEN
! || r_type2 == R_PPC_REL14_BRNTAKEN
! || r_type2 == R_PPC_REL24
! || r_type2 == R_PPC_PLTREL24))
! {
! struct elf_link_hash_entry **sym_hashes;
!
! sym_hashes = elf_sym_hashes (ibfd);
! h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
! while (h2->root.type == bfd_link_hash_indirect
! || h2->root.type == bfd_link_hash_warning)
! h2 = ((struct elf_link_hash_entry *)
! h2->root.u.i.link);
! if (h2 == htab->tls_get_addr)
! continue;
! }
! }
/* Uh oh, we didn't find the expected call. We
could just mark this symbol to exclude it
--- 4487,4496 ----
if (!expecting_tls_get_addr)
continue;
! if (rel + 1 < relend
! && branch_reloc_hash_match (ibfd, rel + 1,
! htab->tls_get_addr))
! continue;
/* Uh oh, we didn't find the expected call. We
could just mark this symbol to exclude it
*************** ppc_elf_relocate_section (bfd *output_bf
*** 6346,6367 ****
case R_PPC_GOT_TLSLD16_LO:
if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
{
! bfd_vma insn1, insn2;
bfd_vma offset;
tls_ldgd_opt:
offset = rel[1].r_offset;
- insn1 = bfd_get_32 (output_bfd,
- contents + rel->r_offset - d_offset);
if ((tls_mask & tls_gd) != 0)
{
/* IE */
insn1 &= (1 << 26) - 1;
insn1 |= 32 << 26; /* lwz */
insn2 = 0x7c631214; /* add 3,3,2 */
rel[1].r_info
= ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info), R_PPC_NONE);
- rel[1].r_addend = 0;
r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
+ R_PPC_GOT_TPREL16);
rel->r_info = ELF32_R_INFO (r_symndx, r_type);
--- 6359,6379 ----
case R_PPC_GOT_TLSLD16_LO:
if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
{
! unsigned int insn1, insn2;
bfd_vma offset;
tls_ldgd_opt:
offset = rel[1].r_offset;
if ((tls_mask & tls_gd) != 0)
{
/* IE */
+ insn1 = bfd_get_32 (output_bfd,
+ contents + rel->r_offset - d_offset);
insn1 &= (1 << 26) - 1;
insn1 |= 32 << 26; /* lwz */
insn2 = 0x7c631214; /* add 3,3,2 */
rel[1].r_info
= ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info), R_PPC_NONE);
r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
+ R_PPC_GOT_TPREL16);
rel->r_info = ELF32_R_INFO (r_symndx, r_type);
diff -rcp ../binutils-2.19.51.0.2.15/bfd/elf64-ppc.c ./bfd/elf64-ppc.c
*** ../binutils-2.19.51.0.2.15/bfd/elf64-ppc.c 2009-03-02 14:05:10.000000000 +0000
--- ./bfd/elf64-ppc.c 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,6 ****
/* PowerPC64-specific support for 64-bit ELF.
! Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
! Free Software Foundation, Inc.
Written by Linus Nordberg, Swox AB <info@swox.com>,
based on elf32-ppc.c by Ian Lance Taylor.
Largely rewritten by Alan Modra <amodra@bigpond.net.au>
--- 1,6 ----
/* PowerPC64-specific support for 64-bit ELF.
! Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
! 2009 Free Software Foundation, Inc.
Written by Linus Nordberg, Swox AB <info@swox.com>,
based on elf32-ppc.c by Ian Lance Taylor.
Largely rewritten by Alan Modra <amodra@bigpond.net.au>
*************** struct _ppc64_elf_section_data
*** 2608,2616 ****
long *adjust;
} opd;
! /* An array for toc sections, indexed by offset/8.
! Specifies the relocation symbol index used at a given toc offset. */
! unsigned *t_symndx;
} u;
enum _ppc64_sec_type sec_type:2;
--- 2608,2622 ----
long *adjust;
} opd;
! /* An array for toc sections, indexed by offset/8. */
! struct _toc_sec_data
! {
! /* Specifies the relocation symbol index used at a given toc offset. */
! unsigned *symndx;
!
! /* And the relocation addend. */
! bfd_vma *add;
! } toc;
} u;
enum _ppc64_sec_type sec_type:2;
*************** ppc64_elf_check_relocs (bfd *abfd, struc
*** 4578,4583 ****
--- 4584,4590 ----
const Elf_Internal_Rela *rel_end;
asection *sreloc;
asection **opd_sym_map;
+ struct elf_link_hash_entry *tga, *dottga;
if (info->relocatable)
return TRUE;
*************** ppc64_elf_check_relocs (bfd *abfd, struc
*** 4594,4599 ****
--- 4601,4610 ----
BFD_ASSERT (is_ppc64_elf (abfd));
htab = ppc_hash_table (info);
+ tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
+ FALSE, FALSE, TRUE);
+ dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
+ FALSE, FALSE, TRUE);
symtab_hdr = &elf_symtab_hdr (abfd);
sym_hashes = elf_sym_hashes (abfd);
*************** ppc64_elf_check_relocs (bfd *abfd, struc
*** 4829,4853 ****
if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
rel->r_addend))
return FALSE;
! if (h == &htab->tls_get_addr->elf
! || h == &htab->tls_get_addr_fd->elf)
sec->has_tls_reloc = 1;
- else if (htab->tls_get_addr == NULL
- && CONST_STRNEQ (h->root.root.string, ".__tls_get_addr")
- && (h->root.root.string[15] == 0
- || h->root.root.string[15] == '@'))
- {
- htab->tls_get_addr = (struct ppc_link_hash_entry *) h;
- sec->has_tls_reloc = 1;
- }
- else if (htab->tls_get_addr_fd == NULL
- && CONST_STRNEQ (h->root.root.string, "__tls_get_addr")
- && (h->root.root.string[14] == 0
- || h->root.root.string[14] == '@'))
- {
- htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) h;
- sec->has_tls_reloc = 1;
- }
}
break;
--- 4840,4847 ----
if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
rel->r_addend))
return FALSE;
! if (h == tga || h == dottga)
sec->has_tls_reloc = 1;
}
break;
*************** ppc64_elf_check_relocs (bfd *abfd, struc
*** 4891,4913 ****
ppc64_sec = ppc64_elf_section_data (sec);
if (ppc64_sec->sec_type != sec_toc)
{
/* One extra to simplify get_tls_mask. */
! bfd_size_type amt = sec->size * sizeof (unsigned) / 8 + 1;
! ppc64_sec->u.t_symndx = bfd_zalloc (abfd, amt);
! if (ppc64_sec->u.t_symndx == NULL)
return FALSE;
BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
ppc64_sec->sec_type = sec_toc;
}
BFD_ASSERT (rel->r_offset % 8 == 0);
! ppc64_sec->u.t_symndx[rel->r_offset / 8] = r_symndx;
/* Mark the second slot of a GD or LD entry.
-1 to indicate GD and -2 to indicate LD. */
if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
! ppc64_sec->u.t_symndx[rel->r_offset / 8 + 1] = -1;
else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
! ppc64_sec->u.t_symndx[rel->r_offset / 8 + 1] = -2;
goto dodyn;
case R_PPC64_TPREL16:
--- 4885,4914 ----
ppc64_sec = ppc64_elf_section_data (sec);
if (ppc64_sec->sec_type != sec_toc)
{
+ bfd_size_type amt;
+
/* One extra to simplify get_tls_mask. */
! amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
! ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
! if (ppc64_sec->u.toc.symndx == NULL)
! return FALSE;
! amt = sec->size * sizeof (bfd_vma) / 8;
! ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
! if (ppc64_sec->u.toc.add == NULL)
return FALSE;
BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
ppc64_sec->sec_type = sec_toc;
}
BFD_ASSERT (rel->r_offset % 8 == 0);
! ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
! ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
/* Mark the second slot of a GD or LD entry.
-1 to indicate GD and -2 to indicate LD. */
if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
! ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
! ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
goto dodyn;
case R_PPC64_TPREL16:
*************** get_sym_h (struct elf_link_hash_entry **
*** 6226,6234 ****
type suitable for optimization, and 1 otherwise. */
static int
! get_tls_mask (char **tls_maskp, unsigned long *toc_symndx,
Elf_Internal_Sym **locsymsp,
! const Elf_Internal_Rela *rel, bfd *ibfd)
{
unsigned long r_symndx;
int next_r;
--- 6227,6238 ----
type suitable for optimization, and 1 otherwise. */
static int
! get_tls_mask (char **tls_maskp,
! unsigned long *toc_symndx,
! bfd_vma *toc_addend,
Elf_Internal_Sym **locsymsp,
! const Elf_Internal_Rela *rel,
! bfd *ibfd)
{
unsigned long r_symndx;
int next_r;
*************** get_tls_mask (char **tls_maskp, unsigned
*** 6256,6267 ****
off = sym->st_value;
off += rel->r_addend;
BFD_ASSERT (off % 8 == 0);
! r_symndx = ppc64_elf_section_data (sec)->u.t_symndx[off / 8];
! next_r = ppc64_elf_section_data (sec)->u.t_symndx[off / 8 + 1];
! if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
! return 0;
if (toc_symndx != NULL)
*toc_symndx = r_symndx;
if ((h == NULL
|| ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
--- 6260,6273 ----
off = sym->st_value;
off += rel->r_addend;
BFD_ASSERT (off % 8 == 0);
! r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
! next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
if (toc_symndx != NULL)
*toc_symndx = r_symndx;
+ if (toc_addend != NULL)
+ *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
+ if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
+ return 0;
if ((h == NULL
|| ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
*************** ppc64_elf_tls_setup (bfd *obfd, struct b
*** 6866,6901 ****
struct ppc_link_hash_table *htab;
htab = ppc_hash_table (info);
! if (htab->tls_get_addr != NULL)
! {
! struct ppc_link_hash_entry *h = htab->tls_get_addr;
!
! while (h->elf.root.type == bfd_link_hash_indirect
! || h->elf.root.type == bfd_link_hash_warning)
! h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
! htab->tls_get_addr = h;
! if (htab->tls_get_addr_fd == NULL
! && h->oh != NULL
! && h->oh->is_func_descriptor
! && (h->oh->elf.root.type == bfd_link_hash_defined
! || h->oh->elf.root.type == bfd_link_hash_defweak))
! htab->tls_get_addr_fd = h->oh;
! }
! if (htab->tls_get_addr_fd != NULL)
{
! struct ppc_link_hash_entry *h = htab->tls_get_addr_fd;
!
! while (h->elf.root.type == bfd_link_hash_indirect
! || h->elf.root.type == bfd_link_hash_warning)
! h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
! htab->tls_get_addr_fd = h;
}
!
! return _bfd_elf_tls_setup (obfd, info);
}
/* Run through all the TLS relocs looking for optimization
--- 6872,6920 ----
struct ppc_link_hash_table *htab;
htab = ppc_hash_table (info);
! htab->tls_get_addr = ((struct ppc_link_hash_entry *)
! elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
! FALSE, FALSE, TRUE));
! htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
! elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
! FALSE, FALSE, TRUE));
! return _bfd_elf_tls_setup (obfd, info);
! }
! /* Return TRUE iff REL is a branch reloc with a global symbol matching
! HASH1 or HASH2. */
! static bfd_boolean
! branch_reloc_hash_match (const bfd *ibfd,
! const Elf_Internal_Rela *rel,
! const struct ppc_link_hash_entry *hash1,
! const struct ppc_link_hash_entry *hash2)
! {
! Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
! enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
! unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
! if (r_symndx >= symtab_hdr->sh_info
! && (r_type == R_PPC64_REL24
! || r_type == R_PPC64_REL14
! || r_type == R_PPC64_REL14_BRTAKEN
! || r_type == R_PPC64_REL14_BRNTAKEN
! || r_type == R_PPC64_ADDR24
! || r_type == R_PPC64_ADDR14
! || r_type == R_PPC64_ADDR14_BRTAKEN
! || r_type == R_PPC64_ADDR14_BRNTAKEN))
{
! struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
! struct elf_link_hash_entry *h;
! h = sym_hashes[r_symndx - symtab_hdr->sh_info];
! while (h->root.type == bfd_link_hash_indirect
! || h->root.type == bfd_link_hash_warning)
! h = (struct elf_link_hash_entry *) h->root.u.i.link;
! if (h == &hash1->elf || h == &hash2->elf)
! return TRUE;
}
! return FALSE;
}
/* Run through all the TLS relocs looking for optimization
*************** ppc64_elf_tls_optimize (bfd *obfd ATTRIB
*** 7141,7195 ****
if (!expecting_tls_get_addr)
continue;
! if (rel + 1 < relend)
{
! Elf_Internal_Shdr *symtab_hdr;
! enum elf_ppc64_reloc_type r_type2;
! unsigned long r_symndx2;
! struct elf_link_hash_entry *h2;
!
! symtab_hdr = &elf_symtab_hdr (ibfd);
!
! /* The next instruction should be a call to
! __tls_get_addr. Peek at the reloc to be sure. */
! r_type2 = ELF64_R_TYPE (rel[1].r_info);
! r_symndx2 = ELF64_R_SYM (rel[1].r_info);
! if (r_symndx2 >= symtab_hdr->sh_info
! && (r_type2 == R_PPC64_REL14
! || r_type2 == R_PPC64_REL14_BRTAKEN
! || r_type2 == R_PPC64_REL14_BRNTAKEN
! || r_type2 == R_PPC64_REL24))
{
! struct elf_link_hash_entry **sym_hashes;
!
! sym_hashes = elf_sym_hashes (ibfd);
!
! h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
! while (h2->root.type == bfd_link_hash_indirect
! || h2->root.type == bfd_link_hash_warning)
! h2 = ((struct elf_link_hash_entry *)
! h2->root.u.i.link);
! if (h2 != NULL
! && (h2 == &htab->tls_get_addr->elf
! || h2 == &htab->tls_get_addr_fd->elf))
! {
! if (expecting_tls_get_addr == 2)
! {
! /* Check for toc tls entries. */
! char *toc_tls;
! int retval;
!
! retval = get_tls_mask (&toc_tls, NULL,
! &locsyms,
! rel, ibfd);
! if (retval == 0)
! goto err_free_rel;
! if (retval > 1 && toc_tls != NULL)
! toc_ref[toc_ref_index] = 1;
! }
! continue;
! }
}
}
if (expecting_tls_get_addr != 1)
--- 7160,7185 ----
if (!expecting_tls_get_addr)
continue;
! if (rel + 1 < relend
! && branch_reloc_hash_match (ibfd, rel + 1,
! htab->tls_get_addr,
! htab->tls_get_addr_fd))
{
! if (expecting_tls_get_addr == 2)
{
! /* Check for toc tls entries. */
! char *toc_tls;
! int retval;
!
! retval = get_tls_mask (&toc_tls, NULL, NULL,
! &locsyms,
! rel, ibfd);
! if (retval == 0)
! goto err_free_rel;
! if (retval > 1 && toc_tls != NULL)
! toc_ref[toc_ref_index] = 1;
}
+ continue;
}
if (expecting_tls_get_addr != 1)
*************** ppc64_elf_size_stubs (bfd *output_bfd,
*** 9712,9718 ****
/* Get tls info. */
char *tls_mask;
! if (!get_tls_mask (&tls_mask, NULL, &local_syms,
irela - 1, input_bfd))
goto error_ret_free_internal;
if (*tls_mask != 0)
--- 9702,9708 ----
/* Get tls info. */
char *tls_mask;
! if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
irela - 1, input_bfd))
goto error_ret_free_internal;
if (*tls_mask != 0)
*************** ppc64_elf_relocate_section (bfd *output_
*** 10204,10209 ****
--- 10194,10200 ----
struct ppc_link_hash_entry *fdh;
const char *sym_name;
unsigned long r_symndx, toc_symndx;
+ bfd_vma toc_addend;
char tls_mask, tls_gd, tls_type;
char sym_type;
bfd_vma relocation;
*************** ppc64_elf_relocate_section (bfd *output_
*** 10314,10321 ****
/* Check for toc tls entries. */
char *toc_tls;
! if (!get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
! rel, input_bfd))
return FALSE;
if (toc_tls)
--- 10305,10312 ----
/* Check for toc tls entries. */
char *toc_tls;
! if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
! &local_syms, rel, input_bfd))
return FALSE;
if (toc_tls)
*************** ppc64_elf_relocate_section (bfd *output_
*** 10377,10384 ****
char *toc_tls;
int retval;
! retval = get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
! rel, input_bfd);
if (retval == 0)
return FALSE;
--- 10368,10375 ----
char *toc_tls;
int retval;
! retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
! &local_syms, rel, input_bfd);
if (retval == 0)
return FALSE;
*************** ppc64_elf_relocate_section (bfd *output_
*** 10426,10431 ****
--- 10417,10423 ----
if (toc_symndx != 0)
{
rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
+ rel->r_addend = toc_addend;
/* We changed the symbol. Start over in order to
get h, sym, sec etc. right. */
rel--;
*************** ppc64_elf_relocate_section (bfd *output_
*** 10479,10484 ****
--- 10471,10477 ----
if (toc_symndx != 0)
{
rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
+ rel->r_addend = toc_addend;
/* We changed the symbol. Start over in order to
get h, sym, sec etc. right. */
rel--;
*************** ppc64_elf_relocate_section (bfd *output_
*** 10525,10544 ****
case R_PPC64_GOT_TLSLD16_LO:
if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
{
! bfd_vma insn1, insn2, insn3;
bfd_vma offset;
tls_ldgd_opt:
/* We know that the next reloc is on a tls_get_addr
call, since ppc64_elf_tls_optimize checks this. */
offset = rel[1].r_offset;
- insn1 = bfd_get_32 (output_bfd,
- contents + rel->r_offset - d_offset);
- insn3 = bfd_get_32 (output_bfd,
- contents + offset + 4);
if ((tls_mask & tls_gd) != 0)
{
/* IE */
insn1 &= (1 << 26) - (1 << 2);
insn1 |= 58 << 26; /* ld */
insn2 = 0x7c636a14; /* add 3,3,13 */
--- 10518,10535 ----
case R_PPC64_GOT_TLSLD16_LO:
if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
{
! unsigned int insn1, insn2, insn3;
bfd_vma offset;
tls_ldgd_opt:
/* We know that the next reloc is on a tls_get_addr
call, since ppc64_elf_tls_optimize checks this. */
offset = rel[1].r_offset;
if ((tls_mask & tls_gd) != 0)
{
/* IE */
+ insn1 = bfd_get_32 (output_bfd,
+ contents + rel->r_offset - d_offset);
insn1 &= (1 << 26) - (1 << 2);
insn1 |= 58 << 26; /* ld */
insn2 = 0x7c636a14; /* add 3,3,13 */
*************** ppc64_elf_relocate_section (bfd *output_
*** 10573,10600 ****
rel->r_addend -= (local_syms[r_symndx].st_value
+ sec->output_offset
+ sec->output_section->vma);
- rel[1].r_addend = rel->r_addend;
}
else if (toc_symndx != 0)
! r_symndx = toc_symndx;
r_type = R_PPC64_TPREL16_HA;
rel->r_info = ELF64_R_INFO (r_symndx, r_type);
rel[1].r_info = ELF64_R_INFO (r_symndx,
R_PPC64_TPREL16_LO);
rel[1].r_offset += d_offset;
}
if (insn3 == NOP
|| insn3 == CROR_151515 || insn3 == CROR_313131)
{
- insn3 = insn2;
- insn2 = NOP;
rel[1].r_offset += 4;
}
- bfd_put_32 (output_bfd, insn1,
- contents + rel->r_offset - d_offset);
bfd_put_32 (output_bfd, insn2, contents + offset);
! bfd_put_32 (output_bfd, insn3, contents + offset + 4);
! if (tls_gd == 0 || toc_symndx != 0)
{
/* We changed the symbol. Start over in order
to get h, sym, sec etc. right. */
--- 10564,10596 ----
rel->r_addend -= (local_syms[r_symndx].st_value
+ sec->output_offset
+ sec->output_section->vma);
}
else if (toc_symndx != 0)
! {
! r_symndx = toc_symndx;
! rel->r_addend = toc_addend;
! }
r_type = R_PPC64_TPREL16_HA;
rel->r_info = ELF64_R_INFO (r_symndx, r_type);
rel[1].r_info = ELF64_R_INFO (r_symndx,
R_PPC64_TPREL16_LO);
rel[1].r_offset += d_offset;
+ rel[1].r_addend = rel->r_addend;
}
+ bfd_put_32 (output_bfd, insn1,
+ contents + rel->r_offset - d_offset);
+ insn3 = bfd_get_32 (output_bfd,
+ contents + offset + 4);
if (insn3 == NOP
|| insn3 == CROR_151515 || insn3 == CROR_313131)
{
rel[1].r_offset += 4;
+ bfd_put_32 (output_bfd, insn2, contents + offset + 4);
+ insn2 = NOP;
}
bfd_put_32 (output_bfd, insn2, contents + offset);
! if ((tls_mask & tls_gd) == 0
! && (tls_gd == 0 || toc_symndx != 0))
{
/* We changed the symbol. Start over in order
to get h, sym, sec etc. right. */
*************** ppc64_elf_relocate_section (bfd *output_
*** 10971,10977 ****
*offp = off | 1;
if ((info->shared || indx != 0)
! && (h == NULL
|| ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
|| h->elf.root.type != bfd_link_hash_undefweak))
{
--- 10967,10974 ----
*offp = off | 1;
if ((info->shared || indx != 0)
! && (offp == &ppc64_tlsld_got (input_bfd)->offset
! || h == NULL
|| ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
|| h->elf.root.type != bfd_link_hash_undefweak))
{
diff -rcp ../binutils-2.19.51.0.2.15/gas/config/tc-ppc.c ./gas/config/tc-ppc.c
*** ../binutils-2.19.51.0.2.15/gas/config/tc-ppc.c 2009-03-02 14:05:00.000000000 +0000
--- ./gas/config/tc-ppc.c 2009-03-05 12:20:26.000000000 +0000
*************** static const struct pd_reg pre_defined_r
*** 358,366 ****
--- 358,399 ----
{ "f.3", 3 },
{ "f.30", 30 },
{ "f.31", 31 },
+
+ { "f.32", 32 }, /* Extended floating point scalar registers (ISA 2.06). */
+ { "f.33", 33 },
+ { "f.34", 34 },
+ { "f.35", 35 },
+ { "f.36", 36 },
+ { "f.37", 37 },
+ { "f.38", 38 },
+ { "f.39", 39 },
{ "f.4", 4 },
+ { "f.40", 40 },
+ { "f.41", 41 },
+ { "f.42", 42 },
+ { "f.43", 43 },
+ { "f.44", 44 },
+ { "f.45", 45 },
+ { "f.46", 46 },
+ { "f.47", 47 },
+ { "f.48", 48 },
+ { "f.49", 49 },
{ "f.5", 5 },
+ { "f.50", 50 },
+ { "f.51", 51 },
+ { "f.52", 52 },
+ { "f.53", 53 },
+ { "f.54", 54 },
+ { "f.55", 55 },
+ { "f.56", 56 },
+ { "f.57", 57 },
+ { "f.58", 58 },
+ { "f.59", 59 },
{ "f.6", 6 },
+ { "f.60", 60 },
+ { "f.61", 61 },
+ { "f.62", 62 },
+ { "f.63", 63 },
{ "f.7", 7 },
{ "f.8", 8 },
{ "f.9", 9 },
*************** static const struct pd_reg pre_defined_r
*** 391,399 ****
--- 424,465 ----
{ "f3", 3 },
{ "f30", 30 },
{ "f31", 31 },
+
+ { "f32", 32 }, /* Extended floating point scalar registers (ISA 2.06). */
+ { "f33", 33 },
+ { "f34", 34 },
+ { "f35", 35 },
+ { "f36", 36 },
+ { "f37", 37 },
+ { "f38", 38 },
+ { "f39", 39 },
{ "f4", 4 },
+ { "f40", 40 },
+ { "f41", 41 },
+ { "f42", 42 },
+ { "f43", 43 },
+ { "f44", 44 },
+ { "f45", 45 },
+ { "f46", 46 },
+ { "f47", 47 },
+ { "f48", 48 },
+ { "f49", 49 },
{ "f5", 5 },
+ { "f50", 50 },
+ { "f51", 51 },
+ { "f52", 52 },
+ { "f53", 53 },
+ { "f54", 54 },
+ { "f55", 55 },
+ { "f56", 56 },
+ { "f57", 57 },
+ { "f58", 58 },
+ { "f59", 59 },
{ "f6", 6 },
+ { "f60", 60 },
+ { "f61", 61 },
+ { "f62", 62 },
+ { "f63", 63 },
{ "f7", 7 },
{ "f8", 8 },
{ "f9", 9 },
*************** static const struct pd_reg pre_defined_r
*** 501,507 ****
{ "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
{ "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
! { "v.0", 0 }, /* Vector registers */
{ "v.1", 1 },
{ "v.10", 10 },
{ "v.11", 11 },
--- 567,573 ----
{ "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
{ "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
! { "v.0", 0 }, /* Vector (Altivec/VMX) registers */
{ "v.1", 1 },
{ "v.10", 10 },
{ "v.11", 11 },
*************** static const struct pd_reg pre_defined_r
*** 567,572 ****
--- 633,768 ----
{ "v8", 8 },
{ "v9", 9 },
+ { "vs.0", 0 }, /* Vector Scalar (VSX) registers (ISA 2.06). */
+ { "vs.1", 1 },
+ { "vs.10", 10 },
+ { "vs.11", 11 },
+ { "vs.12", 12 },
+ { "vs.13", 13 },
+ { "vs.14", 14 },
+ { "vs.15", 15 },
+ { "vs.16", 16 },
+ { "vs.17", 17 },
+ { "vs.18", 18 },
+ { "vs.19", 19 },
+ { "vs.2", 2 },
+ { "vs.20", 20 },
+ { "vs.21", 21 },
+ { "vs.22", 22 },
+ { "vs.23", 23 },
+ { "vs.24", 24 },
+ { "vs.25", 25 },
+ { "vs.26", 26 },
+ { "vs.27", 27 },
+ { "vs.28", 28 },
+ { "vs.29", 29 },
+ { "vs.3", 3 },
+ { "vs.30", 30 },
+ { "vs.31", 31 },
+ { "vs.32", 32 },
+ { "vs.33", 33 },
+ { "vs.34", 34 },
+ { "vs.35", 35 },
+ { "vs.36", 36 },
+ { "vs.37", 37 },
+ { "vs.38", 38 },
+ { "vs.39", 39 },
+ { "vs.4", 4 },
+ { "vs.40", 40 },
+ { "vs.41", 41 },
+ { "vs.42", 42 },
+ { "vs.43", 43 },
+ { "vs.44", 44 },
+ { "vs.45", 45 },
+ { "vs.46", 46 },
+ { "vs.47", 47 },
+ { "vs.48", 48 },
+ { "vs.49", 49 },
+ { "vs.5", 5 },
+ { "vs.50", 50 },
+ { "vs.51", 51 },
+ { "vs.52", 52 },
+ { "vs.53", 53 },
+ { "vs.54", 54 },
+ { "vs.55", 55 },
+ { "vs.56", 56 },
+ { "vs.57", 57 },
+ { "vs.58", 58 },
+ { "vs.59", 59 },
+ { "vs.6", 6 },
+ { "vs.60", 60 },
+ { "vs.61", 61 },
+ { "vs.62", 62 },
+ { "vs.63", 63 },
+ { "vs.7", 7 },
+ { "vs.8", 8 },
+ { "vs.9", 9 },
+
+ { "vs0", 0 },
+ { "vs1", 1 },
+ { "vs10", 10 },
+ { "vs11", 11 },
+ { "vs12", 12 },
+ { "vs13", 13 },
+ { "vs14", 14 },
+ { "vs15", 15 },
+ { "vs16", 16 },
+ { "vs17", 17 },
+ { "vs18", 18 },
+ { "vs19", 19 },
+ { "vs2", 2 },
+ { "vs20", 20 },
+ { "vs21", 21 },
+ { "vs22", 22 },
+ { "vs23", 23 },
+ { "vs24", 24 },
+ { "vs25", 25 },
+ { "vs26", 26 },
+ { "vs27", 27 },
+ { "vs28", 28 },
+ { "vs29", 29 },
+ { "vs3", 3 },
+ { "vs30", 30 },
+ { "vs31", 31 },
+ { "vs32", 32 },
+ { "vs33", 33 },
+ { "vs34", 34 },
+ { "vs35", 35 },
+ { "vs36", 36 },
+ { "vs37", 37 },
+ { "vs38", 38 },
+ { "vs39", 39 },
+ { "vs4", 4 },
+ { "vs40", 40 },
+ { "vs41", 41 },
+ { "vs42", 42 },
+ { "vs43", 43 },
+ { "vs44", 44 },
+ { "vs45", 45 },
+ { "vs46", 46 },
+ { "vs47", 47 },
+ { "vs48", 48 },
+ { "vs49", 49 },
+ { "vs5", 5 },
+ { "vs50", 50 },
+ { "vs51", 51 },
+ { "vs52", 52 },
+ { "vs53", 53 },
+ { "vs54", 54 },
+ { "vs55", 55 },
+ { "vs56", 56 },
+ { "vs57", 57 },
+ { "vs58", 58 },
+ { "vs59", 59 },
+ { "vs6", 6 },
+ { "vs60", 60 },
+ { "vs61", 61 },
+ { "vs62", 62 },
+ { "vs63", 63 },
+ { "vs7", 7 },
+ { "vs8", 8 },
+ { "vs9", 9 },
+
{ "xer", 1 },
};
*************** parse_cpu (const char *arg)
*** 940,947 ****
else if (strcmp (arg, "power7") == 0)
{
ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
! | PPC_OPCODE_64 | PPC_OPCODE_POWER4
! | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
| PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX);
}
else if (strcmp (arg, "cell") == 0)
--- 1136,1144 ----
else if (strcmp (arg, "power7") == 0)
{
ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
! | PPC_OPCODE_ISEL | PPC_OPCODE_64
! | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5
! | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7
| PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX);
}
else if (strcmp (arg, "cell") == 0)
*************** md_assemble (char *str)
*** 2768,2777 ****
#ifdef OBJ_ELF
/* Do we need/want a APUinfo section? */
! if (ppc_cpu & (PPC_OPCODE_SPE
! | PPC_OPCODE_ISEL | PPC_OPCODE_EFS
! | PPC_OPCODE_BRLOCK | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK
! | PPC_OPCODE_RFMCI))
{
/* These are all version "1". */
if (opcode->flags & PPC_OPCODE_SPE)
--- 2965,2971 ----
#ifdef OBJ_ELF
/* Do we need/want a APUinfo section? */
! if ((ppc_cpu & PPC_OPCODE_E500MC) != 0)
{
/* These are all version "1". */
if (opcode->flags & PPC_OPCODE_SPE)
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/booke.d ./gas/testsuite/gas/ppc/booke.d
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/booke.d 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/booke.d 2009-03-05 12:20:26.000000000 +0000
*************** Disassembly of section \.text:
*** 38,40 ****
--- 38,43 ----
68: 7c 07 42 a6 mfsprg r0,7
6c: 7c 17 43 a6 mtsprg 7,r0
70: 7c 17 43 a6 mtsprg 7,r0
+ 74: 7c 05 32 2c dcbt r5,r6
+ 78: 7c 05 32 2c dcbt r5,r6
+ 7c: 7d 05 32 2c dcbt 8,r5,r6
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/booke.s ./gas/testsuite/gas/ppc/booke.s
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/booke.s 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/booke.s 2009-03-05 12:20:26.000000000 +0000
*************** branch_target_2:
*** 36,38 ****
--- 36,42 ----
mfsprg7 0
mtsprg 7, 0
mtsprg7 0
+
+ dcbt 5,6
+ dcbt 0,5,6
+ dcbt 8,5,6
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/e500mc.d ./gas/testsuite/gas/ppc/e500mc.d
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/e500mc.d 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/e500mc.d 2009-03-05 12:20:26.000000000 +0000
***************
*** 6,12 ****
Disassembly of section \.text:
! 0+0000000 <start>:
0: 4c 00 00 4e rfdi
4: 4c 00 00 cc rfgi
8: 4c 1f f9 8c dnh 0,1023
--- 6,12 ----
Disassembly of section \.text:
! 0+00 <start>:
0: 4c 00 00 4e rfdi
4: 4c 00 00 cc rfgi
8: 4c 1f f9 8c dnh 0,1023
*************** Disassembly of section \.text:
*** 14,51 ****
10: 7c 09 57 be icbiep r9,r10
14: 7c 00 69 dc msgclr r13
18: 7c 00 71 9c msgsnd r14
! 1c: 7c 00 00 7c wait
! 20: 7f 9c e3 78 mdors
! 24: 7c 00 02 1c ehpriv
! 28: 7c 18 cb c6 dsn r24,r25
! 2c: 7c 22 18 be lbepx r1,r2,r3
! 30: 7c 85 32 3e lhepx r4,r5,r6
! 34: 7c e8 48 3e lwepx r7,r8,r9
! 38: 7d 4b 60 3a ldepx r10,r11,r12
! 3c: 7d ae 7c be lfdepx r13,r14,r15
! 40: 7e 11 91 be stbepx r16,r17,r18
! 44: 7e 74 ab 3e sthepx r19,r20,r21
! 48: 7e d7 c1 3e stwepx r22,r23,r24
! 4c: 7f 3a d9 3a stdepx r25,r26,r27
! 50: 7f 9d f5 be stfdepx r28,r29,r30
! 54: 7c 01 14 06 lbdx r0,r1,r2
! 58: 7d 8d 74 46 lhdx r12,r13,r14
! 5c: 7c 64 2c 86 lwdx r3,r4,r5
! 60: 7f 5b e6 46 lfddx f26,r27,r28
! 64: 7d f0 8c c6 lddx r15,r16,r17
! 68: 7c c7 45 06 stbdx r6,r7,r8
! 6c: 7e 53 a5 46 sthdx r18,r19,r20
! 70: 7d 2a 5d 86 stwdx r9,r10,r11
! 74: 7f be ff 46 stfddx f29,r30,r31
! 78: 7e b6 bd c6 stddx r21,r22,r23
! 7c: 7c 20 0d ec dcbal r0,r1
! 80: 7c 26 3f ec dcbzl r6,r7
! 84: 7c 1f 00 7e dcbstep r31,r0
! 88: 7c 01 10 fe dcbfep r1,r2
! 8c: 7c 64 29 fe dcbtstep r3,r4,r5
! 90: 7c c7 42 7e dcbtep r6,r7,r8
! 94: 7c 0b 67 fe dcbzep r11,r12
! 98: 7c 00 06 26 tlbilx 0,0,r0
! 9c: 7c 20 06 26 tlbilx 1,0,r0
! a0: 7c 62 1e 26 tlbilx 3,r2,r3
! a4: 7c 64 2e 26 tlbilx 3,r4,r5
--- 14,56 ----
10: 7c 09 57 be icbiep r9,r10
14: 7c 00 69 dc msgclr r13
18: 7c 00 71 9c msgsnd r14
! 1c: 7c 00 00 7c wait
! 20: 7c 00 00 7c wait
! 24: 7c 20 00 7c waitrsv
! 28: 7c 20 00 7c waitrsv
! 2c: 7c 40 00 7c waitimpl
! 30: 7c 40 00 7c waitimpl
! 34: 7f 9c e3 78 mdors
! 38: 7c 00 02 1c ehpriv
! 3c: 7c 18 cb c6 dsn r24,r25
! 40: 7c 22 18 be lbepx r1,r2,r3
! 44: 7c 85 32 3e lhepx r4,r5,r6
! 48: 7c e8 48 3e lwepx r7,r8,r9
! 4c: 7d 4b 60 3a ldepx r10,r11,r12
! 50: 7d ae 7c be lfdepx f13,r14,r15
! 54: 7e 11 91 be stbepx r16,r17,r18
! 58: 7e 74 ab 3e sthepx r19,r20,r21
! 5c: 7e d7 c1 3e stwepx r22,r23,r24
! 60: 7f 3a d9 3a stdepx r25,r26,r27
! 64: 7f 9d f5 be stfdepx f28,r29,r30
! 68: 7c 01 14 06 lbdx r0,r1,r2
! 6c: 7d 8d 74 46 lhdx r12,r13,r14
! 70: 7c 64 2c 86 lwdx r3,r4,r5
! 74: 7f 5b e6 46 lfddx f26,r27,r28
! 78: 7d f0 8c c6 lddx r15,r16,r17
! 7c: 7c c7 45 06 stbdx r6,r7,r8
! 80: 7e 53 a5 46 sthdx r18,r19,r20
! 84: 7d 2a 5d 86 stwdx r9,r10,r11
! 88: 7f be ff 46 stfddx f29,r30,r31
! 8c: 7e b6 bd c6 stddx r21,r22,r23
! 90: 7c 20 0d ec dcbal r0,r1
! 94: 7c 26 3f ec dcbzl r6,r7
! 98: 7c 1f 00 7e dcbstep r31,r0
! 9c: 7c 01 10 fe dcbfep r1,r2
! a0: 7c 64 29 fe dcbtstep r3,r4,r5
! a4: 7c c7 42 7e dcbtep r6,r7,r8
! a8: 7c 0b 67 fe dcbzep r11,r12
! ac: 7c 00 06 26 tlbilx 0,0,r0
! b0: 7c 20 06 26 tlbilx 1,0,r0
! b4: 7c 62 1e 26 tlbilx 3,r2,r3
! b8: 7c 64 2e 26 tlbilx 3,r4,r5
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/e500mc.s ./gas/testsuite/gas/ppc/e500mc.s
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/e500mc.s 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/e500mc.s 2009-03-05 12:20:26.000000000 +0000
*************** start:
*** 9,14 ****
--- 9,19 ----
msgclr 13
msgsnd 14
wait
+ wait 0
+ waitrsv
+ wait 1
+ waitimpl
+ wait 2
mdors
ehpriv
dsn 24, 25
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power4_32.d ./gas/testsuite/gas/ppc/power4_32.d
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power4_32.d 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/power4_32.d 2009-03-05 12:20:26.000000000 +0000
*************** Disassembly of section \.text:
*** 41,43 ****
--- 41,46 ----
7c: 7c 01 17 ec dcbz r1,r2
80: 7c 23 27 ec dcbzl r3,r4
84: 7c 05 37 ec dcbz r5,r6
+ 88: 7c 05 32 2c dcbt r5,r6
+ 8c: 7c 05 32 2c dcbt r5,r6
+ 90: 7d 05 32 2c dcbt r5,r6,8
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power4_32.s ./gas/testsuite/gas/ppc/power4_32.s
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power4_32.s 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/power4_32.s 2009-03-05 12:20:26.000000000 +0000
*************** start:
*** 34,36 ****
--- 34,39 ----
dcbz 1, 2
dcbzl 3, 4
dcbz 5, 6
+ dcbt 5,6
+ dcbt 5,6,0
+ dcbt 5,6,8
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power6.d ./gas/testsuite/gas/ppc/power6.d
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power6.d 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/power6.d 2009-03-05 12:20:26.000000000 +0000
*************** Disassembly of section \.text:
*** 66,68 ****
--- 66,71 ----
e0: ff 00 f1 0d mtfsfi. 6,15
e4: ff 01 01 0c mtfsfi 6,0,1
e8: ff 01 f1 0d mtfsfi. 6,15,1
+ ec: 7d 6a 02 74 cbcdtd r10,r11
+ f0: 7d 6a 02 34 cdtbcd r10,r11
+ f4: 7d 4b 60 94 addg6s r10,r11,r12
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power6.s ./gas/testsuite/gas/ppc/power6.s
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power6.s 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/power6.s 2009-03-05 12:20:26.000000000 +0000
*************** start:
*** 61,63 ****
--- 61,66 ----
mtfsfi. 6,15,0
mtfsfi 6,0,1
mtfsfi. 6,15,1
+ cbcdtd 10,11
+ cdtbcd 10,11
+ addg6s 10,11,12
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power7.d ./gas/testsuite/gas/ppc/power7.d
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power7.d 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/power7.d 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,8 ****
! #as: -a32 -mpower7
#objdump: -dr -Mpower7
#name: POWER7 tests (includes DFP, Altivec and VSX)
! .*: +file format elf32-powerpc.*
Disassembly of section \.text:
--- 1,8 ----
! #as: -mpower7
#objdump: -dr -Mpower7
#name: POWER7 tests (includes DFP, Altivec and VSX)
! .*: +file format elf(32)?(64)?-powerpc.*
Disassembly of section \.text:
*************** Disassembly of section \.text:
*** 33,57 ****
5c: f1 6c 67 87 xvmovdp vs43,vs44
60: f0 64 2f 80 xvcpsgndp vs3,vs4,vs5
64: f1 6c 6f 87 xvcpsgndp vs43,vs44,vs45
! 68: 4c 00 03 24 doze
! 6c: 4c 00 03 64 nap
! 70: 4c 00 03 a4 sleep
! 74: 4c 00 03 e4 rvwinkle
! 78: 7c 83 01 34 prtyw r3,r4
! 7c: 7d cd 01 74 prtyd r13,r14
! 80: 7d 5c 02 a6 mfcfar r10
! 84: 7d 7c 03 a6 mtcfar r11
! 88: 7c 83 2b f8 cmpb r3,r4,r5
! 8c: 7c c0 3c be mffgpr f6,r7
! 90: 7d 00 4d be mftgpr r8,f9
! 94: 7d 4b 66 2a lwzcix r10,r11,r12
! 98: 7d ae 7e 2e lfdpx f13,r14,r15
! 9c: ee 11 90 04 dadd f16,f17,f18
! a0: fe 96 c0 04 daddq f20,f22,f24
! a4: 7c 60 06 6c dss 3
! a8: 7e 00 06 6c dssall
! ac: 7c 25 22 ac dst r5,r4,1
! b0: 7e 08 3a ac dstt r8,r7,0
! b4: 7c 65 32 ec dstst r5,r6,3
! b8: 7e 44 2a ec dststt r4,r5,2
! bc: 4e 80 00 20 blr
--- 33,113 ----
5c: f1 6c 67 87 xvmovdp vs43,vs44
60: f0 64 2f 80 xvcpsgndp vs3,vs4,vs5
64: f1 6c 6f 87 xvcpsgndp vs43,vs44,vs45
! 68: 7c 00 00 7c wait
! 6c: 7c 00 00 7c wait
! 70: 7c 20 00 7c waitrsv
! 74: 7c 20 00 7c waitrsv
! 78: 7c 40 00 7c waitimpl
! 7c: 7c 40 00 7c waitimpl
! 80: 4c 00 03 24 doze
! 84: 4c 00 03 64 nap
! 88: 4c 00 03 a4 sleep
! 8c: 4c 00 03 e4 rvwinkle
! 90: 7c 83 01 34 prtyw r3,r4
! 94: 7d cd 01 74 prtyd r13,r14
! 98: 7d 5c 02 a6 mfcfar r10
! 9c: 7d 7c 03 a6 mtcfar r11
! a0: 7c 83 2b f8 cmpb r3,r4,r5
! a4: 7d 4b 66 2a lwzcix r10,r11,r12
! a8: ee 11 90 04 dadd f16,f17,f18
! ac: fe 96 c0 04 daddq f20,f22,f24
! b0: 7c 60 06 6c dss 3
! b4: 7e 00 06 6c dssall
! b8: 7c 25 22 ac dst r5,r4,1
! bc: 7e 08 3a ac dstt r8,r7,0
! c0: 7c 65 32 ec dstst r5,r6,3
! c4: 7e 44 2a ec dststt r4,r5,2
! c8: 7d 4b 63 56 divwe r10,r11,r12
! cc: 7d 6c 6b 57 divwe\. r11,r12,r13
! d0: 7d 8d 77 56 divweo r12,r13,r14
! d4: 7d ae 7f 57 divweo\. r13,r14,r15
! d8: 7d 4b 63 16 divweu r10,r11,r12
! dc: 7d 6c 6b 17 divweu\. r11,r12,r13
! e0: 7d 8d 77 16 divweuo r12,r13,r14
! e4: 7d ae 7f 17 divweuo\. r13,r14,r15
! e8: 7e 27 d9 f8 bpermd r7,r17,r27
! ec: 7e 8a 02 f4 popcntw r10,r20
! f0: 7e 8a 03 f4 popcntd r10,r20
! f4: 7e 95 b4 28 ldbrx r20,r21,r22
! f8: 7e 95 b5 28 stdbrx r20,r21,r22
! fc: 7d 40 56 ee lfiwzx f10,0,r10
! 100: 7d 49 56 ee lfiwzx f10,r9,r10
! 104: ec 80 2e 9c fcfids f4,f5
! 108: ec 80 2e 9d fcfids\. f4,f5
! 10c: ec 80 2f 9c fcfidus f4,f5
! 110: ec 80 2f 9d fcfidus\. f4,f5
! 114: fc 80 29 1c fctiwu f4,f5
! 118: fc 80 29 1d fctiwu\. f4,f5
! 11c: fc 80 29 1e fctiwuz f4,f5
! 120: fc 80 29 1f fctiwuz\. f4,f5
! 124: fc 80 2f 5c fctidu f4,f5
! 128: fc 80 2f 5d fctidu\. f4,f5
! 12c: fc 80 2f 5e fctiduz f4,f5
! 130: fc 80 2f 5f fctiduz\. f4,f5
! 134: fc 80 2f 9c fcfidu f4,f5
! 138: fc 80 2f 9d fcfidu\. f4,f5
! 13c: fc 0a 59 00 ftdiv cr0,f10,f11
! 140: ff 8a 59 00 ftdiv cr7,f10,f11
! 144: fc 00 51 40 ftsqrt cr0,f10
! 148: ff 80 51 40 ftsqrt cr7,f10
! 14c: 7e 08 4a 2c dcbtt r8,r9
! 150: 7e 08 49 ec dcbtstt r8,r9
! 154: ed 40 66 44 dcffix f10,f12
! 158: ee 80 b6 45 dcffix\. f20,f22
! 15c: 7d 4b 60 68 lbarx r10,r11,r12
! 160: 7d 4b 60 68 lbarx r10,r11,r12
! 164: 7d 4b 60 69 lbarx r10,r11,r12,1
! 168: 7e 95 b0 e8 lharx r20,r21,r22
! 16c: 7e 95 b0 e8 lharx r20,r21,r22
! 170: 7e 95 b0 e9 lharx r20,r21,r22,1
! 174: 7d 4b 65 6d stbcx\. r10,r11,r12
! 178: 7d 4b 65 ad sthcx\. r10,r11,r12
! 17c: fd c0 78 30 fre f14,f15
! 180: fd c0 78 31 fre\. f14,f15
! 184: ed c0 78 30 fres f14,f15
! 188: ed c0 78 31 fres\. f14,f15
! 18c: fd c0 78 34 frsqrte f14,f15
! 190: fd c0 78 35 frsqrte\. f14,f15
! 194: ed c0 78 34 frsqrtes f14,f15
! 198: ed c0 78 35 frsqrtes\. f14,f15
! 19c: 7c 43 27 1e isel r2,r3,r4,28
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power7.s ./gas/testsuite/gas/ppc/power7.s
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/power7.s 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/power7.s 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,9 ****
- .file "power7.c"
.section ".text"
- .align 2
- .p2align 4,,15
- .globl power7
- .type power7, @function
power7:
lxvd2x 3,4,5
lxvd2ux 3,4,5
--- 1,4 ----
*************** power7:
*** 31,36 ****
--- 26,37 ----
xvcpsgndp 43,44,44
xvcpsgndp 3,4,5
xvcpsgndp 43,44,45
+ wait
+ wait 0
+ waitrsv
+ wait 1
+ waitimpl
+ wait 2
doze
nap
sleep
*************** power7:
*** 40,49 ****
mfcfar 10
mtcfar 11
cmpb 3,4,5
- mffgpr 6,7
- mftgpr 8,9
lwzcix 10,11,12
- lfdpx 13,14,15
dadd 16,17,18
daddq 20,22,24
dss 3
--- 41,47 ----
*************** power7:
*** 52,58 ****
dstt 8,7,0
dstst 5,6,3
dststt 4,5,2
! blr
! .size power7,.-power7
! .ident "GCC: (GNU) 4.1.2 20070115 (prerelease) (SUSE Linux)"
! .section .note.GNU-stack,"",@progbits
--- 50,106 ----
dstt 8,7,0
dstst 5,6,3
dststt 4,5,2
! divwe 10,11,12
! divwe. 11,12,13
! divweo 12,13,14
! divweo. 13,14,15
! divweu 10,11,12
! divweu. 11,12,13
! divweuo 12,13,14
! divweuo. 13,14,15
! bpermd 7,17,27
! popcntw 10,20
! popcntd 10,20
! ldbrx 20,21,22
! stdbrx 20,21,22
! lfiwzx 10,0,10
! lfiwzx 10,9,10
! fcfids 4,5
! fcfids. 4,5
! fcfidus 4,5
! fcfidus. 4,5
! fctiwu 4,5
! fctiwu. 4,5
! fctiwuz 4,5
! fctiwuz. 4,5
! fctidu 4,5
! fctidu. 4,5
! fctiduz 4,5
! fctiduz. 4,5
! fcfidu 4,5
! fcfidu. 4,5
! ftdiv 0,10,11
! ftdiv 7,10,11
! ftsqrt 0,10
! ftsqrt 7,10
! dcbtt 8,9
! dcbtstt 8,9
! dcffix 10,12
! dcffix. 20,22
! lbarx 10,11,12
! lbarx 10,11,12,0
! lbarx 10,11,12,1
! lharx 20,21,22
! lharx 20,21,22,0
! lharx 20,21,22,1
! stbcx. 10,11,12
! sthcx. 10,11,12
! fre 14,15
! fre. 14,15
! fres 14,15
! fres. 14,15
! frsqrte 14,15
! frsqrte. 14,15
! frsqrtes 14,15
! frsqrtes. 14,15
! isel 2,3,4,28
diff -rcp ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/ppc.exp ./gas/testsuite/gas/ppc/ppc.exp
*** ../binutils-2.19.51.0.2.15/gas/testsuite/gas/ppc/ppc.exp 2009-03-02 14:05:01.000000000 +0000
--- ./gas/testsuite/gas/ppc/ppc.exp 2009-03-05 12:20:26.000000000 +0000
*************** if { [istarget powerpc*-*-*] } then {
*** 47,51 ****
--- 47,52 ----
run_dump_test "power4_32"
run_dump_test "power6"
run_dump_test "power7"
+ run_dump_test "vsx"
}
}
Only in ./gas/testsuite/gas/ppc: vsx.d
Only in ./gas/testsuite/gas/ppc: vsx.s
diff -rcp ../binutils-2.19.51.0.2.15/include/opcode/ppc.h ./include/opcode/ppc.h
*** ../binutils-2.19.51.0.2.15/include/opcode/ppc.h 2009-03-02 14:04:52.000000000 +0000
--- ./include/opcode/ppc.h 2009-03-05 12:20:26.000000000 +0000
*************** extern const int powerpc_num_opcodes;
*** 114,119 ****
--- 114,122 ----
/* Opcode is only supported by Power4 architecture. */
#define PPC_OPCODE_POWER4 0x4000
+ /* Opcode is only supported by Power7 architecture. */
+ #define PPC_OPCODE_POWER7 0x8000
+
/* Opcode is only supported by POWERPC Classic architecture. */
#define PPC_OPCODE_CLASSIC 0x10000
diff -rcp ../binutils-2.19.51.0.2.15/ld/emultempl/beos.em ./ld/emultempl/beos.em
*** ../binutils-2.19.51.0.2.15/ld/emultempl/beos.em 2009-03-02 14:04:53.000000000 +0000
--- ./ld/emultempl/beos.em 2009-03-05 12:20:26.000000000 +0000
*************** fi
*** 8,14 ****
fragment <<EOF
/* This file is part of GLD, the Gnu Linker.
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
! 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
--- 8,14 ----
fragment <<EOF
/* This file is part of GLD, the Gnu Linker.
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
! 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 330,336 ****
/* Run through and invent symbols for all the
names and insert the defaults. */
int j;
- lang_statement_list_type *save;
if (!init[IMAGEBASEOFF].inited)
{
--- 330,335 ----
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 347,355 ****
return;
/* Glue the assignments into the abs section */
! save = stat_ptr;
!
! stat_ptr = &(abs_output_section->children);
for (j = 0; init[j].ptr; j++)
{
--- 346,352 ----
return;
/* Glue the assignments into the abs section */
! push_stat_ptr (&abs_output_section->children);
for (j = 0; init[j].ptr; j++)
{
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 367,373 ****
else abort();
}
/* Restore the pointer. */
! stat_ptr = save;
if (pe.FileAlignment >
pe.SectionAlignment)
--- 364,370 ----
else abort();
}
/* Restore the pointer. */
! pop_stat_ptr ();
if (pe.FileAlignment >
pe.SectionAlignment)
*************** sort_sections (lang_statement_union_type
*** 609,616 ****
static void
gld_${EMULATION_NAME}_before_allocation (void)
{
- extern lang_statement_list_type *stat_ptr;
-
#ifdef TARGET_IS_ppcpe
/* Here we rummage through the found bfds to collect toc information */
{
--- 606,611 ----
diff -rcp ../binutils-2.19.51.0.2.15/ld/emultempl/pe.em ./ld/emultempl/pe.em
*** ../binutils-2.19.51.0.2.15/ld/emultempl/pe.em 2009-03-02 14:04:53.000000000 +0000
--- ./ld/emultempl/pe.em 2009-03-05 12:20:26.000000000 +0000
*************** rm -f e${EMULATION_NAME}.c
*** 10,16 ****
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
fragment <<EOF
/* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
! 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
--- 10,16 ----
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
fragment <<EOF
/* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
! 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 725,731 ****
/* Run through and invent symbols for all the
names and insert the defaults. */
int j;
- lang_statement_list_type *save;
if (!init[IMAGEBASEOFF].inited)
{
--- 725,730 ----
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 748,756 ****
return;
/* Glue the assignments into the abs section. */
! save = stat_ptr;
!
! stat_ptr = &(abs_output_section->children);
for (j = 0; init[j].ptr; j++)
{
--- 747,753 ----
return;
/* Glue the assignments into the abs section. */
! push_stat_ptr (&abs_output_section->children);
for (j = 0; init[j].ptr; j++)
{
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 772,778 ****
image_base_statement = rv;
}
/* Restore the pointer. */
! stat_ptr = save;
if (pe.FileAlignment >
pe.SectionAlignment)
--- 769,775 ----
image_base_statement = rv;
}
/* Restore the pointer. */
! pop_stat_ptr ();
if (pe.FileAlignment >
pe.SectionAlignment)
diff -rcp ../binutils-2.19.51.0.2.15/ld/emultempl/pep.em ./ld/emultempl/pep.em
*** ../binutils-2.19.51.0.2.15/ld/emultempl/pep.em 2009-03-02 14:04:53.000000000 +0000
--- ./ld/emultempl/pep.em 2009-03-05 12:20:26.000000000 +0000
*************** fi
*** 9,15 ****
rm -f e${EMULATION_NAME}.c
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
fragment <<EOF
! /* Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
Written by Kai Tietz, OneVision Software GmbH&CoKg.
This file is part of the GNU Binutils.
--- 9,15 ----
rm -f e${EMULATION_NAME}.c
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
fragment <<EOF
! /* Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
Written by Kai Tietz, OneVision Software GmbH&CoKg.
This file is part of the GNU Binutils.
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 681,687 ****
/* Run through and invent symbols for all the
names and insert the defaults. */
int j;
- lang_statement_list_type *save;
if (!init[IMAGEBASEOFF].inited)
{
--- 681,686 ----
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 704,712 ****
return;
/* Glue the assignments into the abs section. */
! save = stat_ptr;
!
! stat_ptr = &(abs_output_section->children);
for (j = 0; init[j].ptr; j++)
{
--- 703,709 ----
return;
/* Glue the assignments into the abs section. */
! push_stat_ptr (&abs_output_section->children);
for (j = 0; init[j].ptr; j++)
{
*************** gld_${EMULATION_NAME}_set_symbols (void)
*** 728,734 ****
image_base_statement = rv;
}
/* Restore the pointer. */
! stat_ptr = save;
if (pep.FileAlignment > pep.SectionAlignment)
{
--- 725,731 ----
image_base_statement = rv;
}
/* Restore the pointer. */
! pop_stat_ptr ();
if (pep.FileAlignment > pep.SectionAlignment)
{
diff -rcp ../binutils-2.19.51.0.2.15/ld/emultempl/xtensaelf.em ./ld/emultempl/xtensaelf.em
*** ../binutils-2.19.51.0.2.15/ld/emultempl/xtensaelf.em 2009-03-02 14:04:53.000000000 +0000
--- ./ld/emultempl/xtensaelf.em 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,5 ****
# This shell script emits a C file. -*- C -*-
! # Copyright 2003, 2004, 2005, 2006, 2007, 2008
# Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
--- 1,5 ----
# This shell script emits a C file. -*- C -*-
! # Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009
# Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
*************** ld_xtensa_insert_page_offsets (bfd_vma d
*** 1951,1970 ****
lang_assignment_statement_type *assign_stmt;
lang_statement_union_type *assign_union;
lang_statement_list_type tmplist;
- lang_statement_list_type *old_stat_ptr = stat_ptr;
/* There is hidden state in "lang_add_assignment". It
appends the new assignment statement to the stat_ptr
list. Thus, we swap it before and after the call. */
! tmplist.head = NULL;
! tmplist.tail = &tmplist.head;
!
! stat_ptr = &tmplist;
/* Warning: side effect; statement appended to stat_ptr. */
assign_stmt = lang_add_assignment (assign_op);
assign_union = (lang_statement_union_type *) assign_stmt;
! stat_ptr = old_stat_ptr;
assign_union->header.next = l;
*(*stack_p)->iterloc.loc = assign_union;
--- 1951,1967 ----
lang_assignment_statement_type *assign_stmt;
lang_statement_union_type *assign_union;
lang_statement_list_type tmplist;
/* There is hidden state in "lang_add_assignment". It
appends the new assignment statement to the stat_ptr
list. Thus, we swap it before and after the call. */
! lang_list_init (&tmplist);
! push_stat_ptr (&tmplist);
/* Warning: side effect; statement appended to stat_ptr. */
assign_stmt = lang_add_assignment (assign_op);
assign_union = (lang_statement_union_type *) assign_stmt;
! pop_stat_ptr ();
assign_union->header.next = l;
*(*stack_p)->iterloc.loc = assign_union;
diff -rcp ../binutils-2.19.51.0.2.15/ld/ldctor.c ./ld/ldctor.c
*** ../binutils-2.19.51.0.2.15/ld/ldctor.c 2009-03-02 14:04:56.000000000 +0000
--- ./ld/ldctor.c 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,6 ****
/* ldctor.c -- constructor support routines
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
! 2002, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
By Steve Chamberlain <sac@cygnus.com>
This file is part of the GNU Binutils.
--- 1,7 ----
/* ldctor.c -- constructor support routines
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
! 2002, 2003, 2004, 2006, 2007, 2008, 2009
! Free Software Foundation, Inc.
By Steve Chamberlain <sac@cygnus.com>
This file is part of the GNU Binutils.
*************** void
*** 198,204 ****
ldctor_build_sets (void)
{
static bfd_boolean called;
- lang_statement_list_type *old;
bfd_boolean header_printed;
struct set_info *p;
--- 199,204 ----
*************** ldctor_build_sets (void)
*** 244,253 ****
}
}
! old = stat_ptr;
! stat_ptr = &constructor_list;
!
! lang_list_init (stat_ptr);
header_printed = FALSE;
for (p = sets; p != NULL; p = p->next)
--- 244,251 ----
}
}
! lang_list_init (&constructor_list);
! push_stat_ptr (&constructor_list);
header_printed = FALSE;
for (p = sets; p != NULL; p = p->next)
*************** ldctor_build_sets (void)
*** 372,376 ****
lang_add_data (size, exp_intop (0));
}
! stat_ptr = old;
}
--- 370,374 ----
lang_add_data (size, exp_intop (0));
}
! pop_stat_ptr ();
}
diff -rcp ../binutils-2.19.51.0.2.15/ld/ldlang.c ./ld/ldlang.c
*** ../binutils-2.19.51.0.2.15/ld/ldlang.c 2009-03-02 14:04:56.000000000 +0000
--- ./ld/ldlang.c 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,6 ****
/* Linker command language support.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
! 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of the GNU Binutils.
--- 1,6 ----
/* Linker command language support.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
! 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
This file is part of the GNU Binutils.
*************** static const char *current_target;
*** 64,69 ****
--- 64,71 ----
static const char *output_target;
static lang_statement_list_type statement_list;
static struct bfd_hash_table lang_definedness_table;
+ static lang_statement_list_type *stat_save[10];
+ static lang_statement_list_type **stat_save_ptr = &stat_save[0];
/* Forward declarations. */
static void exp_init_os (etree_type *);
*************** lang_list_init (lang_statement_list_type
*** 925,930 ****
--- 927,949 ----
list->tail = &list->head;
}
+ void
+ push_stat_ptr (lang_statement_list_type *new_ptr)
+ {
+ if (stat_save_ptr >= stat_save + sizeof (stat_save) / sizeof (stat_save[0]))
+ abort ();
+ *stat_save_ptr++ = stat_ptr;
+ stat_ptr = new_ptr;
+ }
+
+ void
+ pop_stat_ptr (void)
+ {
+ if (stat_save_ptr <= stat_save)
+ abort ();
+ stat_ptr = *--stat_save_ptr;
+ }
+
/* Build a new statement node for the parse tree. */
static lang_statement_union_type *
*************** lang_insert_orphan (asection *s,
*** 1586,1608 ****
etree_type *address,
lang_statement_list_type *add_child)
{
- lang_statement_list_type *old;
lang_statement_list_type add;
const char *ps;
lang_output_section_statement_type *os;
lang_output_section_statement_type **os_tail;
- /* Start building a list of statements for this section.
- First save the current statement pointer. */
- old = stat_ptr;
-
/* If we have found an appropriate place for the output section
statements for this orphan, add them to our own private list,
inserting them later into the global statement list. */
if (after != NULL)
{
! stat_ptr = &add;
! lang_list_init (stat_ptr);
}
ps = NULL;
--- 1605,1622 ----
etree_type *address,
lang_statement_list_type *add_child)
{
lang_statement_list_type add;
const char *ps;
lang_output_section_statement_type *os;
lang_output_section_statement_type **os_tail;
/* If we have found an appropriate place for the output section
statements for this orphan, add them to our own private list,
inserting them later into the global statement list. */
if (after != NULL)
{
! lang_list_init (&add);
! push_stat_ptr (&add);
}
ps = NULL;
*************** lang_insert_orphan (asection *s,
*** 1648,1658 ****
{
char *symname;
- /* lang_leave_ouput_section_statement resets stat_ptr.
- Put stat_ptr back where we want it. */
- if (after != NULL)
- stat_ptr = &add;
-
symname = (char *) xmalloc (ps - secname + sizeof "__stop_" + 1);
symname[0] = bfd_get_symbol_leading_char (link_info.output_bfd);
sprintf (symname + (symname[0] != 0), "__stop_%s", secname);
--- 1662,1667 ----
*************** lang_insert_orphan (asection *s,
*** 1663,1669 ****
/* Restore the global list pointer. */
if (after != NULL)
! stat_ptr = old;
if (after != NULL && os->bfd_section != NULL)
{
--- 1672,1678 ----
/* Restore the global list pointer. */
if (after != NULL)
! pop_stat_ptr ();
if (after != NULL && os->bfd_section != NULL)
{
*************** lang_insert_orphan (asection *s,
*** 1749,1756 ****
/* Fix the global list pointer if we happened to tack our
new list at the tail. */
! if (*old->tail == add.head)
! old->tail = add.tail;
/* Save the end of this list. */
place->stmt = add.tail;
--- 1758,1765 ----
/* Fix the global list pointer if we happened to tack our
new list at the tail. */
! if (*stat_ptr->tail == add.head)
! stat_ptr->tail = add.tail;
/* Save the end of this list. */
place->stmt = add.tail;
*************** load_symbols (lang_input_statement_type
*** 2481,2488 ****
&& ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
{
bfd_error_type err;
- lang_statement_list_type *hold;
- bfd_boolean bad_load = TRUE;
bfd_boolean save_ldlang_sysrooted_script;
bfd_boolean save_as_needed, save_add_needed;
--- 2490,2495 ----
*************** load_symbols (lang_input_statement_type
*** 2505,2512 ****
else if (err != bfd_error_file_not_recognized
|| place == NULL)
einfo (_("%F%B: file not recognized: %E\n"), entry->the_bfd);
- else
- bad_load = FALSE;
bfd_close (entry->the_bfd);
entry->the_bfd = NULL;
--- 2512,2517 ----
*************** load_symbols (lang_input_statement_type
*** 2514,2521 ****
/* Try to interpret the file as a linker script. */
ldfile_open_command_file (entry->filename);
! hold = stat_ptr;
! stat_ptr = place;
save_ldlang_sysrooted_script = ldlang_sysrooted_script;
ldlang_sysrooted_script = entry->sysrooted;
save_as_needed = as_needed;
--- 2519,2525 ----
/* Try to interpret the file as a linker script. */
ldfile_open_command_file (entry->filename);
! push_stat_ptr (place);
save_ldlang_sysrooted_script = ldlang_sysrooted_script;
ldlang_sysrooted_script = entry->sysrooted;
save_as_needed = as_needed;
*************** load_symbols (lang_input_statement_type
*** 2534,2542 ****
ldlang_sysrooted_script = save_ldlang_sysrooted_script;
as_needed = save_as_needed;
add_needed = save_add_needed;
! stat_ptr = hold;
! return ! bad_load;
}
if (ldemul_recognized_file (entry))
--- 2538,2546 ----
ldlang_sysrooted_script = save_ldlang_sysrooted_script;
as_needed = save_as_needed;
add_needed = save_add_needed;
! pop_stat_ptr ();
! return TRUE;
}
if (ldemul_recognized_file (entry))
*************** open_input_bfds (lang_statement_union_ty
*** 3008,3013 ****
--- 3012,3018 ----
case lang_input_statement_enum:
if (s->input_statement.real)
{
+ lang_statement_union_type **os_tail;
lang_statement_list_type add;
s->input_statement.target = current_target;
*************** open_input_bfds (lang_statement_union_ty
*** 3023,3028 ****
--- 3028,3034 ----
bfd_archive))
s->input_statement.loaded = FALSE;
+ os_tail = lang_output_section_statement.tail;
lang_list_init (&add);
if (! load_symbols (&s->input_statement, &add))
*************** open_input_bfds (lang_statement_union_ty
*** 3030,3037 ****
if (add.head != NULL)
{
! *add.tail = s->header.next;
! s->header.next = add.head;
}
}
break;
--- 3036,3060 ----
if (add.head != NULL)
{
! /* If this was a script with output sections then
! tack any added statements on to the end of the
! list. This avoids having to reorder the output
! section statement list. Very likely the user
! forgot -T, and whatever we do here will not meet
! naive user expectations. */
! if (os_tail != lang_output_section_statement.tail)
! {
! einfo (_("%P: warning: %s contains output sections;"
! " did you forget -T?\n"),
! s->input_statement.filename);
! *stat_ptr->tail = add.head;
! stat_ptr->tail = add.tail;
! }
! else
! {
! *add.tail = s->header.next;
! s->header.next = add.head;
! }
}
}
break;
*************** lang_enter_output_section_statement (con
*** 5860,5866 ****
os->block_value = 1;
/* Make next things chain into subchain of this. */
! stat_ptr = &os->children;
os->subsection_alignment =
topower (exp_get_value_int (subalign, -1, "subsection alignment"));
--- 5883,5889 ----
os->block_value = 1;
/* Make next things chain into subchain of this. */
! push_stat_ptr (&os->children);
os->subsection_alignment =
topower (exp_get_value_int (subalign, -1, "subsection alignment"));
*************** lang_leave_output_section_statement (fil
*** 6469,6475 ****
current_section->addr_tree != NULL);
current_section->fill = fill;
current_section->phdrs = phdrs;
! stat_ptr = &statement_list;
}
/* Create an absolute symbol with the given name with the value of the
--- 6492,6498 ----
current_section->addr_tree != NULL);
current_section->fill = fill;
current_section->phdrs = phdrs;
! pop_stat_ptr ();
}
/* Create an absolute symbol with the given name with the value of the
*************** lang_enter_group (void)
*** 6586,6592 ****
g = new_stat (lang_group_statement, stat_ptr);
lang_list_init (&g->children);
! stat_ptr = &g->children;
}
/* Leave a group. This just resets stat_ptr to start writing to the
--- 6609,6615 ----
g = new_stat (lang_group_statement, stat_ptr);
lang_list_init (&g->children);
! push_stat_ptr (&g->children);
}
/* Leave a group. This just resets stat_ptr to start writing to the
*************** lang_enter_group (void)
*** 6597,6603 ****
void
lang_leave_group (void)
{
! stat_ptr = &statement_list;
}
/* Add a new program header. This is called for each entry in a PHDRS
--- 6620,6626 ----
void
lang_leave_group (void)
{
! pop_stat_ptr ();
}
/* Add a new program header. This is called for each entry in a PHDRS
diff -rcp ../binutils-2.19.51.0.2.15/ld/ldlang.h ./ld/ldlang.h
*** ../binutils-2.19.51.0.2.15/ld/ldlang.h 2009-03-02 14:04:53.000000000 +0000
--- ./ld/ldlang.h 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,6 ****
/* ldlang.h - linker command language support
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
! 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of the GNU Binutils.
--- 1,6 ----
/* ldlang.h - linker command language support
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
! 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
This file is part of the GNU Binutils.
*************** extern void lang_add_output_format
*** 550,555 ****
--- 550,559 ----
(const char *, const char *, const char *, int);
extern void lang_list_init
(lang_statement_list_type *);
+ extern void push_stat_ptr
+ (lang_statement_list_type *);
+ extern void pop_stat_ptr
+ (void);
extern void lang_add_data
(int type, union etree_union *);
extern void lang_add_reloc
diff -rcp ../binutils-2.19.51.0.2.15/opcodes/ppc-dis.c ./opcodes/ppc-dis.c
*** ../binutils-2.19.51.0.2.15/opcodes/ppc-dis.c 2009-03-02 14:04:59.000000000 +0000
--- ./opcodes/ppc-dis.c 2009-03-05 12:20:26.000000000 +0000
*************** powerpc_init_dialect (struct disassemble
*** 112,119 ****
if (info->disassembler_options
&& strstr (info->disassembler_options, "power7") != NULL)
! dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
! | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX;
if (info->disassembler_options
&& strstr (info->disassembler_options, "vsx") != NULL)
--- 112,120 ----
if (info->disassembler_options
&& strstr (info->disassembler_options, "power7") != NULL)
! dialect |= PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5
! | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7
! | PPC_OPCODE_ISEL | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX;
if (info->disassembler_options
&& strstr (info->disassembler_options, "vsx") != NULL)
diff -rcp ../binutils-2.19.51.0.2.15/opcodes/ppc-opc.c ./opcodes/ppc-opc.c
*** ../binutils-2.19.51.0.2.15/opcodes/ppc-opc.c 2009-03-02 14:05:00.000000000 +0000
--- ./opcodes/ppc-opc.c 2009-03-05 12:20:26.000000000 +0000
***************
*** 1,6 ****
/* ppc-opc.c -- PowerPC opcode list
Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
! 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support
This file is part of the GNU opcodes library.
--- 1,6 ----
/* ppc-opc.c -- PowerPC opcode list
Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
! 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support
This file is part of the GNU opcodes library.
*************** static unsigned long insert_xb6 (unsigne
*** 81,86 ****
--- 81,90 ----
static long extract_xb6 (unsigned long, ppc_cpu_t, int *);
static unsigned long insert_xb6s (unsigned long, long, ppc_cpu_t, const char **);
static long extract_xb6s (unsigned long, ppc_cpu_t, int *);
+ static unsigned long insert_xc6 (unsigned long, long, ppc_cpu_t, const char **);
+ static long extract_xc6 (unsigned long, ppc_cpu_t, int *);
+ static unsigned long insert_dm (unsigned long, long, ppc_cpu_t, const char **);
+ static long extract_dm (unsigned long, ppc_cpu_t, int *);
/* The operands table.
*************** const struct powerpc_operand powerpc_ope
*** 310,317 ****
#define LIA LI + 1
{ 0x3fffffc, 0, NULL, NULL, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED },
! /* The LS field in an X (sync) form instruction. */
#define LS LIA + 1
{ 0x3, 21, NULL, NULL, PPC_OPERAND_OPTIONAL },
/* The ME field in an M form instruction. */
--- 314,322 ----
#define LIA LI + 1
{ 0x3fffffc, 0, NULL, NULL, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED },
! /* The LS or WC field in an X (sync or wait) form instruction. */
#define LS LIA + 1
+ #define WC LS
{ 0x3, 21, NULL, NULL, PPC_OPERAND_OPTIONAL },
/* The ME field in an M form instruction. */
*************** const struct powerpc_operand powerpc_ope
*** 607,613 ****
#define XA6 XT6 + 1
{ 0x3f, -1, insert_xa6, extract_xa6, PPC_OPERAND_VSR },
! /* The XB field in an XX3 form instruction. This is split. */
#define XB6 XA6 + 1
{ 0x3f, -1, insert_xb6, extract_xb6, PPC_OPERAND_VSR },
--- 612,618 ----
#define XA6 XT6 + 1
{ 0x3f, -1, insert_xa6, extract_xa6, PPC_OPERAND_VSR },
! /* The XB field in an XX2 or XX3 form instruction. This is split. */
#define XB6 XA6 + 1
{ 0x3f, -1, insert_xb6, extract_xb6, PPC_OPERAND_VSR },
*************** const struct powerpc_operand powerpc_ope
*** 617,625 ****
#define XB6S XB6 + 1
{ 0x3f, -1, insert_xb6s, extract_xb6s, PPC_OPERAND_FAKE },
! /* The DM field in an XX3 form instruction. */
! #define DM XB6S + 1
{ 0x3, 8, NULL, NULL, 0 },
};
const unsigned int num_powerpc_operands = (sizeof (powerpc_operands)
--- 622,643 ----
#define XB6S XB6 + 1
{ 0x3f, -1, insert_xb6s, extract_xb6s, PPC_OPERAND_FAKE },
! /* The XC field in an XX4 form instruction. This is split. */
! #define XC6 XB6S + 1
! { 0x3f, -1, insert_xc6, extract_xc6, PPC_OPERAND_VSR },
!
! /* The DM or SHW field in an XX3 form instruction. */
! #define DM XC6 + 1
! #define SHW DM
{ 0x3, 8, NULL, NULL, 0 },
+
+ /* The DM field in an extended mnemonic XX3 form instruction. */
+ #define DMEX DM + 1
+ { 0x3, 8, insert_dm, extract_dm, 0 },
+
+ /* The UIM field in an XX2 form instruction. */
+ #define UIM DMEX + 1
+ { 0x3, 16, NULL, NULL, 0 },
};
const unsigned int num_powerpc_operands = (sizeof (powerpc_operands)
*************** extract_xb6s (unsigned long insn,
*** 1395,1400 ****
--- 1413,1461 ----
*invalid = 1;
return 0;
}
+
+ /* The XC field in an XX4 form instruction. This is split. */
+
+ static unsigned long
+ insert_xc6 (unsigned long insn,
+ long value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg ATTRIBUTE_UNUSED)
+ {
+ return insn | ((value & 0x1f) << 6) | ((value & 0x20) >> 2);
+ }
+
+ static long
+ extract_xc6 (unsigned long insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid ATTRIBUTE_UNUSED)
+ {
+ return ((insn << 2) & 0x20) | ((insn >> 6) & 0x1f);
+ }
+
+ static unsigned long
+ insert_dm (unsigned long insn,
+ long value,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ const char **errmsg)
+ {
+ if (value != 0 && value != 1)
+ *errmsg = _("invalid constant");
+ return insn | (((value) ? 3 : 0) << 8);
+ }
+
+ static long
+ extract_dm (unsigned long insn,
+ ppc_cpu_t dialect ATTRIBUTE_UNUSED,
+ int *invalid)
+ {
+ long value;
+
+ value = (insn >> 8) & 3;
+ if (value != 0 && value != 3)
+ *invalid = 1;
+ return (value) ? 1 : 0;
+ }
/* Macros used to form opcodes. */
*************** extract_xb6s (unsigned long insn,
*** 1536,1546 ****
/* An X form instruction. */
#define X(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1))
/* An XX3 form instruction. */
#define XX3(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0xff) << 3))
! #define XX3DM(op, xop, dm) (XX3 (op, ((unsigned long)(xop) & 0x1f)) \
! | ((((unsigned long)(dm)) & 0x3) << 8))
/* A Z form instruction. */
#define Z(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 1))
--- 1597,1613 ----
/* An X form instruction. */
#define X(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1))
+ /* An XX2 form instruction. */
+ #define XX2(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 2))
+
/* An XX3 form instruction. */
#define XX3(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0xff) << 3))
! /* An XX3 form instruction with the RC bit specified. */
! #define XX3RC(op, xop, rc) (OP (op) | (((rc) & 1) << 10) | ((((unsigned long)(xop)) & 0x7f) << 3))
!
! /* An XX4 form instruction. */
! #define XX4(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3) << 4))
/* A Z form instruction. */
#define Z(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 1))
*************** extract_xb6s (unsigned long insn,
*** 1557,1567 ****
/* The mask for an XX1 form instruction. */
#define XX1_MASK X (0x3f, 0x3ff)
/* The mask for an XX3 form instruction. */
#define XX3_MASK XX3 (0x3f, 0xff)
! /* The mask for an XX3 form instruction with the DM bits specified. */
#define XX3DM_MASK (XX3 (0x3f, 0x1f) | (1 << 10))
/* The mask for a Z form instruction. */
#define Z_MASK ZRC (0x3f, 0x1ff, 1)
--- 1624,1653 ----
/* The mask for an XX1 form instruction. */
#define XX1_MASK X (0x3f, 0x3ff)
+ /* The mask for an XX2 form instruction. */
+ #define XX2_MASK (XX2 (0x3f, 0x1ff) | (0x1f << 16))
+
+ /* 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 BF bits specified. */
+ #define XX2BF_MASK (XX2_MASK | (3 << 21) | (1))
+
/* The mask for an XX3 form instruction. */
#define XX3_MASK XX3 (0x3f, 0xff)
! /* The mask for an XX3 form instruction with the BF bits specified. */
! #define XX3BF_MASK (XX3 (0x3f, 0xff) | (3 << 21) | (1))
!
! /* The mask for an XX3 form instruction with the DM or SHW bits specified. */
#define XX3DM_MASK (XX3 (0x3f, 0x1f) | (1 << 10))
+ #define XX3SHW_MASK XX3DM_MASK
+
+ /* The mask for an XX4 form instruction. */
+ #define XX4_MASK XX4 (0x3f, 0x3)
+
+ /* 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)
/* The mask for a Z form instruction. */
#define Z_MASK ZRC (0x3f, 0x1ff, 1)
*************** extract_xb6s (unsigned long insn,
*** 1803,1808 ****
--- 1889,1895 ----
#define POWER4 PPC_OPCODE_POWER4
#define POWER5 PPC_OPCODE_POWER5
#define POWER6 PPC_OPCODE_POWER6
+ #define POWER7 PPC_OPCODE_POWER7
#define CELL PPC_OPCODE_CELL
#define PPC32 PPC_OPCODE_32 | PPC_OPCODE_PPC
#define PPC64 PPC_OPCODE_64 | PPC_OPCODE_PPC
*************** const struct powerpc_opcode powerpc_opco
*** 3425,3430 ****
--- 3512,3519 ----
{"lvewx", X(31,71), X_MASK, PPCVEC, PPCNONE, {VD, RA, RB}},
+ {"addg6s", XO(31,74,0,0), XO_MASK, POWER6, PPCNONE, {RT, RA, RB}},
+
{"iseleq", X(31,79), X_MASK, PPCISEL, PPCNONE, {RT, RA, RB}},
{"isel", XISEL(31,15), XISEL_MASK, PPCISEL, PPCNONE, {RT, RA, RB, CRB}},
*************** const struct powerpc_opcode powerpc_opco
*** 3434,3439 ****
--- 3523,3530 ----
{"subf.", XO(31,40,0,1), XO_MASK, PPC, PPCNONE, {RT, RA, RB}},
{"sub.", XO(31,40,0,1), XO_MASK, PPC, PPCNONE, {RT, RB, RA}},
+ {"lbarx", X(31,52), XEH_MASK, POWER7, PPCNONE, {RT, RA0, RB, EH}},
+
{"ldux", X(31,53), X_MASK, PPC64, PPCNONE, {RT, RAL, RB}},
{"dcbst", X(31,54), XRT_MASK, PPC, PPCNONE, {RA, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 3447,3453 ****
{"andc", XRC(31,60,0), X_MASK, COM, PPCNONE, {RA, RS, RB}},
{"andc.", XRC(31,60,1), X_MASK, COM, PPCNONE, {RA, RS, RB}},
! {"wait", X(31,62), 0xffffffff, E500MC, PPCNONE, {0}},
{"dcbstep", XRT(31,63,0), XRT_MASK, E500MC, PPCNONE, {RA, RB}},
--- 3538,3546 ----
{"andc", XRC(31,60,0), X_MASK, COM, PPCNONE, {RA, RS, RB}},
{"andc.", XRC(31,60,1), X_MASK, COM, PPCNONE, {RA, RS, RB}},
! {"waitrsv", X(31,62)|(1<<21), 0xffffffff, POWER7|E500MC, PPCNONE, {0}},
! {"waitimpl", X(31,62)|(2<<21), 0xffffffff, POWER7|E500MC, PPCNONE, {0}},
! {"wait", X(31,62), XWC_MASK, POWER7|E500MC, PPCNONE, {WC}},
{"dcbstep", XRT(31,63,0), XRT_MASK, E500MC, PPCNONE, {RA, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 3501,3506 ****
--- 3594,3601 ----
{"mtsrdin", X(31,114), XRA_MASK, PPC64, PPCNONE, {RS, RB}},
+ {"lharx", X(31,116), XEH_MASK, POWER7, PPCNONE, {RT, RA0, RB, EH}},
+
{"clf", X(31,118), XTO_MASK, POWER, PPCNONE, {RA, RB}},
{"lbzux", X(31,119), X_MASK, COM, PPCNONE, {RT, RAL, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 3636,3648 ****
{"mtsrin", X(31,242), XRA_MASK, PPC32, PPCNONE, {RS, RB}},
{"mtsri", X(31,242), XRA_MASK, POWER32, PPCNONE, {RS, RB}},
! {"dcbtst", X(31,246), X_MASK, PPC, PPCNONE, {CT, RA, RB}},
{"stbux", X(31,247), X_MASK, COM, PPCNONE, {RS, RAS, RB}},
{"slliq", XRC(31,248,0), X_MASK, M601, PPCNONE, {RA, RS, SH}},
{"slliq.", XRC(31,248,1), X_MASK, M601, PPCNONE, {RA, RS, SH}},
{"dcbtstep", XRT(31,255,0), X_MASK, E500MC, PPCNONE, {RT, RA, RB}},
{"mfdcrx", X(31,259), X_MASK, BOOKE, PPCNONE, {RS, RA}},
--- 3731,3747 ----
{"mtsrin", X(31,242), XRA_MASK, PPC32, PPCNONE, {RS, RB}},
{"mtsri", X(31,242), XRA_MASK, POWER32, PPCNONE, {RS, RB}},
! {"dcbtstt", XRT(31,246,0x10), XRT_MASK, POWER7, PPCNONE, {RA, RB}},
! {"dcbtst", X(31,246), X_MASK, PPC, POWER4, {CT, RA, RB}},
! {"dcbtst", X(31,246), X_MASK, POWER4, PPCNONE, {RA, RB, CT}},
{"stbux", X(31,247), X_MASK, COM, PPCNONE, {RS, RAS, RB}},
{"slliq", XRC(31,248,0), X_MASK, M601, PPCNONE, {RA, RS, SH}},
{"slliq.", XRC(31,248,1), X_MASK, M601, PPCNONE, {RA, RS, SH}},
+ {"bpermd", X(31,252), X_MASK, POWER7, PPCNONE, {RA, RS, RB}},
+
{"dcbtstep", XRT(31,255,0), X_MASK, E500MC, PPCNONE, {RT, RA, RB}},
{"mfdcrx", X(31,259), X_MASK, BOOKE, PPCNONE, {RS, RA}},
*************** const struct powerpc_opcode powerpc_opco
*** 3667,3676 ****
{"lscbx", XRC(31,277,0), X_MASK, M601, PPCNONE, {RT, RA, RB}},
{"lscbx.", XRC(31,277,1), X_MASK, M601, PPCNONE, {RT, RA, RB}},
! {"dcbt", X(31,278), X_MASK, PPC, PPCNONE, {CT, RA, RB}},
{"lhzx", X(31,279), X_MASK, COM, PPCNONE, {RT, RA0, RB}},
{"eqv", XRC(31,284,0), X_MASK, COM, PPCNONE, {RA, RS, RB}},
{"eqv.", XRC(31,284,1), X_MASK, COM, PPCNONE, {RA, RS, RB}},
--- 3766,3779 ----
{"lscbx", XRC(31,277,0), X_MASK, M601, PPCNONE, {RT, RA, RB}},
{"lscbx.", XRC(31,277,1), X_MASK, M601, PPCNONE, {RT, RA, RB}},
! {"dcbtt", XRT(31,278,0x10), XRT_MASK, POWER7, PPCNONE, {RA, RB}},
! {"dcbt", X(31,278), X_MASK, PPC, POWER4, {CT, RA, RB}},
! {"dcbt", X(31,278), X_MASK, POWER4, PPCNONE, {RA, RB, CT}},
{"lhzx", X(31,279), X_MASK, COM, PPCNONE, {RT, RA0, RB}},
+ {"cdtbcd", X(31,282), XRB_MASK, POWER6, PPCNONE, {RA, RS}},
+
{"eqv", XRC(31,284,0), X_MASK, COM, PPCNONE, {RA, RS, RB}},
{"eqv.", XRC(31,284,1), X_MASK, COM, PPCNONE, {RA, RS, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 3685,3690 ****
--- 3788,3795 ----
{"lhzux", X(31,311), X_MASK, COM, PPCNONE, {RT, RAL, RB}},
+ {"cbcdtd", X(31,314), XRB_MASK, POWER6, PPCNONE, {RA, RS}},
+
{"xor", XRC(31,316,0), X_MASK, COM, PPCNONE, {RA, RS, RB}},
{"xor.", XRC(31,316,1), X_MASK, COM, PPCNONE, {RA, RS, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 3729,3734 ****
--- 3834,3841 ----
{"div", XO(31,331,0,0), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
{"div.", XO(31,331,0,1), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
+ {"lxvdsx", X(31,332), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA, RB}},
+
{"mfpmr", X(31,334), X_MASK, PPCPMR|PPCE300, PPCNONE, {RT, PMR}},
{"mfmq", XSPR(31,339, 0), XSPR_MASK, M601, PPCNONE, {RT}},
*************** const struct powerpc_opcode powerpc_opco
*** 3935,3941 ****
{"mftbl", XSPR(31,371,268), XSPR_MASK, CLASSIC, PPCNONE, {RT}},
{"mftbu", XSPR(31,371,269), XSPR_MASK, CLASSIC, PPCNONE, {RT}},
! {"mftb", X(31,371), X_MASK, CLASSIC, PPCNONE, {RT, TBR}},
{"lwaux", X(31,373), X_MASK, PPC64, PPCNONE, {RT, RAL, RB}},
--- 4042,4048 ----
{"mftbl", XSPR(31,371,268), XSPR_MASK, CLASSIC, PPCNONE, {RT}},
{"mftbu", XSPR(31,371,269), XSPR_MASK, CLASSIC, PPCNONE, {RT}},
! {"mftb", X(31,371), X_MASK, CLASSIC, POWER7, {RT, TBR}},
{"lwaux", X(31,373), X_MASK, PPC64, PPCNONE, {RT, RAL, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 3943,3953 ****
--- 4050,4067 ----
{"lhaux", X(31,375), X_MASK, COM, PPCNONE, {RT, RAL, RB}},
+ {"popcntw", X(31,378), XRB_MASK, POWER7, PPCNONE, {RA, RS}},
+
{"mtdcrx", X(31,387), X_MASK, BOOKE, PPCNONE, {RA, RS}},
{"dcblc", X(31,390), X_MASK, PPCCHLK, PPCNONE, {CT, RA, RB}},
{"stdfcmx", APU(31,391,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
+ {"divdeu", XO(31,393,0,0), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divdeu.", XO(31,393,0,1), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divweu", XO(31,395,0,0), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divweu.", XO(31,395,0,1), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+
{"dcblce", X(31,398), X_MASK, PPCCHLK, PPCNONE, {CT, RA, RB}},
{"slbmte", X(31,402), XRA_MASK, PPC64, PPCNONE, {RS, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 3961,3966 ****
--- 4075,4085 ----
{"mtdcrux", X(31,419), X_MASK, PPC464, PPCNONE, {RA, RS}},
+ {"divde", XO(31,425,0,0), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divde.", XO(31,425,0,1), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divwe", XO(31,427,0,0), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divwe.", XO(31,427,0,1), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+
{"slbie", X(31,434), XRTRA_MASK, PPC64, PPCNONE, {RB}},
{"ecowx", X(31,438), X_MASK, PPC, PPCNONE, {RT, RA, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4202,4210 ****
{"cli", X(31,502), XRB_MASK, POWER, PPCNONE, {RT, RA}},
{"cmpb", X(31,508), X_MASK, POWER6, PPCNONE, {RA, RS, RB}},
! {"mcrxr", X(31,512), XRARB_MASK|(3<<21), COM, PPCNONE, {BF}},
{"lbdx", X(31,515), X_MASK, E500MC, PPCNONE, {RT, RA, RB}},
--- 4321,4331 ----
{"cli", X(31,502), XRB_MASK, POWER, PPCNONE, {RT, RA}},
+ {"popcntd", X(31,506), XRB_MASK, POWER7, PPCNONE, {RA, RS}},
+
{"cmpb", X(31,508), X_MASK, POWER6, PPCNONE, {RA, RS, RB}},
! {"mcrxr", X(31,512), XRARB_MASK|(3<<21), COM, POWER7, {BF}},
{"lbdx", X(31,515), X_MASK, E500MC, PPCNONE, {RT, RA, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4227,4233 ****
{"clcs", X(31,531), XRB_MASK, M601, PPCNONE, {RT, RA}},
! {"ldbrx", X(31,532), X_MASK, CELL, PPCNONE, {RT, RA0, RB}},
{"lswx", X(31,533), X_MASK, PPCCOM, PPCNONE, {RT, RA0, RB}},
{"lsx", X(31,533), X_MASK, PWRCOM, PPCNONE, {RT, RA, RB}},
--- 4348,4354 ----
{"clcs", X(31,531), XRB_MASK, M601, PPCNONE, {RT, RA}},
! {"ldbrx", X(31,532), X_MASK, CELL|POWER7, PPCNONE, {RT, RA0, RB}},
{"lswx", X(31,533), X_MASK, PPCCOM, PPCNONE, {RT, RA0, RB}},
{"lsx", X(31,533), X_MASK, PWRCOM, PPCNONE, {RT, RA, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4271,4276 ****
--- 4392,4399 ----
{"lwfcmux", APU(31,583,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
+ {"lxsdx", X(31,588), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA, RB}},
+
{"mfsr", X(31,595), XRB_MASK|(1<<20), COM32, PPCNONE, {RT, SR}},
{"lswi", X(31,597), X_MASK, PPCCOM, PPCNONE, {RT, RA0, NB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4284,4291 ****
{"lfdx", X(31,599), X_MASK, COM, PPCNONE, {FRT, RA0, RB}},
! {"lfdepx", X(31,607), X_MASK, E500MC, PPCNONE, {RT, RA, RB}},
! {"mffgpr", XRC(31,607,0), XRA_MASK, POWER6, PPCNONE, {FRT, RB}},
{"lddx", X(31,611), X_MASK, E500MC, PPCNONE, {RT, RA, RB}},
--- 4407,4414 ----
{"lfdx", X(31,599), X_MASK, COM, PPCNONE, {FRT, RA0, RB}},
! {"lfdepx", X(31,607), X_MASK, E500MC, PPCNONE, {FRT, RA, RB}},
! {"mffgpr", XRC(31,607,0), XRA_MASK, POWER6, POWER7, {FRT, RB}},
{"lddx", X(31,611), X_MASK, E500MC, PPCNONE, {RT, RA, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4297,4302 ****
--- 4420,4427 ----
{"mulo", XO(31,107,1,0), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
{"mulo.", XO(31,107,1,1), XO_MASK, M601, PPCNONE, {RT, RA, RB}},
+ {"lxsdux", X(31,620), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA, RB}},
+
{"mfsri", X(31,627), X_MASK, PWRCOM, PPCNONE, {RT, RA, RB}},
{"dclst", X(31,630), XRB_MASK, PWRCOM, PPCNONE, {RS, RA}},
*************** const struct powerpc_opcode powerpc_opco
*** 4320,4326 ****
{"mfsrin", X(31,659), XRA_MASK, PPC32, PPCNONE, {RT, RB}},
! {"stdbrx", X(31,660), X_MASK, CELL, PPCNONE, {RS, RA0, RB}},
{"stswx", X(31,661), X_MASK, PPCCOM, PPCNONE, {RS, RA0, RB}},
{"stsx", X(31,661), X_MASK, PWRCOM, PPCNONE, {RS, RA0, RB}},
--- 4445,4451 ----
{"mfsrin", X(31,659), XRA_MASK, PPC32, PPCNONE, {RT, RB}},
! {"stdbrx", X(31,660), X_MASK, CELL|POWER7, PPCNONE, {RS, RA0, RB}},
{"stswx", X(31,661), X_MASK, PPCCOM, PPCNONE, {RS, RA0, RB}},
{"stsx", X(31,661), X_MASK, PWRCOM, PPCNONE, {RS, RA0, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4341,4346 ****
--- 4466,4473 ----
{"stvrx", X(31,679), X_MASK, CELL, PPCNONE, {VS, RA0, RB}},
{"sthfcmux", APU(31,679,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
+ {"stbcx.", XRC(31,694,1), X_MASK, POWER7, PPCNONE, {RS, RA0, RB}},
+
{"stfsux", X(31,695), X_MASK, COM, PPCNONE, {FRS, RAS, RB}},
{"sriq", XRC(31,696,0), X_MASK, M601, PPCNONE, {RA, RS, SH}},
*************** const struct powerpc_opcode powerpc_opco
*** 4350,4355 ****
--- 4477,4484 ----
{"stwfcmux", APU(31,711,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
+ {"stxsdx", X(31,716), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA, RB}},
+
{"subfzeo", XO(31,200,1,0), XORB_MASK, PPCCOM, PPCNONE, {RT, RA}},
{"sfzeo", XO(31,200,1,0), XORB_MASK, PWRCOM, PPCNONE, {RT, RA}},
{"subfzeo.", XO(31,200,1,1), XORB_MASK, PPCCOM, PPCNONE, {RT, RA}},
*************** const struct powerpc_opcode powerpc_opco
*** 4363,4368 ****
--- 4492,4499 ----
{"stswi", X(31,725), X_MASK, PPCCOM, PPCNONE, {RS, RA0, NB}},
{"stsi", X(31,725), X_MASK, PWRCOM, PPCNONE, {RS, RA0, NB}},
+ {"sthcx.", XRC(31,726,1), X_MASK, POWER7, PPCNONE, {RS, RA0, RB}},
+
{"stfdx", X(31,727), X_MASK, COM, PPCNONE, {FRS, RA0, RB}},
{"srlq", XRC(31,728,0), X_MASK, M601, PPCNONE, {RA, RS, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4371,4383 ****
{"sreq", XRC(31,729,0), X_MASK, M601, PPCNONE, {RA, RS, RB}},
{"sreq.", XRC(31,729,1), X_MASK, M601, PPCNONE, {RA, RS, RB}},
! {"stfdepx", X(31,735), X_MASK, E500MC, PPCNONE, {RS, RA, RB}},
! {"mftgpr", XRC(31,735,0), XRA_MASK, POWER6, PPCNONE, {RT, FRB}},
{"stddx", X(31,739), X_MASK, E500MC, PPCNONE, {RS, RA, RB}},
{"stqfcmux", APU(31,743,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
{"subfmeo", XO(31,232,1,0), XORB_MASK, PPCCOM, PPCNONE, {RT, RA}},
{"sfmeo", XO(31,232,1,0), XORB_MASK, PWRCOM, PPCNONE, {RT, RA}},
{"subfmeo.", XO(31,232,1,1), XORB_MASK, PPCCOM, PPCNONE, {RT, RA}},
--- 4502,4516 ----
{"sreq", XRC(31,729,0), X_MASK, M601, PPCNONE, {RA, RS, RB}},
{"sreq.", XRC(31,729,1), X_MASK, M601, PPCNONE, {RA, RS, RB}},
! {"stfdepx", X(31,735), X_MASK, E500MC, PPCNONE, {FRS, RA, RB}},
! {"mftgpr", XRC(31,735,0), XRA_MASK, POWER6, POWER7, {RT, FRB}},
{"stddx", X(31,739), X_MASK, E500MC, PPCNONE, {RS, RA, RB}},
{"stqfcmux", APU(31,743,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
+ {"stxsdux", X(31,748), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA, RB}},
+
{"subfmeo", XO(31,232,1,0), XORB_MASK, PPCCOM, PPCNONE, {RT, RA}},
{"sfmeo", XO(31,232,1,0), XORB_MASK, PWRCOM, PPCNONE, {RT, RA}},
{"subfmeo.", XO(31,232,1,1), XORB_MASK, PPCCOM, PPCNONE, {RT, RA}},
*************** const struct powerpc_opcode powerpc_opco
*** 4415,4420 ****
--- 4548,4555 ----
{"addo.", XO(31,266,1,1), XO_MASK, PPCCOM, PPCNONE, {RT, RA, RB}},
{"caxo.", XO(31,266,1,1), XO_MASK, PWRCOM, PPCNONE, {RT, RA, RB}},
+ {"lxvw4x", X(31,780), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA, RB}},
+
{"tlbivax", X(31,786), XRT_MASK, BOOKE, PPCNONE, {RA, RB}},
{"tlbilx", X(31,787), X_MASK, E500MC, PPCNONE, {T, RA0, RB}},
{"tlbilxlpid", XTO(31,787,0), XTO_MASK, E500MC, PPCNONE, {0}},
*************** const struct powerpc_opcode powerpc_opco
*** 4425,4432 ****
{"lhbrx", X(31,790), X_MASK, COM, PPCNONE, {RT, RA0, RB}},
{"lfqx", X(31,791), X_MASK, POWER2, PPCNONE, {FRT, RA, RB}},
- {"lfdpx", X(31,791), X_MASK, POWER6, PPCNONE, {FRT, RA, RB}},
{"sraw", XRC(31,792,0), X_MASK, PPCCOM, PPCNONE, {RA, RS, RB}},
{"sra", XRC(31,792,0), X_MASK, PWRCOM, PPCNONE, {RA, RS, RB}},
--- 4560,4567 ----
{"lhbrx", X(31,790), X_MASK, COM, PPCNONE, {RT, RA0, RB}},
+ {"lfdpx", X(31,791), X_MASK, POWER6, POWER7, {FRT, RA, RB}},
{"lfqx", X(31,791), X_MASK, POWER2, PPCNONE, {FRT, RA, RB}},
{"sraw", XRC(31,792,0), X_MASK, PPCCOM, PPCNONE, {RA, RS, RB}},
{"sra", XRC(31,792,0), X_MASK, PWRCOM, PPCNONE, {RA, RS, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4440,4445 ****
--- 4575,4582 ----
{"lvrxl", X(31,807), X_MASK, CELL, PPCNONE, {VD, RA0, RB}},
+ {"lxvw4ux", X(31,812), XX1_MASK, PPCVSX, PPCNONE, {XT6, RA, RB}},
+
{"rac", X(31,818), X_MASK, PWRCOM, PPCNONE, {RT, RA, RB}},
{"lhzcix", X(31,821), X_MASK, POWER6, PPCNONE, {RT, RA0, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4480,4488 ****
--- 4617,4634 ----
{"ldcix", X(31,885), X_MASK, POWER6, PPCNONE, {RT, RA0, RB}},
+ {"lfiwzx", X(31,887), X_MASK, POWER7, PPCNONE, {FRT, RA0, RB}},
+
{"stvlxl", X(31,903), X_MASK, CELL, PPCNONE, {VS, RA0, RB}},
{"stdfcmux", APU(31,903,0), APU_MASK, PPC405, PPCNONE, {FCRT, RA, RB}},
+ {"divdeuo", XO(31,393,1,0), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divdeuo.", XO(31,393,1,1), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divweuo", XO(31,395,1,0), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divweuo.", XO(31,395,1,1), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+
+ {"stxvw4x", X(31,908), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA, RB}},
+
{"tlbsx", XRC(31,914,0), X_MASK, PPC403|BOOKE, PPCNONE, {RTO, RA, RB}},
{"tlbsx.", XRC(31,914,1), X_MASK, PPC403|BOOKE, PPCNONE, {RTO, RA, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4492,4499 ****
{"sthbrx", X(31,918), X_MASK, COM, PPCNONE, {RS, RA0, RB}},
- {"stfqx", X(31,919), X_MASK, POWER2, PPCNONE, {FRS, RA, RB}},
{"stfdpx", X(31,919), X_MASK, POWER6, PPCNONE, {FRS, RA, RB}},
{"sraq", XRC(31,920,0), X_MASK, M601, PPCNONE, {RA, RS, RB}},
{"sraq.", XRC(31,920,1), X_MASK, M601, PPCNONE, {RA, RS, RB}},
--- 4638,4645 ----
{"sthbrx", X(31,918), X_MASK, COM, PPCNONE, {RS, RA0, RB}},
{"stfdpx", X(31,919), X_MASK, POWER6, PPCNONE, {FRS, RA, RB}},
+ {"stfqx", X(31,919), X_MASK, POWER2, PPCNONE, {FRS, RA, RB}},
{"sraq", XRC(31,920,0), X_MASK, M601, PPCNONE, {RA, RS, RB}},
{"sraq.", XRC(31,920,1), X_MASK, M601, PPCNONE, {RA, RS, RB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4510,4515 ****
--- 4656,4668 ----
{"stvrxl", X(31,935), X_MASK, CELL, PPCNONE, {VS, RA0, RB}},
+ {"divdeo", XO(31,425,1,0), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divdeo.", XO(31,425,1,1), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divweo", XO(31,427,1,0), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+ {"divweo.", XO(31,427,1,1), XO_MASK, POWER7, PPCNONE, {RT, RA, RB}},
+
+ {"stxvw4ux", X(31,940), XX1_MASK, PPCVSX, PPCNONE, {XS6, RA, RB}},
+
{"tlbrehi", XTLB(31,946,0), XTLB_MASK, PPC403, PPCNONE, {RT, RA}},
{"tlbrelo", XTLB(31,946,1), XTLB_MASK, PPC403, PPCNONE, {RT, RA}},
{"tlbre", X(31,946), X_MASK, PPC403|BOOKE, PPCNONE, {RSO, RAOPT, SHO}},
*************** const struct powerpc_opcode powerpc_opco
*** 4648,4659 ****
{"psq_l", OP(56), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}},
{"lfqu", OP(57), OP_MASK, POWER2, PPCNONE, {FRT, D, RA0}},
{"psq_lu", OP(57), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}},
- {"lfdp", OP(57), OP_MASK, POWER6, PPCNONE, {FRT, D, RA0}},
-
{"ld", DSO(58,0), DS_MASK, PPC64, PPCNONE, {RT, DS, RA0}},
{"ldu", DSO(58,1), DS_MASK, PPC64, PPCNONE, {RT, DS, RAL}},
{"lwa", DSO(58,2), DS_MASK, PPC64, PPCNONE, {RT, DS, RA0}},
--- 4801,4812 ----
{"psq_l", OP(56), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}},
+ {"lfdp", OP(57), OP_MASK, POWER6, POWER7, {FRT, D, RA0}},
+
{"lfqu", OP(57), OP_MASK, POWER2, PPCNONE, {FRT, D, RA0}},
{"psq_lu", OP(57), OP_MASK, PPCPS, PPCNONE, {FRT,PSD,RA,PSW,PSQ}},
{"ld", DSO(58,0), DS_MASK, PPC64, PPCNONE, {RT, DS, RA0}},
{"ldu", DSO(58,1), DS_MASK, PPC64, PPCNONE, {RT, DS, RAL}},
{"lwa", DSO(58,2), DS_MASK, PPC64, PPCNONE, {RT, DS, RA0}},
*************** const struct powerpc_opcode powerpc_opco
*** 4676,4689 ****
{"fsqrts", A(59,22,0), AFRAFRC_MASK, PPC, PPCNONE, {FRT, FRB}},
{"fsqrts.", A(59,22,1), AFRAFRC_MASK, PPC, PPCNONE, {FRT, FRB}},
! {"fres", A(59,24,0), AFRALFRC_MASK, PPC, PPCNONE, {FRT, FRB, A_L}},
! {"fres.", A(59,24,1), AFRALFRC_MASK, PPC, PPCNONE, {FRT, FRB, A_L}},
{"fmuls", A(59,25,0), AFRB_MASK, PPC, PPCNONE, {FRT, FRA, FRC}},
{"fmuls.", A(59,25,1), AFRB_MASK, PPC, PPCNONE, {FRT, FRA, FRC}},
! {"frsqrtes", A(59,26,0), AFRALFRC_MASK, POWER5, PPCNONE, {FRT, FRB, A_L}},
! {"frsqrtes.", A(59,26,1), AFRALFRC_MASK, POWER5, PPCNONE, {FRT, FRB, A_L}},
{"fmsubs", A(59,28,0), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}},
{"fmsubs.", A(59,28,1), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}},
--- 4829,4846 ----
{"fsqrts", A(59,22,0), AFRAFRC_MASK, PPC, PPCNONE, {FRT, FRB}},
{"fsqrts.", A(59,22,1), AFRAFRC_MASK, PPC, PPCNONE, {FRT, FRB}},
! {"fres", A(59,24,0), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}},
! {"fres.", A(59,24,1), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}},
! {"fres", A(59,24,0), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}},
! {"fres.", A(59,24,1), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}},
{"fmuls", A(59,25,0), AFRB_MASK, PPC, PPCNONE, {FRT, FRA, FRC}},
{"fmuls.", A(59,25,1), AFRB_MASK, PPC, PPCNONE, {FRT, FRA, FRC}},
! {"frsqrtes", A(59,26,0), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}},
! {"frsqrtes.", A(59,26,1), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}},
! {"frsqrtes", A(59,26,0), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}},
! {"frsqrtes.", A(59,26,1), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}},
{"fmsubs", A(59,28,0), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}},
{"fmsubs.", A(59,28,1), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4749,4776 ****
{"drsp", XRC(59,770,0), X_MASK, POWER6, PPCNONE, {FRT, FRB}},
{"drsp.", XRC(59,770,1), X_MASK, POWER6, PPCNONE, {FRT, FRB}},
{"denbcd", XRC(59,834,0), X_MASK, POWER6, PPCNONE, {S, FRT, FRB}},
{"denbcd.", XRC(59,834,1), X_MASK, POWER6, PPCNONE, {S, FRT, FRB}},
{"diex", XRC(59,866,0), X_MASK, POWER6, PPCNONE, {FRT, FRA, FRB}},
{"diex.", XRC(59,866,1), X_MASK, POWER6, PPCNONE, {FRT, FRA, FRB}},
! {"stfq", OP(60), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}},
!
! {"psq_st", OP(60), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}},
{"xxmrghd", XX3(60,10), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
{"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}},
{"xvmovdp", XX3(60,240), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6S}},
{"xvcpsgndp", XX3(60,240), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
! {"psq_stu", OP(61), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}},
! {"stfqu", OP(61), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}},
{"stfdp", OP(61), OP_MASK, POWER6, PPCNONE, {FRT, D, RA0}},
{"std", DSO(62,0), DS_MASK, PPC64, PPCNONE, {RS, DS, RA0}},
{"stdu", DSO(62,1), DS_MASK, PPC64, PPCNONE, {RS, DS, RAS}},
{"stq", DSO(62,2), DS_MASK, POWER4, PPCNONE, {RSQ, DS, RA0}},
--- 4906,5078 ----
{"drsp", XRC(59,770,0), X_MASK, POWER6, PPCNONE, {FRT, FRB}},
{"drsp.", XRC(59,770,1), X_MASK, POWER6, PPCNONE, {FRT, FRB}},
+ {"dcffix", XRC(59,802,0), X_MASK|FRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+ {"dcffix.", XRC(59,802,1), X_MASK|FRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+
{"denbcd", XRC(59,834,0), X_MASK, POWER6, PPCNONE, {S, FRT, FRB}},
{"denbcd.", XRC(59,834,1), X_MASK, POWER6, PPCNONE, {S, FRT, FRB}},
+ {"fcfids", XRC(59,846,0), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+ {"fcfids.", XRC(59,846,1), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+
{"diex", XRC(59,866,0), X_MASK, POWER6, PPCNONE, {FRT, FRA, FRB}},
{"diex.", XRC(59,866,1), X_MASK, POWER6, PPCNONE, {FRT, FRA, FRB}},
! {"fcfidus", XRC(59,974,0), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
! {"fcfidus.", XRC(59,974,1), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+ {"xxsldwi", XX3(60,2), XX3SHW_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6, SHW}},
+ {"xxsel", XX4(60,3), XX4_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6, XC6}},
+ {"xxspltd", XX3(60,10), XX3DM_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6S, DMEX}},
{"xxmrghd", XX3(60,10), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+ {"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}},
+ {"xxmrghw", XX3(60,18), XX3_MASK, PPCVSX, 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}},
+ {"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}},
+ {"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}},
+ {"xsdivdp", XX3(60,56), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+ {"xsmsubmdp", XX3(60,57), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, 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}},
+ {"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}},
+ {"xvmulsp", XX3(60,80), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+ {"xvmsubasp", XX3(60,81), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+ {"xvcmpgesp", XX3RC(60,83,0), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+ {"xvcmpgesp.", XX3RC(60,83,1), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, 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}},
+ {"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}},
+ {"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}},
+ {"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}},
+ {"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}},
+ {"xvtdivdp", XX3(60,125), XX3BF_MASK, PPCVSX, PPCNONE, {BF, XA6, XB6}},
+ {"xxland", XX3(60,130), 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}},
+ {"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}},
+ {"xxlor", XX3(60,146), 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}},
+ {"xxlxor", XX3(60,154), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+ {"xvresp", XX2(60,154), XX2_MASK, PPCVSX, 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}},
+ {"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}},
+ {"xvrspic", XX2(60,171), XX2_MASK, PPCVSX, 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}},
+ {"xvcvsxwsp", XX2(60,184), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xsnmsubmdp", XX3(60,185), XX3_MASK, PPCVSX, PPCNONE, {XT6, XA6, XB6}},
+ {"xvrspim", XX2(60,185), 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}},
+ {"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}},
+ {"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}},
+ {"xscvdpuxds", XX2(60,328), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xscvspdp", XX2(60,329), 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}},
+ {"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}},
+ {"xvcvsxdsp", XX2(60,440), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvnegsp", XX2(60,441), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvcvdpuxds", XX2(60,456), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvcvspdp", XX2(60,457), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvcvdpsxds", XX2(60,472), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvabsdp", XX2(60,473), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvcvuxddp", XX2(60,488), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvnabsdp", XX2(60,489), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvcvsxddp", XX2(60,504), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
+ {"xvnegdp", XX2(60,505), XX2_MASK, PPCVSX, PPCNONE, {XT6, XB6}},
! {"stfq", OP(60), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}},
! {"psq_st", OP(60), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}},
{"stfdp", OP(61), OP_MASK, POWER6, PPCNONE, {FRT, D, RA0}},
+ {"stfqu", OP(61), OP_MASK, POWER2, PPCNONE, {FRS, D, RA}},
+
+ {"psq_stu", OP(61), OP_MASK, PPCPS, PPCNONE, {FRS,PSD,RA,PSW,PSQ}},
+
{"std", DSO(62,0), DS_MASK, PPC64, PPCNONE, {RS, DS, RA0}},
{"stdu", DSO(62,1), DS_MASK, PPC64, PPCNONE, {RS, DS, RAS}},
{"stq", DSO(62,2), DS_MASK, POWER4, PPCNONE, {RSQ, DS, RA0}},
*************** const struct powerpc_opcode powerpc_opco
*** 4820,4835 ****
{"fsel", A(63,23,0), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}},
{"fsel.", A(63,23,1), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}},
! {"fre", A(63,24,0), AFRALFRC_MASK, POWER5, PPCNONE, {FRT, FRB, A_L}},
! {"fre.", A(63,24,1), AFRALFRC_MASK, POWER5, PPCNONE, {FRT, FRB, A_L}},
{"fmul", A(63,25,0), AFRB_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC}},
{"fm", A(63,25,0), AFRB_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC}},
{"fmul.", A(63,25,1), AFRB_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC}},
{"fm.", A(63,25,1), AFRB_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC}},
! {"frsqrte", A(63,26,0), AFRALFRC_MASK, PPC, PPCNONE, {FRT, FRB, A_L}},
! {"frsqrte.", A(63,26,1), AFRALFRC_MASK, PPC, PPCNONE, {FRT, FRB, A_L}},
{"fmsub", A(63,28,0), A_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC, FRB}},
{"fms", A(63,28,0), A_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC, FRB}},
--- 5122,5141 ----
{"fsel", A(63,23,0), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}},
{"fsel.", A(63,23,1), A_MASK, PPC, PPCNONE, {FRT, FRA, FRC, FRB}},
! {"fre", A(63,24,0), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}},
! {"fre.", A(63,24,1), AFRALFRC_MASK, POWER5, POWER7, {FRT, FRB, A_L}},
! {"fre", A(63,24,0), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}},
! {"fre.", A(63,24,1), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}},
{"fmul", A(63,25,0), AFRB_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC}},
{"fm", A(63,25,0), AFRB_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC}},
{"fmul.", A(63,25,1), AFRB_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC}},
{"fm.", A(63,25,1), AFRB_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC}},
! {"frsqrte", A(63,26,0), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}},
! {"frsqrte.", A(63,26,1), AFRALFRC_MASK, PPC, POWER7, {FRT, FRB, A_L}},
! {"frsqrte", A(63,26,0), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}},
! {"frsqrte.", A(63,26,1), AFRAFRC_MASK, POWER7, PPCNONE, {FRT, FRB}},
{"fmsub", A(63,28,0), A_MASK, PPCCOM, PPCNONE, {FRT, FRA, FRC, FRB}},
{"fms", A(63,28,0), A_MASK, PWRCOM, PPCNONE, {FRT, FRA, FRC, FRB}},
*************** const struct powerpc_opcode powerpc_opco
*** 4885,4890 ****
--- 5191,5198 ----
{"drintxq", ZRC(63,99,0), Z2_MASK, POWER6, PPCNONE, {R, FRT, FRB, RMC}},
{"drintxq.", ZRC(63,99,1), Z2_MASK, POWER6, PPCNONE, {R, FRT, FRB, RMC}},
+ {"ftdiv", X(63,128), X_MASK|(3<<21), POWER7, PPCNONE, {BF, FRA, FRB}},
+
{"dcmpoq", X(63,130), X_MASK, POWER6, PPCNONE, {BF, FRA, FRB}},
{"mtfsfi", XRC(63,134,0), XRA_MASK|(3<<21)|(1<<11), COM, POWER6, {BFF, U}},
*************** const struct powerpc_opcode powerpc_opco
*** 4895,4900 ****
--- 5203,5215 ----
{"fnabs", XRC(63,136,0), XRA_MASK, COM, PPCNONE, {FRT, FRB}},
{"fnabs.", XRC(63,136,1), XRA_MASK, COM, PPCNONE, {FRT, FRB}},
+ {"fctiwu", XRC(63,142,0), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+ {"fctiwu.", XRC(63,142,1), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+ {"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}},
+
{"dtstexq", X(63,162), X_MASK, POWER6, PPCNONE, {BF, FRA, FRB}},
{"dtstdcq", Z(63,194), Z_MASK, POWER6, PPCNONE, {BF, FRA, DCM}},
{"dtstdgq", Z(63,226), Z_MASK, POWER6, PPCNONE, {BF, FRA, DGM}},
*************** const struct powerpc_opcode powerpc_opco
*** 4965,4970 ****
--- 5280,5293 ----
{"diexq", XRC(63,866,0), X_MASK, POWER6, PPCNONE, {FRT, FRA, FRB}},
{"diexq.", XRC(63,866,1), X_MASK, POWER6, PPCNONE, {FRT, FRA, FRB}},
+ {"fctidu", XRC(63,942,0), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+ {"fctidu.", XRC(63,942,1), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+
+ {"fctiduz", XRC(63,943,0), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+ {"fctiduz.", XRC(63,943,1), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+
+ {"fcfidu", XRC(63,974,0), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
+ {"fcfidu.", XRC(63,974,1), XRA_MASK, POWER7, PPCNONE, {FRT, FRB}},
};
const int powerpc_num_opcodes =