a.out.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  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. package x86
  31. import "github.com/twitchyliquid64/golang-asm/obj"
  32. const (
  33. REG_NONE = 0
  34. )
  35. const (
  36. REG_AL = obj.RBaseAMD64 + iota
  37. REG_CL
  38. REG_DL
  39. REG_BL
  40. REG_SPB
  41. REG_BPB
  42. REG_SIB
  43. REG_DIB
  44. REG_R8B
  45. REG_R9B
  46. REG_R10B
  47. REG_R11B
  48. REG_R12B
  49. REG_R13B
  50. REG_R14B
  51. REG_R15B
  52. REG_AX
  53. REG_CX
  54. REG_DX
  55. REG_BX
  56. REG_SP
  57. REG_BP
  58. REG_SI
  59. REG_DI
  60. REG_R8
  61. REG_R9
  62. REG_R10
  63. REG_R11
  64. REG_R12
  65. REG_R13
  66. REG_R14
  67. REG_R15
  68. REG_AH
  69. REG_CH
  70. REG_DH
  71. REG_BH
  72. REG_F0
  73. REG_F1
  74. REG_F2
  75. REG_F3
  76. REG_F4
  77. REG_F5
  78. REG_F6
  79. REG_F7
  80. REG_M0
  81. REG_M1
  82. REG_M2
  83. REG_M3
  84. REG_M4
  85. REG_M5
  86. REG_M6
  87. REG_M7
  88. REG_K0
  89. REG_K1
  90. REG_K2
  91. REG_K3
  92. REG_K4
  93. REG_K5
  94. REG_K6
  95. REG_K7
  96. REG_X0
  97. REG_X1
  98. REG_X2
  99. REG_X3
  100. REG_X4
  101. REG_X5
  102. REG_X6
  103. REG_X7
  104. REG_X8
  105. REG_X9
  106. REG_X10
  107. REG_X11
  108. REG_X12
  109. REG_X13
  110. REG_X14
  111. REG_X15
  112. REG_X16
  113. REG_X17
  114. REG_X18
  115. REG_X19
  116. REG_X20
  117. REG_X21
  118. REG_X22
  119. REG_X23
  120. REG_X24
  121. REG_X25
  122. REG_X26
  123. REG_X27
  124. REG_X28
  125. REG_X29
  126. REG_X30
  127. REG_X31
  128. REG_Y0
  129. REG_Y1
  130. REG_Y2
  131. REG_Y3
  132. REG_Y4
  133. REG_Y5
  134. REG_Y6
  135. REG_Y7
  136. REG_Y8
  137. REG_Y9
  138. REG_Y10
  139. REG_Y11
  140. REG_Y12
  141. REG_Y13
  142. REG_Y14
  143. REG_Y15
  144. REG_Y16
  145. REG_Y17
  146. REG_Y18
  147. REG_Y19
  148. REG_Y20
  149. REG_Y21
  150. REG_Y22
  151. REG_Y23
  152. REG_Y24
  153. REG_Y25
  154. REG_Y26
  155. REG_Y27
  156. REG_Y28
  157. REG_Y29
  158. REG_Y30
  159. REG_Y31
  160. REG_Z0
  161. REG_Z1
  162. REG_Z2
  163. REG_Z3
  164. REG_Z4
  165. REG_Z5
  166. REG_Z6
  167. REG_Z7
  168. REG_Z8
  169. REG_Z9
  170. REG_Z10
  171. REG_Z11
  172. REG_Z12
  173. REG_Z13
  174. REG_Z14
  175. REG_Z15
  176. REG_Z16
  177. REG_Z17
  178. REG_Z18
  179. REG_Z19
  180. REG_Z20
  181. REG_Z21
  182. REG_Z22
  183. REG_Z23
  184. REG_Z24
  185. REG_Z25
  186. REG_Z26
  187. REG_Z27
  188. REG_Z28
  189. REG_Z29
  190. REG_Z30
  191. REG_Z31
  192. REG_CS
  193. REG_SS
  194. REG_DS
  195. REG_ES
  196. REG_FS
  197. REG_GS
  198. REG_GDTR // global descriptor table register
  199. REG_IDTR // interrupt descriptor table register
  200. REG_LDTR // local descriptor table register
  201. REG_MSW // machine status word
  202. REG_TASK // task register
  203. REG_CR0
  204. REG_CR1
  205. REG_CR2
  206. REG_CR3
  207. REG_CR4
  208. REG_CR5
  209. REG_CR6
  210. REG_CR7
  211. REG_CR8
  212. REG_CR9
  213. REG_CR10
  214. REG_CR11
  215. REG_CR12
  216. REG_CR13
  217. REG_CR14
  218. REG_CR15
  219. REG_DR0
  220. REG_DR1
  221. REG_DR2
  222. REG_DR3
  223. REG_DR4
  224. REG_DR5
  225. REG_DR6
  226. REG_DR7
  227. REG_TR0
  228. REG_TR1
  229. REG_TR2
  230. REG_TR3
  231. REG_TR4
  232. REG_TR5
  233. REG_TR6
  234. REG_TR7
  235. REG_TLS
  236. MAXREG
  237. REG_CR = REG_CR0
  238. REG_DR = REG_DR0
  239. REG_TR = REG_TR0
  240. REGARG = -1
  241. REGRET = REG_AX
  242. FREGRET = REG_X0
  243. REGSP = REG_SP
  244. REGCTXT = REG_DX
  245. REGEXT = REG_R15 // compiler allocates external registers R15 down
  246. FREGMIN = REG_X0 + 5 // first register variable
  247. FREGEXT = REG_X0 + 15 // first external register
  248. T_TYPE = 1 << 0
  249. T_INDEX = 1 << 1
  250. T_OFFSET = 1 << 2
  251. T_FCONST = 1 << 3
  252. T_SYM = 1 << 4
  253. T_SCONST = 1 << 5
  254. T_64 = 1 << 6
  255. T_GOTYPE = 1 << 7
  256. )
  257. // https://www.uclibc.org/docs/psABI-x86_64.pdf, figure 3.36
  258. var AMD64DWARFRegisters = map[int16]int16{
  259. REG_AX: 0,
  260. REG_DX: 1,
  261. REG_CX: 2,
  262. REG_BX: 3,
  263. REG_SI: 4,
  264. REG_DI: 5,
  265. REG_BP: 6,
  266. REG_SP: 7,
  267. REG_R8: 8,
  268. REG_R9: 9,
  269. REG_R10: 10,
  270. REG_R11: 11,
  271. REG_R12: 12,
  272. REG_R13: 13,
  273. REG_R14: 14,
  274. REG_R15: 15,
  275. // 16 is "Return Address RA", whatever that is.
  276. // 17-24 vector registers (X/Y/Z).
  277. REG_X0: 17,
  278. REG_X1: 18,
  279. REG_X2: 19,
  280. REG_X3: 20,
  281. REG_X4: 21,
  282. REG_X5: 22,
  283. REG_X6: 23,
  284. REG_X7: 24,
  285. // 25-32 extended vector registers (X/Y/Z).
  286. REG_X8: 25,
  287. REG_X9: 26,
  288. REG_X10: 27,
  289. REG_X11: 28,
  290. REG_X12: 29,
  291. REG_X13: 30,
  292. REG_X14: 31,
  293. REG_X15: 32,
  294. // ST registers. %stN => FN.
  295. REG_F0: 33,
  296. REG_F1: 34,
  297. REG_F2: 35,
  298. REG_F3: 36,
  299. REG_F4: 37,
  300. REG_F5: 38,
  301. REG_F6: 39,
  302. REG_F7: 40,
  303. // MMX registers. %mmN => MN.
  304. REG_M0: 41,
  305. REG_M1: 42,
  306. REG_M2: 43,
  307. REG_M3: 44,
  308. REG_M4: 45,
  309. REG_M5: 46,
  310. REG_M6: 47,
  311. REG_M7: 48,
  312. // 48 is flags, which doesn't have a name.
  313. REG_ES: 50,
  314. REG_CS: 51,
  315. REG_SS: 52,
  316. REG_DS: 53,
  317. REG_FS: 54,
  318. REG_GS: 55,
  319. // 58 and 59 are {fs,gs}base, which don't have names.
  320. REG_TR: 62,
  321. REG_LDTR: 63,
  322. // 64-66 are mxcsr, fcw, fsw, which don't have names.
  323. // 67-82 upper vector registers (X/Y/Z).
  324. REG_X16: 67,
  325. REG_X17: 68,
  326. REG_X18: 69,
  327. REG_X19: 70,
  328. REG_X20: 71,
  329. REG_X21: 72,
  330. REG_X22: 73,
  331. REG_X23: 74,
  332. REG_X24: 75,
  333. REG_X25: 76,
  334. REG_X26: 77,
  335. REG_X27: 78,
  336. REG_X28: 79,
  337. REG_X29: 80,
  338. REG_X30: 81,
  339. REG_X31: 82,
  340. // 118-125 vector mask registers. %kN => KN.
  341. REG_K0: 118,
  342. REG_K1: 119,
  343. REG_K2: 120,
  344. REG_K3: 121,
  345. REG_K4: 122,
  346. REG_K5: 123,
  347. REG_K6: 124,
  348. REG_K7: 125,
  349. }
  350. // https://www.uclibc.org/docs/psABI-i386.pdf, table 2.14
  351. var X86DWARFRegisters = map[int16]int16{
  352. REG_AX: 0,
  353. REG_CX: 1,
  354. REG_DX: 2,
  355. REG_BX: 3,
  356. REG_SP: 4,
  357. REG_BP: 5,
  358. REG_SI: 6,
  359. REG_DI: 7,
  360. // 8 is "Return Address RA", whatever that is.
  361. // 9 is flags, which doesn't have a name.
  362. // ST registers. %stN => FN.
  363. REG_F0: 11,
  364. REG_F1: 12,
  365. REG_F2: 13,
  366. REG_F3: 14,
  367. REG_F4: 15,
  368. REG_F5: 16,
  369. REG_F6: 17,
  370. REG_F7: 18,
  371. // XMM registers. %xmmN => XN.
  372. REG_X0: 21,
  373. REG_X1: 22,
  374. REG_X2: 23,
  375. REG_X3: 24,
  376. REG_X4: 25,
  377. REG_X5: 26,
  378. REG_X6: 27,
  379. REG_X7: 28,
  380. // MMX registers. %mmN => MN.
  381. REG_M0: 29,
  382. REG_M1: 30,
  383. REG_M2: 31,
  384. REG_M3: 32,
  385. REG_M4: 33,
  386. REG_M5: 34,
  387. REG_M6: 35,
  388. REG_M7: 36,
  389. // 39 is mxcsr, which doesn't have a name.
  390. REG_ES: 40,
  391. REG_CS: 41,
  392. REG_SS: 42,
  393. REG_DS: 43,
  394. REG_FS: 44,
  395. REG_GS: 45,
  396. REG_TR: 48,
  397. REG_LDTR: 49,
  398. }