github.com/epfl-dcsl/gotee@v0.0.0-20200909122901-014b35f5e5e9/src/cmd/internal/obj/ppc64/asm9.go (about)

     1  // cmd/9l/optab.c, cmd/9l/asmout.c from Vita Nuova.
     2  //
     3  //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
     4  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
     5  //	Portions Copyright © 1997-1999 Vita Nuova Limited
     6  //	Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
     7  //	Portions Copyright © 2004,2006 Bruce Ellis
     8  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
     9  //	Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
    10  //	Portions Copyright © 2009 The Go Authors. All rights reserved.
    11  //
    12  // Permission is hereby granted, free of charge, to any person obtaining a copy
    13  // of this software and associated documentation files (the "Software"), to deal
    14  // in the Software without restriction, including without limitation the rights
    15  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    16  // copies of the Software, and to permit persons to whom the Software is
    17  // furnished to do so, subject to the following conditions:
    18  //
    19  // The above copyright notice and this permission notice shall be included in
    20  // all copies or substantial portions of the Software.
    21  //
    22  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    23  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    24  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    25  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    26  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    27  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    28  // THE SOFTWARE.
    29  
    30  package ppc64
    31  
    32  import (
    33  	"cmd/internal/obj"
    34  	"cmd/internal/objabi"
    35  	"encoding/binary"
    36  	"fmt"
    37  	"log"
    38  	"sort"
    39  )
    40  
    41  // ctxt9 holds state while assembling a single function.
    42  // Each function gets a fresh ctxt9.
    43  // This allows for multiple functions to be safely concurrently assembled.
    44  type ctxt9 struct {
    45  	ctxt       *obj.Link
    46  	newprog    obj.ProgAlloc
    47  	cursym     *obj.LSym
    48  	autosize   int32
    49  	instoffset int64
    50  	pc         int64
    51  }
    52  
    53  // Instruction layout.
    54  
    55  const (
    56  	funcAlign = 16
    57  )
    58  
    59  const (
    60  	r0iszero = 1
    61  )
    62  
    63  type Optab struct {
    64  	as    obj.As // Opcode
    65  	a1    uint8
    66  	a2    uint8
    67  	a3    uint8
    68  	a4    uint8
    69  	type_ int8 // cases in asmout below. E.g., 44 = st r,(ra+rb); 45 = ld (ra+rb), r
    70  	size  int8
    71  	param int16
    72  }
    73  
    74  var optab = []Optab{
    75  	{obj.ATEXT, C_LEXT, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0},
    76  	{obj.ATEXT, C_LEXT, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0},
    77  	{obj.ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0},
    78  	{obj.ATEXT, C_ADDR, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0},
    79  	/* move register */
    80  	{AMOVD, C_REG, C_NONE, C_NONE, C_REG, 1, 4, 0},
    81  	{AMOVB, C_REG, C_NONE, C_NONE, C_REG, 12, 4, 0},
    82  	{AMOVBZ, C_REG, C_NONE, C_NONE, C_REG, 13, 4, 0},
    83  	{AMOVW, C_REG, C_NONE, C_NONE, C_REG, 12, 4, 0},
    84  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_REG, 13, 4, 0},
    85  	{AADD, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
    86  	{AADD, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
    87  	{AADD, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
    88  	{AADD, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
    89  	{AADD, C_UCON, C_REG, C_NONE, C_REG, 20, 4, 0},
    90  	{AADD, C_UCON, C_NONE, C_NONE, C_REG, 20, 4, 0},
    91  	{AADD, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
    92  	{AADD, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
    93  	{AADDC, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
    94  	{AADDC, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
    95  	{AADDC, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
    96  	{AADDC, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
    97  	{AADDC, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
    98  	{AADDC, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
    99  	{AAND, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0}, /* logical, no literal */
   100  	{AAND, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
   101  	{AANDCC, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
   102  	{AANDCC, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
   103  	{AANDCC, C_ANDCON, C_NONE, C_NONE, C_REG, 58, 4, 0},
   104  	{AANDCC, C_ANDCON, C_REG, C_NONE, C_REG, 58, 4, 0},
   105  	{AANDCC, C_UCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
   106  	{AANDCC, C_UCON, C_REG, C_NONE, C_REG, 59, 4, 0},
   107  	{AANDCC, C_LCON, C_NONE, C_NONE, C_REG, 23, 12, 0},
   108  	{AANDCC, C_LCON, C_REG, C_NONE, C_REG, 23, 12, 0},
   109  	{AMULLW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
   110  	{AMULLW, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
   111  	{AMULLW, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
   112  	{AMULLW, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
   113  	{AMULLW, C_ANDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
   114  	{AMULLW, C_ANDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
   115  	{AMULLW, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
   116  	{AMULLW, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
   117  	{ASUBC, C_REG, C_REG, C_NONE, C_REG, 10, 4, 0},
   118  	{ASUBC, C_REG, C_NONE, C_NONE, C_REG, 10, 4, 0},
   119  	{ASUBC, C_REG, C_NONE, C_ADDCON, C_REG, 27, 4, 0},
   120  	{ASUBC, C_REG, C_NONE, C_LCON, C_REG, 28, 12, 0},
   121  	{AOR, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0}, /* logical, literal not cc (or/xor) */
   122  	{AOR, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
   123  	{AOR, C_ANDCON, C_NONE, C_NONE, C_REG, 58, 4, 0},
   124  	{AOR, C_ANDCON, C_REG, C_NONE, C_REG, 58, 4, 0},
   125  	{AOR, C_UCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
   126  	{AOR, C_UCON, C_REG, C_NONE, C_REG, 59, 4, 0},
   127  	{AOR, C_LCON, C_NONE, C_NONE, C_REG, 23, 12, 0},
   128  	{AOR, C_LCON, C_REG, C_NONE, C_REG, 23, 12, 0},
   129  	{ADIVW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0}, /* op r1[,r2],r3 */
   130  	{ADIVW, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
   131  	{ASUB, C_REG, C_REG, C_NONE, C_REG, 10, 4, 0}, /* op r2[,r1],r3 */
   132  	{ASUB, C_REG, C_NONE, C_NONE, C_REG, 10, 4, 0},
   133  	{ASLW, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
   134  	{ASLW, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
   135  	{ASLD, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
   136  	{ASLD, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
   137  	{ASLD, C_SCON, C_REG, C_NONE, C_REG, 25, 4, 0},
   138  	{ASLD, C_SCON, C_NONE, C_NONE, C_REG, 25, 4, 0},
   139  	{ASLW, C_SCON, C_REG, C_NONE, C_REG, 57, 4, 0},
   140  	{ASLW, C_SCON, C_NONE, C_NONE, C_REG, 57, 4, 0},
   141  	{ASRAW, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
   142  	{ASRAW, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
   143  	{ASRAW, C_SCON, C_REG, C_NONE, C_REG, 56, 4, 0},
   144  	{ASRAW, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
   145  	{ASRAD, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
   146  	{ASRAD, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
   147  	{ASRAD, C_SCON, C_REG, C_NONE, C_REG, 56, 4, 0},
   148  	{ASRAD, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
   149  	{ARLWMI, C_SCON, C_REG, C_LCON, C_REG, 62, 4, 0},
   150  	{ARLWMI, C_REG, C_REG, C_LCON, C_REG, 63, 4, 0},
   151  	{ARLDMI, C_SCON, C_REG, C_LCON, C_REG, 30, 4, 0},
   152  	{ARLDC, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
   153  	{ARLDCL, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
   154  	{ARLDCL, C_REG, C_REG, C_LCON, C_REG, 14, 4, 0},
   155  	{ARLDICL, C_REG, C_REG, C_LCON, C_REG, 14, 4, 0},
   156  	{ARLDICL, C_SCON, C_REG, C_LCON, C_REG, 14, 4, 0},
   157  	{ARLDCL, C_REG, C_NONE, C_LCON, C_REG, 14, 4, 0},
   158  	{AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 2, 4, 0},
   159  	{AFADD, C_FREG, C_FREG, C_NONE, C_FREG, 2, 4, 0},
   160  	{AFABS, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0},
   161  	{AFABS, C_NONE, C_NONE, C_NONE, C_FREG, 33, 4, 0},
   162  	{AFMOVD, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0},
   163  	{AFMADD, C_FREG, C_FREG, C_FREG, C_FREG, 34, 4, 0},
   164  	{AFMUL, C_FREG, C_NONE, C_NONE, C_FREG, 32, 4, 0},
   165  	{AFMUL, C_FREG, C_FREG, C_NONE, C_FREG, 32, 4, 0},
   166  
   167  	/* store, short offset */
   168  	{AMOVD, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
   169  	{AMOVW, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
   170  	{AMOVWZ, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
   171  	{AMOVBZ, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
   172  	{AMOVBZU, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
   173  	{AMOVB, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
   174  	{AMOVBU, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
   175  	{AMOVD, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
   176  	{AMOVW, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
   177  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
   178  	{AMOVBZ, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
   179  	{AMOVB, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
   180  	{AMOVD, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
   181  	{AMOVW, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
   182  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
   183  	{AMOVBZ, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
   184  	{AMOVB, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
   185  	{AMOVD, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
   186  	{AMOVW, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
   187  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
   188  	{AMOVBZ, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
   189  	{AMOVBZU, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
   190  	{AMOVB, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
   191  	{AMOVBU, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
   192  
   193  	/* load, short offset */
   194  	{AMOVD, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
   195  	{AMOVW, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
   196  	{AMOVWZ, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
   197  	{AMOVBZ, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
   198  	{AMOVBZU, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
   199  	{AMOVB, C_ZOREG, C_REG, C_NONE, C_REG, 9, 8, REGZERO},
   200  	{AMOVBU, C_ZOREG, C_REG, C_NONE, C_REG, 9, 8, REGZERO},
   201  	{AMOVD, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
   202  	{AMOVW, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
   203  	{AMOVWZ, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
   204  	{AMOVBZ, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
   205  	{AMOVB, C_SEXT, C_NONE, C_NONE, C_REG, 9, 8, REGSB},
   206  	{AMOVD, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
   207  	{AMOVW, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
   208  	{AMOVWZ, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
   209  	{AMOVBZ, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
   210  	{AMOVB, C_SAUTO, C_NONE, C_NONE, C_REG, 9, 8, REGSP},
   211  	{AMOVD, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
   212  	{AMOVW, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
   213  	{AMOVWZ, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
   214  	{AMOVBZ, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
   215  	{AMOVBZU, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
   216  	{AMOVB, C_SOREG, C_NONE, C_NONE, C_REG, 9, 8, REGZERO},
   217  	{AMOVBU, C_SOREG, C_NONE, C_NONE, C_REG, 9, 8, REGZERO},
   218  
   219  	/* store, long offset */
   220  	{AMOVD, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
   221  	{AMOVW, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
   222  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
   223  	{AMOVBZ, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
   224  	{AMOVB, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
   225  	{AMOVD, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
   226  	{AMOVW, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
   227  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
   228  	{AMOVBZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
   229  	{AMOVB, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
   230  	{AMOVD, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
   231  	{AMOVW, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
   232  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
   233  	{AMOVBZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
   234  	{AMOVB, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
   235  	{AMOVD, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
   236  	{AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
   237  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
   238  	{AMOVBZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
   239  	{AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
   240  
   241  	/* load, long offset */
   242  	{AMOVD, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
   243  	{AMOVW, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
   244  	{AMOVWZ, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
   245  	{AMOVBZ, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
   246  	{AMOVB, C_LEXT, C_NONE, C_NONE, C_REG, 37, 12, REGSB},
   247  	{AMOVD, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
   248  	{AMOVW, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
   249  	{AMOVWZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
   250  	{AMOVBZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
   251  	{AMOVB, C_LAUTO, C_NONE, C_NONE, C_REG, 37, 12, REGSP},
   252  	{AMOVD, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
   253  	{AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
   254  	{AMOVWZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
   255  	{AMOVBZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
   256  	{AMOVB, C_LOREG, C_NONE, C_NONE, C_REG, 37, 12, REGZERO},
   257  	{AMOVD, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
   258  	{AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
   259  	{AMOVWZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
   260  	{AMOVBZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
   261  	{AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, 76, 12, 0},
   262  
   263  	{AMOVD, C_TLS_LE, C_NONE, C_NONE, C_REG, 79, 4, 0},
   264  	{AMOVD, C_TLS_IE, C_NONE, C_NONE, C_REG, 80, 8, 0},
   265  
   266  	{AMOVD, C_GOTADDR, C_NONE, C_NONE, C_REG, 81, 8, 0},
   267  
   268  	/* load constant */
   269  	{AMOVD, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB},
   270  	{AMOVD, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
   271  	{AMOVD, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
   272  	{AMOVD, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
   273  	{AMOVD, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
   274  	{AMOVW, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB}, /* TO DO: check */
   275  	{AMOVW, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
   276  	{AMOVW, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
   277  	{AMOVW, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
   278  	{AMOVW, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
   279  	{AMOVWZ, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB}, /* TO DO: check */
   280  	{AMOVWZ, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
   281  	{AMOVWZ, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
   282  	{AMOVWZ, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
   283  	{AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
   284  
   285  	/* load unsigned/long constants (TO DO: check) */
   286  	{AMOVD, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
   287  	{AMOVD, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
   288  	{AMOVW, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
   289  	{AMOVW, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
   290  	{AMOVWZ, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
   291  	{AMOVWZ, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
   292  	{AMOVHBR, C_ZOREG, C_REG, C_NONE, C_REG, 45, 4, 0},
   293  	{AMOVHBR, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
   294  	{AMOVHBR, C_REG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
   295  	{AMOVHBR, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
   296  	{ASYSCALL, C_NONE, C_NONE, C_NONE, C_NONE, 5, 4, 0},
   297  	{ASYSCALL, C_REG, C_NONE, C_NONE, C_NONE, 77, 12, 0},
   298  	{ASYSCALL, C_SCON, C_NONE, C_NONE, C_NONE, 77, 12, 0},
   299  	{ABEQ, C_NONE, C_NONE, C_NONE, C_SBRA, 16, 4, 0},
   300  	{ABEQ, C_CREG, C_NONE, C_NONE, C_SBRA, 16, 4, 0},
   301  	{ABR, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0},
   302  	{ABR, C_NONE, C_NONE, C_NONE, C_LBRAPIC, 11, 8, 0},
   303  	{ABC, C_SCON, C_REG, C_NONE, C_SBRA, 16, 4, 0},
   304  	{ABC, C_SCON, C_REG, C_NONE, C_LBRA, 17, 4, 0},
   305  	{ABR, C_NONE, C_NONE, C_NONE, C_LR, 18, 4, 0},
   306  	{ABR, C_NONE, C_NONE, C_NONE, C_CTR, 18, 4, 0},
   307  	{ABR, C_REG, C_NONE, C_NONE, C_CTR, 18, 4, 0},
   308  	{ABR, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 8, 0},
   309  	{ABC, C_NONE, C_REG, C_NONE, C_LR, 18, 4, 0},
   310  	{ABC, C_NONE, C_REG, C_NONE, C_CTR, 18, 4, 0},
   311  	{ABC, C_SCON, C_REG, C_NONE, C_LR, 18, 4, 0},
   312  	{ABC, C_SCON, C_REG, C_NONE, C_CTR, 18, 4, 0},
   313  	{ABC, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 8, 0},
   314  	{AFMOVD, C_SEXT, C_NONE, C_NONE, C_FREG, 8, 4, REGSB},
   315  	{AFMOVD, C_SAUTO, C_NONE, C_NONE, C_FREG, 8, 4, REGSP},
   316  	{AFMOVD, C_SOREG, C_NONE, C_NONE, C_FREG, 8, 4, REGZERO},
   317  	{AFMOVD, C_LEXT, C_NONE, C_NONE, C_FREG, 36, 8, REGSB},
   318  	{AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 36, 8, REGSP},
   319  	{AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 36, 8, REGZERO},
   320  	{AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75, 8, 0},
   321  	{AFMOVD, C_FREG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
   322  	{AFMOVD, C_FREG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
   323  	{AFMOVD, C_FREG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
   324  	{AFMOVD, C_FREG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
   325  	{AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
   326  	{AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
   327  	{AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
   328  	{AFMOVSX, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0},
   329  	{AFMOVSX, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0},
   330  	{AFMOVSX, C_FREG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
   331  	{AFMOVSX, C_FREG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
   332  	{AFMOVSZ, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0},
   333  	{AFMOVSZ, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0},
   334  	{ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0},
   335  	{AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40, 4, 0},
   336  	{ADWORD, C_LCON, C_NONE, C_NONE, C_NONE, 31, 8, 0},
   337  	{ADWORD, C_DCON, C_NONE, C_NONE, C_NONE, 31, 8, 0},
   338  	{AADDME, C_REG, C_NONE, C_NONE, C_REG, 47, 4, 0},
   339  	{AEXTSB, C_REG, C_NONE, C_NONE, C_REG, 48, 4, 0},
   340  	{AEXTSB, C_NONE, C_NONE, C_NONE, C_REG, 48, 4, 0},
   341  	{AISEL, C_LCON, C_REG, C_REG, C_REG, 84, 4, 0},
   342  	{AISEL, C_ZCON, C_REG, C_REG, C_REG, 84, 4, 0},
   343  	{ANEG, C_REG, C_NONE, C_NONE, C_REG, 47, 4, 0},
   344  	{ANEG, C_NONE, C_NONE, C_NONE, C_REG, 47, 4, 0},
   345  	{AREM, C_REG, C_NONE, C_NONE, C_REG, 50, 12, 0},
   346  	{AREM, C_REG, C_REG, C_NONE, C_REG, 50, 12, 0},
   347  	{AREMU, C_REG, C_NONE, C_NONE, C_REG, 50, 16, 0},
   348  	{AREMU, C_REG, C_REG, C_NONE, C_REG, 50, 16, 0},
   349  	{AREMD, C_REG, C_NONE, C_NONE, C_REG, 51, 12, 0},
   350  	{AREMD, C_REG, C_REG, C_NONE, C_REG, 51, 12, 0},
   351  	{AREMDU, C_REG, C_NONE, C_NONE, C_REG, 51, 12, 0},
   352  	{AREMDU, C_REG, C_REG, C_NONE, C_REG, 51, 12, 0},
   353  	{AMTFSB0, C_SCON, C_NONE, C_NONE, C_NONE, 52, 4, 0},
   354  	{AMOVFL, C_FPSCR, C_NONE, C_NONE, C_FREG, 53, 4, 0},
   355  	{AMOVFL, C_FREG, C_NONE, C_NONE, C_FPSCR, 64, 4, 0},
   356  	{AMOVFL, C_FREG, C_NONE, C_LCON, C_FPSCR, 64, 4, 0},
   357  	{AMOVFL, C_LCON, C_NONE, C_NONE, C_FPSCR, 65, 4, 0},
   358  	{AMOVD, C_MSR, C_NONE, C_NONE, C_REG, 54, 4, 0},  /* mfmsr */
   359  	{AMOVD, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0},  /* mtmsrd */
   360  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0}, /* mtmsr */
   361  
   362  	/* Other ISA 2.05+ instructions */
   363  	{APOPCNTD, C_REG, C_NONE, C_NONE, C_REG, 93, 4, 0},  /* population count, x-form */
   364  	{ACMPB, C_REG, C_REG, C_NONE, C_REG, 92, 4, 0},      /* compare byte, x-form */
   365  	{ACMPEQB, C_REG, C_REG, C_NONE, C_CREG, 92, 4, 0},   /* compare equal byte, x-form */
   366  	{AFTDIV, C_FREG, C_FREG, C_NONE, C_SCON, 92, 4, 0},  /* floating test for sw divide, x-form */
   367  	{AFTSQRT, C_FREG, C_NONE, C_NONE, C_SCON, 93, 4, 0}, /* floating test for sw square root, x-form */
   368  	{ACOPY, C_REG, C_NONE, C_NONE, C_REG, 92, 4, 0},     /* copy/paste facility, x-form */
   369  	{ADARN, C_SCON, C_NONE, C_NONE, C_REG, 92, 4, 0},    /* deliver random number, x-form */
   370  	{ALDMX, C_SOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},   /* load doubleword monitored, x-form */
   371  	{AMADDHD, C_REG, C_REG, C_REG, C_REG, 83, 4, 0},     /* multiply-add high/low doubleword, va-form */
   372  	{AADDEX, C_REG, C_REG, C_SCON, C_REG, 94, 4, 0},     /* add extended using alternate carry, z23-form */
   373  
   374  	/* Vector instructions */
   375  
   376  	/* Vector load */
   377  	{ALV, C_SOREG, C_NONE, C_NONE, C_VREG, 45, 4, 0}, /* vector load, x-form */
   378  
   379  	/* Vector store */
   380  	{ASTV, C_VREG, C_NONE, C_NONE, C_SOREG, 44, 4, 0}, /* vector store, x-form */
   381  
   382  	/* Vector logical */
   383  	{AVAND, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector and, vx-form */
   384  	{AVOR, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},  /* vector or, vx-form */
   385  
   386  	/* Vector add */
   387  	{AVADDUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add unsigned modulo, vx-form */
   388  	{AVADDCU, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add & write carry unsigned, vx-form */
   389  	{AVADDUS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add unsigned saturate, vx-form */
   390  	{AVADDSS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add signed saturate, vx-form */
   391  	{AVADDE, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0},  /* vector add extended, va-form */
   392  
   393  	/* Vector subtract */
   394  	{AVSUBUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract unsigned modulo, vx-form */
   395  	{AVSUBCU, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract & write carry unsigned, vx-form */
   396  	{AVSUBUS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract unsigned saturate, vx-form */
   397  	{AVSUBSS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract signed saturate, vx-form */
   398  	{AVSUBE, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0},  /* vector subtract extended, va-form */
   399  
   400  	/* Vector multiply */
   401  	{AVPMSUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},   /* vector polynomial multiply & sum, vx-form */
   402  	{AVMSUMUDM, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector multiply-sum, va-form */
   403  
   404  	/* Vector rotate */
   405  	{AVR, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector rotate, vx-form */
   406  
   407  	/* Vector shift */
   408  	{AVS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},     /* vector shift, vx-form */
   409  	{AVSA, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},    /* vector shift algebraic, vx-form */
   410  	{AVSOI, C_ANDCON, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector shift by octet immediate, va-form */
   411  
   412  	/* Vector count */
   413  	{AVCLZ, C_VREG, C_NONE, C_NONE, C_VREG, 85, 4, 0},    /* vector count leading zeros, vx-form */
   414  	{AVPOPCNT, C_VREG, C_NONE, C_NONE, C_VREG, 85, 4, 0}, /* vector population count, vx-form */
   415  
   416  	/* Vector compare */
   417  	{AVCMPEQ, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},   /* vector compare equal, vc-form */
   418  	{AVCMPGT, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},   /* vector compare greater than, vc-form */
   419  	{AVCMPNEZB, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector compare not equal, vx-form */
   420  
   421  	/* Vector permute */
   422  	{AVPERM, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector permute, va-form */
   423  
   424  	/* Vector bit permute */
   425  	{AVBPERMQ, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector bit permute, vx-form */
   426  
   427  	/* Vector select */
   428  	{AVSEL, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector select, va-form */
   429  
   430  	/* Vector splat */
   431  	{AVSPLT, C_SCON, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector splat, vx-form */
   432  	{AVSPLT, C_ADDCON, C_VREG, C_NONE, C_VREG, 82, 4, 0},
   433  	{AVSPLTI, C_SCON, C_NONE, C_NONE, C_VREG, 82, 4, 0}, /* vector splat immediate, vx-form */
   434  	{AVSPLTI, C_ADDCON, C_NONE, C_NONE, C_VREG, 82, 4, 0},
   435  
   436  	/* Vector AES */
   437  	{AVCIPH, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0},  /* vector AES cipher, vx-form */
   438  	{AVNCIPH, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector AES inverse cipher, vx-form */
   439  	{AVSBOX, C_VREG, C_NONE, C_NONE, C_VREG, 82, 4, 0},  /* vector AES subbytes, vx-form */
   440  
   441  	/* Vector SHA */
   442  	{AVSHASIGMA, C_ANDCON, C_VREG, C_ANDCON, C_VREG, 82, 4, 0}, /* vector SHA sigma, vx-form */
   443  
   444  	/* VSX vector load */
   445  	{ALXV, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx vector load, xx1-form */
   446  
   447  	/* VSX vector store */
   448  	{ASTXV, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx vector store, xx1-form */
   449  
   450  	/* VSX scalar load */
   451  	{ALXS, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx scalar load, xx1-form */
   452  
   453  	/* VSX scalar store */
   454  	{ASTXS, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx scalar store, xx1-form */
   455  
   456  	/* VSX scalar as integer load */
   457  	{ALXSI, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx scalar as integer load, xx1-form */
   458  
   459  	/* VSX scalar store as integer */
   460  	{ASTXSI, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx scalar as integer store, xx1-form */
   461  
   462  	/* VSX move from VSR */
   463  	{AMFVSR, C_VSREG, C_NONE, C_NONE, C_REG, 88, 4, 0}, /* vsx move from vsr, xx1-form */
   464  	{AMFVSR, C_FREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
   465  	{AMFVSR, C_VREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
   466  
   467  	/* VSX move to VSR */
   468  	{AMTVSR, C_REG, C_NONE, C_NONE, C_VSREG, 88, 4, 0}, /* vsx move to vsr, xx1-form */
   469  	{AMTVSR, C_REG, C_REG, C_NONE, C_VSREG, 88, 4, 0},
   470  	{AMTVSR, C_REG, C_NONE, C_NONE, C_FREG, 88, 4, 0},
   471  	{AMTVSR, C_REG, C_NONE, C_NONE, C_VREG, 88, 4, 0},
   472  
   473  	/* VSX logical */
   474  	{AXXLAND, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx and, xx3-form */
   475  	{AXXLOR, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0},  /* vsx or, xx3-form */
   476  
   477  	/* VSX select */
   478  	{AXXSEL, C_VSREG, C_VSREG, C_VSREG, C_VSREG, 91, 4, 0}, /* vsx select, xx4-form */
   479  
   480  	/* VSX merge */
   481  	{AXXMRG, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx merge, xx3-form */
   482  
   483  	/* VSX splat */
   484  	{AXXSPLT, C_VSREG, C_NONE, C_SCON, C_VSREG, 89, 4, 0}, /* vsx splat, xx2-form */
   485  
   486  	/* VSX permute */
   487  	{AXXPERM, C_VSREG, C_VSREG, C_SCON, C_VSREG, 90, 4, 0}, /* vsx permute, xx3-form */
   488  
   489  	/* VSX shift */
   490  	{AXXSI, C_VSREG, C_VSREG, C_SCON, C_VSREG, 90, 4, 0}, /* vsx shift immediate, xx3-form */
   491  
   492  	/* VSX scalar FP-FP conversion */
   493  	{AXSCV, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar fp-fp conversion, xx2-form */
   494  
   495  	/* VSX vector FP-FP conversion */
   496  	{AXVCV, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector fp-fp conversion, xx2-form */
   497  
   498  	/* VSX scalar FP-integer conversion */
   499  	{AXSCVX, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar fp-integer conversion, xx2-form */
   500  
   501  	/* VSX scalar integer-FP conversion */
   502  	{AXSCVXP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar integer-fp conversion, xx2-form */
   503  
   504  	/* VSX vector FP-integer conversion */
   505  	{AXVCVX, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector fp-integer conversion, xx2-form */
   506  
   507  	/* VSX vector integer-FP conversion */
   508  	{AXVCVXP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector integer-fp conversion, xx2-form */
   509  
   510  	/* 64-bit special registers */
   511  	{AMOVD, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
   512  	{AMOVD, C_REG, C_NONE, C_NONE, C_LR, 66, 4, 0},
   513  	{AMOVD, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
   514  	{AMOVD, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
   515  	{AMOVD, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
   516  	{AMOVD, C_LR, C_NONE, C_NONE, C_REG, 66, 4, 0},
   517  	{AMOVD, C_CTR, C_NONE, C_NONE, C_REG, 66, 4, 0},
   518  	{AMOVD, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
   519  
   520  	/* 32-bit special registers (gloss over sign-extension or not?) */
   521  	{AMOVW, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
   522  	{AMOVW, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
   523  	{AMOVW, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
   524  	{AMOVW, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
   525  	{AMOVW, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
   526  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
   527  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
   528  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
   529  	{AMOVWZ, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
   530  	{AMOVWZ, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
   531  	{AMOVFL, C_FPSCR, C_NONE, C_NONE, C_CREG, 73, 4, 0},
   532  	{AMOVFL, C_CREG, C_NONE, C_NONE, C_CREG, 67, 4, 0},
   533  	{AMOVW, C_CREG, C_NONE, C_NONE, C_REG, 68, 4, 0},
   534  	{AMOVWZ, C_CREG, C_NONE, C_NONE, C_REG, 68, 4, 0},
   535  	{AMOVFL, C_REG, C_NONE, C_NONE, C_LCON, 69, 4, 0},
   536  	{AMOVFL, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
   537  	{AMOVW, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
   538  	{AMOVWZ, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
   539  	{ACMP, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
   540  	{ACMP, C_REG, C_REG, C_NONE, C_REG, 70, 4, 0},
   541  	{ACMP, C_REG, C_NONE, C_NONE, C_ADDCON, 71, 4, 0},
   542  	{ACMP, C_REG, C_REG, C_NONE, C_ADDCON, 71, 4, 0},
   543  	{ACMPU, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
   544  	{ACMPU, C_REG, C_REG, C_NONE, C_REG, 70, 4, 0},
   545  	{ACMPU, C_REG, C_NONE, C_NONE, C_ANDCON, 71, 4, 0},
   546  	{ACMPU, C_REG, C_REG, C_NONE, C_ANDCON, 71, 4, 0},
   547  	{AFCMPO, C_FREG, C_NONE, C_NONE, C_FREG, 70, 4, 0},
   548  	{AFCMPO, C_FREG, C_REG, C_NONE, C_FREG, 70, 4, 0},
   549  	{ATW, C_LCON, C_REG, C_NONE, C_REG, 60, 4, 0},
   550  	{ATW, C_LCON, C_REG, C_NONE, C_ADDCON, 61, 4, 0},
   551  	{ADCBF, C_ZOREG, C_NONE, C_NONE, C_NONE, 43, 4, 0},
   552  	{ADCBF, C_SOREG, C_NONE, C_NONE, C_NONE, 43, 4, 0},
   553  	{ADCBF, C_ZOREG, C_REG, C_NONE, C_SCON, 43, 4, 0},
   554  	{ADCBF, C_SOREG, C_NONE, C_NONE, C_SCON, 43, 4, 0},
   555  	{AECOWX, C_REG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
   556  	{AECIWX, C_ZOREG, C_REG, C_NONE, C_REG, 45, 4, 0},
   557  	{AECOWX, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
   558  	{AECIWX, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
   559  	{AEIEIO, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0},
   560  	{ATLBIE, C_REG, C_NONE, C_NONE, C_NONE, 49, 4, 0},
   561  	{ATLBIE, C_SCON, C_NONE, C_NONE, C_REG, 49, 4, 0},
   562  	{ASLBMFEE, C_REG, C_NONE, C_NONE, C_REG, 55, 4, 0},
   563  	{ASLBMTE, C_REG, C_NONE, C_NONE, C_REG, 55, 4, 0},
   564  	{ASTSW, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
   565  	{ASTSW, C_REG, C_NONE, C_LCON, C_ZOREG, 41, 4, 0},
   566  	{ALSW, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
   567  	{ALSW, C_ZOREG, C_NONE, C_LCON, C_REG, 42, 4, 0},
   568  	{obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, 78, 4, 0},
   569  	{obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0, 0, 0},
   570  	{obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0},
   571  	{obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0},
   572  	{obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
   573  	{obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
   574  
   575  	{obj.AXXX, C_NONE, C_NONE, C_NONE, C_NONE, 0, 4, 0},
   576  }
   577  
   578  var oprange [ALAST & obj.AMask][]Optab
   579  
   580  var xcmp [C_NCLASS][C_NCLASS]bool
   581  
   582  func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
   583  	p := cursym.Func.Text
   584  	if p == nil || p.Link == nil { // handle external functions and ELF section symbols
   585  		return
   586  	}
   587  
   588  	if oprange[AANDN&obj.AMask] == nil {
   589  		ctxt.Diag("ppc64 ops not initialized, call ppc64.buildop first")
   590  	}
   591  
   592  	c := ctxt9{ctxt: ctxt, newprog: newprog, cursym: cursym, autosize: int32(p.To.Offset)}
   593  
   594  	pc := int64(0)
   595  	p.Pc = pc
   596  
   597  	var m int
   598  	var o *Optab
   599  	for p = p.Link; p != nil; p = p.Link {
   600  		p.Pc = pc
   601  		o = c.oplook(p)
   602  		m = int(o.size)
   603  		if m == 0 {
   604  			if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
   605  				c.ctxt.Diag("zero-width instruction\n%v", p)
   606  			}
   607  			continue
   608  		}
   609  
   610  		pc += int64(m)
   611  	}
   612  
   613  	c.cursym.Size = pc
   614  
   615  	/*
   616  	 * if any procedure is large enough to
   617  	 * generate a large SBRA branch, then
   618  	 * generate extra passes putting branches
   619  	 * around jmps to fix. this is rare.
   620  	 */
   621  	bflag := 1
   622  
   623  	var otxt int64
   624  	var q *obj.Prog
   625  	for bflag != 0 {
   626  		bflag = 0
   627  		pc = 0
   628  		for p = c.cursym.Func.Text.Link; p != nil; p = p.Link {
   629  			p.Pc = pc
   630  			o = c.oplook(p)
   631  
   632  			// very large conditional branches
   633  			if (o.type_ == 16 || o.type_ == 17) && p.Pcond != nil {
   634  				otxt = p.Pcond.Pc - pc
   635  				if otxt < -(1<<15)+10 || otxt >= (1<<15)-10 {
   636  					q = c.newprog()
   637  					q.Link = p.Link
   638  					p.Link = q
   639  					q.As = ABR
   640  					q.To.Type = obj.TYPE_BRANCH
   641  					q.Pcond = p.Pcond
   642  					p.Pcond = q
   643  					q = c.newprog()
   644  					q.Link = p.Link
   645  					p.Link = q
   646  					q.As = ABR
   647  					q.To.Type = obj.TYPE_BRANCH
   648  					q.Pcond = q.Link.Link
   649  
   650  					//addnop(p->link);
   651  					//addnop(p);
   652  					bflag = 1
   653  				}
   654  			}
   655  
   656  			m = int(o.size)
   657  			if m == 0 {
   658  				if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
   659  					c.ctxt.Diag("zero-width instruction\n%v", p)
   660  				}
   661  				continue
   662  			}
   663  
   664  			pc += int64(m)
   665  		}
   666  
   667  		c.cursym.Size = pc
   668  	}
   669  
   670  	pc += -pc & (funcAlign - 1)
   671  	c.cursym.Size = pc
   672  
   673  	/*
   674  	 * lay out the code, emitting code and data relocations.
   675  	 */
   676  
   677  	c.cursym.Grow(c.cursym.Size)
   678  
   679  	bp := c.cursym.P
   680  	var i int32
   681  	var out [6]uint32
   682  	for p := c.cursym.Func.Text.Link; p != nil; p = p.Link {
   683  		c.pc = p.Pc
   684  		o = c.oplook(p)
   685  		if int(o.size) > 4*len(out) {
   686  			log.Fatalf("out array in span9 is too small, need at least %d for %v", o.size/4, p)
   687  		}
   688  		c.asmout(p, o, out[:])
   689  		for i = 0; i < int32(o.size/4); i++ {
   690  			c.ctxt.Arch.ByteOrder.PutUint32(bp, out[i])
   691  			bp = bp[4:]
   692  		}
   693  	}
   694  }
   695  
   696  func isint32(v int64) bool {
   697  	return int64(int32(v)) == v
   698  }
   699  
   700  func isuint32(v uint64) bool {
   701  	return uint64(uint32(v)) == v
   702  }
   703  
   704  func (c *ctxt9) aclass(a *obj.Addr) int {
   705  	switch a.Type {
   706  	case obj.TYPE_NONE:
   707  		return C_NONE
   708  
   709  	case obj.TYPE_REG:
   710  		if REG_R0 <= a.Reg && a.Reg <= REG_R31 {
   711  			return C_REG
   712  		}
   713  		if REG_F0 <= a.Reg && a.Reg <= REG_F31 {
   714  			return C_FREG
   715  		}
   716  		if REG_V0 <= a.Reg && a.Reg <= REG_V31 {
   717  			return C_VREG
   718  		}
   719  		if REG_VS0 <= a.Reg && a.Reg <= REG_VS63 {
   720  			return C_VSREG
   721  		}
   722  		if REG_CR0 <= a.Reg && a.Reg <= REG_CR7 || a.Reg == REG_CR {
   723  			return C_CREG
   724  		}
   725  		if REG_SPR0 <= a.Reg && a.Reg <= REG_SPR0+1023 {
   726  			switch a.Reg {
   727  			case REG_LR:
   728  				return C_LR
   729  
   730  			case REG_XER:
   731  				return C_XER
   732  
   733  			case REG_CTR:
   734  				return C_CTR
   735  			}
   736  
   737  			return C_SPR
   738  		}
   739  
   740  		if REG_DCR0 <= a.Reg && a.Reg <= REG_DCR0+1023 {
   741  			return C_SPR
   742  		}
   743  		if a.Reg == REG_FPSCR {
   744  			return C_FPSCR
   745  		}
   746  		if a.Reg == REG_MSR {
   747  			return C_MSR
   748  		}
   749  		return C_GOK
   750  
   751  	case obj.TYPE_MEM:
   752  		switch a.Name {
   753  		case obj.NAME_EXTERN,
   754  			obj.NAME_STATIC:
   755  			if a.Sym == nil {
   756  				break
   757  			}
   758  			c.instoffset = a.Offset
   759  			if a.Sym != nil { // use relocation
   760  				if a.Sym.Type == objabi.STLSBSS {
   761  					if c.ctxt.Flag_shared {
   762  						return C_TLS_IE
   763  					} else {
   764  						return C_TLS_LE
   765  					}
   766  				}
   767  				return C_ADDR
   768  			}
   769  			return C_LEXT
   770  
   771  		case obj.NAME_GOTREF:
   772  			return C_GOTADDR
   773  
   774  		case obj.NAME_AUTO:
   775  			c.instoffset = int64(c.autosize) + a.Offset
   776  			if c.instoffset >= -BIG && c.instoffset < BIG {
   777  				return C_SAUTO
   778  			}
   779  			return C_LAUTO
   780  
   781  		case obj.NAME_PARAM:
   782  			c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
   783  			if c.instoffset >= -BIG && c.instoffset < BIG {
   784  				return C_SAUTO
   785  			}
   786  			return C_LAUTO
   787  
   788  		case obj.NAME_NONE:
   789  			c.instoffset = a.Offset
   790  			if c.instoffset == 0 {
   791  				return C_ZOREG
   792  			}
   793  			if c.instoffset >= -BIG && c.instoffset < BIG {
   794  				return C_SOREG
   795  			}
   796  			return C_LOREG
   797  		}
   798  
   799  		return C_GOK
   800  
   801  	case obj.TYPE_TEXTSIZE:
   802  		return C_TEXTSIZE
   803  
   804  	case obj.TYPE_CONST,
   805  		obj.TYPE_ADDR:
   806  		switch a.Name {
   807  		case obj.NAME_NONE:
   808  			c.instoffset = a.Offset
   809  			if a.Reg != 0 {
   810  				if -BIG <= c.instoffset && c.instoffset <= BIG {
   811  					return C_SACON
   812  				}
   813  				if isint32(c.instoffset) {
   814  					return C_LACON
   815  				}
   816  				return C_DACON
   817  			}
   818  
   819  			goto consize
   820  
   821  		case obj.NAME_EXTERN,
   822  			obj.NAME_STATIC:
   823  			s := a.Sym
   824  			if s == nil {
   825  				break
   826  			}
   827  
   828  			c.instoffset = a.Offset
   829  
   830  			/* not sure why this barfs */
   831  			return C_LCON
   832  
   833  		case obj.NAME_AUTO:
   834  			c.instoffset = int64(c.autosize) + a.Offset
   835  			if c.instoffset >= -BIG && c.instoffset < BIG {
   836  				return C_SACON
   837  			}
   838  			return C_LACON
   839  
   840  		case obj.NAME_PARAM:
   841  			c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
   842  			if c.instoffset >= -BIG && c.instoffset < BIG {
   843  				return C_SACON
   844  			}
   845  			return C_LACON
   846  		}
   847  
   848  		return C_GOK
   849  
   850  	consize:
   851  		if c.instoffset >= 0 {
   852  			if c.instoffset == 0 {
   853  				return C_ZCON
   854  			}
   855  			if c.instoffset <= 0x7fff {
   856  				return C_SCON
   857  			}
   858  			if c.instoffset <= 0xffff {
   859  				return C_ANDCON
   860  			}
   861  			if c.instoffset&0xffff == 0 && isuint32(uint64(c.instoffset)) { /* && (instoffset & (1<<31)) == 0) */
   862  				return C_UCON
   863  			}
   864  			if isint32(c.instoffset) || isuint32(uint64(c.instoffset)) {
   865  				return C_LCON
   866  			}
   867  			return C_DCON
   868  		}
   869  
   870  		if c.instoffset >= -0x8000 {
   871  			return C_ADDCON
   872  		}
   873  		if c.instoffset&0xffff == 0 && isint32(c.instoffset) {
   874  			return C_UCON
   875  		}
   876  		if isint32(c.instoffset) {
   877  			return C_LCON
   878  		}
   879  		return C_DCON
   880  
   881  	case obj.TYPE_BRANCH:
   882  		if a.Sym != nil && c.ctxt.Flag_dynlink {
   883  			return C_LBRAPIC
   884  		}
   885  		return C_SBRA
   886  	}
   887  
   888  	return C_GOK
   889  }
   890  
   891  func prasm(p *obj.Prog) {
   892  	fmt.Printf("%v\n", p)
   893  }
   894  
   895  func (c *ctxt9) oplook(p *obj.Prog) *Optab {
   896  	a1 := int(p.Optab)
   897  	if a1 != 0 {
   898  		return &optab[a1-1]
   899  	}
   900  	a1 = int(p.From.Class)
   901  	if a1 == 0 {
   902  		a1 = c.aclass(&p.From) + 1
   903  		p.From.Class = int8(a1)
   904  	}
   905  
   906  	a1--
   907  	a3 := C_NONE + 1
   908  	if p.GetFrom3() != nil {
   909  		a3 = int(p.GetFrom3().Class)
   910  		if a3 == 0 {
   911  			a3 = c.aclass(p.GetFrom3()) + 1
   912  			p.GetFrom3().Class = int8(a3)
   913  		}
   914  	}
   915  
   916  	a3--
   917  	a4 := int(p.To.Class)
   918  	if a4 == 0 {
   919  		a4 = c.aclass(&p.To) + 1
   920  		p.To.Class = int8(a4)
   921  	}
   922  
   923  	a4--
   924  	a2 := C_NONE
   925  	if p.Reg != 0 {
   926  		if REG_R0 <= p.Reg && p.Reg <= REG_R31 {
   927  			a2 = C_REG
   928  		} else if REG_V0 <= p.Reg && p.Reg <= REG_V31 {
   929  			a2 = C_VREG
   930  		} else if REG_VS0 <= p.Reg && p.Reg <= REG_VS63 {
   931  			a2 = C_VSREG
   932  		} else if REG_F0 <= p.Reg && p.Reg <= REG_F31 {
   933  			a2 = C_FREG
   934  		}
   935  	}
   936  
   937  	//print("oplook %v %d %d %d %d\n", p, a1, a2, a3, a4);
   938  	ops := oprange[p.As&obj.AMask]
   939  	c1 := &xcmp[a1]
   940  	c3 := &xcmp[a3]
   941  	c4 := &xcmp[a4]
   942  	for i := range ops {
   943  		op := &ops[i]
   944  		if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] && c4[op.a4] {
   945  			p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
   946  			return op
   947  		}
   948  	}
   949  
   950  	c.ctxt.Diag("illegal combination %v %v %v %v %v", p.As, DRconv(a1), DRconv(a2), DRconv(a3), DRconv(a4))
   951  	prasm(p)
   952  	if ops == nil {
   953  		ops = optab
   954  	}
   955  	return &ops[0]
   956  }
   957  
   958  func cmp(a int, b int) bool {
   959  	if a == b {
   960  		return true
   961  	}
   962  	switch a {
   963  	case C_LCON:
   964  		if b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON {
   965  			return true
   966  		}
   967  
   968  	case C_ADDCON:
   969  		if b == C_ZCON || b == C_SCON {
   970  			return true
   971  		}
   972  
   973  	case C_ANDCON:
   974  		if b == C_ZCON || b == C_SCON {
   975  			return true
   976  		}
   977  
   978  	case C_SPR:
   979  		if b == C_LR || b == C_XER || b == C_CTR {
   980  			return true
   981  		}
   982  
   983  	case C_UCON:
   984  		if b == C_ZCON {
   985  			return true
   986  		}
   987  
   988  	case C_SCON:
   989  		if b == C_ZCON {
   990  			return true
   991  		}
   992  
   993  	case C_LACON:
   994  		if b == C_SACON {
   995  			return true
   996  		}
   997  
   998  	case C_LBRA:
   999  		if b == C_SBRA {
  1000  			return true
  1001  		}
  1002  
  1003  	case C_LEXT:
  1004  		if b == C_SEXT {
  1005  			return true
  1006  		}
  1007  
  1008  	case C_LAUTO:
  1009  		if b == C_SAUTO {
  1010  			return true
  1011  		}
  1012  
  1013  	case C_REG:
  1014  		if b == C_ZCON {
  1015  			return r0iszero != 0 /*TypeKind(100016)*/
  1016  		}
  1017  
  1018  	case C_LOREG:
  1019  		if b == C_ZOREG || b == C_SOREG {
  1020  			return true
  1021  		}
  1022  
  1023  	case C_SOREG:
  1024  		if b == C_ZOREG {
  1025  			return true
  1026  		}
  1027  
  1028  	case C_ANY:
  1029  		return true
  1030  	}
  1031  
  1032  	return false
  1033  }
  1034  
  1035  type ocmp []Optab
  1036  
  1037  func (x ocmp) Len() int {
  1038  	return len(x)
  1039  }
  1040  
  1041  func (x ocmp) Swap(i, j int) {
  1042  	x[i], x[j] = x[j], x[i]
  1043  }
  1044  
  1045  func (x ocmp) Less(i, j int) bool {
  1046  	p1 := &x[i]
  1047  	p2 := &x[j]
  1048  	n := int(p1.as) - int(p2.as)
  1049  	if n != 0 {
  1050  		return n < 0
  1051  	}
  1052  	n = int(p1.a1) - int(p2.a1)
  1053  	if n != 0 {
  1054  		return n < 0
  1055  	}
  1056  	n = int(p1.a2) - int(p2.a2)
  1057  	if n != 0 {
  1058  		return n < 0
  1059  	}
  1060  	n = int(p1.a3) - int(p2.a3)
  1061  	if n != 0 {
  1062  		return n < 0
  1063  	}
  1064  	n = int(p1.a4) - int(p2.a4)
  1065  	if n != 0 {
  1066  		return n < 0
  1067  	}
  1068  	return false
  1069  }
  1070  func opset(a, b0 obj.As) {
  1071  	oprange[a&obj.AMask] = oprange[b0]
  1072  }
  1073  
  1074  func buildop(ctxt *obj.Link) {
  1075  	if oprange[AANDN&obj.AMask] != nil {
  1076  		// Already initialized; stop now.
  1077  		// This happens in the cmd/asm tests,
  1078  		// each of which re-initializes the arch.
  1079  		return
  1080  	}
  1081  
  1082  	var n int
  1083  
  1084  	for i := 0; i < C_NCLASS; i++ {
  1085  		for n = 0; n < C_NCLASS; n++ {
  1086  			if cmp(n, i) {
  1087  				xcmp[i][n] = true
  1088  			}
  1089  		}
  1090  	}
  1091  	for n = 0; optab[n].as != obj.AXXX; n++ {
  1092  	}
  1093  	sort.Sort(ocmp(optab[:n]))
  1094  	for i := 0; i < n; i++ {
  1095  		r := optab[i].as
  1096  		r0 := r & obj.AMask
  1097  		start := i
  1098  		for optab[i].as == r {
  1099  			i++
  1100  		}
  1101  		oprange[r0] = optab[start:i]
  1102  		i--
  1103  
  1104  		switch r {
  1105  		default:
  1106  			ctxt.Diag("unknown op in build: %v", r)
  1107  			log.Fatalf("instruction missing from switch in asm9.go:buildop: %v", r)
  1108  
  1109  		case ADCBF: /* unary indexed: op (b+a); op (b) */
  1110  			opset(ADCBI, r0)
  1111  
  1112  			opset(ADCBST, r0)
  1113  			opset(ADCBT, r0)
  1114  			opset(ADCBTST, r0)
  1115  			opset(ADCBZ, r0)
  1116  			opset(AICBI, r0)
  1117  
  1118  		case AECOWX: /* indexed store: op s,(b+a); op s,(b) */
  1119  			opset(ASTWCCC, r0)
  1120  			opset(ASTBCCC, r0)
  1121  
  1122  			opset(ASTDCCC, r0)
  1123  
  1124  		case AREM: /* macro */
  1125  			opset(AREMCC, r0)
  1126  
  1127  			opset(AREMV, r0)
  1128  			opset(AREMVCC, r0)
  1129  
  1130  		case AREMU:
  1131  			opset(AREMU, r0)
  1132  			opset(AREMUCC, r0)
  1133  			opset(AREMUV, r0)
  1134  			opset(AREMUVCC, r0)
  1135  
  1136  		case AREMD:
  1137  			opset(AREMDCC, r0)
  1138  			opset(AREMDV, r0)
  1139  			opset(AREMDVCC, r0)
  1140  
  1141  		case AREMDU:
  1142  			opset(AREMDU, r0)
  1143  			opset(AREMDUCC, r0)
  1144  			opset(AREMDUV, r0)
  1145  			opset(AREMDUVCC, r0)
  1146  
  1147  		case ADIVW: /* op Rb[,Ra],Rd */
  1148  			opset(AMULHW, r0)
  1149  
  1150  			opset(AMULHWCC, r0)
  1151  			opset(AMULHWU, r0)
  1152  			opset(AMULHWUCC, r0)
  1153  			opset(AMULLWCC, r0)
  1154  			opset(AMULLWVCC, r0)
  1155  			opset(AMULLWV, r0)
  1156  			opset(ADIVWCC, r0)
  1157  			opset(ADIVWV, r0)
  1158  			opset(ADIVWVCC, r0)
  1159  			opset(ADIVWU, r0)
  1160  			opset(ADIVWUCC, r0)
  1161  			opset(ADIVWUV, r0)
  1162  			opset(ADIVWUVCC, r0)
  1163  			opset(AADDCC, r0)
  1164  			opset(AADDCV, r0)
  1165  			opset(AADDCVCC, r0)
  1166  			opset(AADDV, r0)
  1167  			opset(AADDVCC, r0)
  1168  			opset(AADDE, r0)
  1169  			opset(AADDECC, r0)
  1170  			opset(AADDEV, r0)
  1171  			opset(AADDEVCC, r0)
  1172  			opset(ACRAND, r0)
  1173  			opset(ACRANDN, r0)
  1174  			opset(ACREQV, r0)
  1175  			opset(ACRNAND, r0)
  1176  			opset(ACRNOR, r0)
  1177  			opset(ACROR, r0)
  1178  			opset(ACRORN, r0)
  1179  			opset(ACRXOR, r0)
  1180  			opset(AMULHD, r0)
  1181  			opset(AMULHDCC, r0)
  1182  			opset(AMULHDU, r0)
  1183  			opset(AMULHDUCC, r0)
  1184  			opset(AMULLD, r0)
  1185  			opset(AMULLDCC, r0)
  1186  			opset(AMULLDVCC, r0)
  1187  			opset(AMULLDV, r0)
  1188  			opset(ADIVD, r0)
  1189  			opset(ADIVDCC, r0)
  1190  			opset(ADIVDE, r0)
  1191  			opset(ADIVDEU, r0)
  1192  			opset(ADIVDECC, r0)
  1193  			opset(ADIVDEUCC, r0)
  1194  			opset(ADIVDVCC, r0)
  1195  			opset(ADIVDV, r0)
  1196  			opset(ADIVDU, r0)
  1197  			opset(ADIVDUCC, r0)
  1198  			opset(ADIVDUVCC, r0)
  1199  			opset(ADIVDUCC, r0)
  1200  
  1201  		case APOPCNTD:
  1202  			opset(APOPCNTW, r0)
  1203  			opset(APOPCNTB, r0)
  1204  
  1205  		case ACOPY: /* copy, paste. */
  1206  			opset(APASTECC, r0)
  1207  
  1208  		case AMADDHD: /* maddhd, maddhdu, maddld */
  1209  			opset(AMADDHDU, r0)
  1210  			opset(AMADDLD, r0)
  1211  
  1212  		case AMOVBZ: /* lbz, stz, rlwm(r/r), lhz, lha, stz, and x variants */
  1213  			opset(AMOVH, r0)
  1214  			opset(AMOVHZ, r0)
  1215  
  1216  		case AMOVBZU: /* lbz[x]u, stb[x]u, lhz[x]u, lha[x]u, sth[u]x, ld[x]u, std[u]x */
  1217  			opset(AMOVHU, r0)
  1218  
  1219  			opset(AMOVHZU, r0)
  1220  			opset(AMOVWU, r0)
  1221  			opset(AMOVWZU, r0)
  1222  			opset(AMOVDU, r0)
  1223  			opset(AMOVMW, r0)
  1224  
  1225  		case ALV: /* lvebx, lvehx, lvewx, lvx, lvxl, lvsl, lvsr */
  1226  			opset(ALVEBX, r0)
  1227  			opset(ALVEHX, r0)
  1228  			opset(ALVEWX, r0)
  1229  			opset(ALVX, r0)
  1230  			opset(ALVXL, r0)
  1231  			opset(ALVSL, r0)
  1232  			opset(ALVSR, r0)
  1233  
  1234  		case ASTV: /* stvebx, stvehx, stvewx, stvx, stvxl */
  1235  			opset(ASTVEBX, r0)
  1236  			opset(ASTVEHX, r0)
  1237  			opset(ASTVEWX, r0)
  1238  			opset(ASTVX, r0)
  1239  			opset(ASTVXL, r0)
  1240  
  1241  		case AVAND: /* vand, vandc, vnand */
  1242  			opset(AVAND, r0)
  1243  			opset(AVANDC, r0)
  1244  			opset(AVNAND, r0)
  1245  
  1246  		case AVOR: /* vor, vorc, vxor, vnor, veqv */
  1247  			opset(AVOR, r0)
  1248  			opset(AVORC, r0)
  1249  			opset(AVXOR, r0)
  1250  			opset(AVNOR, r0)
  1251  			opset(AVEQV, r0)
  1252  
  1253  		case AVADDUM: /* vaddubm, vadduhm, vadduwm, vaddudm, vadduqm */
  1254  			opset(AVADDUBM, r0)
  1255  			opset(AVADDUHM, r0)
  1256  			opset(AVADDUWM, r0)
  1257  			opset(AVADDUDM, r0)
  1258  			opset(AVADDUQM, r0)
  1259  
  1260  		case AVADDCU: /* vaddcuq, vaddcuw */
  1261  			opset(AVADDCUQ, r0)
  1262  			opset(AVADDCUW, r0)
  1263  
  1264  		case AVADDUS: /* vaddubs, vadduhs, vadduws */
  1265  			opset(AVADDUBS, r0)
  1266  			opset(AVADDUHS, r0)
  1267  			opset(AVADDUWS, r0)
  1268  
  1269  		case AVADDSS: /* vaddsbs, vaddshs, vaddsws */
  1270  			opset(AVADDSBS, r0)
  1271  			opset(AVADDSHS, r0)
  1272  			opset(AVADDSWS, r0)
  1273  
  1274  		case AVADDE: /* vaddeuqm, vaddecuq */
  1275  			opset(AVADDEUQM, r0)
  1276  			opset(AVADDECUQ, r0)
  1277  
  1278  		case AVSUBUM: /* vsububm, vsubuhm, vsubuwm, vsubudm, vsubuqm */
  1279  			opset(AVSUBUBM, r0)
  1280  			opset(AVSUBUHM, r0)
  1281  			opset(AVSUBUWM, r0)
  1282  			opset(AVSUBUDM, r0)
  1283  			opset(AVSUBUQM, r0)
  1284  
  1285  		case AVSUBCU: /* vsubcuq, vsubcuw */
  1286  			opset(AVSUBCUQ, r0)
  1287  			opset(AVSUBCUW, r0)
  1288  
  1289  		case AVSUBUS: /* vsububs, vsubuhs, vsubuws */
  1290  			opset(AVSUBUBS, r0)
  1291  			opset(AVSUBUHS, r0)
  1292  			opset(AVSUBUWS, r0)
  1293  
  1294  		case AVSUBSS: /* vsubsbs, vsubshs, vsubsws */
  1295  			opset(AVSUBSBS, r0)
  1296  			opset(AVSUBSHS, r0)
  1297  			opset(AVSUBSWS, r0)
  1298  
  1299  		case AVSUBE: /* vsubeuqm, vsubecuq */
  1300  			opset(AVSUBEUQM, r0)
  1301  			opset(AVSUBECUQ, r0)
  1302  
  1303  		case AVPMSUM: /* vpmsumb, vpmsumh, vpmsumw, vpmsumd */
  1304  			opset(AVPMSUMB, r0)
  1305  			opset(AVPMSUMH, r0)
  1306  			opset(AVPMSUMW, r0)
  1307  			opset(AVPMSUMD, r0)
  1308  
  1309  		case AVR: /* vrlb, vrlh, vrlw, vrld */
  1310  			opset(AVRLB, r0)
  1311  			opset(AVRLH, r0)
  1312  			opset(AVRLW, r0)
  1313  			opset(AVRLD, r0)
  1314  
  1315  		case AVS: /* vs[l,r], vs[l,r]o, vs[l,r]b, vs[l,r]h, vs[l,r]w, vs[l,r]d */
  1316  			opset(AVSLB, r0)
  1317  			opset(AVSLH, r0)
  1318  			opset(AVSLW, r0)
  1319  			opset(AVSL, r0)
  1320  			opset(AVSLO, r0)
  1321  			opset(AVSRB, r0)
  1322  			opset(AVSRH, r0)
  1323  			opset(AVSRW, r0)
  1324  			opset(AVSR, r0)
  1325  			opset(AVSRO, r0)
  1326  			opset(AVSLD, r0)
  1327  			opset(AVSRD, r0)
  1328  
  1329  		case AVSA: /* vsrab, vsrah, vsraw, vsrad */
  1330  			opset(AVSRAB, r0)
  1331  			opset(AVSRAH, r0)
  1332  			opset(AVSRAW, r0)
  1333  			opset(AVSRAD, r0)
  1334  
  1335  		case AVSOI: /* vsldoi */
  1336  			opset(AVSLDOI, r0)
  1337  
  1338  		case AVCLZ: /* vclzb, vclzh, vclzw, vclzd */
  1339  			opset(AVCLZB, r0)
  1340  			opset(AVCLZH, r0)
  1341  			opset(AVCLZW, r0)
  1342  			opset(AVCLZD, r0)
  1343  
  1344  		case AVPOPCNT: /* vpopcntb, vpopcnth, vpopcntw, vpopcntd */
  1345  			opset(AVPOPCNTB, r0)
  1346  			opset(AVPOPCNTH, r0)
  1347  			opset(AVPOPCNTW, r0)
  1348  			opset(AVPOPCNTD, r0)
  1349  
  1350  		case AVCMPEQ: /* vcmpequb[.], vcmpequh[.], vcmpequw[.], vcmpequd[.] */
  1351  			opset(AVCMPEQUB, r0)
  1352  			opset(AVCMPEQUBCC, r0)
  1353  			opset(AVCMPEQUH, r0)
  1354  			opset(AVCMPEQUHCC, r0)
  1355  			opset(AVCMPEQUW, r0)
  1356  			opset(AVCMPEQUWCC, r0)
  1357  			opset(AVCMPEQUD, r0)
  1358  			opset(AVCMPEQUDCC, r0)
  1359  
  1360  		case AVCMPGT: /* vcmpgt[u,s]b[.], vcmpgt[u,s]h[.], vcmpgt[u,s]w[.], vcmpgt[u,s]d[.] */
  1361  			opset(AVCMPGTUB, r0)
  1362  			opset(AVCMPGTUBCC, r0)
  1363  			opset(AVCMPGTUH, r0)
  1364  			opset(AVCMPGTUHCC, r0)
  1365  			opset(AVCMPGTUW, r0)
  1366  			opset(AVCMPGTUWCC, r0)
  1367  			opset(AVCMPGTUD, r0)
  1368  			opset(AVCMPGTUDCC, r0)
  1369  			opset(AVCMPGTSB, r0)
  1370  			opset(AVCMPGTSBCC, r0)
  1371  			opset(AVCMPGTSH, r0)
  1372  			opset(AVCMPGTSHCC, r0)
  1373  			opset(AVCMPGTSW, r0)
  1374  			opset(AVCMPGTSWCC, r0)
  1375  			opset(AVCMPGTSD, r0)
  1376  			opset(AVCMPGTSDCC, r0)
  1377  
  1378  		case AVCMPNEZB: /* vcmpnezb[.] */
  1379  			opset(AVCMPNEZBCC, r0)
  1380  
  1381  		case AVPERM: /* vperm */
  1382  			opset(AVPERM, r0)
  1383  
  1384  		case AVBPERMQ: /* vbpermq, vbpermd */
  1385  			opset(AVBPERMD, r0)
  1386  
  1387  		case AVSEL: /* vsel */
  1388  			opset(AVSEL, r0)
  1389  
  1390  		case AVSPLT: /* vspltb, vsplth, vspltw */
  1391  			opset(AVSPLTB, r0)
  1392  			opset(AVSPLTH, r0)
  1393  			opset(AVSPLTW, r0)
  1394  
  1395  		case AVSPLTI: /* vspltisb, vspltish, vspltisw */
  1396  			opset(AVSPLTISB, r0)
  1397  			opset(AVSPLTISH, r0)
  1398  			opset(AVSPLTISW, r0)
  1399  
  1400  		case AVCIPH: /* vcipher, vcipherlast */
  1401  			opset(AVCIPHER, r0)
  1402  			opset(AVCIPHERLAST, r0)
  1403  
  1404  		case AVNCIPH: /* vncipher, vncipherlast */
  1405  			opset(AVNCIPHER, r0)
  1406  			opset(AVNCIPHERLAST, r0)
  1407  
  1408  		case AVSBOX: /* vsbox */
  1409  			opset(AVSBOX, r0)
  1410  
  1411  		case AVSHASIGMA: /* vshasigmaw, vshasigmad */
  1412  			opset(AVSHASIGMAW, r0)
  1413  			opset(AVSHASIGMAD, r0)
  1414  
  1415  		case ALXV: /* lxvd2x, lxvdsx, lxvw4x */
  1416  			opset(ALXVD2X, r0)
  1417  			opset(ALXVDSX, r0)
  1418  			opset(ALXVW4X, r0)
  1419  
  1420  		case ASTXV: /* stxvd2x, stxvdsx, stxvw4x */
  1421  			opset(ASTXVD2X, r0)
  1422  			opset(ASTXVW4X, r0)
  1423  
  1424  		case ALXS: /* lxsdx  */
  1425  			opset(ALXSDX, r0)
  1426  
  1427  		case ASTXS: /* stxsdx */
  1428  			opset(ASTXSDX, r0)
  1429  
  1430  		case ALXSI: /* lxsiwax, lxsiwzx  */
  1431  			opset(ALXSIWAX, r0)
  1432  			opset(ALXSIWZX, r0)
  1433  
  1434  		case ASTXSI: /* stxsiwx */
  1435  			opset(ASTXSIWX, r0)
  1436  
  1437  		case AMFVSR: /* mfvsrd, mfvsrwz (and extended mnemonics), mfvsrld */
  1438  			opset(AMFVSRD, r0)
  1439  			opset(AMFFPRD, r0)
  1440  			opset(AMFVRD, r0)
  1441  			opset(AMFVSRWZ, r0)
  1442  			opset(AMFVSRLD, r0)
  1443  
  1444  		case AMTVSR: /* mtvsrd, mtvsrwa, mtvsrwz (and extended mnemonics), mtvsrdd, mtvsrws */
  1445  			opset(AMTVSRD, r0)
  1446  			opset(AMTFPRD, r0)
  1447  			opset(AMTVRD, r0)
  1448  			opset(AMTVSRWA, r0)
  1449  			opset(AMTVSRWZ, r0)
  1450  			opset(AMTVSRDD, r0)
  1451  			opset(AMTVSRWS, r0)
  1452  
  1453  		case AXXLAND: /* xxland, xxlandc, xxleqv, xxlnand */
  1454  			opset(AXXLANDQ, r0)
  1455  			opset(AXXLANDC, r0)
  1456  			opset(AXXLEQV, r0)
  1457  			opset(AXXLNAND, r0)
  1458  
  1459  		case AXXLOR: /* xxlorc, xxlnor, xxlor, xxlxor */
  1460  			opset(AXXLORC, r0)
  1461  			opset(AXXLNOR, r0)
  1462  			opset(AXXLORQ, r0)
  1463  			opset(AXXLXOR, r0)
  1464  
  1465  		case AXXSEL: /* xxsel */
  1466  			opset(AXXSEL, r0)
  1467  
  1468  		case AXXMRG: /* xxmrghw, xxmrglw */
  1469  			opset(AXXMRGHW, r0)
  1470  			opset(AXXMRGLW, r0)
  1471  
  1472  		case AXXSPLT: /* xxspltw */
  1473  			opset(AXXSPLTW, r0)
  1474  
  1475  		case AXXPERM: /* xxpermdi */
  1476  			opset(AXXPERMDI, r0)
  1477  
  1478  		case AXXSI: /* xxsldwi */
  1479  			opset(AXXSLDWI, r0)
  1480  
  1481  		case AXSCV: /* xscvdpsp, xscvspdp, xscvdpspn, xscvspdpn */
  1482  			opset(AXSCVDPSP, r0)
  1483  			opset(AXSCVSPDP, r0)
  1484  			opset(AXSCVDPSPN, r0)
  1485  			opset(AXSCVSPDPN, r0)
  1486  
  1487  		case AXVCV: /* xvcvdpsp, xvcvspdp */
  1488  			opset(AXVCVDPSP, r0)
  1489  			opset(AXVCVSPDP, r0)
  1490  
  1491  		case AXSCVX: /* xscvdpsxds, xscvdpsxws, xscvdpuxds, xscvdpuxws */
  1492  			opset(AXSCVDPSXDS, r0)
  1493  			opset(AXSCVDPSXWS, r0)
  1494  			opset(AXSCVDPUXDS, r0)
  1495  			opset(AXSCVDPUXWS, r0)
  1496  
  1497  		case AXSCVXP: /* xscvsxddp, xscvuxddp, xscvsxdsp, xscvuxdsp */
  1498  			opset(AXSCVSXDDP, r0)
  1499  			opset(AXSCVUXDDP, r0)
  1500  			opset(AXSCVSXDSP, r0)
  1501  			opset(AXSCVUXDSP, r0)
  1502  
  1503  		case AXVCVX: /* xvcvdpsxds, xvcvdpsxws, xvcvdpuxds, xvcvdpuxws, xvcvspsxds, xvcvspsxws, xvcvspuxds, xvcvspuxws */
  1504  			opset(AXVCVDPSXDS, r0)
  1505  			opset(AXVCVDPSXWS, r0)
  1506  			opset(AXVCVDPUXDS, r0)
  1507  			opset(AXVCVDPUXWS, r0)
  1508  			opset(AXVCVSPSXDS, r0)
  1509  			opset(AXVCVSPSXWS, r0)
  1510  			opset(AXVCVSPUXDS, r0)
  1511  			opset(AXVCVSPUXWS, r0)
  1512  
  1513  		case AXVCVXP: /* xvcvsxddp, xvcvsxwdp, xvcvuxddp, xvcvuxwdp, xvcvsxdsp, xvcvsxwsp, xvcvuxdsp, xvcvuxwsp */
  1514  			opset(AXVCVSXDDP, r0)
  1515  			opset(AXVCVSXWDP, r0)
  1516  			opset(AXVCVUXDDP, r0)
  1517  			opset(AXVCVUXWDP, r0)
  1518  			opset(AXVCVSXDSP, r0)
  1519  			opset(AXVCVSXWSP, r0)
  1520  			opset(AXVCVUXDSP, r0)
  1521  			opset(AXVCVUXWSP, r0)
  1522  
  1523  		case AAND: /* logical op Rb,Rs,Ra; no literal */
  1524  			opset(AANDN, r0)
  1525  
  1526  			opset(AANDNCC, r0)
  1527  			opset(AEQV, r0)
  1528  			opset(AEQVCC, r0)
  1529  			opset(ANAND, r0)
  1530  			opset(ANANDCC, r0)
  1531  			opset(ANOR, r0)
  1532  			opset(ANORCC, r0)
  1533  			opset(AORCC, r0)
  1534  			opset(AORN, r0)
  1535  			opset(AORNCC, r0)
  1536  			opset(AXORCC, r0)
  1537  
  1538  		case AADDME: /* op Ra, Rd */
  1539  			opset(AADDMECC, r0)
  1540  
  1541  			opset(AADDMEV, r0)
  1542  			opset(AADDMEVCC, r0)
  1543  			opset(AADDZE, r0)
  1544  			opset(AADDZECC, r0)
  1545  			opset(AADDZEV, r0)
  1546  			opset(AADDZEVCC, r0)
  1547  			opset(ASUBME, r0)
  1548  			opset(ASUBMECC, r0)
  1549  			opset(ASUBMEV, r0)
  1550  			opset(ASUBMEVCC, r0)
  1551  			opset(ASUBZE, r0)
  1552  			opset(ASUBZECC, r0)
  1553  			opset(ASUBZEV, r0)
  1554  			opset(ASUBZEVCC, r0)
  1555  
  1556  		case AADDC:
  1557  			opset(AADDCCC, r0)
  1558  
  1559  		case ABEQ:
  1560  			opset(ABGE, r0)
  1561  			opset(ABGT, r0)
  1562  			opset(ABLE, r0)
  1563  			opset(ABLT, r0)
  1564  			opset(ABNE, r0)
  1565  			opset(ABVC, r0)
  1566  			opset(ABVS, r0)
  1567  
  1568  		case ABR:
  1569  			opset(ABL, r0)
  1570  
  1571  		case ABC:
  1572  			opset(ABCL, r0)
  1573  
  1574  		case AEXTSB: /* op Rs, Ra */
  1575  			opset(AEXTSBCC, r0)
  1576  
  1577  			opset(AEXTSH, r0)
  1578  			opset(AEXTSHCC, r0)
  1579  			opset(ACNTLZW, r0)
  1580  			opset(ACNTLZWCC, r0)
  1581  			opset(ACNTLZD, r0)
  1582  			opset(AEXTSW, r0)
  1583  			opset(AEXTSWCC, r0)
  1584  			opset(ACNTLZDCC, r0)
  1585  
  1586  		case AFABS: /* fop [s,]d */
  1587  			opset(AFABSCC, r0)
  1588  
  1589  			opset(AFNABS, r0)
  1590  			opset(AFNABSCC, r0)
  1591  			opset(AFNEG, r0)
  1592  			opset(AFNEGCC, r0)
  1593  			opset(AFRSP, r0)
  1594  			opset(AFRSPCC, r0)
  1595  			opset(AFCTIW, r0)
  1596  			opset(AFCTIWCC, r0)
  1597  			opset(AFCTIWZ, r0)
  1598  			opset(AFCTIWZCC, r0)
  1599  			opset(AFCTID, r0)
  1600  			opset(AFCTIDCC, r0)
  1601  			opset(AFCTIDZ, r0)
  1602  			opset(AFCTIDZCC, r0)
  1603  			opset(AFCFID, r0)
  1604  			opset(AFCFIDCC, r0)
  1605  			opset(AFCFIDU, r0)
  1606  			opset(AFCFIDUCC, r0)
  1607  			opset(AFCFIDS, r0)
  1608  			opset(AFCFIDSCC, r0)
  1609  			opset(AFRES, r0)
  1610  			opset(AFRESCC, r0)
  1611  			opset(AFRIM, r0)
  1612  			opset(AFRIMCC, r0)
  1613  			opset(AFRIP, r0)
  1614  			opset(AFRIPCC, r0)
  1615  			opset(AFRIZ, r0)
  1616  			opset(AFRIZCC, r0)
  1617  			opset(AFRSQRTE, r0)
  1618  			opset(AFRSQRTECC, r0)
  1619  			opset(AFSQRT, r0)
  1620  			opset(AFSQRTCC, r0)
  1621  			opset(AFSQRTS, r0)
  1622  			opset(AFSQRTSCC, r0)
  1623  
  1624  		case AFADD:
  1625  			opset(AFADDS, r0)
  1626  			opset(AFADDCC, r0)
  1627  			opset(AFADDSCC, r0)
  1628  			opset(AFCPSGN, r0)
  1629  			opset(AFCPSGNCC, r0)
  1630  			opset(AFDIV, r0)
  1631  			opset(AFDIVS, r0)
  1632  			opset(AFDIVCC, r0)
  1633  			opset(AFDIVSCC, r0)
  1634  			opset(AFSUB, r0)
  1635  			opset(AFSUBS, r0)
  1636  			opset(AFSUBCC, r0)
  1637  			opset(AFSUBSCC, r0)
  1638  
  1639  		case AFMADD:
  1640  			opset(AFMADDCC, r0)
  1641  			opset(AFMADDS, r0)
  1642  			opset(AFMADDSCC, r0)
  1643  			opset(AFMSUB, r0)
  1644  			opset(AFMSUBCC, r0)
  1645  			opset(AFMSUBS, r0)
  1646  			opset(AFMSUBSCC, r0)
  1647  			opset(AFNMADD, r0)
  1648  			opset(AFNMADDCC, r0)
  1649  			opset(AFNMADDS, r0)
  1650  			opset(AFNMADDSCC, r0)
  1651  			opset(AFNMSUB, r0)
  1652  			opset(AFNMSUBCC, r0)
  1653  			opset(AFNMSUBS, r0)
  1654  			opset(AFNMSUBSCC, r0)
  1655  			opset(AFSEL, r0)
  1656  			opset(AFSELCC, r0)
  1657  
  1658  		case AFMUL:
  1659  			opset(AFMULS, r0)
  1660  			opset(AFMULCC, r0)
  1661  			opset(AFMULSCC, r0)
  1662  
  1663  		case AFCMPO:
  1664  			opset(AFCMPU, r0)
  1665  
  1666  		case AISEL:
  1667  			opset(AISEL, r0)
  1668  
  1669  		case AMTFSB0:
  1670  			opset(AMTFSB0CC, r0)
  1671  			opset(AMTFSB1, r0)
  1672  			opset(AMTFSB1CC, r0)
  1673  
  1674  		case ANEG: /* op [Ra,] Rd */
  1675  			opset(ANEGCC, r0)
  1676  
  1677  			opset(ANEGV, r0)
  1678  			opset(ANEGVCC, r0)
  1679  
  1680  		case AOR: /* or/xor Rb,Rs,Ra; ori/xori $uimm,Rs,Ra; oris/xoris $uimm,Rs,Ra */
  1681  			opset(AXOR, r0)
  1682  
  1683  		case ASLW:
  1684  			opset(ASLWCC, r0)
  1685  			opset(ASRW, r0)
  1686  			opset(ASRWCC, r0)
  1687  			opset(AROTLW, r0)
  1688  
  1689  		case ASLD:
  1690  			opset(ASLDCC, r0)
  1691  			opset(ASRD, r0)
  1692  			opset(ASRDCC, r0)
  1693  			opset(AROTL, r0)
  1694  
  1695  		case ASRAW: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
  1696  			opset(ASRAWCC, r0)
  1697  
  1698  		case ASRAD: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
  1699  			opset(ASRADCC, r0)
  1700  
  1701  		case ASUB: /* SUB Ra,Rb,Rd => subf Rd,ra,rb */
  1702  			opset(ASUB, r0)
  1703  
  1704  			opset(ASUBCC, r0)
  1705  			opset(ASUBV, r0)
  1706  			opset(ASUBVCC, r0)
  1707  			opset(ASUBCCC, r0)
  1708  			opset(ASUBCV, r0)
  1709  			opset(ASUBCVCC, r0)
  1710  			opset(ASUBE, r0)
  1711  			opset(ASUBECC, r0)
  1712  			opset(ASUBEV, r0)
  1713  			opset(ASUBEVCC, r0)
  1714  
  1715  		case ASYNC:
  1716  			opset(AISYNC, r0)
  1717  			opset(ALWSYNC, r0)
  1718  			opset(APTESYNC, r0)
  1719  			opset(ATLBSYNC, r0)
  1720  
  1721  		case ARLWMI:
  1722  			opset(ARLWMICC, r0)
  1723  			opset(ARLWNM, r0)
  1724  			opset(ARLWNMCC, r0)
  1725  
  1726  		case ARLDMI:
  1727  			opset(ARLDMICC, r0)
  1728  			opset(ARLDIMI, r0)
  1729  			opset(ARLDIMICC, r0)
  1730  
  1731  		case ARLDC:
  1732  			opset(ARLDCCC, r0)
  1733  
  1734  		case ARLDCL:
  1735  			opset(ARLDCR, r0)
  1736  			opset(ARLDCLCC, r0)
  1737  			opset(ARLDCRCC, r0)
  1738  
  1739  		case ARLDICL:
  1740  			opset(ARLDICLCC, r0)
  1741  			opset(ARLDICR, r0)
  1742  			opset(ARLDICRCC, r0)
  1743  
  1744  		case AFMOVD:
  1745  			opset(AFMOVDCC, r0)
  1746  			opset(AFMOVDU, r0)
  1747  			opset(AFMOVS, r0)
  1748  			opset(AFMOVSU, r0)
  1749  
  1750  		case AECIWX:
  1751  			opset(ALBAR, r0)
  1752  			opset(ALWAR, r0)
  1753  			opset(ALDAR, r0)
  1754  
  1755  		case ASYSCALL: /* just the op; flow of control */
  1756  			opset(ARFI, r0)
  1757  
  1758  			opset(ARFCI, r0)
  1759  			opset(ARFID, r0)
  1760  			opset(AHRFID, r0)
  1761  
  1762  		case AMOVHBR:
  1763  			opset(AMOVWBR, r0)
  1764  			opset(AMOVDBR, r0)
  1765  
  1766  		case ASLBMFEE:
  1767  			opset(ASLBMFEV, r0)
  1768  
  1769  		case ATW:
  1770  			opset(ATD, r0)
  1771  
  1772  		case ATLBIE:
  1773  			opset(ASLBIE, r0)
  1774  			opset(ATLBIEL, r0)
  1775  
  1776  		case AEIEIO:
  1777  			opset(ASLBIA, r0)
  1778  
  1779  		case ACMP:
  1780  			opset(ACMPW, r0)
  1781  
  1782  		case ACMPU:
  1783  			opset(ACMPWU, r0)
  1784  
  1785  		case ACMPB:
  1786  			opset(ACMPB, r0)
  1787  
  1788  		case AFTDIV:
  1789  			opset(AFTDIV, r0)
  1790  
  1791  		case AFTSQRT:
  1792  			opset(AFTSQRT, r0)
  1793  
  1794  		case AADD,
  1795  			AANDCC, /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra; andis. $uimm,Rs,Ra */
  1796  			AFMOVSX,
  1797  			AFMOVSZ,
  1798  			ALSW,
  1799  			AMOVW,
  1800  			/* load/store/move word with sign extension; special 32-bit move; move 32-bit literals */
  1801  			AMOVWZ, /* load/store/move word with zero extension; move 32-bit literals  */
  1802  			AMOVD,  /* load/store/move 64-bit values, including 32-bit literals with/without sign-extension */
  1803  			AMOVB,  /* macro: move byte with sign extension */
  1804  			AMOVBU, /* macro: move byte with sign extension & update */
  1805  			AMOVFL,
  1806  			AMULLW,
  1807  			/* op $s[,r2],r3; op r1[,r2],r3; no cc/v */
  1808  			ASUBC, /* op r1,$s,r3; op r1[,r2],r3 */
  1809  			ASTSW,
  1810  			ASLBMTE,
  1811  			AWORD,
  1812  			ADWORD,
  1813  			ADARN,
  1814  			ALDMX,
  1815  			AVMSUMUDM,
  1816  			AADDEX,
  1817  			ACMPEQB,
  1818  			obj.ANOP,
  1819  			obj.ATEXT,
  1820  			obj.AUNDEF,
  1821  			obj.AFUNCDATA,
  1822  			obj.APCDATA,
  1823  			obj.ADUFFZERO,
  1824  			obj.ADUFFCOPY:
  1825  			break
  1826  		}
  1827  	}
  1828  }
  1829  
  1830  func OPVXX1(o uint32, xo uint32, oe uint32) uint32 {
  1831  	return o<<26 | xo<<1 | oe<<11
  1832  }
  1833  
  1834  func OPVXX2(o uint32, xo uint32, oe uint32) uint32 {
  1835  	return o<<26 | xo<<2 | oe<<11
  1836  }
  1837  
  1838  func OPVXX3(o uint32, xo uint32, oe uint32) uint32 {
  1839  	return o<<26 | xo<<3 | oe<<11
  1840  }
  1841  
  1842  func OPVXX4(o uint32, xo uint32, oe uint32) uint32 {
  1843  	return o<<26 | xo<<4 | oe<<11
  1844  }
  1845  
  1846  func OPVX(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
  1847  	return o<<26 | xo | oe<<11 | rc&1
  1848  }
  1849  
  1850  func OPVC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
  1851  	return o<<26 | xo | oe<<11 | (rc&1)<<10
  1852  }
  1853  
  1854  func OPVCC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
  1855  	return o<<26 | xo<<1 | oe<<10 | rc&1
  1856  }
  1857  
  1858  func OPCC(o uint32, xo uint32, rc uint32) uint32 {
  1859  	return OPVCC(o, xo, 0, rc)
  1860  }
  1861  
  1862  func OP(o uint32, xo uint32) uint32 {
  1863  	return OPVCC(o, xo, 0, 0)
  1864  }
  1865  
  1866  /* the order is dest, a/s, b/imm for both arithmetic and logical operations */
  1867  func AOP_RRR(op uint32, d uint32, a uint32, b uint32) uint32 {
  1868  	return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11
  1869  }
  1870  
  1871  /* VX-form 2-register operands, r/none/r */
  1872  func AOP_RR(op uint32, d uint32, a uint32) uint32 {
  1873  	return op | (d&31)<<21 | (a&31)<<11
  1874  }
  1875  
  1876  /* VA-form 4-register operands */
  1877  func AOP_RRRR(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1878  	return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&31)<<6
  1879  }
  1880  
  1881  func AOP_IRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
  1882  	return op | (d&31)<<21 | (a&31)<<16 | simm&0xFFFF
  1883  }
  1884  
  1885  /* VX-form 2-register + UIM operands */
  1886  func AOP_VIRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
  1887  	return op | (d&31)<<21 | (simm&0xFFFF)<<16 | (a&31)<<11
  1888  }
  1889  
  1890  /* VX-form 2-register + ST + SIX operands */
  1891  func AOP_IIRR(op uint32, d uint32, a uint32, sbit uint32, simm uint32) uint32 {
  1892  	return op | (d&31)<<21 | (a&31)<<16 | (sbit&1)<<15 | (simm&0xF)<<11
  1893  }
  1894  
  1895  /* VA-form 3-register + SHB operands */
  1896  func AOP_IRRR(op uint32, d uint32, a uint32, b uint32, simm uint32) uint32 {
  1897  	return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (simm&0xF)<<6
  1898  }
  1899  
  1900  /* VX-form 1-register + SIM operands */
  1901  func AOP_IR(op uint32, d uint32, simm uint32) uint32 {
  1902  	return op | (d&31)<<21 | (simm&31)<<16
  1903  }
  1904  
  1905  /* XX1-form 3-register operands, 1 VSR operand */
  1906  func AOP_XX1(op uint32, d uint32, a uint32, b uint32) uint32 {
  1907  	/* For the XX-form encodings, we need the VSX register number to be exactly */
  1908  	/* between 0-63, so we can properly set the rightmost bits. */
  1909  	r := d - REG_VS0
  1910  	return op | (r&31)<<21 | (a&31)<<16 | (b&31)<<11 | (r&32)>>5
  1911  }
  1912  
  1913  /* XX2-form 3-register operands, 2 VSR operands */
  1914  func AOP_XX2(op uint32, d uint32, a uint32, b uint32) uint32 {
  1915  	xt := d - REG_VS0
  1916  	xb := b - REG_VS0
  1917  	return op | (xt&31)<<21 | (a&3)<<16 | (xb&31)<<11 | (xb&32)>>4 | (xt&32)>>5
  1918  }
  1919  
  1920  /* XX3-form 3 VSR operands */
  1921  func AOP_XX3(op uint32, d uint32, a uint32, b uint32) uint32 {
  1922  	xt := d - REG_VS0
  1923  	xa := a - REG_VS0
  1924  	xb := b - REG_VS0
  1925  	return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
  1926  }
  1927  
  1928  /* XX3-form 3 VSR operands + immediate */
  1929  func AOP_XX3I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1930  	xt := d - REG_VS0
  1931  	xa := a - REG_VS0
  1932  	xb := b - REG_VS0
  1933  	return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (c&3)<<8 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
  1934  }
  1935  
  1936  /* XX4-form, 4 VSR operands */
  1937  func AOP_XX4(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1938  	xt := d - REG_VS0
  1939  	xa := a - REG_VS0
  1940  	xb := b - REG_VS0
  1941  	xc := c - REG_VS0
  1942  	return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xc&31)<<6 | (xc&32)>>2 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
  1943  }
  1944  
  1945  /* Z23-form, 3-register operands + CY field */
  1946  func AOP_Z23I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1947  	return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&3)<<7
  1948  }
  1949  
  1950  func LOP_RRR(op uint32, a uint32, s uint32, b uint32) uint32 {
  1951  	return op | (s&31)<<21 | (a&31)<<16 | (b&31)<<11
  1952  }
  1953  
  1954  func LOP_IRR(op uint32, a uint32, s uint32, uimm uint32) uint32 {
  1955  	return op | (s&31)<<21 | (a&31)<<16 | uimm&0xFFFF
  1956  }
  1957  
  1958  func OP_BR(op uint32, li uint32, aa uint32) uint32 {
  1959  	return op | li&0x03FFFFFC | aa<<1
  1960  }
  1961  
  1962  func OP_BC(op uint32, bo uint32, bi uint32, bd uint32, aa uint32) uint32 {
  1963  	return op | (bo&0x1F)<<21 | (bi&0x1F)<<16 | bd&0xFFFC | aa<<1
  1964  }
  1965  
  1966  func OP_BCR(op uint32, bo uint32, bi uint32) uint32 {
  1967  	return op | (bo&0x1F)<<21 | (bi&0x1F)<<16
  1968  }
  1969  
  1970  func OP_RLW(op uint32, a uint32, s uint32, sh uint32, mb uint32, me uint32) uint32 {
  1971  	return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | (mb&31)<<6 | (me&31)<<1
  1972  }
  1973  
  1974  func AOP_RLDIC(op uint32, a uint32, s uint32, sh uint32, m uint32) uint32 {
  1975  	return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | ((sh&32)>>5)<<1 | (m&31)<<6 | ((m&32)>>5)<<5
  1976  }
  1977  
  1978  func AOP_ISEL(op uint32, t uint32, a uint32, b uint32, bc uint32) uint32 {
  1979  	return op | (t&31)<<21 | (a&31)<<16 | (b&31)<<11 | (bc&0x1F)<<6
  1980  }
  1981  
  1982  const (
  1983  	/* each rhs is OPVCC(_, _, _, _) */
  1984  	OP_ADD    = 31<<26 | 266<<1 | 0<<10 | 0
  1985  	OP_ADDI   = 14<<26 | 0<<1 | 0<<10 | 0
  1986  	OP_ADDIS  = 15<<26 | 0<<1 | 0<<10 | 0
  1987  	OP_ANDI   = 28<<26 | 0<<1 | 0<<10 | 0
  1988  	OP_EXTSB  = 31<<26 | 954<<1 | 0<<10 | 0
  1989  	OP_EXTSH  = 31<<26 | 922<<1 | 0<<10 | 0
  1990  	OP_EXTSW  = 31<<26 | 986<<1 | 0<<10 | 0
  1991  	OP_ISEL   = 31<<26 | 15<<1 | 0<<10 | 0
  1992  	OP_MCRF   = 19<<26 | 0<<1 | 0<<10 | 0
  1993  	OP_MCRFS  = 63<<26 | 64<<1 | 0<<10 | 0
  1994  	OP_MCRXR  = 31<<26 | 512<<1 | 0<<10 | 0
  1995  	OP_MFCR   = 31<<26 | 19<<1 | 0<<10 | 0
  1996  	OP_MFFS   = 63<<26 | 583<<1 | 0<<10 | 0
  1997  	OP_MFMSR  = 31<<26 | 83<<1 | 0<<10 | 0
  1998  	OP_MFSPR  = 31<<26 | 339<<1 | 0<<10 | 0
  1999  	OP_MFSR   = 31<<26 | 595<<1 | 0<<10 | 0
  2000  	OP_MFSRIN = 31<<26 | 659<<1 | 0<<10 | 0
  2001  	OP_MTCRF  = 31<<26 | 144<<1 | 0<<10 | 0
  2002  	OP_MTFSF  = 63<<26 | 711<<1 | 0<<10 | 0
  2003  	OP_MTFSFI = 63<<26 | 134<<1 | 0<<10 | 0
  2004  	OP_MTMSR  = 31<<26 | 146<<1 | 0<<10 | 0
  2005  	OP_MTMSRD = 31<<26 | 178<<1 | 0<<10 | 0
  2006  	OP_MTSPR  = 31<<26 | 467<<1 | 0<<10 | 0
  2007  	OP_MTSR   = 31<<26 | 210<<1 | 0<<10 | 0
  2008  	OP_MTSRIN = 31<<26 | 242<<1 | 0<<10 | 0
  2009  	OP_MULLW  = 31<<26 | 235<<1 | 0<<10 | 0
  2010  	OP_MULLD  = 31<<26 | 233<<1 | 0<<10 | 0
  2011  	OP_OR     = 31<<26 | 444<<1 | 0<<10 | 0
  2012  	OP_ORI    = 24<<26 | 0<<1 | 0<<10 | 0
  2013  	OP_ORIS   = 25<<26 | 0<<1 | 0<<10 | 0
  2014  	OP_RLWINM = 21<<26 | 0<<1 | 0<<10 | 0
  2015  	OP_RLWNM  = 23<<26 | 0<<1 | 0<<10 | 0
  2016  	OP_SUBF   = 31<<26 | 40<<1 | 0<<10 | 0
  2017  	OP_RLDIC  = 30<<26 | 4<<1 | 0<<10 | 0
  2018  	OP_RLDICR = 30<<26 | 2<<1 | 0<<10 | 0
  2019  	OP_RLDICL = 30<<26 | 0<<1 | 0<<10 | 0
  2020  	OP_RLDCL  = 30<<26 | 8<<1 | 0<<10 | 0
  2021  )
  2022  
  2023  func oclass(a *obj.Addr) int {
  2024  	return int(a.Class) - 1
  2025  }
  2026  
  2027  const (
  2028  	D_FORM = iota
  2029  	DS_FORM
  2030  )
  2031  
  2032  // This function determines when a non-indexed load or store is D or
  2033  // DS form for use in finding the size of the offset field in the instruction.
  2034  // The size is needed when setting the offset value in the instruction
  2035  // and when generating relocation for that field.
  2036  // DS form instructions include: ld, ldu, lwa, std, stdu.  All other
  2037  // loads and stores with an offset field are D form.  This function should
  2038  // only be called with the same opcodes as are handled by opstore and opload.
  2039  func (c *ctxt9) opform(insn uint32) int {
  2040  	switch insn {
  2041  	default:
  2042  		c.ctxt.Diag("bad insn in loadform: %x", insn)
  2043  	case OPVCC(58, 0, 0, 0), // ld
  2044  		OPVCC(58, 0, 0, 1),        // ldu
  2045  		OPVCC(58, 0, 0, 0) | 1<<1, // lwa
  2046  		OPVCC(62, 0, 0, 0),        // std
  2047  		OPVCC(62, 0, 0, 1):        //stdu
  2048  		return DS_FORM
  2049  	case OP_ADDI, // add
  2050  		OPVCC(32, 0, 0, 0), // lwz
  2051  		OPVCC(33, 0, 0, 0), // lwzu
  2052  		OPVCC(34, 0, 0, 0), // lbz
  2053  		OPVCC(35, 0, 0, 0), // lbzu
  2054  		OPVCC(40, 0, 0, 0), // lhz
  2055  		OPVCC(41, 0, 0, 0), // lhzu
  2056  		OPVCC(42, 0, 0, 0), // lha
  2057  		OPVCC(43, 0, 0, 0), // lhau
  2058  		OPVCC(46, 0, 0, 0), // lmw
  2059  		OPVCC(48, 0, 0, 0), // lfs
  2060  		OPVCC(49, 0, 0, 0), // lfsu
  2061  		OPVCC(50, 0, 0, 0), // lfd
  2062  		OPVCC(51, 0, 0, 0), // lfdu
  2063  		OPVCC(36, 0, 0, 0), // stw
  2064  		OPVCC(37, 0, 0, 0), // stwu
  2065  		OPVCC(38, 0, 0, 0), // stb
  2066  		OPVCC(39, 0, 0, 0), // stbu
  2067  		OPVCC(44, 0, 0, 0), // sth
  2068  		OPVCC(45, 0, 0, 0), // sthu
  2069  		OPVCC(47, 0, 0, 0), // stmw
  2070  		OPVCC(52, 0, 0, 0), // stfs
  2071  		OPVCC(53, 0, 0, 0), // stfsu
  2072  		OPVCC(54, 0, 0, 0), // stfd
  2073  		OPVCC(55, 0, 0, 0): // stfdu
  2074  		return D_FORM
  2075  	}
  2076  	return 0
  2077  }
  2078  
  2079  // Encode instructions and create relocation for accessing s+d according to the
  2080  // instruction op with source or destination (as appropriate) register reg.
  2081  func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32) (o1, o2 uint32) {
  2082  	var base uint32
  2083  	form := c.opform(op)
  2084  	if c.ctxt.Flag_shared {
  2085  		base = REG_R2
  2086  	} else {
  2087  		base = REG_R0
  2088  	}
  2089  	o1 = AOP_IRR(OP_ADDIS, REGTMP, base, 0)
  2090  	o2 = AOP_IRR(op, uint32(reg), REGTMP, 0)
  2091  	rel := obj.Addrel(c.cursym)
  2092  	rel.Off = int32(c.pc)
  2093  	rel.Siz = 8
  2094  	rel.Sym = s
  2095  	rel.Add = d
  2096  	if c.ctxt.Flag_shared {
  2097  		switch form {
  2098  		case D_FORM:
  2099  			rel.Type = objabi.R_ADDRPOWER_TOCREL
  2100  		case DS_FORM:
  2101  			rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
  2102  		}
  2103  
  2104  	} else {
  2105  		switch form {
  2106  		case D_FORM:
  2107  			rel.Type = objabi.R_ADDRPOWER
  2108  		case DS_FORM:
  2109  			rel.Type = objabi.R_ADDRPOWER_DS
  2110  		}
  2111  	}
  2112  	return
  2113  }
  2114  
  2115  /*
  2116   * 32-bit masks
  2117   */
  2118  func getmask(m []byte, v uint32) bool {
  2119  	m[1] = 0
  2120  	m[0] = m[1]
  2121  	if v != ^uint32(0) && v&(1<<31) != 0 && v&1 != 0 { /* MB > ME */
  2122  		if getmask(m, ^v) {
  2123  			i := int(m[0])
  2124  			m[0] = m[1] + 1
  2125  			m[1] = byte(i - 1)
  2126  			return true
  2127  		}
  2128  
  2129  		return false
  2130  	}
  2131  
  2132  	for i := 0; i < 32; i++ {
  2133  		if v&(1<<uint(31-i)) != 0 {
  2134  			m[0] = byte(i)
  2135  			for {
  2136  				m[1] = byte(i)
  2137  				i++
  2138  				if i >= 32 || v&(1<<uint(31-i)) == 0 {
  2139  					break
  2140  				}
  2141  			}
  2142  
  2143  			for ; i < 32; i++ {
  2144  				if v&(1<<uint(31-i)) != 0 {
  2145  					return false
  2146  				}
  2147  			}
  2148  			return true
  2149  		}
  2150  	}
  2151  
  2152  	return false
  2153  }
  2154  
  2155  func (c *ctxt9) maskgen(p *obj.Prog, m []byte, v uint32) {
  2156  	if !getmask(m, v) {
  2157  		c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
  2158  	}
  2159  }
  2160  
  2161  /*
  2162   * 64-bit masks (rldic etc)
  2163   */
  2164  func getmask64(m []byte, v uint64) bool {
  2165  	m[1] = 0
  2166  	m[0] = m[1]
  2167  	for i := 0; i < 64; i++ {
  2168  		if v&(uint64(1)<<uint(63-i)) != 0 {
  2169  			m[0] = byte(i)
  2170  			for {
  2171  				m[1] = byte(i)
  2172  				i++
  2173  				if i >= 64 || v&(uint64(1)<<uint(63-i)) == 0 {
  2174  					break
  2175  				}
  2176  			}
  2177  
  2178  			for ; i < 64; i++ {
  2179  				if v&(uint64(1)<<uint(63-i)) != 0 {
  2180  					return false
  2181  				}
  2182  			}
  2183  			return true
  2184  		}
  2185  	}
  2186  
  2187  	return false
  2188  }
  2189  
  2190  func (c *ctxt9) maskgen64(p *obj.Prog, m []byte, v uint64) {
  2191  	if !getmask64(m, v) {
  2192  		c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
  2193  	}
  2194  }
  2195  
  2196  func loadu32(r int, d int64) uint32 {
  2197  	v := int32(d >> 16)
  2198  	if isuint32(uint64(d)) {
  2199  		return LOP_IRR(OP_ORIS, uint32(r), REGZERO, uint32(v))
  2200  	}
  2201  	return AOP_IRR(OP_ADDIS, uint32(r), REGZERO, uint32(v))
  2202  }
  2203  
  2204  func high16adjusted(d int32) uint16 {
  2205  	if d&0x8000 != 0 {
  2206  		return uint16((d >> 16) + 1)
  2207  	}
  2208  	return uint16(d >> 16)
  2209  }
  2210  
  2211  func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
  2212  	o1 := uint32(0)
  2213  	o2 := uint32(0)
  2214  	o3 := uint32(0)
  2215  	o4 := uint32(0)
  2216  	o5 := uint32(0)
  2217  
  2218  	//print("%v => case %d\n", p, o->type);
  2219  	switch o.type_ {
  2220  	default:
  2221  		c.ctxt.Diag("unknown type %d", o.type_)
  2222  		prasm(p)
  2223  
  2224  	case 0: /* pseudo ops */
  2225  		break
  2226  
  2227  	case 1: /* mov r1,r2 ==> OR Rs,Rs,Ra */
  2228  		if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
  2229  			v := c.regoff(&p.From)
  2230  			if r0iszero != 0 /*TypeKind(100016)*/ && v != 0 {
  2231  				//nerrors--;
  2232  				c.ctxt.Diag("literal operation on R0\n%v", p)
  2233  			}
  2234  
  2235  			o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
  2236  			break
  2237  		}
  2238  
  2239  		o1 = LOP_RRR(OP_OR, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.From.Reg))
  2240  
  2241  	case 2: /* int/cr/fp op Rb,[Ra],Rd */
  2242  		r := int(p.Reg)
  2243  
  2244  		if r == 0 {
  2245  			r = int(p.To.Reg)
  2246  		}
  2247  		o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
  2248  
  2249  	case 3: /* mov $soreg/addcon/ucon, r ==> addis/addi $i,reg',r */
  2250  		d := c.vregoff(&p.From)
  2251  
  2252  		v := int32(d)
  2253  		r := int(p.From.Reg)
  2254  		if r == 0 {
  2255  			r = int(o.param)
  2256  		}
  2257  		if r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0 && (r != 0 || v != 0) {
  2258  			c.ctxt.Diag("literal operation on R0\n%v", p)
  2259  		}
  2260  		a := OP_ADDI
  2261  		if o.a1 == C_UCON {
  2262  			if d&0xffff != 0 {
  2263  				log.Fatalf("invalid handling of %v", p)
  2264  			}
  2265  			v >>= 16
  2266  			if r == REGZERO && isuint32(uint64(d)) {
  2267  				o1 = LOP_IRR(OP_ORIS, uint32(p.To.Reg), REGZERO, uint32(v))
  2268  				break
  2269  			}
  2270  
  2271  			a = OP_ADDIS
  2272  		} else {
  2273  			if int64(int16(d)) != d {
  2274  				log.Fatalf("invalid handling of %v", p)
  2275  			}
  2276  		}
  2277  
  2278  		o1 = AOP_IRR(uint32(a), uint32(p.To.Reg), uint32(r), uint32(v))
  2279  
  2280  	case 4: /* add/mul $scon,[r1],r2 */
  2281  		v := c.regoff(&p.From)
  2282  
  2283  		r := int(p.Reg)
  2284  		if r == 0 {
  2285  			r = int(p.To.Reg)
  2286  		}
  2287  		if r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0 {
  2288  			c.ctxt.Diag("literal operation on R0\n%v", p)
  2289  		}
  2290  		if int32(int16(v)) != v {
  2291  			log.Fatalf("mishandled instruction %v", p)
  2292  		}
  2293  		o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2294  
  2295  	case 5: /* syscall */
  2296  		o1 = c.oprrr(p.As)
  2297  
  2298  	case 6: /* logical op Rb,[Rs,]Ra; no literal */
  2299  		r := int(p.Reg)
  2300  
  2301  		if r == 0 {
  2302  			r = int(p.To.Reg)
  2303  		}
  2304  		// AROTL and AROTLW are extended mnemonics, which map to RLDCL and RLWNM.
  2305  		switch p.As {
  2306  		case AROTL:
  2307  			o1 = AOP_RLDIC(OP_RLDCL, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), uint32(0))
  2308  		case AROTLW:
  2309  			o1 = OP_RLW(OP_RLWNM, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), 0, 31)
  2310  		default:
  2311  			o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
  2312  		}
  2313  
  2314  	case 7: /* mov r, soreg ==> stw o(r) */
  2315  		r := int(p.To.Reg)
  2316  
  2317  		if r == 0 {
  2318  			r = int(o.param)
  2319  		}
  2320  		v := c.regoff(&p.To)
  2321  		if p.To.Type == obj.TYPE_MEM && p.To.Index != 0 {
  2322  			if v != 0 {
  2323  				c.ctxt.Diag("illegal indexed instruction\n%v", p)
  2324  			}
  2325  			if c.ctxt.Flag_shared && r == REG_R13 {
  2326  				rel := obj.Addrel(c.cursym)
  2327  				rel.Off = int32(c.pc)
  2328  				rel.Siz = 4
  2329  				// This (and the matching part in the load case
  2330  				// below) are the only places in the ppc64 toolchain
  2331  				// that knows the name of the tls variable. Possibly
  2332  				// we could add some assembly syntax so that the name
  2333  				// of the variable does not have to be assumed.
  2334  				rel.Sym = c.ctxt.Lookup("runtime.tls_g")
  2335  				rel.Type = objabi.R_POWER_TLS
  2336  			}
  2337  			o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(r))
  2338  		} else {
  2339  			if int32(int16(v)) != v {
  2340  				log.Fatalf("mishandled instruction %v", p)
  2341  			}
  2342  			// Offsets in DS form stores must be a multiple of 4
  2343  			inst := c.opstore(p.As)
  2344  			if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  2345  				log.Fatalf("invalid offset for DS form load/store %v", p)
  2346  			}
  2347  			o1 = AOP_IRR(inst, uint32(p.From.Reg), uint32(r), uint32(v))
  2348  		}
  2349  
  2350  	case 8: /* mov soreg, r ==> lbz/lhz/lwz o(r) */
  2351  		r := int(p.From.Reg)
  2352  
  2353  		if r == 0 {
  2354  			r = int(o.param)
  2355  		}
  2356  		v := c.regoff(&p.From)
  2357  		if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
  2358  			if v != 0 {
  2359  				c.ctxt.Diag("illegal indexed instruction\n%v", p)
  2360  			}
  2361  			if c.ctxt.Flag_shared && r == REG_R13 {
  2362  				rel := obj.Addrel(c.cursym)
  2363  				rel.Off = int32(c.pc)
  2364  				rel.Siz = 4
  2365  				rel.Sym = c.ctxt.Lookup("runtime.tls_g")
  2366  				rel.Type = objabi.R_POWER_TLS
  2367  			}
  2368  			o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
  2369  		} else {
  2370  			if int32(int16(v)) != v {
  2371  				log.Fatalf("mishandled instruction %v", p)
  2372  			}
  2373  			// Offsets in DS form loads must be a multiple of 4
  2374  			inst := c.opload(p.As)
  2375  			if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  2376  				log.Fatalf("invalid offset for DS form load/store %v", p)
  2377  			}
  2378  			o1 = AOP_IRR(inst, uint32(p.To.Reg), uint32(r), uint32(v))
  2379  		}
  2380  
  2381  	case 9: /* movb soreg, r ==> lbz o(r),r2; extsb r2,r2 */
  2382  		r := int(p.From.Reg)
  2383  
  2384  		if r == 0 {
  2385  			r = int(o.param)
  2386  		}
  2387  		v := c.regoff(&p.From)
  2388  		if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
  2389  			if v != 0 {
  2390  				c.ctxt.Diag("illegal indexed instruction\n%v", p)
  2391  			}
  2392  			o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
  2393  		} else {
  2394  			o1 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2395  		}
  2396  		o2 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
  2397  
  2398  	case 10: /* sub Ra,[Rb],Rd => subf Rd,Ra,Rb */
  2399  		r := int(p.Reg)
  2400  
  2401  		if r == 0 {
  2402  			r = int(p.To.Reg)
  2403  		}
  2404  		o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(r))
  2405  
  2406  	case 11: /* br/bl lbra */
  2407  		v := int32(0)
  2408  
  2409  		if p.Pcond != nil {
  2410  			v = int32(p.Pcond.Pc - p.Pc)
  2411  			if v&03 != 0 {
  2412  				c.ctxt.Diag("odd branch target address\n%v", p)
  2413  				v &^= 03
  2414  			}
  2415  
  2416  			if v < -(1<<25) || v >= 1<<24 {
  2417  				c.ctxt.Diag("branch too far\n%v", p)
  2418  			}
  2419  		}
  2420  
  2421  		o1 = OP_BR(c.opirr(p.As), uint32(v), 0)
  2422  		if p.To.Sym != nil {
  2423  			rel := obj.Addrel(c.cursym)
  2424  			rel.Off = int32(c.pc)
  2425  			rel.Siz = 4
  2426  			rel.Sym = p.To.Sym
  2427  			v += int32(p.To.Offset)
  2428  			if v&03 != 0 {
  2429  				c.ctxt.Diag("odd branch target address\n%v", p)
  2430  				v &^= 03
  2431  			}
  2432  
  2433  			rel.Add = int64(v)
  2434  			rel.Type = objabi.R_CALLPOWER
  2435  		}
  2436  		o2 = 0x60000000 // nop, sometimes overwritten by ld r2, 24(r1) when dynamic linking
  2437  
  2438  	case 12: /* movb r,r (extsb); movw r,r (extsw) */
  2439  		if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
  2440  			v := c.regoff(&p.From)
  2441  			if r0iszero != 0 /*TypeKind(100016)*/ && v != 0 {
  2442  				c.ctxt.Diag("literal operation on R0\n%v", p)
  2443  			}
  2444  
  2445  			o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
  2446  			break
  2447  		}
  2448  
  2449  		if p.As == AMOVW {
  2450  			o1 = LOP_RRR(OP_EXTSW, uint32(p.To.Reg), uint32(p.From.Reg), 0)
  2451  		} else {
  2452  			o1 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.From.Reg), 0)
  2453  		}
  2454  
  2455  	case 13: /* mov[bhw]z r,r; uses rlwinm not andi. to avoid changing CC */
  2456  		if p.As == AMOVBZ {
  2457  			o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 24, 31)
  2458  		} else if p.As == AMOVH {
  2459  			o1 = LOP_RRR(OP_EXTSH, uint32(p.To.Reg), uint32(p.From.Reg), 0)
  2460  		} else if p.As == AMOVHZ {
  2461  			o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 16, 31)
  2462  		} else if p.As == AMOVWZ {
  2463  			o1 = OP_RLW(OP_RLDIC, uint32(p.To.Reg), uint32(p.From.Reg), 0, 0, 0) | 1<<5 /* MB=32 */
  2464  		} else {
  2465  			c.ctxt.Diag("internal: bad mov[bhw]z\n%v", p)
  2466  		}
  2467  
  2468  	case 14: /* rldc[lr] Rb,Rs,$mask,Ra -- left, right give different masks */
  2469  		r := int(p.Reg)
  2470  
  2471  		if r == 0 {
  2472  			r = int(p.To.Reg)
  2473  		}
  2474  		d := c.vregoff(p.GetFrom3())
  2475  		var a int
  2476  		switch p.As {
  2477  
  2478  		// These opcodes expect a mask operand that has to be converted into the
  2479  		// appropriate operand.  The way these were defined, not all valid masks are possible.
  2480  		// Left here for compatibility in case they were used or generated.
  2481  		case ARLDCL, ARLDCLCC:
  2482  			var mask [2]uint8
  2483  			c.maskgen64(p, mask[:], uint64(d))
  2484  
  2485  			a = int(mask[0]) /* MB */
  2486  			if mask[1] != 63 {
  2487  				c.ctxt.Diag("invalid mask for rotate: %x (end != bit 63)\n%v", uint64(d), p)
  2488  			}
  2489  			o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
  2490  			o1 |= (uint32(a) & 31) << 6
  2491  			if a&0x20 != 0 {
  2492  				o1 |= 1 << 5 /* mb[5] is top bit */
  2493  			}
  2494  
  2495  		case ARLDCR, ARLDCRCC:
  2496  			var mask [2]uint8
  2497  			c.maskgen64(p, mask[:], uint64(d))
  2498  
  2499  			a = int(mask[1]) /* ME */
  2500  			if mask[0] != 0 {
  2501  				c.ctxt.Diag("invalid mask for rotate: %x (start != 0)\n%v", uint64(d), p)
  2502  			}
  2503  			o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
  2504  			o1 |= (uint32(a) & 31) << 6
  2505  			if a&0x20 != 0 {
  2506  				o1 |= 1 << 5 /* mb[5] is top bit */
  2507  			}
  2508  
  2509  		// These opcodes use a shift count like the ppc64 asm, no mask conversion done
  2510  		case ARLDICR, ARLDICRCC:
  2511  			me := int(d)
  2512  			sh := c.regoff(&p.From)
  2513  			o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(me))
  2514  
  2515  		case ARLDICL, ARLDICLCC:
  2516  			mb := int(d)
  2517  			sh := c.regoff(&p.From)
  2518  			o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(mb))
  2519  
  2520  		default:
  2521  			c.ctxt.Diag("unexpected op in rldc case\n%v", p)
  2522  			a = 0
  2523  		}
  2524  
  2525  	case 17, /* bc bo,bi,lbra (same for now) */
  2526  		16: /* bc bo,bi,sbra */
  2527  		a := 0
  2528  
  2529  		r := int(p.Reg)
  2530  
  2531  		if p.From.Type == obj.TYPE_CONST {
  2532  			a = int(c.regoff(&p.From))
  2533  		} else if p.From.Type == obj.TYPE_REG {
  2534  			if r != 0 {
  2535  				c.ctxt.Diag("unexpected register setting for branch with CR: %d\n", r)
  2536  			}
  2537  			// BI values for the CR
  2538  			switch p.From.Reg {
  2539  			case REG_CR0:
  2540  				r = BI_CR0
  2541  			case REG_CR1:
  2542  				r = BI_CR1
  2543  			case REG_CR2:
  2544  				r = BI_CR2
  2545  			case REG_CR3:
  2546  				r = BI_CR3
  2547  			case REG_CR4:
  2548  				r = BI_CR4
  2549  			case REG_CR5:
  2550  				r = BI_CR5
  2551  			case REG_CR6:
  2552  				r = BI_CR6
  2553  			case REG_CR7:
  2554  				r = BI_CR7
  2555  			default:
  2556  				c.ctxt.Diag("unrecognized register: expecting CR\n")
  2557  			}
  2558  		}
  2559  		v := int32(0)
  2560  		if p.Pcond != nil {
  2561  			v = int32(p.Pcond.Pc - p.Pc)
  2562  		}
  2563  		if v&03 != 0 {
  2564  			c.ctxt.Diag("odd branch target address\n%v", p)
  2565  			v &^= 03
  2566  		}
  2567  
  2568  		if v < -(1<<16) || v >= 1<<15 {
  2569  			c.ctxt.Diag("branch too far\n%v", p)
  2570  		}
  2571  		o1 = OP_BC(c.opirr(p.As), uint32(a), uint32(r), uint32(v), 0)
  2572  
  2573  	case 15: /* br/bl (r) => mov r,lr; br/bl (lr) */
  2574  		var v int32
  2575  		if p.As == ABC || p.As == ABCL {
  2576  			v = c.regoff(&p.To) & 31
  2577  		} else {
  2578  			v = 20 /* unconditional */
  2579  		}
  2580  		o1 = AOP_RRR(OP_MTSPR, uint32(p.To.Reg), 0, 0) | (REG_LR&0x1f)<<16 | ((REG_LR>>5)&0x1f)<<11
  2581  		o2 = OPVCC(19, 16, 0, 0)
  2582  		if p.As == ABL || p.As == ABCL {
  2583  			o2 |= 1
  2584  		}
  2585  		o2 = OP_BCR(o2, uint32(v), uint32(p.To.Index))
  2586  
  2587  	case 18: /* br/bl (lr/ctr); bc/bcl bo,bi,(lr/ctr) */
  2588  		var v int32
  2589  		if p.As == ABC || p.As == ABCL {
  2590  			v = c.regoff(&p.From) & 31
  2591  		} else {
  2592  			v = 20 /* unconditional */
  2593  		}
  2594  		r := int(p.Reg)
  2595  		if r == 0 {
  2596  			r = 0
  2597  		}
  2598  		switch oclass(&p.To) {
  2599  		case C_CTR:
  2600  			o1 = OPVCC(19, 528, 0, 0)
  2601  
  2602  		case C_LR:
  2603  			o1 = OPVCC(19, 16, 0, 0)
  2604  
  2605  		default:
  2606  			c.ctxt.Diag("bad optab entry (18): %d\n%v", p.To.Class, p)
  2607  			v = 0
  2608  		}
  2609  
  2610  		if p.As == ABL || p.As == ABCL {
  2611  			o1 |= 1
  2612  		}
  2613  		o1 = OP_BCR(o1, uint32(v), uint32(r))
  2614  
  2615  	case 19: /* mov $lcon,r ==> cau+or */
  2616  		d := c.vregoff(&p.From)
  2617  
  2618  		if p.From.Sym == nil {
  2619  			o1 = loadu32(int(p.To.Reg), d)
  2620  			o2 = LOP_IRR(OP_ORI, uint32(p.To.Reg), uint32(p.To.Reg), uint32(int32(d)))
  2621  		} else {
  2622  			o1, o2 = c.symbolAccess(p.From.Sym, d, p.To.Reg, OP_ADDI)
  2623  		}
  2624  
  2625  	//if(dlm) reloc(&p->from, p->pc, 0);
  2626  
  2627  	case 20: /* add $ucon,,r */
  2628  		v := c.regoff(&p.From)
  2629  
  2630  		r := int(p.Reg)
  2631  		if r == 0 {
  2632  			r = int(p.To.Reg)
  2633  		}
  2634  		if p.As == AADD && (r0iszero == 0 /*TypeKind(100016)*/ && p.Reg == 0 || r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0) {
  2635  			c.ctxt.Diag("literal operation on R0\n%v", p)
  2636  		}
  2637  		o1 = AOP_IRR(c.opirr(-p.As), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
  2638  
  2639  	case 22: /* add $lcon,r1,r2 ==> cau+or+add */ /* could do add/sub more efficiently */
  2640  		if p.To.Reg == REGTMP || p.Reg == REGTMP {
  2641  			c.ctxt.Diag("can't synthesize large constant\n%v", p)
  2642  		}
  2643  		d := c.vregoff(&p.From)
  2644  		o1 = loadu32(REGTMP, d)
  2645  		o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
  2646  		r := int(p.Reg)
  2647  		if r == 0 {
  2648  			r = int(p.To.Reg)
  2649  		}
  2650  		o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
  2651  		if p.From.Sym != nil {
  2652  			c.ctxt.Diag("%v is not supported", p)
  2653  		}
  2654  
  2655  	//if(dlm) reloc(&p->from, p->pc, 0);
  2656  
  2657  	case 23: /* and $lcon,r1,r2 ==> cau+or+and */ /* masks could be done using rlnm etc. */
  2658  		if p.To.Reg == REGTMP || p.Reg == REGTMP {
  2659  			c.ctxt.Diag("can't synthesize large constant\n%v", p)
  2660  		}
  2661  		d := c.vregoff(&p.From)
  2662  		o1 = loadu32(REGTMP, d)
  2663  		o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
  2664  		r := int(p.Reg)
  2665  		if r == 0 {
  2666  			r = int(p.To.Reg)
  2667  		}
  2668  		o3 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
  2669  		if p.From.Sym != nil {
  2670  			c.ctxt.Diag("%v is not supported", p)
  2671  		}
  2672  
  2673  		//if(dlm) reloc(&p->from, p->pc, 0);
  2674  
  2675  		/*24*/
  2676  	case 25:
  2677  		/* sld[.] $sh,rS,rA -> rldicr[.] $sh,rS,mask(0,63-sh),rA; srd[.] -> rldicl */
  2678  		v := c.regoff(&p.From)
  2679  
  2680  		if v < 0 {
  2681  			v = 0
  2682  		} else if v > 63 {
  2683  			v = 63
  2684  		}
  2685  		r := int(p.Reg)
  2686  		if r == 0 {
  2687  			r = int(p.To.Reg)
  2688  		}
  2689  		var a int
  2690  		op := uint32(0)
  2691  		switch p.As {
  2692  		case ASLD, ASLDCC:
  2693  			a = int(63 - v)
  2694  			op = OP_RLDICR
  2695  
  2696  		case ASRD, ASRDCC:
  2697  			a = int(v)
  2698  			v = 64 - v
  2699  			op = OP_RLDICL
  2700  		case AROTL:
  2701  			a = int(0)
  2702  			op = OP_RLDICL
  2703  		default:
  2704  			c.ctxt.Diag("unexpected op in sldi case\n%v", p)
  2705  			a = 0
  2706  			o1 = 0
  2707  		}
  2708  
  2709  		o1 = AOP_RLDIC(op, uint32(p.To.Reg), uint32(r), uint32(v), uint32(a))
  2710  		if p.As == ASLDCC || p.As == ASRDCC {
  2711  			o1 |= 1 // Set the condition code bit
  2712  		}
  2713  
  2714  	case 26: /* mov $lsext/auto/oreg,,r2 ==> addis+addi */
  2715  		if p.To.Reg == REGTMP {
  2716  			c.ctxt.Diag("can't synthesize large constant\n%v", p)
  2717  		}
  2718  		v := c.regoff(&p.From)
  2719  		r := int(p.From.Reg)
  2720  		if r == 0 {
  2721  			r = int(o.param)
  2722  		}
  2723  		o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
  2724  		o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGTMP, uint32(v))
  2725  
  2726  	case 27: /* subc ra,$simm,rd => subfic rd,ra,$simm */
  2727  		v := c.regoff(p.GetFrom3())
  2728  
  2729  		r := int(p.From.Reg)
  2730  		o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2731  
  2732  	case 28: /* subc r1,$lcon,r2 ==> cau+or+subfc */
  2733  		if p.To.Reg == REGTMP || p.From.Reg == REGTMP {
  2734  			c.ctxt.Diag("can't synthesize large constant\n%v", p)
  2735  		}
  2736  		v := c.regoff(p.GetFrom3())
  2737  		o1 = AOP_IRR(OP_ADDIS, REGTMP, REGZERO, uint32(v)>>16)
  2738  		o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(v))
  2739  		o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), REGTMP)
  2740  		if p.From.Sym != nil {
  2741  			c.ctxt.Diag("%v is not supported", p)
  2742  		}
  2743  
  2744  	//if(dlm) reloc(&p->from3, p->pc, 0);
  2745  
  2746  	case 29: /* rldic[lr]? $sh,s,$mask,a -- left, right, plain give different masks */
  2747  		v := c.regoff(&p.From)
  2748  
  2749  		d := c.vregoff(p.GetFrom3())
  2750  		var mask [2]uint8
  2751  		c.maskgen64(p, mask[:], uint64(d))
  2752  		var a int
  2753  		switch p.As {
  2754  		case ARLDC, ARLDCCC:
  2755  			a = int(mask[0]) /* MB */
  2756  			if int32(mask[1]) != (63 - v) {
  2757  				c.ctxt.Diag("invalid mask for shift: %x (shift %d)\n%v", uint64(d), v, p)
  2758  			}
  2759  
  2760  		case ARLDCL, ARLDCLCC:
  2761  			a = int(mask[0]) /* MB */
  2762  			if mask[1] != 63 {
  2763  				c.ctxt.Diag("invalid mask for shift: %x (shift %d)\n%v", uint64(d), v, p)
  2764  			}
  2765  
  2766  		case ARLDCR, ARLDCRCC:
  2767  			a = int(mask[1]) /* ME */
  2768  			if mask[0] != 0 {
  2769  				c.ctxt.Diag("invalid mask for shift: %x (shift %d)\n%v", uint64(d), v, p)
  2770  			}
  2771  
  2772  		default:
  2773  			c.ctxt.Diag("unexpected op in rldic case\n%v", p)
  2774  			a = 0
  2775  		}
  2776  
  2777  		o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
  2778  		o1 |= (uint32(a) & 31) << 6
  2779  		if v&0x20 != 0 {
  2780  			o1 |= 1 << 1
  2781  		}
  2782  		if a&0x20 != 0 {
  2783  			o1 |= 1 << 5 /* mb[5] is top bit */
  2784  		}
  2785  
  2786  	case 30: /* rldimi $sh,s,$mask,a */
  2787  		v := c.regoff(&p.From)
  2788  
  2789  		d := c.vregoff(p.GetFrom3())
  2790  
  2791  		// Original opcodes had mask operands which had to be converted to a shift count as expected by
  2792  		// the ppc64 asm.
  2793  		switch p.As {
  2794  		case ARLDMI, ARLDMICC:
  2795  			var mask [2]uint8
  2796  			c.maskgen64(p, mask[:], uint64(d))
  2797  			if int32(mask[1]) != (63 - v) {
  2798  				c.ctxt.Diag("invalid mask for shift: %x (shift %d)\n%v", uint64(d), v, p)
  2799  			}
  2800  			o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
  2801  			o1 |= (uint32(mask[0]) & 31) << 6
  2802  			if v&0x20 != 0 {
  2803  				o1 |= 1 << 1
  2804  			}
  2805  			if mask[0]&0x20 != 0 {
  2806  				o1 |= 1 << 5 /* mb[5] is top bit */
  2807  			}
  2808  
  2809  		// Opcodes with shift count operands.
  2810  		case ARLDIMI, ARLDIMICC:
  2811  			o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
  2812  			o1 |= (uint32(d) & 31) << 6
  2813  			if d&0x20 != 0 {
  2814  				o1 |= 1 << 5
  2815  			}
  2816  			if v&0x20 != 0 {
  2817  				o1 |= 1 << 1
  2818  			}
  2819  		}
  2820  
  2821  	case 31: /* dword */
  2822  		d := c.vregoff(&p.From)
  2823  
  2824  		if c.ctxt.Arch.ByteOrder == binary.BigEndian {
  2825  			o1 = uint32(d >> 32)
  2826  			o2 = uint32(d)
  2827  		} else {
  2828  			o1 = uint32(d)
  2829  			o2 = uint32(d >> 32)
  2830  		}
  2831  
  2832  		if p.From.Sym != nil {
  2833  			rel := obj.Addrel(c.cursym)
  2834  			rel.Off = int32(c.pc)
  2835  			rel.Siz = 8
  2836  			rel.Sym = p.From.Sym
  2837  			rel.Add = p.From.Offset
  2838  			rel.Type = objabi.R_ADDR
  2839  			o2 = 0
  2840  			o1 = o2
  2841  		}
  2842  
  2843  	case 32: /* fmul frc,fra,frd */
  2844  		r := int(p.Reg)
  2845  
  2846  		if r == 0 {
  2847  			r = int(p.To.Reg)
  2848  		}
  2849  		o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0) | (uint32(p.From.Reg)&31)<<6
  2850  
  2851  	case 33: /* fabs [frb,]frd; fmr. frb,frd */
  2852  		r := int(p.From.Reg)
  2853  
  2854  		if oclass(&p.From) == C_NONE {
  2855  			r = int(p.To.Reg)
  2856  		}
  2857  		o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(r))
  2858  
  2859  	case 34: /* FMADDx fra,frb,frc,frt (t=a*c±b) */
  2860  		o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg)) | (uint32(p.GetFrom3().Reg)&31)<<6
  2861  
  2862  	case 35: /* mov r,lext/lauto/loreg ==> cau $(v>>16),sb,r'; store o(r') */
  2863  		v := c.regoff(&p.To)
  2864  
  2865  		r := int(p.To.Reg)
  2866  		if r == 0 {
  2867  			r = int(o.param)
  2868  		}
  2869  		// Offsets in DS form stores must be a multiple of 4
  2870  		inst := c.opstore(p.As)
  2871  		if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  2872  			log.Fatalf("invalid offset for DS form load/store %v", p)
  2873  		}
  2874  		o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
  2875  		o2 = AOP_IRR(inst, uint32(p.From.Reg), REGTMP, uint32(v))
  2876  
  2877  	case 36: /* mov bz/h/hz lext/lauto/lreg,r ==> lbz/lha/lhz etc */
  2878  		v := c.regoff(&p.From)
  2879  
  2880  		r := int(p.From.Reg)
  2881  		if r == 0 {
  2882  			r = int(o.param)
  2883  		}
  2884  		o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
  2885  		o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
  2886  
  2887  	case 37: /* movb lext/lauto/lreg,r ==> lbz o(reg),r; extsb r */
  2888  		v := c.regoff(&p.From)
  2889  
  2890  		r := int(p.From.Reg)
  2891  		if r == 0 {
  2892  			r = int(o.param)
  2893  		}
  2894  		o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
  2895  		o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
  2896  		o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
  2897  
  2898  	case 40: /* word */
  2899  		o1 = uint32(c.regoff(&p.From))
  2900  
  2901  	case 41: /* stswi */
  2902  		o1 = AOP_RRR(c.opirr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
  2903  
  2904  	case 42: /* lswi */
  2905  		o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
  2906  
  2907  	case 43: /* data cache instructions: op (Ra+[Rb]), [th|l] */
  2908  		/* TH field for dcbt/dcbtst: */
  2909  		/* 0 = Block access - program will soon access EA. */
  2910  		/* 8-15 = Stream access - sequence of access (data stream). See section 4.3.2 of the ISA for details. */
  2911  		/* 16 = Block access - program will soon make a transient access to EA. */
  2912  		/* 17 = Block access - program will not access EA for a long time. */
  2913  
  2914  		/* L field for dcbf: */
  2915  		/* 0 = invalidates the block containing EA in all processors. */
  2916  		/* 1 = same as 0, but with limited scope (i.e. block in the current processor will not be reused soon). */
  2917  		/* 3 = same as 1, but with even more limited scope (i.e. block in the current processor primary cache will not be reused soon). */
  2918  		if p.To.Type == obj.TYPE_NONE {
  2919  			o1 = AOP_RRR(c.oprrr(p.As), 0, uint32(p.From.Index), uint32(p.From.Reg))
  2920  		} else {
  2921  			th := c.regoff(&p.To)
  2922  			o1 = AOP_RRR(c.oprrr(p.As), uint32(th), uint32(p.From.Index), uint32(p.From.Reg))
  2923  		}
  2924  
  2925  	case 44: /* indexed store */
  2926  		o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
  2927  
  2928  	case 45: /* indexed load */
  2929  		o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
  2930  
  2931  	case 46: /* plain op */
  2932  		o1 = c.oprrr(p.As)
  2933  
  2934  	case 47: /* op Ra, Rd; also op [Ra,] Rd */
  2935  		r := int(p.From.Reg)
  2936  
  2937  		if r == 0 {
  2938  			r = int(p.To.Reg)
  2939  		}
  2940  		o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
  2941  
  2942  	case 48: /* op Rs, Ra */
  2943  		r := int(p.From.Reg)
  2944  
  2945  		if r == 0 {
  2946  			r = int(p.To.Reg)
  2947  		}
  2948  		o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
  2949  
  2950  	case 49: /* op Rb; op $n, Rb */
  2951  		if p.From.Type != obj.TYPE_REG { /* tlbie $L, rB */
  2952  			v := c.regoff(&p.From) & 1
  2953  			o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.To.Reg)) | uint32(v)<<21
  2954  		} else {
  2955  			o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.From.Reg))
  2956  		}
  2957  
  2958  	case 50: /* rem[u] r1[,r2],r3 */
  2959  		r := int(p.Reg)
  2960  
  2961  		if r == 0 {
  2962  			r = int(p.To.Reg)
  2963  		}
  2964  		v := c.oprrr(p.As)
  2965  		t := v & (1<<10 | 1) /* OE|Rc */
  2966  		o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
  2967  		o2 = AOP_RRR(OP_MULLW, REGTMP, REGTMP, uint32(p.From.Reg))
  2968  		o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
  2969  		if p.As == AREMU {
  2970  			o4 = o3
  2971  
  2972  			/* Clear top 32 bits */
  2973  			o3 = OP_RLW(OP_RLDIC, REGTMP, REGTMP, 0, 0, 0) | 1<<5
  2974  		}
  2975  
  2976  	case 51: /* remd[u] r1[,r2],r3 */
  2977  		r := int(p.Reg)
  2978  
  2979  		if r == 0 {
  2980  			r = int(p.To.Reg)
  2981  		}
  2982  		v := c.oprrr(p.As)
  2983  		t := v & (1<<10 | 1) /* OE|Rc */
  2984  		o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
  2985  		o2 = AOP_RRR(OP_MULLD, REGTMP, REGTMP, uint32(p.From.Reg))
  2986  		o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
  2987  
  2988  	case 52: /* mtfsbNx cr(n) */
  2989  		v := c.regoff(&p.From) & 31
  2990  
  2991  		o1 = AOP_RRR(c.oprrr(p.As), uint32(v), 0, 0)
  2992  
  2993  	case 53: /* mffsX ,fr1 */
  2994  		o1 = AOP_RRR(OP_MFFS, uint32(p.To.Reg), 0, 0)
  2995  
  2996  	case 54: /* mov msr,r1; mov r1, msr*/
  2997  		if oclass(&p.From) == C_REG {
  2998  			if p.As == AMOVD {
  2999  				o1 = AOP_RRR(OP_MTMSRD, uint32(p.From.Reg), 0, 0)
  3000  			} else {
  3001  				o1 = AOP_RRR(OP_MTMSR, uint32(p.From.Reg), 0, 0)
  3002  			}
  3003  		} else {
  3004  			o1 = AOP_RRR(OP_MFMSR, uint32(p.To.Reg), 0, 0)
  3005  		}
  3006  
  3007  	case 55: /* op Rb, Rd */
  3008  		o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(p.From.Reg))
  3009  
  3010  	case 56: /* sra $sh,[s,]a; srd $sh,[s,]a */
  3011  		v := c.regoff(&p.From)
  3012  
  3013  		r := int(p.Reg)
  3014  		if r == 0 {
  3015  			r = int(p.To.Reg)
  3016  		}
  3017  		o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.To.Reg), uint32(v)&31)
  3018  		if (p.As == ASRAD || p.As == ASRADCC) && (v&0x20 != 0) {
  3019  			o1 |= 1 << 1 /* mb[5] */
  3020  		}
  3021  
  3022  	case 57: /* slw $sh,[s,]a -> rlwinm ... */
  3023  		v := c.regoff(&p.From)
  3024  
  3025  		r := int(p.Reg)
  3026  		if r == 0 {
  3027  			r = int(p.To.Reg)
  3028  		}
  3029  
  3030  		/*
  3031  			 * Let user (gs) shoot himself in the foot.
  3032  			 * qc has already complained.
  3033  			 *
  3034  			if(v < 0 || v > 31)
  3035  				ctxt->diag("illegal shift %ld\n%v", v, p);
  3036  		*/
  3037  		if v < 0 {
  3038  			v = 0
  3039  		} else if v > 32 {
  3040  			v = 32
  3041  		}
  3042  		var mask [2]uint8
  3043  		switch p.As {
  3044  		case AROTLW:
  3045  			mask[0], mask[1] = 0, 31
  3046  		case ASRW, ASRWCC:
  3047  			mask[0], mask[1] = uint8(v), 31
  3048  			v = 32 - v
  3049  		default:
  3050  			mask[0], mask[1] = 0, uint8(31-v)
  3051  		}
  3052  		o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(r), uint32(v), uint32(mask[0]), uint32(mask[1]))
  3053  		if p.As == ASLWCC || p.As == ASRWCC {
  3054  			o1 |= 1 // set the condition code
  3055  		}
  3056  
  3057  	case 58: /* logical $andcon,[s],a */
  3058  		v := c.regoff(&p.From)
  3059  
  3060  		r := int(p.Reg)
  3061  		if r == 0 {
  3062  			r = int(p.To.Reg)
  3063  		}
  3064  		o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  3065  
  3066  	case 59: /* or/and $ucon,,r */
  3067  		v := c.regoff(&p.From)
  3068  
  3069  		r := int(p.Reg)
  3070  		if r == 0 {
  3071  			r = int(p.To.Reg)
  3072  		}
  3073  		o1 = LOP_IRR(c.opirr(-p.As), uint32(p.To.Reg), uint32(r), uint32(v)>>16) /* oris, xoris, andis */
  3074  
  3075  	case 60: /* tw to,a,b */
  3076  		r := int(c.regoff(&p.From) & 31)
  3077  
  3078  		o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.Reg), uint32(p.To.Reg))
  3079  
  3080  	case 61: /* tw to,a,$simm */
  3081  		r := int(c.regoff(&p.From) & 31)
  3082  
  3083  		v := c.regoff(&p.To)
  3084  		o1 = AOP_IRR(c.opirr(p.As), uint32(r), uint32(p.Reg), uint32(v))
  3085  
  3086  	case 62: /* rlwmi $sh,s,$mask,a */
  3087  		v := c.regoff(&p.From)
  3088  
  3089  		var mask [2]uint8
  3090  		c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
  3091  		o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
  3092  		o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
  3093  
  3094  	case 63: /* rlwmi b,s,$mask,a */
  3095  		var mask [2]uint8
  3096  		c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
  3097  
  3098  		o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(p.From.Reg))
  3099  		o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
  3100  
  3101  	case 64: /* mtfsf fr[, $m] {,fpcsr} */
  3102  		var v int32
  3103  		if p.From3Type() != obj.TYPE_NONE {
  3104  			v = c.regoff(p.GetFrom3()) & 255
  3105  		} else {
  3106  			v = 255
  3107  		}
  3108  		o1 = OP_MTFSF | uint32(v)<<17 | uint32(p.From.Reg)<<11
  3109  
  3110  	case 65: /* MOVFL $imm,FPSCR(n) => mtfsfi crfd,imm */
  3111  		if p.To.Reg == 0 {
  3112  			c.ctxt.Diag("must specify FPSCR(n)\n%v", p)
  3113  		}
  3114  		o1 = OP_MTFSFI | (uint32(p.To.Reg)&15)<<23 | (uint32(c.regoff(&p.From))&31)<<12
  3115  
  3116  	case 66: /* mov spr,r1; mov r1,spr, also dcr */
  3117  		var r int
  3118  		var v int32
  3119  		if REG_R0 <= p.From.Reg && p.From.Reg <= REG_R31 {
  3120  			r = int(p.From.Reg)
  3121  			v = int32(p.To.Reg)
  3122  			if REG_DCR0 <= v && v <= REG_DCR0+1023 {
  3123  				o1 = OPVCC(31, 451, 0, 0) /* mtdcr */
  3124  			} else {
  3125  				o1 = OPVCC(31, 467, 0, 0) /* mtspr */
  3126  			}
  3127  		} else {
  3128  			r = int(p.To.Reg)
  3129  			v = int32(p.From.Reg)
  3130  			if REG_DCR0 <= v && v <= REG_DCR0+1023 {
  3131  				o1 = OPVCC(31, 323, 0, 0) /* mfdcr */
  3132  			} else {
  3133  				o1 = OPVCC(31, 339, 0, 0) /* mfspr */
  3134  			}
  3135  		}
  3136  
  3137  		o1 = AOP_RRR(o1, uint32(r), 0, 0) | (uint32(v)&0x1f)<<16 | ((uint32(v)>>5)&0x1f)<<11
  3138  
  3139  	case 67: /* mcrf crfD,crfS */
  3140  		if p.From.Type != obj.TYPE_REG || p.From.Reg < REG_CR0 || REG_CR7 < p.From.Reg || p.To.Type != obj.TYPE_REG || p.To.Reg < REG_CR0 || REG_CR7 < p.To.Reg {
  3141  			c.ctxt.Diag("illegal CR field number\n%v", p)
  3142  		}
  3143  		o1 = AOP_RRR(OP_MCRF, ((uint32(p.To.Reg) & 7) << 2), ((uint32(p.From.Reg) & 7) << 2), 0)
  3144  
  3145  	case 68: /* mfcr rD; mfocrf CRM,rD */
  3146  		if p.From.Type == obj.TYPE_REG && REG_CR0 <= p.From.Reg && p.From.Reg <= REG_CR7 {
  3147  			v := int32(1 << uint(7-(p.To.Reg&7)))                                 /* CR(n) */
  3148  			o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) | 1<<20 | uint32(v)<<12 /* new form, mfocrf */
  3149  		} else {
  3150  			o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) /* old form, whole register */
  3151  		}
  3152  
  3153  	case 69: /* mtcrf CRM,rS */
  3154  		var v int32
  3155  		if p.From3Type() != obj.TYPE_NONE {
  3156  			if p.To.Reg != 0 {
  3157  				c.ctxt.Diag("can't use both mask and CR(n)\n%v", p)
  3158  			}
  3159  			v = c.regoff(p.GetFrom3()) & 0xff
  3160  		} else {
  3161  			if p.To.Reg == 0 {
  3162  				v = 0xff /* CR */
  3163  			} else {
  3164  				v = 1 << uint(7-(p.To.Reg&7)) /* CR(n) */
  3165  			}
  3166  		}
  3167  
  3168  		o1 = AOP_RRR(OP_MTCRF, uint32(p.From.Reg), 0, 0) | uint32(v)<<12
  3169  
  3170  	case 70: /* [f]cmp r,r,cr*/
  3171  		var r int
  3172  		if p.Reg == 0 {
  3173  			r = 0
  3174  		} else {
  3175  			r = (int(p.Reg) & 7) << 2
  3176  		}
  3177  		o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.From.Reg), uint32(p.To.Reg))
  3178  
  3179  	case 71: /* cmp[l] r,i,cr*/
  3180  		var r int
  3181  		if p.Reg == 0 {
  3182  			r = 0
  3183  		} else {
  3184  			r = (int(p.Reg) & 7) << 2
  3185  		}
  3186  		o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.From.Reg), 0) | uint32(c.regoff(&p.To))&0xffff
  3187  
  3188  	case 72: /* slbmte (Rb+Rs -> slb[Rb]) -> Rs, Rb */
  3189  		o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), 0, uint32(p.To.Reg))
  3190  
  3191  	case 73: /* mcrfs crfD,crfS */
  3192  		if p.From.Type != obj.TYPE_REG || p.From.Reg != REG_FPSCR || p.To.Type != obj.TYPE_REG || p.To.Reg < REG_CR0 || REG_CR7 < p.To.Reg {
  3193  			c.ctxt.Diag("illegal FPSCR/CR field number\n%v", p)
  3194  		}
  3195  		o1 = AOP_RRR(OP_MCRFS, ((uint32(p.To.Reg) & 7) << 2), ((0 & 7) << 2), 0)
  3196  
  3197  	case 77: /* syscall $scon, syscall Rx */
  3198  		if p.From.Type == obj.TYPE_CONST {
  3199  			if p.From.Offset > BIG || p.From.Offset < -BIG {
  3200  				c.ctxt.Diag("illegal syscall, sysnum too large: %v", p)
  3201  			}
  3202  			o1 = AOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(p.From.Offset))
  3203  		} else if p.From.Type == obj.TYPE_REG {
  3204  			o1 = LOP_RRR(OP_OR, REGZERO, uint32(p.From.Reg), uint32(p.From.Reg))
  3205  		} else {
  3206  			c.ctxt.Diag("illegal syscall: %v", p)
  3207  			o1 = 0x7fe00008 // trap always
  3208  		}
  3209  
  3210  		o2 = c.oprrr(p.As)
  3211  		o3 = AOP_RRR(c.oprrr(AXOR), REGZERO, REGZERO, REGZERO) // XOR R0, R0
  3212  
  3213  	case 78: /* undef */
  3214  		o1 = 0 /* "An instruction consisting entirely of binary 0s is guaranteed
  3215  		   always to be an illegal instruction."  */
  3216  
  3217  	/* relocation operations */
  3218  	case 74:
  3219  		v := c.vregoff(&p.To)
  3220  		// Offsets in DS form stores must be a multiple of 4
  3221  		inst := c.opstore(p.As)
  3222  		if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  3223  			log.Fatalf("invalid offset for DS form load/store %v", p)
  3224  		}
  3225  		o1, o2 = c.symbolAccess(p.To.Sym, v, p.From.Reg, inst)
  3226  
  3227  	//if(dlm) reloc(&p->to, p->pc, 1);
  3228  
  3229  	case 75:
  3230  		v := c.vregoff(&p.From)
  3231  		// Offsets in DS form loads must be a multiple of 4
  3232  		inst := c.opload(p.As)
  3233  		if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  3234  			log.Fatalf("invalid offset for DS form load/store %v", p)
  3235  		}
  3236  		o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
  3237  
  3238  	//if(dlm) reloc(&p->from, p->pc, 1);
  3239  
  3240  	case 76:
  3241  		v := c.vregoff(&p.From)
  3242  		// Offsets in DS form loads must be a multiple of 4
  3243  		inst := c.opload(p.As)
  3244  		if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  3245  			log.Fatalf("invalid offset for DS form load/store %v", p)
  3246  		}
  3247  		o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
  3248  		o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
  3249  
  3250  		//if(dlm) reloc(&p->from, p->pc, 1);
  3251  
  3252  	case 79:
  3253  		if p.From.Offset != 0 {
  3254  			c.ctxt.Diag("invalid offset against tls var %v", p)
  3255  		}
  3256  		o1 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGZERO, 0)
  3257  		rel := obj.Addrel(c.cursym)
  3258  		rel.Off = int32(c.pc)
  3259  		rel.Siz = 4
  3260  		rel.Sym = p.From.Sym
  3261  		rel.Type = objabi.R_POWER_TLS_LE
  3262  
  3263  	case 80:
  3264  		if p.From.Offset != 0 {
  3265  			c.ctxt.Diag("invalid offset against tls var %v", p)
  3266  		}
  3267  		o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
  3268  		o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
  3269  		rel := obj.Addrel(c.cursym)
  3270  		rel.Off = int32(c.pc)
  3271  		rel.Siz = 8
  3272  		rel.Sym = p.From.Sym
  3273  		rel.Type = objabi.R_POWER_TLS_IE
  3274  
  3275  	case 81:
  3276  		v := c.vregoff(&p.To)
  3277  		if v != 0 {
  3278  			c.ctxt.Diag("invalid offset against GOT slot %v", p)
  3279  		}
  3280  
  3281  		o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
  3282  		o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
  3283  		rel := obj.Addrel(c.cursym)
  3284  		rel.Off = int32(c.pc)
  3285  		rel.Siz = 8
  3286  		rel.Sym = p.From.Sym
  3287  		rel.Type = objabi.R_ADDRPOWER_GOT
  3288  	case 82: /* vector instructions, VX-form and VC-form */
  3289  		if p.From.Type == obj.TYPE_REG {
  3290  			/* reg reg none OR reg reg reg */
  3291  			/* 3-register operand order: VRA, VRB, VRT */
  3292  			/* 2-register operand order: VRA, VRT */
  3293  			o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
  3294  		} else if p.From3Type() == obj.TYPE_CONST {
  3295  			/* imm imm reg reg */
  3296  			/* operand order: SIX, VRA, ST, VRT */
  3297  			six := int(c.regoff(&p.From))
  3298  			st := int(c.regoff(p.GetFrom3()))
  3299  			o1 = AOP_IIRR(c.opiirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(st), uint32(six))
  3300  		} else if p.From3Type() == obj.TYPE_NONE && p.Reg != 0 {
  3301  			/* imm reg reg */
  3302  			/* operand order: UIM, VRB, VRT */
  3303  			uim := int(c.regoff(&p.From))
  3304  			o1 = AOP_VIRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(uim))
  3305  		} else {
  3306  			/* imm reg */
  3307  			/* operand order: SIM, VRT */
  3308  			sim := int(c.regoff(&p.From))
  3309  			o1 = AOP_IR(c.opirr(p.As), uint32(p.To.Reg), uint32(sim))
  3310  		}
  3311  
  3312  	case 83: /* vector instructions, VA-form */
  3313  		if p.From.Type == obj.TYPE_REG {
  3314  			/* reg reg reg reg */
  3315  			/* 4-register operand order: VRA, VRB, VRC, VRT */
  3316  			o1 = AOP_RRRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
  3317  		} else if p.From.Type == obj.TYPE_CONST {
  3318  			/* imm reg reg reg */
  3319  			/* operand order: SHB, VRA, VRB, VRT */
  3320  			shb := int(c.regoff(&p.From))
  3321  			o1 = AOP_IRRR(c.opirrr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(shb))
  3322  		}
  3323  
  3324  	case 84: // ISEL BC,RA,RB,RT -> isel rt,ra,rb,bc
  3325  		bc := c.vregoff(&p.From)
  3326  
  3327  		// rt = To.Reg, ra = p.Reg, rb = p.From3.Reg
  3328  		o1 = AOP_ISEL(OP_ISEL, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(bc))
  3329  
  3330  	case 85: /* vector instructions, VX-form */
  3331  		/* reg none reg */
  3332  		/* 2-register operand order: VRB, VRT */
  3333  		o1 = AOP_RR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg))
  3334  
  3335  	case 86: /* VSX indexed store, XX1-form */
  3336  		/* reg reg reg */
  3337  		/* 3-register operand order: XT, (RB)(RA*1) */
  3338  		o1 = AOP_XX1(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
  3339  
  3340  	case 87: /* VSX indexed load, XX1-form */
  3341  		/* reg reg reg */
  3342  		/* 3-register operand order: (RB)(RA*1), XT */
  3343  		o1 = AOP_XX1(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
  3344  
  3345  	case 88: /* VSX instructions, XX1-form */
  3346  		/* reg reg none OR reg reg reg */
  3347  		/* 3-register operand order: RA, RB, XT */
  3348  		/* 2-register operand order: XS, RA or RA, XT */
  3349  		xt := int32(p.To.Reg)
  3350  		xs := int32(p.From.Reg)
  3351  		/* We need to treat the special case of extended mnemonics that may have a FREG/VREG as an argument */
  3352  		if REG_V0 <= xt && xt <= REG_V31 {
  3353  			/* Convert V0-V31 to VS32-VS63 */
  3354  			xt = xt + 64
  3355  			o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
  3356  		} else if REG_F0 <= xt && xt <= REG_F31 {
  3357  			/* Convert F0-F31 to VS0-VS31 */
  3358  			xt = xt + 64
  3359  			o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
  3360  		} else if REG_VS0 <= xt && xt <= REG_VS63 {
  3361  			o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
  3362  		} else if REG_V0 <= xs && xs <= REG_V31 {
  3363  			/* Likewise for XS */
  3364  			xs = xs + 64
  3365  			o1 = AOP_XX1(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
  3366  		} else if REG_F0 <= xs && xs <= REG_F31 {
  3367  			xs = xs + 64
  3368  			o1 = AOP_XX1(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
  3369  		} else if REG_VS0 <= xs && xs <= REG_VS63 {
  3370  			o1 = AOP_XX1(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
  3371  		}
  3372  
  3373  	case 89: /* VSX instructions, XX2-form */
  3374  		/* reg none reg OR reg imm reg */
  3375  		/* 2-register operand order: XB, XT or XB, UIM, XT*/
  3376  		uim := int(c.regoff(p.GetFrom3()))
  3377  		o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(uim), uint32(p.From.Reg))
  3378  
  3379  	case 90: /* VSX instructions, XX3-form */
  3380  		if p.From3Type() == obj.TYPE_NONE {
  3381  			/* reg reg reg */
  3382  			/* 3-register operand order: XA, XB, XT */
  3383  			o1 = AOP_XX3(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
  3384  		} else if p.From3Type() == obj.TYPE_CONST {
  3385  			/* reg reg reg imm */
  3386  			/* operand order: XA, XB, DM, XT */
  3387  			dm := int(c.regoff(p.GetFrom3()))
  3388  			o1 = AOP_XX3I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(dm))
  3389  		}
  3390  
  3391  	case 91: /* VSX instructions, XX4-form */
  3392  		/* reg reg reg reg */
  3393  		/* 3-register operand order: XA, XB, XC, XT */
  3394  		o1 = AOP_XX4(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
  3395  
  3396  	case 92: /* X-form instructions, 3-operands */
  3397  		if p.To.Type == obj.TYPE_CONST {
  3398  			/* imm reg reg */
  3399  			xf := int32(p.From.Reg)
  3400  			if REG_F0 <= xf && xf <= REG_F31 {
  3401  				/* operand order: FRA, FRB, BF */
  3402  				bf := int(c.regoff(&p.To)) << 2
  3403  				o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
  3404  			} else {
  3405  				/* operand order: RA, RB, L */
  3406  				l := int(c.regoff(&p.To))
  3407  				o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.From.Reg), uint32(p.Reg))
  3408  			}
  3409  		} else if p.From3Type() == obj.TYPE_CONST {
  3410  			/* reg reg imm */
  3411  			/* operand order: RB, L, RA */
  3412  			l := int(c.regoff(p.GetFrom3()))
  3413  			o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.To.Reg), uint32(p.From.Reg))
  3414  		} else if p.To.Type == obj.TYPE_REG {
  3415  			cr := int32(p.To.Reg)
  3416  			if REG_CR0 <= cr && cr <= REG_CR7 {
  3417  				/* cr reg reg */
  3418  				/* operand order: RA, RB, BF */
  3419  				bf := (int(p.To.Reg) & 7) << 2
  3420  				o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
  3421  			} else if p.From.Type == obj.TYPE_CONST {
  3422  				/* reg imm */
  3423  				/* operand order: L, RT */
  3424  				l := int(c.regoff(&p.From))
  3425  				o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(l), uint32(p.Reg))
  3426  			} else {
  3427  				switch p.As {
  3428  				case ACOPY, APASTECC:
  3429  					o1 = AOP_RRR(c.opirr(p.As), uint32(1), uint32(p.From.Reg), uint32(p.To.Reg))
  3430  				default:
  3431  					/* reg reg reg */
  3432  					/* operand order: RS, RB, RA */
  3433  					o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
  3434  				}
  3435  			}
  3436  		}
  3437  
  3438  	case 93: /* X-form instructions, 2-operands */
  3439  		if p.To.Type == obj.TYPE_CONST {
  3440  			/* imm reg */
  3441  			/* operand order: FRB, BF */
  3442  			bf := int(c.regoff(&p.To)) << 2
  3443  			o1 = AOP_RR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg))
  3444  		} else if p.Reg == 0 {
  3445  			/* popcnt* r,r, X-form */
  3446  			/* operand order: RS, RA */
  3447  			o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
  3448  		}
  3449  
  3450  	case 94: /* Z23-form instructions, 4-operands */
  3451  		/* reg reg reg imm */
  3452  		/* operand order: RA, RB, CY, RT */
  3453  		cy := int(c.regoff(p.GetFrom3()))
  3454  		o1 = AOP_Z23I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(cy))
  3455  	}
  3456  
  3457  	out[0] = o1
  3458  	out[1] = o2
  3459  	out[2] = o3
  3460  	out[3] = o4
  3461  	out[4] = o5
  3462  	return
  3463  }
  3464  
  3465  func (c *ctxt9) vregoff(a *obj.Addr) int64 {
  3466  	c.instoffset = 0
  3467  	if a != nil {
  3468  		c.aclass(a)
  3469  	}
  3470  	return c.instoffset
  3471  }
  3472  
  3473  func (c *ctxt9) regoff(a *obj.Addr) int32 {
  3474  	return int32(c.vregoff(a))
  3475  }
  3476  
  3477  func (c *ctxt9) oprrr(a obj.As) uint32 {
  3478  	switch a {
  3479  	case AADD:
  3480  		return OPVCC(31, 266, 0, 0)
  3481  	case AADDCC:
  3482  		return OPVCC(31, 266, 0, 1)
  3483  	case AADDV:
  3484  		return OPVCC(31, 266, 1, 0)
  3485  	case AADDVCC:
  3486  		return OPVCC(31, 266, 1, 1)
  3487  	case AADDC:
  3488  		return OPVCC(31, 10, 0, 0)
  3489  	case AADDCCC:
  3490  		return OPVCC(31, 10, 0, 1)
  3491  	case AADDCV:
  3492  		return OPVCC(31, 10, 1, 0)
  3493  	case AADDCVCC:
  3494  		return OPVCC(31, 10, 1, 1)
  3495  	case AADDE:
  3496  		return OPVCC(31, 138, 0, 0)
  3497  	case AADDECC:
  3498  		return OPVCC(31, 138, 0, 1)
  3499  	case AADDEV:
  3500  		return OPVCC(31, 138, 1, 0)
  3501  	case AADDEVCC:
  3502  		return OPVCC(31, 138, 1, 1)
  3503  	case AADDME:
  3504  		return OPVCC(31, 234, 0, 0)
  3505  	case AADDMECC:
  3506  		return OPVCC(31, 234, 0, 1)
  3507  	case AADDMEV:
  3508  		return OPVCC(31, 234, 1, 0)
  3509  	case AADDMEVCC:
  3510  		return OPVCC(31, 234, 1, 1)
  3511  	case AADDZE:
  3512  		return OPVCC(31, 202, 0, 0)
  3513  	case AADDZECC:
  3514  		return OPVCC(31, 202, 0, 1)
  3515  	case AADDZEV:
  3516  		return OPVCC(31, 202, 1, 0)
  3517  	case AADDZEVCC:
  3518  		return OPVCC(31, 202, 1, 1)
  3519  	case AADDEX:
  3520  		return OPVCC(31, 170, 0, 0) /* addex - v3.0b */
  3521  
  3522  	case AAND:
  3523  		return OPVCC(31, 28, 0, 0)
  3524  	case AANDCC:
  3525  		return OPVCC(31, 28, 0, 1)
  3526  	case AANDN:
  3527  		return OPVCC(31, 60, 0, 0)
  3528  	case AANDNCC:
  3529  		return OPVCC(31, 60, 0, 1)
  3530  
  3531  	case ACMP:
  3532  		return OPVCC(31, 0, 0, 0) | 1<<21 /* L=1 */
  3533  	case ACMPU:
  3534  		return OPVCC(31, 32, 0, 0) | 1<<21
  3535  	case ACMPW:
  3536  		return OPVCC(31, 0, 0, 0) /* L=0 */
  3537  	case ACMPWU:
  3538  		return OPVCC(31, 32, 0, 0)
  3539  	case ACMPB:
  3540  		return OPVCC(31, 508, 0, 0) /* cmpb - v2.05 */
  3541  
  3542  	case ACNTLZW:
  3543  		return OPVCC(31, 26, 0, 0)
  3544  	case ACNTLZWCC:
  3545  		return OPVCC(31, 26, 0, 1)
  3546  	case ACNTLZD:
  3547  		return OPVCC(31, 58, 0, 0)
  3548  	case ACNTLZDCC:
  3549  		return OPVCC(31, 58, 0, 1)
  3550  
  3551  	case ACRAND:
  3552  		return OPVCC(19, 257, 0, 0)
  3553  	case ACRANDN:
  3554  		return OPVCC(19, 129, 0, 0)
  3555  	case ACREQV:
  3556  		return OPVCC(19, 289, 0, 0)
  3557  	case ACRNAND:
  3558  		return OPVCC(19, 225, 0, 0)
  3559  	case ACRNOR:
  3560  		return OPVCC(19, 33, 0, 0)
  3561  	case ACROR:
  3562  		return OPVCC(19, 449, 0, 0)
  3563  	case ACRORN:
  3564  		return OPVCC(19, 417, 0, 0)
  3565  	case ACRXOR:
  3566  		return OPVCC(19, 193, 0, 0)
  3567  
  3568  	case ADCBF:
  3569  		return OPVCC(31, 86, 0, 0)
  3570  	case ADCBI:
  3571  		return OPVCC(31, 470, 0, 0)
  3572  	case ADCBST:
  3573  		return OPVCC(31, 54, 0, 0)
  3574  	case ADCBT:
  3575  		return OPVCC(31, 278, 0, 0)
  3576  	case ADCBTST:
  3577  		return OPVCC(31, 246, 0, 0)
  3578  	case ADCBZ:
  3579  		return OPVCC(31, 1014, 0, 0)
  3580  
  3581  	case AREM, ADIVW:
  3582  		return OPVCC(31, 491, 0, 0)
  3583  
  3584  	case AREMCC, ADIVWCC:
  3585  		return OPVCC(31, 491, 0, 1)
  3586  
  3587  	case AREMV, ADIVWV:
  3588  		return OPVCC(31, 491, 1, 0)
  3589  
  3590  	case AREMVCC, ADIVWVCC:
  3591  		return OPVCC(31, 491, 1, 1)
  3592  
  3593  	case AREMU, ADIVWU:
  3594  		return OPVCC(31, 459, 0, 0)
  3595  
  3596  	case AREMUCC, ADIVWUCC:
  3597  		return OPVCC(31, 459, 0, 1)
  3598  
  3599  	case AREMUV, ADIVWUV:
  3600  		return OPVCC(31, 459, 1, 0)
  3601  
  3602  	case AREMUVCC, ADIVWUVCC:
  3603  		return OPVCC(31, 459, 1, 1)
  3604  
  3605  	case AREMD, ADIVD:
  3606  		return OPVCC(31, 489, 0, 0)
  3607  
  3608  	case AREMDCC, ADIVDCC:
  3609  		return OPVCC(31, 489, 0, 1)
  3610  
  3611  	case ADIVDE:
  3612  		return OPVCC(31, 425, 0, 0)
  3613  
  3614  	case ADIVDECC:
  3615  		return OPVCC(31, 425, 0, 1)
  3616  
  3617  	case ADIVDEU:
  3618  		return OPVCC(31, 393, 0, 0)
  3619  
  3620  	case ADIVDEUCC:
  3621  		return OPVCC(31, 393, 0, 1)
  3622  
  3623  	case AREMDV, ADIVDV:
  3624  		return OPVCC(31, 489, 1, 0)
  3625  
  3626  	case AREMDVCC, ADIVDVCC:
  3627  		return OPVCC(31, 489, 1, 1)
  3628  
  3629  	case AREMDU, ADIVDU:
  3630  		return OPVCC(31, 457, 0, 0)
  3631  
  3632  	case AREMDUCC, ADIVDUCC:
  3633  		return OPVCC(31, 457, 0, 1)
  3634  
  3635  	case AREMDUV, ADIVDUV:
  3636  		return OPVCC(31, 457, 1, 0)
  3637  
  3638  	case AREMDUVCC, ADIVDUVCC:
  3639  		return OPVCC(31, 457, 1, 1)
  3640  
  3641  	case AEIEIO:
  3642  		return OPVCC(31, 854, 0, 0)
  3643  
  3644  	case AEQV:
  3645  		return OPVCC(31, 284, 0, 0)
  3646  	case AEQVCC:
  3647  		return OPVCC(31, 284, 0, 1)
  3648  
  3649  	case AEXTSB:
  3650  		return OPVCC(31, 954, 0, 0)
  3651  	case AEXTSBCC:
  3652  		return OPVCC(31, 954, 0, 1)
  3653  	case AEXTSH:
  3654  		return OPVCC(31, 922, 0, 0)
  3655  	case AEXTSHCC:
  3656  		return OPVCC(31, 922, 0, 1)
  3657  	case AEXTSW:
  3658  		return OPVCC(31, 986, 0, 0)
  3659  	case AEXTSWCC:
  3660  		return OPVCC(31, 986, 0, 1)
  3661  
  3662  	case AFABS:
  3663  		return OPVCC(63, 264, 0, 0)
  3664  	case AFABSCC:
  3665  		return OPVCC(63, 264, 0, 1)
  3666  	case AFADD:
  3667  		return OPVCC(63, 21, 0, 0)
  3668  	case AFADDCC:
  3669  		return OPVCC(63, 21, 0, 1)
  3670  	case AFADDS:
  3671  		return OPVCC(59, 21, 0, 0)
  3672  	case AFADDSCC:
  3673  		return OPVCC(59, 21, 0, 1)
  3674  	case AFCMPO:
  3675  		return OPVCC(63, 32, 0, 0)
  3676  	case AFCMPU:
  3677  		return OPVCC(63, 0, 0, 0)
  3678  	case AFCFID:
  3679  		return OPVCC(63, 846, 0, 0)
  3680  	case AFCFIDCC:
  3681  		return OPVCC(63, 846, 0, 1)
  3682  	case AFCFIDU:
  3683  		return OPVCC(63, 974, 0, 0)
  3684  	case AFCFIDUCC:
  3685  		return OPVCC(63, 974, 0, 1)
  3686  	case AFCFIDS:
  3687  		return OPVCC(59, 846, 0, 0)
  3688  	case AFCFIDSCC:
  3689  		return OPVCC(59, 846, 0, 1)
  3690  	case AFCTIW:
  3691  		return OPVCC(63, 14, 0, 0)
  3692  	case AFCTIWCC:
  3693  		return OPVCC(63, 14, 0, 1)
  3694  	case AFCTIWZ:
  3695  		return OPVCC(63, 15, 0, 0)
  3696  	case AFCTIWZCC:
  3697  		return OPVCC(63, 15, 0, 1)
  3698  	case AFCTID:
  3699  		return OPVCC(63, 814, 0, 0)
  3700  	case AFCTIDCC:
  3701  		return OPVCC(63, 814, 0, 1)
  3702  	case AFCTIDZ:
  3703  		return OPVCC(63, 815, 0, 0)
  3704  	case AFCTIDZCC:
  3705  		return OPVCC(63, 815, 0, 1)
  3706  	case AFDIV:
  3707  		return OPVCC(63, 18, 0, 0)
  3708  	case AFDIVCC:
  3709  		return OPVCC(63, 18, 0, 1)
  3710  	case AFDIVS:
  3711  		return OPVCC(59, 18, 0, 0)
  3712  	case AFDIVSCC:
  3713  		return OPVCC(59, 18, 0, 1)
  3714  	case AFMADD:
  3715  		return OPVCC(63, 29, 0, 0)
  3716  	case AFMADDCC:
  3717  		return OPVCC(63, 29, 0, 1)
  3718  	case AFMADDS:
  3719  		return OPVCC(59, 29, 0, 0)
  3720  	case AFMADDSCC:
  3721  		return OPVCC(59, 29, 0, 1)
  3722  
  3723  	case AFMOVS, AFMOVD:
  3724  		return OPVCC(63, 72, 0, 0) /* load */
  3725  	case AFMOVDCC:
  3726  		return OPVCC(63, 72, 0, 1)
  3727  	case AFMSUB:
  3728  		return OPVCC(63, 28, 0, 0)
  3729  	case AFMSUBCC:
  3730  		return OPVCC(63, 28, 0, 1)
  3731  	case AFMSUBS:
  3732  		return OPVCC(59, 28, 0, 0)
  3733  	case AFMSUBSCC:
  3734  		return OPVCC(59, 28, 0, 1)
  3735  	case AFMUL:
  3736  		return OPVCC(63, 25, 0, 0)
  3737  	case AFMULCC:
  3738  		return OPVCC(63, 25, 0, 1)
  3739  	case AFMULS:
  3740  		return OPVCC(59, 25, 0, 0)
  3741  	case AFMULSCC:
  3742  		return OPVCC(59, 25, 0, 1)
  3743  	case AFNABS:
  3744  		return OPVCC(63, 136, 0, 0)
  3745  	case AFNABSCC:
  3746  		return OPVCC(63, 136, 0, 1)
  3747  	case AFNEG:
  3748  		return OPVCC(63, 40, 0, 0)
  3749  	case AFNEGCC:
  3750  		return OPVCC(63, 40, 0, 1)
  3751  	case AFNMADD:
  3752  		return OPVCC(63, 31, 0, 0)
  3753  	case AFNMADDCC:
  3754  		return OPVCC(63, 31, 0, 1)
  3755  	case AFNMADDS:
  3756  		return OPVCC(59, 31, 0, 0)
  3757  	case AFNMADDSCC:
  3758  		return OPVCC(59, 31, 0, 1)
  3759  	case AFNMSUB:
  3760  		return OPVCC(63, 30, 0, 0)
  3761  	case AFNMSUBCC:
  3762  		return OPVCC(63, 30, 0, 1)
  3763  	case AFNMSUBS:
  3764  		return OPVCC(59, 30, 0, 0)
  3765  	case AFNMSUBSCC:
  3766  		return OPVCC(59, 30, 0, 1)
  3767  	case AFCPSGN:
  3768  		return OPVCC(63, 8, 0, 0)
  3769  	case AFCPSGNCC:
  3770  		return OPVCC(63, 8, 0, 1)
  3771  	case AFRES:
  3772  		return OPVCC(59, 24, 0, 0)
  3773  	case AFRESCC:
  3774  		return OPVCC(59, 24, 0, 1)
  3775  	case AFRIM:
  3776  		return OPVCC(63, 488, 0, 0)
  3777  	case AFRIMCC:
  3778  		return OPVCC(63, 488, 0, 1)
  3779  	case AFRIP:
  3780  		return OPVCC(63, 456, 0, 0)
  3781  	case AFRIPCC:
  3782  		return OPVCC(63, 456, 0, 1)
  3783  	case AFRIZ:
  3784  		return OPVCC(63, 424, 0, 0)
  3785  	case AFRIZCC:
  3786  		return OPVCC(63, 424, 0, 1)
  3787  	case AFRSP:
  3788  		return OPVCC(63, 12, 0, 0)
  3789  	case AFRSPCC:
  3790  		return OPVCC(63, 12, 0, 1)
  3791  	case AFRSQRTE:
  3792  		return OPVCC(63, 26, 0, 0)
  3793  	case AFRSQRTECC:
  3794  		return OPVCC(63, 26, 0, 1)
  3795  	case AFSEL:
  3796  		return OPVCC(63, 23, 0, 0)
  3797  	case AFSELCC:
  3798  		return OPVCC(63, 23, 0, 1)
  3799  	case AFSQRT:
  3800  		return OPVCC(63, 22, 0, 0)
  3801  	case AFSQRTCC:
  3802  		return OPVCC(63, 22, 0, 1)
  3803  	case AFSQRTS:
  3804  		return OPVCC(59, 22, 0, 0)
  3805  	case AFSQRTSCC:
  3806  		return OPVCC(59, 22, 0, 1)
  3807  	case AFSUB:
  3808  		return OPVCC(63, 20, 0, 0)
  3809  	case AFSUBCC:
  3810  		return OPVCC(63, 20, 0, 1)
  3811  	case AFSUBS:
  3812  		return OPVCC(59, 20, 0, 0)
  3813  	case AFSUBSCC:
  3814  		return OPVCC(59, 20, 0, 1)
  3815  
  3816  	case AICBI:
  3817  		return OPVCC(31, 982, 0, 0)
  3818  	case AISYNC:
  3819  		return OPVCC(19, 150, 0, 0)
  3820  
  3821  	case AMTFSB0:
  3822  		return OPVCC(63, 70, 0, 0)
  3823  	case AMTFSB0CC:
  3824  		return OPVCC(63, 70, 0, 1)
  3825  	case AMTFSB1:
  3826  		return OPVCC(63, 38, 0, 0)
  3827  	case AMTFSB1CC:
  3828  		return OPVCC(63, 38, 0, 1)
  3829  
  3830  	case AMULHW:
  3831  		return OPVCC(31, 75, 0, 0)
  3832  	case AMULHWCC:
  3833  		return OPVCC(31, 75, 0, 1)
  3834  	case AMULHWU:
  3835  		return OPVCC(31, 11, 0, 0)
  3836  	case AMULHWUCC:
  3837  		return OPVCC(31, 11, 0, 1)
  3838  	case AMULLW:
  3839  		return OPVCC(31, 235, 0, 0)
  3840  	case AMULLWCC:
  3841  		return OPVCC(31, 235, 0, 1)
  3842  	case AMULLWV:
  3843  		return OPVCC(31, 235, 1, 0)
  3844  	case AMULLWVCC:
  3845  		return OPVCC(31, 235, 1, 1)
  3846  
  3847  	case AMULHD:
  3848  		return OPVCC(31, 73, 0, 0)
  3849  	case AMULHDCC:
  3850  		return OPVCC(31, 73, 0, 1)
  3851  	case AMULHDU:
  3852  		return OPVCC(31, 9, 0, 0)
  3853  	case AMULHDUCC:
  3854  		return OPVCC(31, 9, 0, 1)
  3855  	case AMULLD:
  3856  		return OPVCC(31, 233, 0, 0)
  3857  	case AMULLDCC:
  3858  		return OPVCC(31, 233, 0, 1)
  3859  	case AMULLDV:
  3860  		return OPVCC(31, 233, 1, 0)
  3861  	case AMULLDVCC:
  3862  		return OPVCC(31, 233, 1, 1)
  3863  
  3864  	case ANAND:
  3865  		return OPVCC(31, 476, 0, 0)
  3866  	case ANANDCC:
  3867  		return OPVCC(31, 476, 0, 1)
  3868  	case ANEG:
  3869  		return OPVCC(31, 104, 0, 0)
  3870  	case ANEGCC:
  3871  		return OPVCC(31, 104, 0, 1)
  3872  	case ANEGV:
  3873  		return OPVCC(31, 104, 1, 0)
  3874  	case ANEGVCC:
  3875  		return OPVCC(31, 104, 1, 1)
  3876  	case ANOR:
  3877  		return OPVCC(31, 124, 0, 0)
  3878  	case ANORCC:
  3879  		return OPVCC(31, 124, 0, 1)
  3880  	case AOR:
  3881  		return OPVCC(31, 444, 0, 0)
  3882  	case AORCC:
  3883  		return OPVCC(31, 444, 0, 1)
  3884  	case AORN:
  3885  		return OPVCC(31, 412, 0, 0)
  3886  	case AORNCC:
  3887  		return OPVCC(31, 412, 0, 1)
  3888  
  3889  	case APOPCNTD:
  3890  		return OPVCC(31, 506, 0, 0) /* popcntd - v2.06 */
  3891  	case APOPCNTW:
  3892  		return OPVCC(31, 378, 0, 0) /* popcntw - v2.06 */
  3893  	case APOPCNTB:
  3894  		return OPVCC(31, 122, 0, 0) /* popcntb - v2.02 */
  3895  
  3896  	case ARFI:
  3897  		return OPVCC(19, 50, 0, 0)
  3898  	case ARFCI:
  3899  		return OPVCC(19, 51, 0, 0)
  3900  	case ARFID:
  3901  		return OPVCC(19, 18, 0, 0)
  3902  	case AHRFID:
  3903  		return OPVCC(19, 274, 0, 0)
  3904  
  3905  	case ARLWMI:
  3906  		return OPVCC(20, 0, 0, 0)
  3907  	case ARLWMICC:
  3908  		return OPVCC(20, 0, 0, 1)
  3909  	case ARLWNM:
  3910  		return OPVCC(23, 0, 0, 0)
  3911  	case ARLWNMCC:
  3912  		return OPVCC(23, 0, 0, 1)
  3913  
  3914  	case ARLDCL:
  3915  		return OPVCC(30, 8, 0, 0)
  3916  	case ARLDCR:
  3917  		return OPVCC(30, 9, 0, 0)
  3918  
  3919  	case ARLDICL:
  3920  		return OPVCC(30, 0, 0, 0)
  3921  	case ARLDICLCC:
  3922  		return OPVCC(30, 0, 0, 1)
  3923  	case ARLDICR:
  3924  		return OPVCC(30, 0, 0, 0) | 2<<1 // rldicr
  3925  	case ARLDICRCC:
  3926  		return OPVCC(30, 0, 0, 1) | 2<<1 // rldicr.
  3927  
  3928  	case ASYSCALL:
  3929  		return OPVCC(17, 1, 0, 0)
  3930  
  3931  	case ASLW:
  3932  		return OPVCC(31, 24, 0, 0)
  3933  	case ASLWCC:
  3934  		return OPVCC(31, 24, 0, 1)
  3935  	case ASLD:
  3936  		return OPVCC(31, 27, 0, 0)
  3937  	case ASLDCC:
  3938  		return OPVCC(31, 27, 0, 1)
  3939  
  3940  	case ASRAW:
  3941  		return OPVCC(31, 792, 0, 0)
  3942  	case ASRAWCC:
  3943  		return OPVCC(31, 792, 0, 1)
  3944  	case ASRAD:
  3945  		return OPVCC(31, 794, 0, 0)
  3946  	case ASRADCC:
  3947  		return OPVCC(31, 794, 0, 1)
  3948  
  3949  	case ASRW:
  3950  		return OPVCC(31, 536, 0, 0)
  3951  	case ASRWCC:
  3952  		return OPVCC(31, 536, 0, 1)
  3953  	case ASRD:
  3954  		return OPVCC(31, 539, 0, 0)
  3955  	case ASRDCC:
  3956  		return OPVCC(31, 539, 0, 1)
  3957  
  3958  	case ASUB:
  3959  		return OPVCC(31, 40, 0, 0)
  3960  	case ASUBCC:
  3961  		return OPVCC(31, 40, 0, 1)
  3962  	case ASUBV:
  3963  		return OPVCC(31, 40, 1, 0)
  3964  	case ASUBVCC:
  3965  		return OPVCC(31, 40, 1, 1)
  3966  	case ASUBC:
  3967  		return OPVCC(31, 8, 0, 0)
  3968  	case ASUBCCC:
  3969  		return OPVCC(31, 8, 0, 1)
  3970  	case ASUBCV:
  3971  		return OPVCC(31, 8, 1, 0)
  3972  	case ASUBCVCC:
  3973  		return OPVCC(31, 8, 1, 1)
  3974  	case ASUBE:
  3975  		return OPVCC(31, 136, 0, 0)
  3976  	case ASUBECC:
  3977  		return OPVCC(31, 136, 0, 1)
  3978  	case ASUBEV:
  3979  		return OPVCC(31, 136, 1, 0)
  3980  	case ASUBEVCC:
  3981  		return OPVCC(31, 136, 1, 1)
  3982  	case ASUBME:
  3983  		return OPVCC(31, 232, 0, 0)
  3984  	case ASUBMECC:
  3985  		return OPVCC(31, 232, 0, 1)
  3986  	case ASUBMEV:
  3987  		return OPVCC(31, 232, 1, 0)
  3988  	case ASUBMEVCC:
  3989  		return OPVCC(31, 232, 1, 1)
  3990  	case ASUBZE:
  3991  		return OPVCC(31, 200, 0, 0)
  3992  	case ASUBZECC:
  3993  		return OPVCC(31, 200, 0, 1)
  3994  	case ASUBZEV:
  3995  		return OPVCC(31, 200, 1, 0)
  3996  	case ASUBZEVCC:
  3997  		return OPVCC(31, 200, 1, 1)
  3998  
  3999  	case ASYNC:
  4000  		return OPVCC(31, 598, 0, 0)
  4001  	case ALWSYNC:
  4002  		return OPVCC(31, 598, 0, 0) | 1<<21
  4003  
  4004  	case APTESYNC:
  4005  		return OPVCC(31, 598, 0, 0) | 2<<21
  4006  
  4007  	case ATLBIE:
  4008  		return OPVCC(31, 306, 0, 0)
  4009  	case ATLBIEL:
  4010  		return OPVCC(31, 274, 0, 0)
  4011  	case ATLBSYNC:
  4012  		return OPVCC(31, 566, 0, 0)
  4013  	case ASLBIA:
  4014  		return OPVCC(31, 498, 0, 0)
  4015  	case ASLBIE:
  4016  		return OPVCC(31, 434, 0, 0)
  4017  	case ASLBMFEE:
  4018  		return OPVCC(31, 915, 0, 0)
  4019  	case ASLBMFEV:
  4020  		return OPVCC(31, 851, 0, 0)
  4021  	case ASLBMTE:
  4022  		return OPVCC(31, 402, 0, 0)
  4023  
  4024  	case ATW:
  4025  		return OPVCC(31, 4, 0, 0)
  4026  	case ATD:
  4027  		return OPVCC(31, 68, 0, 0)
  4028  
  4029  	/* Vector (VMX/Altivec) instructions */
  4030  	/* ISA 2.03 enables these for PPC970. For POWERx processors, these */
  4031  	/* are enabled starting at POWER6 (ISA 2.05). */
  4032  	case AVAND:
  4033  		return OPVX(4, 1028, 0, 0) /* vand - v2.03 */
  4034  	case AVANDC:
  4035  		return OPVX(4, 1092, 0, 0) /* vandc - v2.03 */
  4036  	case AVNAND:
  4037  		return OPVX(4, 1412, 0, 0) /* vnand - v2.07 */
  4038  
  4039  	case AVOR:
  4040  		return OPVX(4, 1156, 0, 0) /* vor - v2.03 */
  4041  	case AVORC:
  4042  		return OPVX(4, 1348, 0, 0) /* vorc - v2.07 */
  4043  	case AVNOR:
  4044  		return OPVX(4, 1284, 0, 0) /* vnor - v2.03 */
  4045  	case AVXOR:
  4046  		return OPVX(4, 1220, 0, 0) /* vxor - v2.03 */
  4047  	case AVEQV:
  4048  		return OPVX(4, 1668, 0, 0) /* veqv - v2.07 */
  4049  
  4050  	case AVADDUBM:
  4051  		return OPVX(4, 0, 0, 0) /* vaddubm - v2.03 */
  4052  	case AVADDUHM:
  4053  		return OPVX(4, 64, 0, 0) /* vadduhm - v2.03 */
  4054  	case AVADDUWM:
  4055  		return OPVX(4, 128, 0, 0) /* vadduwm - v2.03 */
  4056  	case AVADDUDM:
  4057  		return OPVX(4, 192, 0, 0) /* vaddudm - v2.07 */
  4058  	case AVADDUQM:
  4059  		return OPVX(4, 256, 0, 0) /* vadduqm - v2.07 */
  4060  
  4061  	case AVADDCUQ:
  4062  		return OPVX(4, 320, 0, 0) /* vaddcuq - v2.07 */
  4063  	case AVADDCUW:
  4064  		return OPVX(4, 384, 0, 0) /* vaddcuw - v2.03 */
  4065  
  4066  	case AVADDUBS:
  4067  		return OPVX(4, 512, 0, 0) /* vaddubs - v2.03 */
  4068  	case AVADDUHS:
  4069  		return OPVX(4, 576, 0, 0) /* vadduhs - v2.03 */
  4070  	case AVADDUWS:
  4071  		return OPVX(4, 640, 0, 0) /* vadduws - v2.03 */
  4072  
  4073  	case AVADDSBS:
  4074  		return OPVX(4, 768, 0, 0) /* vaddsbs - v2.03 */
  4075  	case AVADDSHS:
  4076  		return OPVX(4, 832, 0, 0) /* vaddshs - v2.03 */
  4077  	case AVADDSWS:
  4078  		return OPVX(4, 896, 0, 0) /* vaddsws - v2.03 */
  4079  
  4080  	case AVADDEUQM:
  4081  		return OPVX(4, 60, 0, 0) /* vaddeuqm - v2.07 */
  4082  	case AVADDECUQ:
  4083  		return OPVX(4, 61, 0, 0) /* vaddecuq - v2.07 */
  4084  
  4085  	case AVPMSUMB:
  4086  		return OPVX(4, 1032, 0, 0) /* vpmsumb - v2.07 */
  4087  	case AVPMSUMH:
  4088  		return OPVX(4, 1096, 0, 0) /* vpmsumh - v2.07 */
  4089  	case AVPMSUMW:
  4090  		return OPVX(4, 1160, 0, 0) /* vpmsumw - v2.07 */
  4091  	case AVPMSUMD:
  4092  		return OPVX(4, 1224, 0, 0) /* vpmsumd - v2.07 */
  4093  
  4094  	case AVMSUMUDM:
  4095  		return OPVX(4, 35, 0, 0) /* vmsumudm - v3.00b */
  4096  
  4097  	case AVSUBUBM:
  4098  		return OPVX(4, 1024, 0, 0) /* vsububm - v2.03 */
  4099  	case AVSUBUHM:
  4100  		return OPVX(4, 1088, 0, 0) /* vsubuhm - v2.03 */
  4101  	case AVSUBUWM:
  4102  		return OPVX(4, 1152, 0, 0) /* vsubuwm - v2.03 */
  4103  	case AVSUBUDM:
  4104  		return OPVX(4, 1216, 0, 0) /* vsubudm - v2.07 */
  4105  	case AVSUBUQM:
  4106  		return OPVX(4, 1280, 0, 0) /* vsubuqm - v2.07 */
  4107  
  4108  	case AVSUBCUQ:
  4109  		return OPVX(4, 1344, 0, 0) /* vsubcuq - v2.07 */
  4110  	case AVSUBCUW:
  4111  		return OPVX(4, 1408, 0, 0) /* vsubcuw - v2.03 */
  4112  
  4113  	case AVSUBUBS:
  4114  		return OPVX(4, 1536, 0, 0) /* vsububs - v2.03 */
  4115  	case AVSUBUHS:
  4116  		return OPVX(4, 1600, 0, 0) /* vsubuhs - v2.03 */
  4117  	case AVSUBUWS:
  4118  		return OPVX(4, 1664, 0, 0) /* vsubuws - v2.03 */
  4119  
  4120  	case AVSUBSBS:
  4121  		return OPVX(4, 1792, 0, 0) /* vsubsbs - v2.03 */
  4122  	case AVSUBSHS:
  4123  		return OPVX(4, 1856, 0, 0) /* vsubshs - v2.03 */
  4124  	case AVSUBSWS:
  4125  		return OPVX(4, 1920, 0, 0) /* vsubsws - v2.03 */
  4126  
  4127  	case AVSUBEUQM:
  4128  		return OPVX(4, 62, 0, 0) /* vsubeuqm - v2.07 */
  4129  	case AVSUBECUQ:
  4130  		return OPVX(4, 63, 0, 0) /* vsubecuq - v2.07 */
  4131  
  4132  	case AVRLB:
  4133  		return OPVX(4, 4, 0, 0) /* vrlb - v2.03 */
  4134  	case AVRLH:
  4135  		return OPVX(4, 68, 0, 0) /* vrlh - v2.03 */
  4136  	case AVRLW:
  4137  		return OPVX(4, 132, 0, 0) /* vrlw - v2.03 */
  4138  	case AVRLD:
  4139  		return OPVX(4, 196, 0, 0) /* vrld - v2.07 */
  4140  
  4141  	case AVSLB:
  4142  		return OPVX(4, 260, 0, 0) /* vslh - v2.03 */
  4143  	case AVSLH:
  4144  		return OPVX(4, 324, 0, 0) /* vslh - v2.03 */
  4145  	case AVSLW:
  4146  		return OPVX(4, 388, 0, 0) /* vslw - v2.03 */
  4147  	case AVSL:
  4148  		return OPVX(4, 452, 0, 0) /* vsl - v2.03 */
  4149  	case AVSLO:
  4150  		return OPVX(4, 1036, 0, 0) /* vsl - v2.03 */
  4151  	case AVSRB:
  4152  		return OPVX(4, 516, 0, 0) /* vsrb - v2.03 */
  4153  	case AVSRH:
  4154  		return OPVX(4, 580, 0, 0) /* vsrh - v2.03 */
  4155  	case AVSRW:
  4156  		return OPVX(4, 644, 0, 0) /* vsrw - v2.03 */
  4157  	case AVSR:
  4158  		return OPVX(4, 708, 0, 0) /* vsr - v2.03 */
  4159  	case AVSRO:
  4160  		return OPVX(4, 1100, 0, 0) /* vsro - v2.03 */
  4161  	case AVSLD:
  4162  		return OPVX(4, 1476, 0, 0) /* vsld - v2.07 */
  4163  	case AVSRD:
  4164  		return OPVX(4, 1732, 0, 0) /* vsrd - v2.07 */
  4165  
  4166  	case AVSRAB:
  4167  		return OPVX(4, 772, 0, 0) /* vsrab - v2.03 */
  4168  	case AVSRAH:
  4169  		return OPVX(4, 836, 0, 0) /* vsrah - v2.03 */
  4170  	case AVSRAW:
  4171  		return OPVX(4, 900, 0, 0) /* vsraw - v2.03 */
  4172  	case AVSRAD:
  4173  		return OPVX(4, 964, 0, 0) /* vsrad - v2.07 */
  4174  
  4175  	case AVBPERMQ:
  4176  		return OPVC(4, 1356, 0, 0) /* vbpermq - v2.07 */
  4177  	case AVBPERMD:
  4178  		return OPVC(4, 1484, 0, 0) /* vbpermd - v3.00 */
  4179  
  4180  	case AVCLZB:
  4181  		return OPVX(4, 1794, 0, 0) /* vclzb - v2.07 */
  4182  	case AVCLZH:
  4183  		return OPVX(4, 1858, 0, 0) /* vclzh - v2.07 */
  4184  	case AVCLZW:
  4185  		return OPVX(4, 1922, 0, 0) /* vclzw - v2.07 */
  4186  	case AVCLZD:
  4187  		return OPVX(4, 1986, 0, 0) /* vclzd - v2.07 */
  4188  
  4189  	case AVPOPCNTB:
  4190  		return OPVX(4, 1795, 0, 0) /* vpopcntb - v2.07 */
  4191  	case AVPOPCNTH:
  4192  		return OPVX(4, 1859, 0, 0) /* vpopcnth - v2.07 */
  4193  	case AVPOPCNTW:
  4194  		return OPVX(4, 1923, 0, 0) /* vpopcntw - v2.07 */
  4195  	case AVPOPCNTD:
  4196  		return OPVX(4, 1987, 0, 0) /* vpopcntd - v2.07 */
  4197  
  4198  	case AVCMPEQUB:
  4199  		return OPVC(4, 6, 0, 0) /* vcmpequb - v2.03 */
  4200  	case AVCMPEQUBCC:
  4201  		return OPVC(4, 6, 0, 1) /* vcmpequb. - v2.03 */
  4202  	case AVCMPEQUH:
  4203  		return OPVC(4, 70, 0, 0) /* vcmpequh - v2.03 */
  4204  	case AVCMPEQUHCC:
  4205  		return OPVC(4, 70, 0, 1) /* vcmpequh. - v2.03 */
  4206  	case AVCMPEQUW:
  4207  		return OPVC(4, 134, 0, 0) /* vcmpequw - v2.03 */
  4208  	case AVCMPEQUWCC:
  4209  		return OPVC(4, 134, 0, 1) /* vcmpequw. - v2.03 */
  4210  	case AVCMPEQUD:
  4211  		return OPVC(4, 199, 0, 0) /* vcmpequd - v2.07 */
  4212  	case AVCMPEQUDCC:
  4213  		return OPVC(4, 199, 0, 1) /* vcmpequd. - v2.07 */
  4214  
  4215  	case AVCMPGTUB:
  4216  		return OPVC(4, 518, 0, 0) /* vcmpgtub - v2.03 */
  4217  	case AVCMPGTUBCC:
  4218  		return OPVC(4, 518, 0, 1) /* vcmpgtub. - v2.03 */
  4219  	case AVCMPGTUH:
  4220  		return OPVC(4, 582, 0, 0) /* vcmpgtuh - v2.03 */
  4221  	case AVCMPGTUHCC:
  4222  		return OPVC(4, 582, 0, 1) /* vcmpgtuh. - v2.03 */
  4223  	case AVCMPGTUW:
  4224  		return OPVC(4, 646, 0, 0) /* vcmpgtuw - v2.03 */
  4225  	case AVCMPGTUWCC:
  4226  		return OPVC(4, 646, 0, 1) /* vcmpgtuw. - v2.03 */
  4227  	case AVCMPGTUD:
  4228  		return OPVC(4, 711, 0, 0) /* vcmpgtud - v2.07 */
  4229  	case AVCMPGTUDCC:
  4230  		return OPVC(4, 711, 0, 1) /* vcmpgtud. v2.07 */
  4231  	case AVCMPGTSB:
  4232  		return OPVC(4, 774, 0, 0) /* vcmpgtsb - v2.03 */
  4233  	case AVCMPGTSBCC:
  4234  		return OPVC(4, 774, 0, 1) /* vcmpgtsb. - v2.03 */
  4235  	case AVCMPGTSH:
  4236  		return OPVC(4, 838, 0, 0) /* vcmpgtsh - v2.03 */
  4237  	case AVCMPGTSHCC:
  4238  		return OPVC(4, 838, 0, 1) /* vcmpgtsh. - v2.03 */
  4239  	case AVCMPGTSW:
  4240  		return OPVC(4, 902, 0, 0) /* vcmpgtsw - v2.03 */
  4241  	case AVCMPGTSWCC:
  4242  		return OPVC(4, 902, 0, 1) /* vcmpgtsw. - v2.03 */
  4243  	case AVCMPGTSD:
  4244  		return OPVC(4, 967, 0, 0) /* vcmpgtsd - v2.07 */
  4245  	case AVCMPGTSDCC:
  4246  		return OPVC(4, 967, 0, 1) /* vcmpgtsd. - v2.07 */
  4247  
  4248  	case AVCMPNEZB:
  4249  		return OPVC(4, 263, 0, 0) /* vcmpnezb - v3.00 */
  4250  	case AVCMPNEZBCC:
  4251  		return OPVC(4, 263, 0, 1) /* vcmpnezb. - v3.00 */
  4252  
  4253  	case AVPERM:
  4254  		return OPVX(4, 43, 0, 0) /* vperm - v2.03 */
  4255  
  4256  	case AVSEL:
  4257  		return OPVX(4, 42, 0, 0) /* vsel - v2.03 */
  4258  
  4259  	case AVCIPHER:
  4260  		return OPVX(4, 1288, 0, 0) /* vcipher - v2.07 */
  4261  	case AVCIPHERLAST:
  4262  		return OPVX(4, 1289, 0, 0) /* vcipherlast - v2.07 */
  4263  	case AVNCIPHER:
  4264  		return OPVX(4, 1352, 0, 0) /* vncipher - v2.07 */
  4265  	case AVNCIPHERLAST:
  4266  		return OPVX(4, 1353, 0, 0) /* vncipherlast - v2.07 */
  4267  	case AVSBOX:
  4268  		return OPVX(4, 1480, 0, 0) /* vsbox - v2.07 */
  4269  	/* End of vector instructions */
  4270  
  4271  	/* Vector scalar (VSX) instructions */
  4272  	/* ISA 2.06 enables these for POWER7. */
  4273  	case AMFVSRD, AMFVRD, AMFFPRD:
  4274  		return OPVXX1(31, 51, 0) /* mfvsrd - v2.07 */
  4275  	case AMFVSRWZ:
  4276  		return OPVXX1(31, 115, 0) /* mfvsrwz - v2.07 */
  4277  	case AMFVSRLD:
  4278  		return OPVXX1(31, 307, 0) /* mfvsrld - v3.00 */
  4279  
  4280  	case AMTVSRD, AMTFPRD, AMTVRD:
  4281  		return OPVXX1(31, 179, 0) /* mtvsrd - v2.07 */
  4282  	case AMTVSRWA:
  4283  		return OPVXX1(31, 211, 0) /* mtvsrwa - v2.07 */
  4284  	case AMTVSRWZ:
  4285  		return OPVXX1(31, 243, 0) /* mtvsrwz - v2.07 */
  4286  	case AMTVSRDD:
  4287  		return OPVXX1(31, 435, 0) /* mtvsrdd - v3.00 */
  4288  	case AMTVSRWS:
  4289  		return OPVXX1(31, 403, 0) /* mtvsrws - v3.00 */
  4290  
  4291  	case AXXLANDQ:
  4292  		return OPVXX3(60, 130, 0) /* xxland - v2.06 */
  4293  	case AXXLANDC:
  4294  		return OPVXX3(60, 138, 0) /* xxlandc - v2.06 */
  4295  	case AXXLEQV:
  4296  		return OPVXX3(60, 186, 0) /* xxleqv - v2.07 */
  4297  	case AXXLNAND:
  4298  		return OPVXX3(60, 178, 0) /* xxlnand - v2.07 */
  4299  
  4300  	case AXXLORC:
  4301  		return OPVXX3(60, 170, 0) /* xxlorc - v2.07 */
  4302  	case AXXLNOR:
  4303  		return OPVXX3(60, 162, 0) /* xxlnor - v2.06 */
  4304  	case AXXLORQ:
  4305  		return OPVXX3(60, 146, 0) /* xxlor - v2.06 */
  4306  	case AXXLXOR:
  4307  		return OPVXX3(60, 154, 0) /* xxlxor - v2.06 */
  4308  
  4309  	case AXXSEL:
  4310  		return OPVXX4(60, 3, 0) /* xxsel - v2.06 */
  4311  
  4312  	case AXXMRGHW:
  4313  		return OPVXX3(60, 18, 0) /* xxmrghw - v2.06 */
  4314  	case AXXMRGLW:
  4315  		return OPVXX3(60, 50, 0) /* xxmrglw - v2.06 */
  4316  
  4317  	case AXXSPLTW:
  4318  		return OPVXX2(60, 164, 0) /* xxspltw - v2.06 */
  4319  
  4320  	case AXXPERMDI:
  4321  		return OPVXX3(60, 10, 0) /* xxpermdi - v2.06 */
  4322  
  4323  	case AXXSLDWI:
  4324  		return OPVXX3(60, 2, 0) /* xxsldwi - v2.06 */
  4325  
  4326  	case AXSCVDPSP:
  4327  		return OPVXX2(60, 265, 0) /* xscvdpsp - v2.06 */
  4328  	case AXSCVSPDP:
  4329  		return OPVXX2(60, 329, 0) /* xscvspdp - v2.06 */
  4330  	case AXSCVDPSPN:
  4331  		return OPVXX2(60, 267, 0) /* xscvdpspn - v2.07 */
  4332  	case AXSCVSPDPN:
  4333  		return OPVXX2(60, 331, 0) /* xscvspdpn - v2.07 */
  4334  
  4335  	case AXVCVDPSP:
  4336  		return OPVXX2(60, 393, 0) /* xvcvdpsp - v2.06 */
  4337  	case AXVCVSPDP:
  4338  		return OPVXX2(60, 457, 0) /* xvcvspdp - v2.06 */
  4339  
  4340  	case AXSCVDPSXDS:
  4341  		return OPVXX2(60, 344, 0) /* xscvdpsxds - v2.06 */
  4342  	case AXSCVDPSXWS:
  4343  		return OPVXX2(60, 88, 0) /* xscvdpsxws - v2.06 */
  4344  	case AXSCVDPUXDS:
  4345  		return OPVXX2(60, 328, 0) /* xscvdpuxds - v2.06 */
  4346  	case AXSCVDPUXWS:
  4347  		return OPVXX2(60, 72, 0) /* xscvdpuxws - v2.06 */
  4348  
  4349  	case AXSCVSXDDP:
  4350  		return OPVXX2(60, 376, 0) /* xscvsxddp - v2.06 */
  4351  	case AXSCVUXDDP:
  4352  		return OPVXX2(60, 360, 0) /* xscvuxddp - v2.06 */
  4353  	case AXSCVSXDSP:
  4354  		return OPVXX2(60, 312, 0) /* xscvsxdsp - v2.06 */
  4355  	case AXSCVUXDSP:
  4356  		return OPVXX2(60, 296, 0) /* xscvuxdsp - v2.06 */
  4357  
  4358  	case AXVCVDPSXDS:
  4359  		return OPVXX2(60, 472, 0) /* xvcvdpsxds - v2.06 */
  4360  	case AXVCVDPSXWS:
  4361  		return OPVXX2(60, 216, 0) /* xvcvdpsxws - v2.06 */
  4362  	case AXVCVDPUXDS:
  4363  		return OPVXX2(60, 456, 0) /* xvcvdpuxds - v2.06 */
  4364  	case AXVCVDPUXWS:
  4365  		return OPVXX2(60, 200, 0) /* xvcvdpuxws - v2.06 */
  4366  	case AXVCVSPSXDS:
  4367  		return OPVXX2(60, 408, 0) /* xvcvspsxds - v2.07 */
  4368  	case AXVCVSPSXWS:
  4369  		return OPVXX2(60, 152, 0) /* xvcvspsxws - v2.07 */
  4370  	case AXVCVSPUXDS:
  4371  		return OPVXX2(60, 392, 0) /* xvcvspuxds - v2.07 */
  4372  	case AXVCVSPUXWS:
  4373  		return OPVXX2(60, 136, 0) /* xvcvspuxws - v2.07 */
  4374  
  4375  	case AXVCVSXDDP:
  4376  		return OPVXX2(60, 504, 0) /* xvcvsxddp - v2.06 */
  4377  	case AXVCVSXWDP:
  4378  		return OPVXX2(60, 248, 0) /* xvcvsxwdp - v2.06 */
  4379  	case AXVCVUXDDP:
  4380  		return OPVXX2(60, 488, 0) /* xvcvuxddp - v2.06 */
  4381  	case AXVCVUXWDP:
  4382  		return OPVXX2(60, 232, 0) /* xvcvuxwdp - v2.06 */
  4383  	case AXVCVSXDSP:
  4384  		return OPVXX2(60, 440, 0) /* xvcvsxdsp - v2.06 */
  4385  	case AXVCVSXWSP:
  4386  		return OPVXX2(60, 184, 0) /* xvcvsxwsp - v2.06 */
  4387  	case AXVCVUXDSP:
  4388  		return OPVXX2(60, 424, 0) /* xvcvuxdsp - v2.06 */
  4389  	case AXVCVUXWSP:
  4390  		return OPVXX2(60, 168, 0) /* xvcvuxwsp - v2.06 */
  4391  	/* End of VSX instructions */
  4392  
  4393  	case AMADDHD:
  4394  		return OPVX(4, 48, 0, 0) /* maddhd - v3.00 */
  4395  	case AMADDHDU:
  4396  		return OPVX(4, 49, 0, 0) /* maddhdu - v3.00 */
  4397  	case AMADDLD:
  4398  		return OPVX(4, 51, 0, 0) /* maddld - v3.00 */
  4399  
  4400  	case AXOR:
  4401  		return OPVCC(31, 316, 0, 0)
  4402  	case AXORCC:
  4403  		return OPVCC(31, 316, 0, 1)
  4404  	}
  4405  
  4406  	c.ctxt.Diag("bad r/r, r/r/r or r/r/r/r opcode %v", a)
  4407  	return 0
  4408  }
  4409  
  4410  func (c *ctxt9) opirrr(a obj.As) uint32 {
  4411  	switch a {
  4412  	/* Vector (VMX/Altivec) instructions */
  4413  	/* ISA 2.03 enables these for PPC970. For POWERx processors, these */
  4414  	/* are enabled starting at POWER6 (ISA 2.05). */
  4415  	case AVSLDOI:
  4416  		return OPVX(4, 44, 0, 0) /* vsldoi - v2.03 */
  4417  	}
  4418  
  4419  	c.ctxt.Diag("bad i/r/r/r opcode %v", a)
  4420  	return 0
  4421  }
  4422  
  4423  func (c *ctxt9) opiirr(a obj.As) uint32 {
  4424  	switch a {
  4425  	/* Vector (VMX/Altivec) instructions */
  4426  	/* ISA 2.07 enables these for POWER8 and beyond. */
  4427  	case AVSHASIGMAW:
  4428  		return OPVX(4, 1666, 0, 0) /* vshasigmaw - v2.07 */
  4429  	case AVSHASIGMAD:
  4430  		return OPVX(4, 1730, 0, 0) /* vshasigmad - v2.07 */
  4431  	}
  4432  
  4433  	c.ctxt.Diag("bad i/i/r/r opcode %v", a)
  4434  	return 0
  4435  }
  4436  
  4437  func (c *ctxt9) opirr(a obj.As) uint32 {
  4438  	switch a {
  4439  	case AADD:
  4440  		return OPVCC(14, 0, 0, 0)
  4441  	case AADDC:
  4442  		return OPVCC(12, 0, 0, 0)
  4443  	case AADDCCC:
  4444  		return OPVCC(13, 0, 0, 0)
  4445  	case -AADD:
  4446  		return OPVCC(15, 0, 0, 0) /* ADDIS/CAU */
  4447  
  4448  	case AANDCC:
  4449  		return OPVCC(28, 0, 0, 0)
  4450  	case -AANDCC:
  4451  		return OPVCC(29, 0, 0, 0) /* ANDIS./ANDIU. */
  4452  
  4453  	case ABR:
  4454  		return OPVCC(18, 0, 0, 0)
  4455  	case ABL:
  4456  		return OPVCC(18, 0, 0, 0) | 1
  4457  	case obj.ADUFFZERO:
  4458  		return OPVCC(18, 0, 0, 0) | 1
  4459  	case obj.ADUFFCOPY:
  4460  		return OPVCC(18, 0, 0, 0) | 1
  4461  	case ABC:
  4462  		return OPVCC(16, 0, 0, 0)
  4463  	case ABCL:
  4464  		return OPVCC(16, 0, 0, 0) | 1
  4465  
  4466  	case ABEQ:
  4467  		return AOP_RRR(16<<26, 12, 2, 0)
  4468  	case ABGE:
  4469  		return AOP_RRR(16<<26, 4, 0, 0)
  4470  	case ABGT:
  4471  		return AOP_RRR(16<<26, 12, 1, 0)
  4472  	case ABLE:
  4473  		return AOP_RRR(16<<26, 4, 1, 0)
  4474  	case ABLT:
  4475  		return AOP_RRR(16<<26, 12, 0, 0)
  4476  	case ABNE:
  4477  		return AOP_RRR(16<<26, 4, 2, 0)
  4478  	case ABVC:
  4479  		return AOP_RRR(16<<26, 4, 3, 0) // apparently unordered-clear
  4480  	case ABVS:
  4481  		return AOP_RRR(16<<26, 12, 3, 0) // apparently unordered-set
  4482  
  4483  	case ACMP:
  4484  		return OPVCC(11, 0, 0, 0) | 1<<21 /* L=1 */
  4485  	case ACMPU:
  4486  		return OPVCC(10, 0, 0, 0) | 1<<21
  4487  	case ACMPW:
  4488  		return OPVCC(11, 0, 0, 0) /* L=0 */
  4489  	case ACMPWU:
  4490  		return OPVCC(10, 0, 0, 0)
  4491  	case ACMPEQB:
  4492  		return OPVCC(31, 224, 0, 0) /* cmpeqb - v3.00 */
  4493  
  4494  	case ALSW:
  4495  		return OPVCC(31, 597, 0, 0)
  4496  
  4497  	case ACOPY:
  4498  		return OPVCC(31, 774, 0, 0) /* copy - v3.00 */
  4499  	case APASTECC:
  4500  		return OPVCC(31, 902, 0, 1) /* paste. - v3.00 */
  4501  	case ADARN:
  4502  		return OPVCC(31, 755, 0, 0) /* darn - v3.00 */
  4503  
  4504  	case AMULLW:
  4505  		return OPVCC(7, 0, 0, 0)
  4506  
  4507  	case AOR:
  4508  		return OPVCC(24, 0, 0, 0)
  4509  	case -AOR:
  4510  		return OPVCC(25, 0, 0, 0) /* ORIS/ORIU */
  4511  
  4512  	case ARLWMI:
  4513  		return OPVCC(20, 0, 0, 0) /* rlwimi */
  4514  	case ARLWMICC:
  4515  		return OPVCC(20, 0, 0, 1)
  4516  	case ARLDMI:
  4517  		return OPVCC(30, 0, 0, 0) | 3<<2 /* rldimi */
  4518  	case ARLDMICC:
  4519  		return OPVCC(30, 0, 0, 1) | 3<<2
  4520  	case ARLDIMI:
  4521  		return OPVCC(30, 0, 0, 0) | 3<<2 /* rldimi */
  4522  	case ARLDIMICC:
  4523  		return OPVCC(30, 0, 0, 1) | 3<<2
  4524  	case ARLWNM:
  4525  		return OPVCC(21, 0, 0, 0) /* rlwinm */
  4526  	case ARLWNMCC:
  4527  		return OPVCC(21, 0, 0, 1)
  4528  
  4529  	case ARLDCL:
  4530  		return OPVCC(30, 0, 0, 0) /* rldicl */
  4531  	case ARLDCLCC:
  4532  		return OPVCC(30, 0, 0, 1)
  4533  	case ARLDCR:
  4534  		return OPVCC(30, 1, 0, 0) /* rldicr */
  4535  	case ARLDCRCC:
  4536  		return OPVCC(30, 1, 0, 1)
  4537  	case ARLDC:
  4538  		return OPVCC(30, 0, 0, 0) | 2<<2
  4539  	case ARLDCCC:
  4540  		return OPVCC(30, 0, 0, 1) | 2<<2
  4541  
  4542  	case ASRAW:
  4543  		return OPVCC(31, 824, 0, 0)
  4544  	case ASRAWCC:
  4545  		return OPVCC(31, 824, 0, 1)
  4546  	case ASRAD:
  4547  		return OPVCC(31, (413 << 1), 0, 0)
  4548  	case ASRADCC:
  4549  		return OPVCC(31, (413 << 1), 0, 1)
  4550  
  4551  	case ASTSW:
  4552  		return OPVCC(31, 725, 0, 0)
  4553  
  4554  	case ASUBC:
  4555  		return OPVCC(8, 0, 0, 0)
  4556  
  4557  	case ATW:
  4558  		return OPVCC(3, 0, 0, 0)
  4559  	case ATD:
  4560  		return OPVCC(2, 0, 0, 0)
  4561  
  4562  	/* Vector (VMX/Altivec) instructions */
  4563  	/* ISA 2.03 enables these for PPC970. For POWERx processors, these */
  4564  	/* are enabled starting at POWER6 (ISA 2.05). */
  4565  	case AVSPLTB:
  4566  		return OPVX(4, 524, 0, 0) /* vspltb - v2.03 */
  4567  	case AVSPLTH:
  4568  		return OPVX(4, 588, 0, 0) /* vsplth - v2.03 */
  4569  	case AVSPLTW:
  4570  		return OPVX(4, 652, 0, 0) /* vspltw - v2.03 */
  4571  
  4572  	case AVSPLTISB:
  4573  		return OPVX(4, 780, 0, 0) /* vspltisb - v2.03 */
  4574  	case AVSPLTISH:
  4575  		return OPVX(4, 844, 0, 0) /* vspltish - v2.03 */
  4576  	case AVSPLTISW:
  4577  		return OPVX(4, 908, 0, 0) /* vspltisw - v2.03 */
  4578  	/* End of vector instructions */
  4579  
  4580  	case AFTDIV:
  4581  		return OPVCC(63, 128, 0, 0) /* ftdiv - v2.06 */
  4582  	case AFTSQRT:
  4583  		return OPVCC(63, 160, 0, 0) /* ftsqrt - v2.06 */
  4584  
  4585  	case AXOR:
  4586  		return OPVCC(26, 0, 0, 0) /* XORIL */
  4587  	case -AXOR:
  4588  		return OPVCC(27, 0, 0, 0) /* XORIU */
  4589  	}
  4590  
  4591  	c.ctxt.Diag("bad opcode i/r or i/r/r %v", a)
  4592  	return 0
  4593  }
  4594  
  4595  /*
  4596   * load o(a),d
  4597   */
  4598  func (c *ctxt9) opload(a obj.As) uint32 {
  4599  	switch a {
  4600  	case AMOVD:
  4601  		return OPVCC(58, 0, 0, 0) /* ld */
  4602  	case AMOVDU:
  4603  		return OPVCC(58, 0, 0, 1) /* ldu */
  4604  	case AMOVWZ:
  4605  		return OPVCC(32, 0, 0, 0) /* lwz */
  4606  	case AMOVWZU:
  4607  		return OPVCC(33, 0, 0, 0) /* lwzu */
  4608  	case AMOVW:
  4609  		return OPVCC(58, 0, 0, 0) | 1<<1 /* lwa */
  4610  
  4611  		/* no AMOVWU */
  4612  	case AMOVB, AMOVBZ:
  4613  		return OPVCC(34, 0, 0, 0)
  4614  		/* load */
  4615  
  4616  	case AMOVBU, AMOVBZU:
  4617  		return OPVCC(35, 0, 0, 0)
  4618  	case AFMOVD:
  4619  		return OPVCC(50, 0, 0, 0)
  4620  	case AFMOVDU:
  4621  		return OPVCC(51, 0, 0, 0)
  4622  	case AFMOVS:
  4623  		return OPVCC(48, 0, 0, 0)
  4624  	case AFMOVSU:
  4625  		return OPVCC(49, 0, 0, 0)
  4626  	case AMOVH:
  4627  		return OPVCC(42, 0, 0, 0)
  4628  	case AMOVHU:
  4629  		return OPVCC(43, 0, 0, 0)
  4630  	case AMOVHZ:
  4631  		return OPVCC(40, 0, 0, 0)
  4632  	case AMOVHZU:
  4633  		return OPVCC(41, 0, 0, 0)
  4634  	case AMOVMW:
  4635  		return OPVCC(46, 0, 0, 0) /* lmw */
  4636  	}
  4637  
  4638  	c.ctxt.Diag("bad load opcode %v", a)
  4639  	return 0
  4640  }
  4641  
  4642  /*
  4643   * indexed load a(b),d
  4644   */
  4645  func (c *ctxt9) oploadx(a obj.As) uint32 {
  4646  	switch a {
  4647  	case AMOVWZ:
  4648  		return OPVCC(31, 23, 0, 0) /* lwzx */
  4649  	case AMOVWZU:
  4650  		return OPVCC(31, 55, 0, 0) /* lwzux */
  4651  	case AMOVW:
  4652  		return OPVCC(31, 341, 0, 0) /* lwax */
  4653  	case AMOVWU:
  4654  		return OPVCC(31, 373, 0, 0) /* lwaux */
  4655  
  4656  	case AMOVB, AMOVBZ:
  4657  		return OPVCC(31, 87, 0, 0) /* lbzx */
  4658  
  4659  	case AMOVBU, AMOVBZU:
  4660  		return OPVCC(31, 119, 0, 0) /* lbzux */
  4661  	case AFMOVD:
  4662  		return OPVCC(31, 599, 0, 0) /* lfdx */
  4663  	case AFMOVDU:
  4664  		return OPVCC(31, 631, 0, 0) /*  lfdux */
  4665  	case AFMOVS:
  4666  		return OPVCC(31, 535, 0, 0) /* lfsx */
  4667  	case AFMOVSU:
  4668  		return OPVCC(31, 567, 0, 0) /* lfsux */
  4669  	case AFMOVSX:
  4670  		return OPVCC(31, 855, 0, 0) /* lfiwax - power6, isa 2.05 */
  4671  	case AFMOVSZ:
  4672  		return OPVCC(31, 887, 0, 0) /* lfiwzx - power7, isa 2.06 */
  4673  	case AMOVH:
  4674  		return OPVCC(31, 343, 0, 0) /* lhax */
  4675  	case AMOVHU:
  4676  		return OPVCC(31, 375, 0, 0) /* lhaux */
  4677  	case AMOVHBR:
  4678  		return OPVCC(31, 790, 0, 0) /* lhbrx */
  4679  	case AMOVWBR:
  4680  		return OPVCC(31, 534, 0, 0) /* lwbrx */
  4681  	case AMOVDBR:
  4682  		return OPVCC(31, 532, 0, 0) /* ldbrx */
  4683  	case AMOVHZ:
  4684  		return OPVCC(31, 279, 0, 0) /* lhzx */
  4685  	case AMOVHZU:
  4686  		return OPVCC(31, 311, 0, 0) /* lhzux */
  4687  	case AECIWX:
  4688  		return OPVCC(31, 310, 0, 0) /* eciwx */
  4689  	case ALBAR:
  4690  		return OPVCC(31, 52, 0, 0) /* lbarx */
  4691  	case ALWAR:
  4692  		return OPVCC(31, 20, 0, 0) /* lwarx */
  4693  	case ALDAR:
  4694  		return OPVCC(31, 84, 0, 0)
  4695  	case ALSW:
  4696  		return OPVCC(31, 533, 0, 0) /* lswx */
  4697  	case AMOVD:
  4698  		return OPVCC(31, 21, 0, 0) /* ldx */
  4699  	case AMOVDU:
  4700  		return OPVCC(31, 53, 0, 0) /* ldux */
  4701  	case ALDMX:
  4702  		return OPVCC(31, 309, 0, 0) /* ldmx */
  4703  
  4704  	/* Vector (VMX/Altivec) instructions */
  4705  	/* ISA 2.03 enables these for PPC970. For POWERx processors, these */
  4706  	/* are enabled starting at POWER6 (ISA 2.05). */
  4707  	case ALVEBX:
  4708  		return OPVCC(31, 7, 0, 0) /* lvebx - v2.03 */
  4709  	case ALVEHX:
  4710  		return OPVCC(31, 39, 0, 0) /* lvehx - v2.03 */
  4711  	case ALVEWX:
  4712  		return OPVCC(31, 71, 0, 0) /* lvewx - v2.03 */
  4713  	case ALVX:
  4714  		return OPVCC(31, 103, 0, 0) /* lvx - v2.03 */
  4715  	case ALVXL:
  4716  		return OPVCC(31, 359, 0, 0) /* lvxl - v2.03 */
  4717  	case ALVSL:
  4718  		return OPVCC(31, 6, 0, 0) /* lvsl - v2.03 */
  4719  	case ALVSR:
  4720  		return OPVCC(31, 38, 0, 0) /* lvsr - v2.03 */
  4721  		/* End of vector instructions */
  4722  
  4723  	/* Vector scalar (VSX) instructions */
  4724  	/* ISA 2.06 enables these for POWER7. */
  4725  	case ALXVD2X:
  4726  		return OPVXX1(31, 844, 0) /* lxvd2x - v2.06 */
  4727  	case ALXVDSX:
  4728  		return OPVXX1(31, 332, 0) /* lxvdsx - v2.06 */
  4729  	case ALXVW4X:
  4730  		return OPVXX1(31, 780, 0) /* lxvw4x - v2.06 */
  4731  
  4732  	case ALXSDX:
  4733  		return OPVXX1(31, 588, 0) /* lxsdx - v2.06 */
  4734  
  4735  	case ALXSIWAX:
  4736  		return OPVXX1(31, 76, 0) /* lxsiwax - v2.07 */
  4737  	case ALXSIWZX:
  4738  		return OPVXX1(31, 12, 0) /* lxsiwzx - v2.07 */
  4739  		/* End of vector scalar instructions */
  4740  
  4741  	}
  4742  
  4743  	c.ctxt.Diag("bad loadx opcode %v", a)
  4744  	return 0
  4745  }
  4746  
  4747  /*
  4748   * store s,o(d)
  4749   */
  4750  func (c *ctxt9) opstore(a obj.As) uint32 {
  4751  	switch a {
  4752  	case AMOVB, AMOVBZ:
  4753  		return OPVCC(38, 0, 0, 0) /* stb */
  4754  
  4755  	case AMOVBU, AMOVBZU:
  4756  		return OPVCC(39, 0, 0, 0) /* stbu */
  4757  	case AFMOVD:
  4758  		return OPVCC(54, 0, 0, 0) /* stfd */
  4759  	case AFMOVDU:
  4760  		return OPVCC(55, 0, 0, 0) /* stfdu */
  4761  	case AFMOVS:
  4762  		return OPVCC(52, 0, 0, 0) /* stfs */
  4763  	case AFMOVSU:
  4764  		return OPVCC(53, 0, 0, 0) /* stfsu */
  4765  
  4766  	case AMOVHZ, AMOVH:
  4767  		return OPVCC(44, 0, 0, 0) /* sth */
  4768  
  4769  	case AMOVHZU, AMOVHU:
  4770  		return OPVCC(45, 0, 0, 0) /* sthu */
  4771  	case AMOVMW:
  4772  		return OPVCC(47, 0, 0, 0) /* stmw */
  4773  	case ASTSW:
  4774  		return OPVCC(31, 725, 0, 0) /* stswi */
  4775  
  4776  	case AMOVWZ, AMOVW:
  4777  		return OPVCC(36, 0, 0, 0) /* stw */
  4778  
  4779  	case AMOVWZU, AMOVWU:
  4780  		return OPVCC(37, 0, 0, 0) /* stwu */
  4781  	case AMOVD:
  4782  		return OPVCC(62, 0, 0, 0) /* std */
  4783  	case AMOVDU:
  4784  		return OPVCC(62, 0, 0, 1) /* stdu */
  4785  	}
  4786  
  4787  	c.ctxt.Diag("unknown store opcode %v", a)
  4788  	return 0
  4789  }
  4790  
  4791  /*
  4792   * indexed store s,a(b)
  4793   */
  4794  func (c *ctxt9) opstorex(a obj.As) uint32 {
  4795  	switch a {
  4796  	case AMOVB, AMOVBZ:
  4797  		return OPVCC(31, 215, 0, 0) /* stbx */
  4798  
  4799  	case AMOVBU, AMOVBZU:
  4800  		return OPVCC(31, 247, 0, 0) /* stbux */
  4801  	case AFMOVD:
  4802  		return OPVCC(31, 727, 0, 0) /* stfdx */
  4803  	case AFMOVDU:
  4804  		return OPVCC(31, 759, 0, 0) /* stfdux */
  4805  	case AFMOVS:
  4806  		return OPVCC(31, 663, 0, 0) /* stfsx */
  4807  	case AFMOVSU:
  4808  		return OPVCC(31, 695, 0, 0) /* stfsux */
  4809  	case AFMOVSX:
  4810  		return OPVCC(31, 983, 0, 0) /* stfiwx */
  4811  
  4812  	case AMOVHZ, AMOVH:
  4813  		return OPVCC(31, 407, 0, 0) /* sthx */
  4814  	case AMOVHBR:
  4815  		return OPVCC(31, 918, 0, 0) /* sthbrx */
  4816  
  4817  	case AMOVHZU, AMOVHU:
  4818  		return OPVCC(31, 439, 0, 0) /* sthux */
  4819  
  4820  	case AMOVWZ, AMOVW:
  4821  		return OPVCC(31, 151, 0, 0) /* stwx */
  4822  
  4823  	case AMOVWZU, AMOVWU:
  4824  		return OPVCC(31, 183, 0, 0) /* stwux */
  4825  	case ASTSW:
  4826  		return OPVCC(31, 661, 0, 0) /* stswx */
  4827  	case AMOVWBR:
  4828  		return OPVCC(31, 662, 0, 0) /* stwbrx */
  4829  	case ASTBCCC:
  4830  		return OPVCC(31, 694, 0, 1) /* stbcx. */
  4831  	case ASTWCCC:
  4832  		return OPVCC(31, 150, 0, 1) /* stwcx. */
  4833  	case ASTDCCC:
  4834  		return OPVCC(31, 214, 0, 1) /* stwdx. */
  4835  	case AECOWX:
  4836  		return OPVCC(31, 438, 0, 0) /* ecowx */
  4837  	case AMOVD:
  4838  		return OPVCC(31, 149, 0, 0) /* stdx */
  4839  	case AMOVDU:
  4840  		return OPVCC(31, 181, 0, 0) /* stdux */
  4841  
  4842  	/* Vector (VMX/Altivec) instructions */
  4843  	/* ISA 2.03 enables these for PPC970. For POWERx processors, these */
  4844  	/* are enabled starting at POWER6 (ISA 2.05). */
  4845  	case ASTVEBX:
  4846  		return OPVCC(31, 135, 0, 0) /* stvebx - v2.03 */
  4847  	case ASTVEHX:
  4848  		return OPVCC(31, 167, 0, 0) /* stvehx - v2.03 */
  4849  	case ASTVEWX:
  4850  		return OPVCC(31, 199, 0, 0) /* stvewx - v2.03 */
  4851  	case ASTVX:
  4852  		return OPVCC(31, 231, 0, 0) /* stvx - v2.03 */
  4853  	case ASTVXL:
  4854  		return OPVCC(31, 487, 0, 0) /* stvxl - v2.03 */
  4855  		/* End of vector instructions */
  4856  
  4857  	/* Vector scalar (VSX) instructions */
  4858  	/* ISA 2.06 enables these for POWER7. */
  4859  	case ASTXVD2X:
  4860  		return OPVXX1(31, 972, 0) /* stxvd2x - v2.06 */
  4861  	case ASTXVW4X:
  4862  		return OPVXX1(31, 908, 0) /* stxvw4x - v2.06 */
  4863  
  4864  	case ASTXSDX:
  4865  		return OPVXX1(31, 716, 0) /* stxsdx - v2.06 */
  4866  
  4867  	case ASTXSIWX:
  4868  		return OPVXX1(31, 140, 0) /* stxsiwx - v2.07 */
  4869  		/* End of vector scalar instructions */
  4870  
  4871  	}
  4872  
  4873  	c.ctxt.Diag("unknown storex opcode %v", a)
  4874  	return 0
  4875  }