/extra/cpu/ppc/assembler/assembler.factor

http://github.com/abeaumont/factor · Factor · 428 lines · 369 code · 38 blank · 21 comment · 2 complexity · 9052c2806ff70eed85420c4adcf22c2d MD5 · raw file

  1. ! Copyright (C) 2005, 2009 Slava Pestov.
  2. ! See http://factorcode.org/license.txt for BSD license.
  3. USING: kernel namespaces words math math.order locals
  4. cpu.ppc.assembler.backend ;
  5. IN: cpu.ppc.assembler
  6. ! See the Motorola or IBM documentation for details. The opcode
  7. ! names are standard, and the operand order is the same as in
  8. ! the docs, except a few differences, namely, in IBM/Motorola
  9. ! assembler syntax, loads and stores are written like:
  10. !
  11. ! stw r14,10(r15)
  12. !
  13. ! In Factor, we write:
  14. !
  15. ! 14 15 10 STW
  16. ! D-form
  17. D: ADDI 14
  18. D: ADDIC 12
  19. D: ADDIC. 13
  20. D: ADDIS 15
  21. D: CMPI 11
  22. D: CMPLI 10
  23. D: LBZ 34
  24. D: LBZU 35
  25. D: LFD 50
  26. D: LFDU 51
  27. D: LFS 48
  28. D: LFSU 49
  29. D: LHA 42
  30. D: LHAU 43
  31. D: LHZ 40
  32. D: LHZU 41
  33. D: LWZ 32
  34. D: LWZU 33
  35. D: MULI 7
  36. D: MULLI 7
  37. D: STB 38
  38. D: STBU 39
  39. D: STFD 54
  40. D: STFDU 55
  41. D: STFS 52
  42. D: STFSU 53
  43. D: STH 44
  44. D: STHU 45
  45. D: STW 36
  46. D: STWU 37
  47. ! SD-form
  48. SD: ANDI 28
  49. SD: ANDIS 29
  50. SD: ORI 24
  51. SD: ORIS 25
  52. SD: XORI 26
  53. SD: XORIS 27
  54. ! X-form
  55. X: AND 0 28 31
  56. X: AND. 1 28 31
  57. X: CMP 0 0 31
  58. X: CMPL 0 32 31
  59. X: EQV 0 284 31
  60. X: EQV. 1 284 31
  61. X: FCMPO 0 32 63
  62. X: FCMPU 0 0 63
  63. X: LBZUX 0 119 31
  64. X: LBZX 0 87 31
  65. X: LFDUX 0 631 31
  66. X: LFDX 0 599 31
  67. X: LFSUX 0 567 31
  68. X: LFSX 0 535 31
  69. X: LHAUX 0 375 31
  70. X: LHAX 0 343 31
  71. X: LHZUX 0 311 31
  72. X: LHZX 0 279 31
  73. X: LWZUX 0 55 31
  74. X: LWZX 0 23 31
  75. X: NAND 0 476 31
  76. X: NAND. 1 476 31
  77. X: NOR 0 124 31
  78. X: NOR. 1 124 31
  79. X: OR 0 444 31
  80. X: OR. 1 444 31
  81. X: ORC 0 412 31
  82. X: ORC. 1 412 31
  83. X: SLW 0 24 31
  84. X: SLW. 1 24 31
  85. X: SRAW 0 792 31
  86. X: SRAW. 1 792 31
  87. X: SRAWI 0 824 31
  88. X: SRW 0 536 31
  89. X: SRW. 1 536 31
  90. X: STBUX 0 247 31
  91. X: STBX 0 215 31
  92. X: STFDUX 0 759 31
  93. X: STFDX 0 727 31
  94. X: STFSUX 0 695 31
  95. X: STFSX 0 663 31
  96. X: STHUX 0 439 31
  97. X: STHX 0 407 31
  98. X: STWUX 0 183 31
  99. X: STWX 0 151 31
  100. X: XOR 0 316 31
  101. X: XOR. 1 316 31
  102. X1: EXTSB 0 954 31
  103. X1: EXTSB. 1 954 31
  104. : FRSP ( a s -- ) [ 0 ] 2dip 0 12 63 x-insn ;
  105. : FRSP. ( a s -- ) [ 0 ] 2dip 1 12 63 x-insn ;
  106. : FMR ( a s -- ) [ 0 ] 2dip 0 72 63 x-insn ;
  107. : FMR. ( a s -- ) [ 0 ] 2dip 1 72 63 x-insn ;
  108. : FCTIWZ ( a s -- ) [ 0 ] 2dip 0 15 63 x-insn ;
  109. : FCTIWZ. ( a s -- ) [ 0 ] 2dip 1 15 63 x-insn ;
  110. ! XO-form
  111. XO: ADD 0 0 266 31
  112. XO: ADD. 0 1 266 31
  113. XO: ADDC 0 0 10 31
  114. XO: ADDC. 0 1 10 31
  115. XO: ADDCO 1 0 10 31
  116. XO: ADDCO. 1 1 10 31
  117. XO: ADDE 0 0 138 31
  118. XO: ADDE. 0 1 138 31
  119. XO: ADDEO 1 0 138 31
  120. XO: ADDEO. 1 1 138 31
  121. XO: ADDO 1 0 266 31
  122. XO: ADDO. 1 1 266 31
  123. XO: DIVW 0 0 491 31
  124. XO: DIVW. 0 1 491 31
  125. XO: DIVWO 1 0 491 31
  126. XO: DIVWO. 1 1 491 31
  127. XO: DIVWU 0 0 459 31
  128. XO: DIVWU. 0 1 459 31
  129. XO: DIVWUO 1 0 459 31
  130. XO: DIVWUO. 1 1 459 31
  131. XO: MULHW 0 0 75 31
  132. XO: MULHW. 0 1 75 31
  133. XO: MULHWU 0 0 11 31
  134. XO: MULHWU. 0 1 11 31
  135. XO: MULLW 0 0 235 31
  136. XO: MULLW. 0 1 235 31
  137. XO: MULLWO 1 0 235 31
  138. XO: MULLWO. 1 1 235 31
  139. XO: SUBF 0 0 40 31
  140. XO: SUBF. 0 1 40 31
  141. XO: SUBFC 0 0 8 31
  142. XO: SUBFC. 0 1 8 31
  143. XO: SUBFCO 1 0 8 31
  144. XO: SUBFCO. 1 1 8 31
  145. XO: SUBFE 0 0 136 31
  146. XO: SUBFE. 0 1 136 31
  147. XO: SUBFEO 1 0 136 31
  148. XO: SUBFEO. 1 1 136 31
  149. XO: SUBFO 1 0 40 31
  150. XO: SUBFO. 1 1 40 31
  151. XO1: NEG 0 0 104 31
  152. XO1: NEG. 0 1 104 31
  153. XO1: NEGO 1 0 104 31
  154. XO1: NEGO. 1 1 104 31
  155. ! A-form
  156. : RLWINM ( d a b c xo -- ) 0 21 a-insn ;
  157. : RLWINM. ( d a b c xo -- ) 1 21 a-insn ;
  158. : FADD ( d a b -- ) 0 21 0 63 a-insn ;
  159. : FADD. ( d a b -- ) 0 21 1 63 a-insn ;
  160. : FSUB ( d a b -- ) 0 20 0 63 a-insn ;
  161. : FSUB. ( d a b -- ) 0 20 1 63 a-insn ;
  162. : FMUL ( d a c -- ) 0 swap 25 0 63 a-insn ;
  163. : FMUL. ( d a c -- ) 0 swap 25 1 63 a-insn ;
  164. : FDIV ( d a b -- ) 0 18 0 63 a-insn ;
  165. : FDIV. ( d a b -- ) 0 18 1 63 a-insn ;
  166. : FSQRT ( d b -- ) 0 swap 0 22 0 63 a-insn ;
  167. : FSQRT. ( d b -- ) 0 swap 0 22 1 63 a-insn ;
  168. ! Branches
  169. : B ( dest -- ) 0 0 (B) ;
  170. : BL ( dest -- ) 0 1 (B) ;
  171. BC: LT 12 0
  172. BC: GE 4 0
  173. BC: GT 12 1
  174. BC: LE 4 1
  175. BC: EQ 12 2
  176. BC: NE 4 2
  177. BC: O 12 3
  178. BC: NO 4 3
  179. B: CLR 0 8 0 0 19
  180. B: CLRL 0 8 0 1 19
  181. B: CCTR 0 264 0 0 19
  182. : BLR ( -- ) 20 BCLR ;
  183. : BLRL ( -- ) 20 BCLRL ;
  184. : BCTR ( -- ) 20 BCCTR ;
  185. ! Special registers
  186. MFSPR: XER 1
  187. MFSPR: LR 8
  188. MFSPR: CTR 9
  189. MTSPR: XER 1
  190. MTSPR: LR 8
  191. MTSPR: CTR 9
  192. ! Pseudo-instructions
  193. : LI ( value dst -- ) swap [ 0 ] dip ADDI ; inline
  194. : SUBI ( dst src1 src2 -- ) neg ADDI ; inline
  195. : LIS ( value dst -- ) swap [ 0 ] dip ADDIS ; inline
  196. : SUBIC ( dst src1 src2 -- ) neg ADDIC ; inline
  197. : SUBIC. ( dst src1 src2 -- ) neg ADDIC. ; inline
  198. : NOT ( dst src -- ) dup NOR ; inline
  199. : NOT. ( dst src -- ) dup NOR. ; inline
  200. : MR ( dst src -- ) dup OR ; inline
  201. : MR. ( dst src -- ) dup OR. ; inline
  202. : (SLWI) ( d a b -- d a b x y ) 0 31 pick - ; inline
  203. : SLWI ( d a b -- ) (SLWI) RLWINM ;
  204. : SLWI. ( d a b -- ) (SLWI) RLWINM. ;
  205. : (SRWI) ( d a b -- d a b x y ) 32 over - swap 31 ; inline
  206. : SRWI ( d a b -- ) (SRWI) RLWINM ;
  207. : SRWI. ( d a b -- ) (SRWI) RLWINM. ;
  208. :: LOAD32 ( n r -- )
  209. n -16 shift HEX: ffff bitand r LIS
  210. r r n HEX: ffff bitand ORI ;
  211. : immediate? ( n -- ? ) HEX: -8000 HEX: 7fff between? ;
  212. : LOAD ( n r -- ) over immediate? [ LI ] [ LOAD32 ] if ;
  213. ! Altivec/VMX instructions
  214. VA: VMHADDSHS 32 4
  215. VA: VMHRADDSHS 33 4
  216. VA: VMLADDUHM 34 4
  217. VA: VMSUMUBM 36 4
  218. VA: VMSUMMBM 37 4
  219. VA: VMSUMUHM 38 4
  220. VA: VMSUMUHS 39 4
  221. VA: VMSUMSHM 40 4
  222. VA: VMSUMSHS 41 4
  223. VA: VSEL 42 4
  224. VA: VPERM 43 4
  225. VA: VSLDOI 44 4
  226. VA: VMADDFP 46 4
  227. VA: VNMSUBFP 47 4
  228. VX: VADDUBM 0 4
  229. VX: VADDUHM 64 4
  230. VX: VADDUWM 128 4
  231. VX: VADDCUW 384 4
  232. VX: VADDUBS 512 4
  233. VX: VADDUHS 576 4
  234. VX: VADDUWS 640 4
  235. VX: VADDSBS 768 4
  236. VX: VADDSHS 832 4
  237. VX: VADDSWS 896 4
  238. VX: VSUBUBM 1024 4
  239. VX: VSUBUHM 1088 4
  240. VX: VSUBUWM 1152 4
  241. VX: VSUBCUW 1408 4
  242. VX: VSUBUBS 1536 4
  243. VX: VSUBUHS 1600 4
  244. VX: VSUBUWS 1664 4
  245. VX: VSUBSBS 1792 4
  246. VX: VSUBSHS 1856 4
  247. VX: VSUBSWS 1920 4
  248. VX: VMAXUB 2 4
  249. VX: VMAXUH 66 4
  250. VX: VMAXUW 130 4
  251. VX: VMAXSB 258 4
  252. VX: VMAXSH 322 4
  253. VX: VMAXSW 386 4
  254. VX: VMINUB 514 4
  255. VX: VMINUH 578 4
  256. VX: VMINUW 642 4
  257. VX: VMINSB 770 4
  258. VX: VMINSH 834 4
  259. VX: VMINSW 898 4
  260. VX: VAVGUB 1026 4
  261. VX: VAVGUH 1090 4
  262. VX: VAVGUW 1154 4
  263. VX: VAVGSB 1282 4
  264. VX: VAVGSH 1346 4
  265. VX: VAVGSW 1410 4
  266. VX: VRLB 4 4
  267. VX: VRLH 68 4
  268. VX: VRLW 132 4
  269. VX: VSLB 260 4
  270. VX: VSLH 324 4
  271. VX: VSLW 388 4
  272. VX: VSL 452 4
  273. VX: VSRB 516 4
  274. VX: VSRH 580 4
  275. VX: VSRW 644 4
  276. VX: VSR 708 4
  277. VX: VSRAB 772 4
  278. VX: VSRAH 836 4
  279. VX: VSRAW 900 4
  280. VX: VAND 1028 4
  281. VX: VANDC 1092 4
  282. VX: VOR 1156 4
  283. VX: VNOR 1284 4
  284. VX: VXOR 1220 4
  285. VXD: MFVSCR 1540 4
  286. VXB: MTVSCR 1604 4
  287. VX: VMULOUB 8 4
  288. VX: VMULOUH 72 4
  289. VX: VMULOSB 264 4
  290. VX: VMULOSH 328 4
  291. VX: VMULEUB 520 4
  292. VX: VMULEUH 584 4
  293. VX: VMULESB 776 4
  294. VX: VMULESH 840 4
  295. VX: VSUM4UBS 1544 4
  296. VX: VSUM4SBS 1800 4
  297. VX: VSUM4SHS 1608 4
  298. VX: VSUM2SWS 1672 4
  299. VX: VSUMSWS 1928 4
  300. VX: VADDFP 10 4
  301. VX: VSUBFP 74 4
  302. VXDB: VREFP 266 4
  303. VXDB: VRSQRTEFP 330 4
  304. VXDB: VEXPTEFP 394 4
  305. VXDB: VLOGEFP 458 4
  306. VXDB: VRFIN 522 4
  307. VXDB: VRFIZ 586 4
  308. VXDB: VRFIP 650 4
  309. VXDB: VRFIM 714 4
  310. VX: VCFUX 778 4
  311. VX: VCFSX 842 4
  312. VX: VCTUXS 906 4
  313. VX: VCTSXS 970 4
  314. VX: VMAXFP 1034 4
  315. VX: VMINFP 1098 4
  316. VX: VMRGHB 12 4
  317. VX: VMRGHH 76 4
  318. VX: VMRGHW 140 4
  319. VX: VMRGLB 268 4
  320. VX: VMRGLH 332 4
  321. VX: VMRGLW 396 4
  322. VX: VSPLTB 524 4
  323. VX: VSPLTH 588 4
  324. VX: VSPLTW 652 4
  325. VXA: VSPLTISB 780 4
  326. VXA: VSPLTISH 844 4
  327. VXA: VSPLTISW 908 4
  328. VX: VSLO 1036 4
  329. VX: VSRO 1100 4
  330. VX: VPKUHUM 14 4
  331. VX: VPKUWUM 78 4
  332. VX: VPKUHUS 142 4
  333. VX: VPKUWUS 206 4
  334. VX: VPKSHUS 270 4
  335. VX: VPKSWUS 334 4
  336. VX: VPKSHSS 398 4
  337. VX: VPKSWSS 462 4
  338. VX: VPKPX 782 4
  339. VXDB: VUPKHSB 526 4
  340. VXDB: VUPKHSH 590 4
  341. VXDB: VUPKLSB 654 4
  342. VXDB: VUPKLSH 718 4
  343. VXDB: VUPKHPX 846 4
  344. VXDB: VUPKLPX 974 4
  345. : -T ( strm a b -- strm-t a b ) [ 16 bitor ] 2dip ;
  346. XD: DST 0 342 31
  347. : DSTT ( strm a b -- ) -T DST ;
  348. XD: DSTST 0 374 31
  349. : DSTSTT ( strm a b -- ) -T DSTST ;
  350. XD: (DSS) 0 822 31
  351. : DSS ( strm -- ) 0 0 (DSS) ;
  352. : DSSALL ( -- ) 16 0 0 (DSS) ;
  353. XD: LVEBX 0 7 31
  354. XD: LVEHX 0 39 31
  355. XD: LVEWX 0 71 31
  356. XD: LVSL 0 6 31
  357. XD: LVSR 0 38 31
  358. XD: LVX 0 103 31
  359. XD: LVXL 0 359 31
  360. XD: STVEBX 0 135 31
  361. XD: STVEHX 0 167 31
  362. XD: STVEWX 0 199 31
  363. XD: STVX 0 231 31
  364. XD: STVXL 0 487 31
  365. VXR: VCMPBFP 0 966 4
  366. VXR: VCMPEQFP 0 198 4
  367. VXR: VCMPEQUB 0 6 4
  368. VXR: VCMPEQUH 0 70 4
  369. VXR: VCMPEQUW 0 134 4
  370. VXR: VCMPGEFP 0 454 4
  371. VXR: VCMPGTFP 0 710 4
  372. VXR: VCMPGTSB 0 774 4
  373. VXR: VCMPGTSH 0 838 4
  374. VXR: VCMPGTSW 0 902 4
  375. VXR: VCMPGTUB 0 518 4
  376. VXR: VCMPGTUH 0 582 4
  377. VXR: VCMPGTUW 0 646 4
  378. VXR: VCMPBFP. 1 966 4
  379. VXR: VCMPEQFP. 1 198 4
  380. VXR: VCMPEQUB. 1 6 4
  381. VXR: VCMPEQUH. 1 70 4
  382. VXR: VCMPEQUW. 1 134 4
  383. VXR: VCMPGEFP. 1 454 4
  384. VXR: VCMPGTFP. 1 710 4
  385. VXR: VCMPGTSB. 1 774 4
  386. VXR: VCMPGTSH. 1 838 4
  387. VXR: VCMPGTSW. 1 902 4
  388. VXR: VCMPGTUB. 1 518 4
  389. VXR: VCMPGTUH. 1 582 4
  390. VXR: VCMPGTUW. 1 646 4