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