github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/obj/x86/a.out.go (about) 1 // Inferno utils/6c/6.out.h 2 // https://bitbucket.org/inferno-os/inferno-os/src/master/utils/6c/6.out.h 3 // 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) 6 // Portions Copyright © 1997-1999 Vita Nuova Limited 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) 8 // Portions Copyright © 2004,2006 Bruce Ellis 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others 11 // Portions Copyright © 2009 The Go Authors. All rights reserved. 12 // 13 // Permission is hereby granted, free of charge, to any person obtaining a copy 14 // of this software and associated documentation files (the "Software"), to deal 15 // in the Software without restriction, including without limitation the rights 16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 // copies of the Software, and to permit persons to whom the Software is 18 // furnished to do so, subject to the following conditions: 19 // 20 // The above copyright notice and this permission notice shall be included in 21 // all copies or substantial portions of the Software. 22 // 23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 // THE SOFTWARE. 30 31 package x86 32 33 import "github.com/go-asm/go/cmd/obj" 34 35 const ( 36 REG_NONE = 0 37 ) 38 39 const ( 40 REG_AL = obj.RBaseAMD64 + iota 41 REG_CL 42 REG_DL 43 REG_BL 44 REG_SPB 45 REG_BPB 46 REG_SIB 47 REG_DIB 48 REG_R8B 49 REG_R9B 50 REG_R10B 51 REG_R11B 52 REG_R12B 53 REG_R13B 54 REG_R14B 55 REG_R15B 56 57 REG_AX 58 REG_CX 59 REG_DX 60 REG_BX 61 REG_SP 62 REG_BP 63 REG_SI 64 REG_DI 65 REG_R8 66 REG_R9 67 REG_R10 68 REG_R11 69 REG_R12 70 REG_R13 71 REG_R14 72 REG_R15 73 74 REG_AH 75 REG_CH 76 REG_DH 77 REG_BH 78 79 REG_F0 80 REG_F1 81 REG_F2 82 REG_F3 83 REG_F4 84 REG_F5 85 REG_F6 86 REG_F7 87 88 REG_M0 89 REG_M1 90 REG_M2 91 REG_M3 92 REG_M4 93 REG_M5 94 REG_M6 95 REG_M7 96 97 REG_K0 98 REG_K1 99 REG_K2 100 REG_K3 101 REG_K4 102 REG_K5 103 REG_K6 104 REG_K7 105 106 REG_X0 107 REG_X1 108 REG_X2 109 REG_X3 110 REG_X4 111 REG_X5 112 REG_X6 113 REG_X7 114 REG_X8 115 REG_X9 116 REG_X10 117 REG_X11 118 REG_X12 119 REG_X13 120 REG_X14 121 REG_X15 122 REG_X16 123 REG_X17 124 REG_X18 125 REG_X19 126 REG_X20 127 REG_X21 128 REG_X22 129 REG_X23 130 REG_X24 131 REG_X25 132 REG_X26 133 REG_X27 134 REG_X28 135 REG_X29 136 REG_X30 137 REG_X31 138 139 REG_Y0 140 REG_Y1 141 REG_Y2 142 REG_Y3 143 REG_Y4 144 REG_Y5 145 REG_Y6 146 REG_Y7 147 REG_Y8 148 REG_Y9 149 REG_Y10 150 REG_Y11 151 REG_Y12 152 REG_Y13 153 REG_Y14 154 REG_Y15 155 REG_Y16 156 REG_Y17 157 REG_Y18 158 REG_Y19 159 REG_Y20 160 REG_Y21 161 REG_Y22 162 REG_Y23 163 REG_Y24 164 REG_Y25 165 REG_Y26 166 REG_Y27 167 REG_Y28 168 REG_Y29 169 REG_Y30 170 REG_Y31 171 172 REG_Z0 173 REG_Z1 174 REG_Z2 175 REG_Z3 176 REG_Z4 177 REG_Z5 178 REG_Z6 179 REG_Z7 180 REG_Z8 181 REG_Z9 182 REG_Z10 183 REG_Z11 184 REG_Z12 185 REG_Z13 186 REG_Z14 187 REG_Z15 188 REG_Z16 189 REG_Z17 190 REG_Z18 191 REG_Z19 192 REG_Z20 193 REG_Z21 194 REG_Z22 195 REG_Z23 196 REG_Z24 197 REG_Z25 198 REG_Z26 199 REG_Z27 200 REG_Z28 201 REG_Z29 202 REG_Z30 203 REG_Z31 204 205 REG_CS 206 REG_SS 207 REG_DS 208 REG_ES 209 REG_FS 210 REG_GS 211 212 REG_GDTR // global descriptor table register 213 REG_IDTR // interrupt descriptor table register 214 REG_LDTR // local descriptor table register 215 REG_MSW // machine status word 216 REG_TASK // task register 217 218 REG_CR0 219 REG_CR1 220 REG_CR2 221 REG_CR3 222 REG_CR4 223 REG_CR5 224 REG_CR6 225 REG_CR7 226 REG_CR8 227 REG_CR9 228 REG_CR10 229 REG_CR11 230 REG_CR12 231 REG_CR13 232 REG_CR14 233 REG_CR15 234 235 REG_DR0 236 REG_DR1 237 REG_DR2 238 REG_DR3 239 REG_DR4 240 REG_DR5 241 REG_DR6 242 REG_DR7 243 244 REG_TR0 245 REG_TR1 246 REG_TR2 247 REG_TR3 248 REG_TR4 249 REG_TR5 250 REG_TR6 251 REG_TR7 252 253 REG_TLS 254 255 MAXREG 256 257 REG_CR = REG_CR0 258 REG_DR = REG_DR0 259 REG_TR = REG_TR0 260 261 REGARG = -1 262 REGRET = REG_AX 263 FREGRET = REG_X0 264 REGSP = REG_SP 265 REGCTXT = REG_DX 266 REGENTRYTMP0 = REG_R12 // scratch register available at function entry in ABIInternal 267 REGENTRYTMP1 = REG_R13 // scratch register available at function entry in ABIInternal 268 REGG = REG_R14 // g register in ABIInternal 269 REGEXT = REG_R15 // compiler allocates external registers R15 down 270 FREGMIN = REG_X0 + 5 // first register variable 271 FREGEXT = REG_X0 + 15 // first external register 272 T_TYPE = 1 << 0 273 T_INDEX = 1 << 1 274 T_OFFSET = 1 << 2 275 T_FCONST = 1 << 3 276 T_SYM = 1 << 4 277 T_SCONST = 1 << 5 278 T_64 = 1 << 6 279 T_GOTYPE = 1 << 7 280 ) 281 282 // https://www.uclibc.org/docs/psABI-x86_64.pdf, figure 3.36 283 var AMD64DWARFRegisters = map[int16]int16{ 284 REG_AX: 0, 285 REG_DX: 1, 286 REG_CX: 2, 287 REG_BX: 3, 288 REG_SI: 4, 289 REG_DI: 5, 290 REG_BP: 6, 291 REG_SP: 7, 292 REG_R8: 8, 293 REG_R9: 9, 294 REG_R10: 10, 295 REG_R11: 11, 296 REG_R12: 12, 297 REG_R13: 13, 298 REG_R14: 14, 299 REG_R15: 15, 300 // 16 is "Return Address RA", whatever that is. 301 // 17-24 vector registers (X/Y/Z). 302 REG_X0: 17, 303 REG_X1: 18, 304 REG_X2: 19, 305 REG_X3: 20, 306 REG_X4: 21, 307 REG_X5: 22, 308 REG_X6: 23, 309 REG_X7: 24, 310 // 25-32 extended vector registers (X/Y/Z). 311 REG_X8: 25, 312 REG_X9: 26, 313 REG_X10: 27, 314 REG_X11: 28, 315 REG_X12: 29, 316 REG_X13: 30, 317 REG_X14: 31, 318 REG_X15: 32, 319 // ST registers. %stN => FN. 320 REG_F0: 33, 321 REG_F1: 34, 322 REG_F2: 35, 323 REG_F3: 36, 324 REG_F4: 37, 325 REG_F5: 38, 326 REG_F6: 39, 327 REG_F7: 40, 328 // MMX registers. %mmN => MN. 329 REG_M0: 41, 330 REG_M1: 42, 331 REG_M2: 43, 332 REG_M3: 44, 333 REG_M4: 45, 334 REG_M5: 46, 335 REG_M6: 47, 336 REG_M7: 48, 337 // 48 is flags, which doesn't have a name. 338 REG_ES: 50, 339 REG_CS: 51, 340 REG_SS: 52, 341 REG_DS: 53, 342 REG_FS: 54, 343 REG_GS: 55, 344 // 58 and 59 are {fs,gs}base, which don't have names. 345 REG_TR: 62, 346 REG_LDTR: 63, 347 // 64-66 are mxcsr, fcw, fsw, which don't have names. 348 349 // 67-82 upper vector registers (X/Y/Z). 350 REG_X16: 67, 351 REG_X17: 68, 352 REG_X18: 69, 353 REG_X19: 70, 354 REG_X20: 71, 355 REG_X21: 72, 356 REG_X22: 73, 357 REG_X23: 74, 358 REG_X24: 75, 359 REG_X25: 76, 360 REG_X26: 77, 361 REG_X27: 78, 362 REG_X28: 79, 363 REG_X29: 80, 364 REG_X30: 81, 365 REG_X31: 82, 366 367 // 118-125 vector mask registers. %kN => KN. 368 REG_K0: 118, 369 REG_K1: 119, 370 REG_K2: 120, 371 REG_K3: 121, 372 REG_K4: 122, 373 REG_K5: 123, 374 REG_K6: 124, 375 REG_K7: 125, 376 } 377 378 // https://www.uclibc.org/docs/psABI-i386.pdf, table 2.14 379 var X86DWARFRegisters = map[int16]int16{ 380 REG_AX: 0, 381 REG_CX: 1, 382 REG_DX: 2, 383 REG_BX: 3, 384 REG_SP: 4, 385 REG_BP: 5, 386 REG_SI: 6, 387 REG_DI: 7, 388 // 8 is "Return Address RA", whatever that is. 389 // 9 is flags, which doesn't have a name. 390 // ST registers. %stN => FN. 391 REG_F0: 11, 392 REG_F1: 12, 393 REG_F2: 13, 394 REG_F3: 14, 395 REG_F4: 15, 396 REG_F5: 16, 397 REG_F6: 17, 398 REG_F7: 18, 399 // XMM registers. %xmmN => XN. 400 REG_X0: 21, 401 REG_X1: 22, 402 REG_X2: 23, 403 REG_X3: 24, 404 REG_X4: 25, 405 REG_X5: 26, 406 REG_X6: 27, 407 REG_X7: 28, 408 // MMX registers. %mmN => MN. 409 REG_M0: 29, 410 REG_M1: 30, 411 REG_M2: 31, 412 REG_M3: 32, 413 REG_M4: 33, 414 REG_M5: 34, 415 REG_M6: 35, 416 REG_M7: 36, 417 // 39 is mxcsr, which doesn't have a name. 418 REG_ES: 40, 419 REG_CS: 41, 420 REG_SS: 42, 421 REG_DS: 43, 422 REG_FS: 44, 423 REG_GS: 45, 424 REG_TR: 48, 425 REG_LDTR: 49, 426 }