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