github.com/hikaru7719/go@v0.0.0-20181025140707-c8b2ac68906a/src/cmd/internal/obj/ppc64/asm9.go (about)

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