registers.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. package x86_64
  2. import (
  3. `fmt`
  4. )
  5. // Register represents a hardware register.
  6. type Register interface {
  7. fmt.Stringer
  8. implRegister()
  9. }
  10. type (
  11. Register8 byte
  12. Register16 byte
  13. Register32 byte
  14. Register64 byte
  15. )
  16. type (
  17. KRegister byte
  18. MMRegister byte
  19. XMMRegister byte
  20. YMMRegister byte
  21. ZMMRegister byte
  22. )
  23. // RegisterMask is a KRegister used to mask another register.
  24. type RegisterMask struct {
  25. Z bool
  26. K KRegister
  27. }
  28. // String implements the fmt.Stringer interface.
  29. func (self RegisterMask) String() string {
  30. if !self.Z {
  31. return fmt.Sprintf("{%%%s}", self.K)
  32. } else {
  33. return fmt.Sprintf("{%%%s}{z}", self.K)
  34. }
  35. }
  36. // MaskedRegister is a Register masked by a RegisterMask.
  37. type MaskedRegister struct {
  38. Reg Register
  39. Mask RegisterMask
  40. }
  41. // String implements the fmt.Stringer interface.
  42. func (self MaskedRegister) String() string {
  43. return self.Reg.String() + self.Mask.String()
  44. }
  45. const (
  46. AL Register8 = iota
  47. CL
  48. DL
  49. BL
  50. SPL
  51. BPL
  52. SIL
  53. DIL
  54. R8b
  55. R9b
  56. R10b
  57. R11b
  58. R12b
  59. R13b
  60. R14b
  61. R15b
  62. )
  63. const (
  64. AH = SPL | 0x80
  65. CH = BPL | 0x80
  66. DH = SIL | 0x80
  67. BH = DIL | 0x80
  68. )
  69. const (
  70. AX Register16 = iota
  71. CX
  72. DX
  73. BX
  74. SP
  75. BP
  76. SI
  77. DI
  78. R8w
  79. R9w
  80. R10w
  81. R11w
  82. R12w
  83. R13w
  84. R14w
  85. R15w
  86. )
  87. const (
  88. EAX Register32 = iota
  89. ECX
  90. EDX
  91. EBX
  92. ESP
  93. EBP
  94. ESI
  95. EDI
  96. R8d
  97. R9d
  98. R10d
  99. R11d
  100. R12d
  101. R13d
  102. R14d
  103. R15d
  104. )
  105. const (
  106. RAX Register64 = iota
  107. RCX
  108. RDX
  109. RBX
  110. RSP
  111. RBP
  112. RSI
  113. RDI
  114. R8
  115. R9
  116. R10
  117. R11
  118. R12
  119. R13
  120. R14
  121. R15
  122. )
  123. const (
  124. K0 KRegister = iota
  125. K1
  126. K2
  127. K3
  128. K4
  129. K5
  130. K6
  131. K7
  132. )
  133. const (
  134. MM0 MMRegister = iota
  135. MM1
  136. MM2
  137. MM3
  138. MM4
  139. MM5
  140. MM6
  141. MM7
  142. )
  143. const (
  144. XMM0 XMMRegister = iota
  145. XMM1
  146. XMM2
  147. XMM3
  148. XMM4
  149. XMM5
  150. XMM6
  151. XMM7
  152. XMM8
  153. XMM9
  154. XMM10
  155. XMM11
  156. XMM12
  157. XMM13
  158. XMM14
  159. XMM15
  160. XMM16
  161. XMM17
  162. XMM18
  163. XMM19
  164. XMM20
  165. XMM21
  166. XMM22
  167. XMM23
  168. XMM24
  169. XMM25
  170. XMM26
  171. XMM27
  172. XMM28
  173. XMM29
  174. XMM30
  175. XMM31
  176. )
  177. const (
  178. YMM0 YMMRegister = iota
  179. YMM1
  180. YMM2
  181. YMM3
  182. YMM4
  183. YMM5
  184. YMM6
  185. YMM7
  186. YMM8
  187. YMM9
  188. YMM10
  189. YMM11
  190. YMM12
  191. YMM13
  192. YMM14
  193. YMM15
  194. YMM16
  195. YMM17
  196. YMM18
  197. YMM19
  198. YMM20
  199. YMM21
  200. YMM22
  201. YMM23
  202. YMM24
  203. YMM25
  204. YMM26
  205. YMM27
  206. YMM28
  207. YMM29
  208. YMM30
  209. YMM31
  210. )
  211. const (
  212. ZMM0 ZMMRegister = iota
  213. ZMM1
  214. ZMM2
  215. ZMM3
  216. ZMM4
  217. ZMM5
  218. ZMM6
  219. ZMM7
  220. ZMM8
  221. ZMM9
  222. ZMM10
  223. ZMM11
  224. ZMM12
  225. ZMM13
  226. ZMM14
  227. ZMM15
  228. ZMM16
  229. ZMM17
  230. ZMM18
  231. ZMM19
  232. ZMM20
  233. ZMM21
  234. ZMM22
  235. ZMM23
  236. ZMM24
  237. ZMM25
  238. ZMM26
  239. ZMM27
  240. ZMM28
  241. ZMM29
  242. ZMM30
  243. ZMM31
  244. )
  245. func (self Register8) implRegister() {}
  246. func (self Register16) implRegister() {}
  247. func (self Register32) implRegister() {}
  248. func (self Register64) implRegister() {}
  249. func (self KRegister) implRegister() {}
  250. func (self MMRegister) implRegister() {}
  251. func (self XMMRegister) implRegister() {}
  252. func (self YMMRegister) implRegister() {}
  253. func (self ZMMRegister) implRegister() {}
  254. func (self Register8) String() string { if int(self) >= len(r8names) { return "???" } else { return r8names[self] } }
  255. func (self Register16) String() string { if int(self) >= len(r16names) { return "???" } else { return r16names[self] } }
  256. func (self Register32) String() string { if int(self) >= len(r32names) { return "???" } else { return r32names[self] } }
  257. func (self Register64) String() string { if int(self) >= len(r64names) { return "???" } else { return r64names[self] } }
  258. func (self KRegister) String() string { if int(self) >= len(knames) { return "???" } else { return knames[self] } }
  259. func (self MMRegister) String() string { if int(self) >= len(mmnames) { return "???" } else { return mmnames[self] } }
  260. func (self XMMRegister) String() string { if int(self) >= len(xmmnames) { return "???" } else { return xmmnames[self] } }
  261. func (self YMMRegister) String() string { if int(self) >= len(ymmnames) { return "???" } else { return ymmnames[self] } }
  262. func (self ZMMRegister) String() string { if int(self) >= len(zmmnames) { return "???" } else { return zmmnames[self] } }
  263. // Registers maps register name into Register instances.
  264. var Registers = map[string]Register {
  265. "al" : AL,
  266. "cl" : CL,
  267. "dl" : DL,
  268. "bl" : BL,
  269. "spl" : SPL,
  270. "bpl" : BPL,
  271. "sil" : SIL,
  272. "dil" : DIL,
  273. "r8b" : R8b,
  274. "r9b" : R9b,
  275. "r10b" : R10b,
  276. "r11b" : R11b,
  277. "r12b" : R12b,
  278. "r13b" : R13b,
  279. "r14b" : R14b,
  280. "r15b" : R15b,
  281. "ah" : AH,
  282. "ch" : CH,
  283. "dh" : DH,
  284. "bh" : BH,
  285. "ax" : AX,
  286. "cx" : CX,
  287. "dx" : DX,
  288. "bx" : BX,
  289. "sp" : SP,
  290. "bp" : BP,
  291. "si" : SI,
  292. "di" : DI,
  293. "r8w" : R8w,
  294. "r9w" : R9w,
  295. "r10w" : R10w,
  296. "r11w" : R11w,
  297. "r12w" : R12w,
  298. "r13w" : R13w,
  299. "r14w" : R14w,
  300. "r15w" : R15w,
  301. "eax" : EAX,
  302. "ecx" : ECX,
  303. "edx" : EDX,
  304. "ebx" : EBX,
  305. "esp" : ESP,
  306. "ebp" : EBP,
  307. "esi" : ESI,
  308. "edi" : EDI,
  309. "r8d" : R8d,
  310. "r9d" : R9d,
  311. "r10d" : R10d,
  312. "r11d" : R11d,
  313. "r12d" : R12d,
  314. "r13d" : R13d,
  315. "r14d" : R14d,
  316. "r15d" : R15d,
  317. "rax" : RAX,
  318. "rcx" : RCX,
  319. "rdx" : RDX,
  320. "rbx" : RBX,
  321. "rsp" : RSP,
  322. "rbp" : RBP,
  323. "rsi" : RSI,
  324. "rdi" : RDI,
  325. "r8" : R8,
  326. "r9" : R9,
  327. "r10" : R10,
  328. "r11" : R11,
  329. "r12" : R12,
  330. "r13" : R13,
  331. "r14" : R14,
  332. "r15" : R15,
  333. "k0" : K0,
  334. "k1" : K1,
  335. "k2" : K2,
  336. "k3" : K3,
  337. "k4" : K4,
  338. "k5" : K5,
  339. "k6" : K6,
  340. "k7" : K7,
  341. "mm0" : MM0,
  342. "mm1" : MM1,
  343. "mm2" : MM2,
  344. "mm3" : MM3,
  345. "mm4" : MM4,
  346. "mm5" : MM5,
  347. "mm6" : MM6,
  348. "mm7" : MM7,
  349. "xmm0" : XMM0,
  350. "xmm1" : XMM1,
  351. "xmm2" : XMM2,
  352. "xmm3" : XMM3,
  353. "xmm4" : XMM4,
  354. "xmm5" : XMM5,
  355. "xmm6" : XMM6,
  356. "xmm7" : XMM7,
  357. "xmm8" : XMM8,
  358. "xmm9" : XMM9,
  359. "xmm10" : XMM10,
  360. "xmm11" : XMM11,
  361. "xmm12" : XMM12,
  362. "xmm13" : XMM13,
  363. "xmm14" : XMM14,
  364. "xmm15" : XMM15,
  365. "xmm16" : XMM16,
  366. "xmm17" : XMM17,
  367. "xmm18" : XMM18,
  368. "xmm19" : XMM19,
  369. "xmm20" : XMM20,
  370. "xmm21" : XMM21,
  371. "xmm22" : XMM22,
  372. "xmm23" : XMM23,
  373. "xmm24" : XMM24,
  374. "xmm25" : XMM25,
  375. "xmm26" : XMM26,
  376. "xmm27" : XMM27,
  377. "xmm28" : XMM28,
  378. "xmm29" : XMM29,
  379. "xmm30" : XMM30,
  380. "xmm31" : XMM31,
  381. "ymm0" : YMM0,
  382. "ymm1" : YMM1,
  383. "ymm2" : YMM2,
  384. "ymm3" : YMM3,
  385. "ymm4" : YMM4,
  386. "ymm5" : YMM5,
  387. "ymm6" : YMM6,
  388. "ymm7" : YMM7,
  389. "ymm8" : YMM8,
  390. "ymm9" : YMM9,
  391. "ymm10" : YMM10,
  392. "ymm11" : YMM11,
  393. "ymm12" : YMM12,
  394. "ymm13" : YMM13,
  395. "ymm14" : YMM14,
  396. "ymm15" : YMM15,
  397. "ymm16" : YMM16,
  398. "ymm17" : YMM17,
  399. "ymm18" : YMM18,
  400. "ymm19" : YMM19,
  401. "ymm20" : YMM20,
  402. "ymm21" : YMM21,
  403. "ymm22" : YMM22,
  404. "ymm23" : YMM23,
  405. "ymm24" : YMM24,
  406. "ymm25" : YMM25,
  407. "ymm26" : YMM26,
  408. "ymm27" : YMM27,
  409. "ymm28" : YMM28,
  410. "ymm29" : YMM29,
  411. "ymm30" : YMM30,
  412. "ymm31" : YMM31,
  413. "zmm0" : ZMM0,
  414. "zmm1" : ZMM1,
  415. "zmm2" : ZMM2,
  416. "zmm3" : ZMM3,
  417. "zmm4" : ZMM4,
  418. "zmm5" : ZMM5,
  419. "zmm6" : ZMM6,
  420. "zmm7" : ZMM7,
  421. "zmm8" : ZMM8,
  422. "zmm9" : ZMM9,
  423. "zmm10" : ZMM10,
  424. "zmm11" : ZMM11,
  425. "zmm12" : ZMM12,
  426. "zmm13" : ZMM13,
  427. "zmm14" : ZMM14,
  428. "zmm15" : ZMM15,
  429. "zmm16" : ZMM16,
  430. "zmm17" : ZMM17,
  431. "zmm18" : ZMM18,
  432. "zmm19" : ZMM19,
  433. "zmm20" : ZMM20,
  434. "zmm21" : ZMM21,
  435. "zmm22" : ZMM22,
  436. "zmm23" : ZMM23,
  437. "zmm24" : ZMM24,
  438. "zmm25" : ZMM25,
  439. "zmm26" : ZMM26,
  440. "zmm27" : ZMM27,
  441. "zmm28" : ZMM28,
  442. "zmm29" : ZMM29,
  443. "zmm30" : ZMM30,
  444. "zmm31" : ZMM31,
  445. }
  446. /** Register Name Tables **/
  447. var r8names = [...]string {
  448. AL : "al",
  449. CL : "cl",
  450. DL : "dl",
  451. BL : "bl",
  452. SPL : "spl",
  453. BPL : "bpl",
  454. SIL : "sil",
  455. DIL : "dil",
  456. R8b : "r8b",
  457. R9b : "r9b",
  458. R10b : "r10b",
  459. R11b : "r11b",
  460. R12b : "r12b",
  461. R13b : "r13b",
  462. R14b : "r14b",
  463. R15b : "r15b",
  464. AH : "ah",
  465. CH : "ch",
  466. DH : "dh",
  467. BH : "bh",
  468. }
  469. var r16names = [...]string {
  470. AX : "ax",
  471. CX : "cx",
  472. DX : "dx",
  473. BX : "bx",
  474. SP : "sp",
  475. BP : "bp",
  476. SI : "si",
  477. DI : "di",
  478. R8w : "r8w",
  479. R9w : "r9w",
  480. R10w : "r10w",
  481. R11w : "r11w",
  482. R12w : "r12w",
  483. R13w : "r13w",
  484. R14w : "r14w",
  485. R15w : "r15w",
  486. }
  487. var r32names = [...]string {
  488. EAX : "eax",
  489. ECX : "ecx",
  490. EDX : "edx",
  491. EBX : "ebx",
  492. ESP : "esp",
  493. EBP : "ebp",
  494. ESI : "esi",
  495. EDI : "edi",
  496. R8d : "r8d",
  497. R9d : "r9d",
  498. R10d : "r10d",
  499. R11d : "r11d",
  500. R12d : "r12d",
  501. R13d : "r13d",
  502. R14d : "r14d",
  503. R15d : "r15d",
  504. }
  505. var r64names = [...]string {
  506. RAX : "rax",
  507. RCX : "rcx",
  508. RDX : "rdx",
  509. RBX : "rbx",
  510. RSP : "rsp",
  511. RBP : "rbp",
  512. RSI : "rsi",
  513. RDI : "rdi",
  514. R8 : "r8",
  515. R9 : "r9",
  516. R10 : "r10",
  517. R11 : "r11",
  518. R12 : "r12",
  519. R13 : "r13",
  520. R14 : "r14",
  521. R15 : "r15",
  522. }
  523. var knames = [...]string {
  524. K0: "k0",
  525. K1: "k1",
  526. K2: "k2",
  527. K3: "k3",
  528. K4: "k4",
  529. K5: "k5",
  530. K6: "k6",
  531. K7: "k7",
  532. }
  533. var mmnames = [...]string {
  534. MM0: "mm0",
  535. MM1: "mm1",
  536. MM2: "mm2",
  537. MM3: "mm3",
  538. MM4: "mm4",
  539. MM5: "mm5",
  540. MM6: "mm6",
  541. MM7: "mm7",
  542. }
  543. var xmmnames = [...]string {
  544. XMM0 : "xmm0",
  545. XMM1 : "xmm1",
  546. XMM2 : "xmm2",
  547. XMM3 : "xmm3",
  548. XMM4 : "xmm4",
  549. XMM5 : "xmm5",
  550. XMM6 : "xmm6",
  551. XMM7 : "xmm7",
  552. XMM8 : "xmm8",
  553. XMM9 : "xmm9",
  554. XMM10 : "xmm10",
  555. XMM11 : "xmm11",
  556. XMM12 : "xmm12",
  557. XMM13 : "xmm13",
  558. XMM14 : "xmm14",
  559. XMM15 : "xmm15",
  560. XMM16 : "xmm16",
  561. XMM17 : "xmm17",
  562. XMM18 : "xmm18",
  563. XMM19 : "xmm19",
  564. XMM20 : "xmm20",
  565. XMM21 : "xmm21",
  566. XMM22 : "xmm22",
  567. XMM23 : "xmm23",
  568. XMM24 : "xmm24",
  569. XMM25 : "xmm25",
  570. XMM26 : "xmm26",
  571. XMM27 : "xmm27",
  572. XMM28 : "xmm28",
  573. XMM29 : "xmm29",
  574. XMM30 : "xmm30",
  575. XMM31 : "xmm31",
  576. }
  577. var ymmnames = [...]string {
  578. YMM0 : "ymm0",
  579. YMM1 : "ymm1",
  580. YMM2 : "ymm2",
  581. YMM3 : "ymm3",
  582. YMM4 : "ymm4",
  583. YMM5 : "ymm5",
  584. YMM6 : "ymm6",
  585. YMM7 : "ymm7",
  586. YMM8 : "ymm8",
  587. YMM9 : "ymm9",
  588. YMM10 : "ymm10",
  589. YMM11 : "ymm11",
  590. YMM12 : "ymm12",
  591. YMM13 : "ymm13",
  592. YMM14 : "ymm14",
  593. YMM15 : "ymm15",
  594. YMM16 : "ymm16",
  595. YMM17 : "ymm17",
  596. YMM18 : "ymm18",
  597. YMM19 : "ymm19",
  598. YMM20 : "ymm20",
  599. YMM21 : "ymm21",
  600. YMM22 : "ymm22",
  601. YMM23 : "ymm23",
  602. YMM24 : "ymm24",
  603. YMM25 : "ymm25",
  604. YMM26 : "ymm26",
  605. YMM27 : "ymm27",
  606. YMM28 : "ymm28",
  607. YMM29 : "ymm29",
  608. YMM30 : "ymm30",
  609. YMM31 : "ymm31",
  610. }
  611. var zmmnames = [...]string {
  612. ZMM0 : "zmm0",
  613. ZMM1 : "zmm1",
  614. ZMM2 : "zmm2",
  615. ZMM3 : "zmm3",
  616. ZMM4 : "zmm4",
  617. ZMM5 : "zmm5",
  618. ZMM6 : "zmm6",
  619. ZMM7 : "zmm7",
  620. ZMM8 : "zmm8",
  621. ZMM9 : "zmm9",
  622. ZMM10 : "zmm10",
  623. ZMM11 : "zmm11",
  624. ZMM12 : "zmm12",
  625. ZMM13 : "zmm13",
  626. ZMM14 : "zmm14",
  627. ZMM15 : "zmm15",
  628. ZMM16 : "zmm16",
  629. ZMM17 : "zmm17",
  630. ZMM18 : "zmm18",
  631. ZMM19 : "zmm19",
  632. ZMM20 : "zmm20",
  633. ZMM21 : "zmm21",
  634. ZMM22 : "zmm22",
  635. ZMM23 : "zmm23",
  636. ZMM24 : "zmm24",
  637. ZMM25 : "zmm25",
  638. ZMM26 : "zmm26",
  639. ZMM27 : "zmm27",
  640. ZMM28 : "zmm28",
  641. ZMM29 : "zmm29",
  642. ZMM30 : "zmm30",
  643. ZMM31 : "zmm31",
  644. }