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