github.com/zebozhuang/go@v0.0.0-20200207033046-f8a98f6f5c5d/src/cmd/internal/obj/ppc64/asm9.go (about)

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