asm9.go raw

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