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