github.com/gernest/nezuko@v0.1.2/internal/obj/ppc64/asm9.go (about)

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