...

Source file src/github.com/twitchyliquid64/golang-asm/obj/ppc64/asm9.go

Documentation: github.com/twitchyliquid64/golang-asm/obj/ppc64

     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  

View as plain text