PageRenderTime 52ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/rpython/jit/backend/ppc/codebuilder.py

https://bitbucket.org/pypy/pypy/
Python | 1294 lines | 1050 code | 206 blank | 38 comment | 28 complexity | 36e55a2236e77e331cc962b0654597e7 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. import os
  2. from rpython.jit.backend.ppc.ppc_form import PPCForm as Form
  3. from rpython.jit.backend.ppc.locations import RegisterLocation
  4. from rpython.jit.backend.ppc.ppc_field import ppc_fields
  5. from rpython.jit.backend.ppc.arch import (IS_PPC_32, WORD, IS_PPC_64,
  6. LR_BC_OFFSET, IS_BIG_ENDIAN, IS_LITTLE_ENDIAN)
  7. import rpython.jit.backend.ppc.register as r
  8. import rpython.jit.backend.ppc.condition as c
  9. from rpython.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin
  10. from rpython.jit.backend.llsupport.assembler import GuardToken
  11. from rpython.rtyper.lltypesystem import lltype, rffi
  12. from rpython.jit.metainterp.resoperation import rop
  13. from rpython.tool.udir import udir
  14. from rpython.rlib.objectmodel import we_are_translated
  15. from rpython.translator.tool.cbuild import ExternalCompilationInfo
  16. from rpython.jit.backend.ppc.rassemblermaker import make_rassembler
  17. # the following instructions can't accept "r0" as the second argument
  18. # (i.e. the base address): it is recognized as "0" instead, or is
  19. # even invalid (load-with-update, store-with-update).
  20. #
  21. # any load or store instruction
  22. # addi rD, r0, immed
  23. # subi rD, r0, immed
  24. # addis rD, r0, immed
  25. # subis rD, r0, immed
  26. A = Form("frD", "frA", "frB", "XO3", "Rc")
  27. A1 = Form("frD", "frB", "XO3", "Rc")
  28. A2 = Form("frD", "frA", "frC", "XO3", "Rc")
  29. A3 = Form("frD", "frA", "frC", "frB", "XO3", "Rc")
  30. I = Form("LI", "AA", "LK")
  31. B = Form("BO", "BI", "BD", "AA", "LK")
  32. SC = Form("AA") # fudge
  33. DD = Form("rD", "rA", "SIMM")
  34. DDO = Form("rD", "rA", "ds", "XO4")
  35. DS = Form("rA", "rS", "UIMM")
  36. X = Form("XO1")
  37. XS = Form("rA", "rS", "rB", "XO1", "Rc")
  38. XSO = Form("rS", "rA", "rB", "XO1")
  39. XD = Form("rD", "rA", "rB", "XO1")
  40. XO = Form("rD", "rA", "rB", "OE", "XO2", "Rc")
  41. XO0 = Form("rD", "rA", "OE", "XO2", "Rc")
  42. XDB = Form("frD", "frB", "XO1", "Rc")
  43. XS0 = Form("rA", "rS", "XO1", "Rc")
  44. X0 = Form("rA", "rB", "XO1")
  45. XcAB = Form("crfD", "rA", "rB", "XO1")
  46. XN = Form("rD", "rA", "NB", "XO1")
  47. XL = Form("crbD", "crbA", "crbB", "XO1")
  48. XL1 = Form("crfD", "crfS")
  49. XL2 = Form("crbD", "XO1", "Rc")
  50. XFL = Form("FM", "frB", "XO1", "Rc")
  51. XFX = Form("CRM", "rS", "XO1")
  52. XLL = Form("LL", "XO1")
  53. MI = Form("rA", "rS", "SH", "MB", "ME", "Rc")
  54. MB = Form("rA", "rS", "rB", "MB", "ME", "Rc")
  55. MDI = Form("rA", "rS", "sh", "mbe", "XO5", "Rc")
  56. MDS = Form("rA", "rS", "rB", "mbe", "XO7", "Rc")
  57. class BasicPPCAssembler(object):
  58. def disassemble(cls, inst, labels={}, pc=0):
  59. cache = cls.__dict__.get('idesc cache')
  60. if cache is None:
  61. idescs = cls.get_idescs()
  62. cache = {}
  63. for n, i in idescs:
  64. cache.setdefault(i.specializations[ppc_fields['opcode']],
  65. []).append((n,i))
  66. setattr(cls, 'idesc cache', cache)
  67. matches = []
  68. idescs = cache[ppc_fields['opcode'].decode(inst)]
  69. for name, idesc in idescs:
  70. m = idesc.match(inst)
  71. if m > 0:
  72. matches.append((m, idesc, name))
  73. if matches:
  74. score, idesc, name = max(matches)
  75. return idesc.disassemble(name, inst, labels, pc)
  76. disassemble = classmethod(disassemble)
  77. # "basic" means no simplified mnemonics
  78. # I form
  79. b = I(18, AA=0, LK=0)
  80. ba = I(18, AA=1, LK=0)
  81. bl = I(18, AA=0, LK=1)
  82. bla = I(18, AA=1, LK=1)
  83. # B form
  84. bc = B(16, AA=0, LK=0)
  85. bcl = B(16, AA=0, LK=1)
  86. bca = B(16, AA=1, LK=0)
  87. bcla = B(16, AA=1, LK=1)
  88. # SC form
  89. sc = SC(17, AA=1) # it's not really the aa field...
  90. # D form
  91. addi = DD(14)
  92. addic = DD(12)
  93. addicx = DD(13)
  94. addis = DD(15)
  95. andix = DS(28)
  96. andisx = DS(29)
  97. cmpi = Form("crfD", "L", "rA", "SIMM")(11)
  98. cmpi.default(L=0).default(crfD=0)
  99. cmpli = Form("crfD", "L", "rA", "UIMM")(10)
  100. cmpli.default(L=0).default(crfD=0)
  101. lbz = DD(34)
  102. lbzu = DD(35)
  103. ld = DDO(58, XO4=0)
  104. ldu = DDO(58, XO4=1)
  105. lfd = DD(50)
  106. lfdu = DD(51)
  107. lfs = DD(48)
  108. lfsu = DD(49)
  109. lha = DD(42)
  110. lhau = DD(43)
  111. lhz = DD(40)
  112. lhzu = DD(41)
  113. lmw = DD(46)
  114. lwa = DDO(58, XO4=2)
  115. lwz = DD(32)
  116. lwzu = DD(33)
  117. mulli = DD(7)
  118. ori = DS(24)
  119. oris = DS(25)
  120. stb = DD(38)
  121. stbu = DD(39)
  122. std = DDO(62, XO4=0)
  123. stdu = DDO(62, XO4=1)
  124. stfd = DD(54)
  125. stfdu = DD(55)
  126. stfs = DD(52)
  127. stfsu = DD(53)
  128. sth = DD(44)
  129. sthu = DD(45)
  130. stmw = DD(47)
  131. stw = DD(36)
  132. stwu = DD(37)
  133. subfic = DD(8)
  134. tdi = Form("TO", "rA", "SIMM")(2)
  135. twi = Form("TO", "rA", "SIMM")(3)
  136. xori = DS(26)
  137. xoris = DS(27)
  138. # X form
  139. and_ = XS(31, XO1=28, Rc=0)
  140. and_x = XS(31, XO1=28, Rc=1)
  141. andc_ = XS(31, XO1=60, Rc=0)
  142. andc_x = XS(31, XO1=60, Rc=1)
  143. # is the L bit for 64 bit compares? hmm
  144. cmp = Form("crfD", "L", "rA", "rB", "XO1")(31, XO1=0)
  145. cmp.default(L=0).default(crfD=0)
  146. cmpl = Form("crfD", "L", "rA", "rB", "XO1")(31, XO1=32)
  147. cmpl.default(L=0).default(crfD=0)
  148. cntlzd = XS0(31, XO1=58, Rc=0)
  149. cntlzdx = XS0(31, XO1=58, Rc=1)
  150. cntlzw = XS0(31, XO1=26, Rc=0)
  151. cntlzwx = XS0(31, XO1=26, Rc=1)
  152. dcba = X0(31, XO1=758)
  153. dcbf = X0(31, XO1=86)
  154. dcbi = X0(31, XO1=470)
  155. dcbst = X0(31, XO1=54)
  156. dcbt = X0(31, XO1=278)
  157. dcbtst = X0(31, XO1=246)
  158. dcbz = X0(31, XO1=1014)
  159. eciwx = XD(31, XO1=310)
  160. ecowx = XS(31, XO1=438, Rc=0)
  161. eieio = X(31, XO1=854)
  162. eqv = XS(31, XO1=284, Rc=0)
  163. eqvx = XS(31, XO1=284, Rc=1)
  164. extsb = XS0(31, XO1=954, Rc=0)
  165. extsbx = XS0(31, XO1=954, Rc=1)
  166. extsh = XS0(31, XO1=922, Rc=0)
  167. extshx = XS0(31, XO1=922, Rc=1)
  168. extsw = XS0(31, XO1=986, Rc=0)
  169. extswx = XS0(31, XO1=986, Rc=1)
  170. fabs = XDB(63, XO1=264, Rc=0)
  171. fabsx = XDB(63, XO1=264, Rc=1)
  172. fcmpo = XcAB(63, XO1=32)
  173. fcmpu = XcAB(63, XO1=0)
  174. fcfid = XDB(63, XO1=846, Rc=0)
  175. fcfidx = XDB(63, XO1=846, Rc=1)
  176. fctid = XDB(63, XO1=814, Rc=0)
  177. fctidx = XDB(63, XO1=814, Rc=1)
  178. fctidz = XDB(63, XO1=815, Rc=0)
  179. fctidzx = XDB(63, XO1=815, Rc=1)
  180. fctiw = XDB(63, XO1=14, Rc=0)
  181. fctiwx = XDB(63, XO1=14, Rc=1)
  182. fctiwz = XDB(63, XO1=15, Rc=0)
  183. fctiwzx = XDB(63, XO1=15, Rc=1)
  184. fmr = XDB(63, XO1=72, Rc=0)
  185. fmrx = XDB(63, XO1=72, Rc=1)
  186. fnabs = XDB(63, XO1=136, Rc=0)
  187. fnabsx = XDB(63, XO1=136, Rc=1)
  188. fneg = XDB(63, XO1=40, Rc=0)
  189. fnegx = XDB(63, XO1=40, Rc=1)
  190. frsp = XDB(63, XO1=12, Rc=0)
  191. frspx = XDB(63, XO1=12, Rc=1)
  192. fsqrt = XDB(63, XO1=22, Rc=0)
  193. mffgpr = XS(31, XO1=607, Rc=0)
  194. mftgpr = XS(31, XO1=735, Rc=0)
  195. icbi = X0(31, XO1=982)
  196. lbzux = XD(31, XO1=119)
  197. lbzx = XD(31, XO1=87)
  198. ldarx = XD(31, XO1=84)
  199. ldux = XD(31, XO1=53)
  200. ldx = XD(31, XO1=21)
  201. lfdux = XD(31, XO1=631)
  202. lfdx = XD(31, XO1=599)
  203. lfsux = XD(31, XO1=567)
  204. lfsx = XD(31, XO1=535)
  205. lhaux = XD(31, XO1=375)
  206. lhax = XD(31, XO1=343)
  207. lhbrx = XD(31, XO1=790)
  208. lhzux = XD(31, XO1=311)
  209. lhzx = XD(31, XO1=279)
  210. lswi = XD(31, XO1=597)
  211. lswx = XD(31, XO1=533)
  212. lwarx = XD(31, XO1=20)
  213. lwaux = XD(31, XO1=373)
  214. lwax = XD(31, XO1=341)
  215. lwbrx = XD(31, XO1=534)
  216. lwzux = XD(31, XO1=55)
  217. lwzx = XD(31, XO1=23)
  218. mcrfs = Form("crfD", "crfS", "XO1")(63, XO1=64)
  219. mcrxr = Form("crfD", "XO1")(31, XO1=512)
  220. mfcr = Form("rD", "XO1")(31, XO1=19)
  221. mffs = Form("frD", "XO1", "Rc")(63, XO1=583, Rc=0)
  222. mffsx = Form("frD", "XO1", "Rc")(63, XO1=583, Rc=1)
  223. mfmsr = Form("rD", "XO1")(31, XO1=83)
  224. mfsr = Form("rD", "SR", "XO1")(31, XO1=595)
  225. mfsrin = XDB(31, XO1=659, Rc=0)
  226. add = XO(31, XO2=266, OE=0, Rc=0)
  227. addx = XO(31, XO2=266, OE=0, Rc=1)
  228. addo = XO(31, XO2=266, OE=1, Rc=0)
  229. addox = XO(31, XO2=266, OE=1, Rc=1)
  230. addc = XO(31, XO2=10, OE=0, Rc=0)
  231. addcx = XO(31, XO2=10, OE=0, Rc=1)
  232. addco = XO(31, XO2=10, OE=1, Rc=0)
  233. addcox = XO(31, XO2=10, OE=1, Rc=1)
  234. adde = XO(31, XO2=138, OE=0, Rc=0)
  235. addex = XO(31, XO2=138, OE=0, Rc=1)
  236. addeo = XO(31, XO2=138, OE=1, Rc=0)
  237. addeox = XO(31, XO2=138, OE=1, Rc=1)
  238. addme = XO(31, rB=0, XO2=234, OE=0, Rc=0)
  239. addmex = XO(31, rB=0, XO2=234, OE=0, Rc=1)
  240. addmeo = XO(31, rB=0, XO2=234, OE=1, Rc=0)
  241. addmeox = XO(31, rB=0, XO2=234, OE=1, Rc=1)
  242. addze = XO(31, rB=0, XO2=202, OE=0, Rc=0)
  243. addzex = XO(31, rB=0, XO2=202, OE=0, Rc=1)
  244. addzeo = XO(31, rB=0, XO2=202, OE=1, Rc=0)
  245. addzeox = XO(31, rB=0, XO2=202, OE=1, Rc=1)
  246. bcctr = Form("BO", "BI", "XO1", "LK")(19, XO1=528, LK=0)
  247. bcctrl = Form("BO", "BI", "XO1", "LK")(19, XO1=528, LK=1)
  248. bclr = Form("BO", "BI", "XO1", "LK")(19, XO1=16, LK=0)
  249. bclrl = Form("BO", "BI", "XO1", "LK")(19, XO1=16, LK=1)
  250. crand = XL(19, XO1=257)
  251. crandc = XL(19, XO1=129)
  252. creqv = XL(19, XO1=289)
  253. crnand = XL(19, XO1=225)
  254. crnor = XL(19, XO1=33)
  255. cror = XL(19, XO1=449)
  256. crorc = XL(19, XO1=417)
  257. crxor = XL(19, XO1=193)
  258. divd = XO(31, XO2=489, OE=0, Rc=0)
  259. divdx = XO(31, XO2=489, OE=0, Rc=1)
  260. divdo = XO(31, XO2=489, OE=1, Rc=0)
  261. divdox = XO(31, XO2=489, OE=1, Rc=1)
  262. divdu = XO(31, XO2=457, OE=0, Rc=0)
  263. divdux = XO(31, XO2=457, OE=0, Rc=1)
  264. divduo = XO(31, XO2=457, OE=1, Rc=0)
  265. divduox = XO(31, XO2=457, OE=1, Rc=1)
  266. divw = XO(31, XO2=491, OE=0, Rc=0)
  267. divwx = XO(31, XO2=491, OE=0, Rc=1)
  268. divwo = XO(31, XO2=491, OE=1, Rc=0)
  269. divwox = XO(31, XO2=491, OE=1, Rc=1)
  270. divwu = XO(31, XO2=459, OE=0, Rc=0)
  271. divwux = XO(31, XO2=459, OE=0, Rc=1)
  272. divwuo = XO(31, XO2=459, OE=1, Rc=0)
  273. divwuox = XO(31, XO2=459, OE=1, Rc=1)
  274. fadd = A(63, XO3=21, Rc=0)
  275. faddx = A(63, XO3=21, Rc=1)
  276. fadds = A(59, XO3=21, Rc=0)
  277. faddsx = A(59, XO3=21, Rc=1)
  278. fdiv = A(63, XO3=18, Rc=0)
  279. fdivx = A(63, XO3=18, Rc=1)
  280. fdivs = A(59, XO3=18, Rc=0)
  281. fdivsx = A(59, XO3=18, Rc=1)
  282. fmadd = A3(63, XO3=19, Rc=0)
  283. fmaddx = A3(63, XO3=19, Rc=1)
  284. fmadds = A3(59, XO3=19, Rc=0)
  285. fmaddsx = A3(59, XO3=19, Rc=1)
  286. fmsub = A3(63, XO3=28, Rc=0)
  287. fmsubx = A3(63, XO3=28, Rc=1)
  288. fmsubs = A3(59, XO3=28, Rc=0)
  289. fmsubsx = A3(59, XO3=28, Rc=1)
  290. fmul = A2(63, XO3=25, Rc=0)
  291. fmulx = A2(63, XO3=25, Rc=1)
  292. fmuls = A2(59, XO3=25, Rc=0)
  293. fmulsx = A2(59, XO3=25, Rc=1)
  294. fnmadd = A3(63, XO3=31, Rc=0)
  295. fnmaddx = A3(63, XO3=31, Rc=1)
  296. fnmadds = A3(59, XO3=31, Rc=0)
  297. fnmaddsx = A3(59, XO3=31, Rc=1)
  298. fnmsub = A3(63, XO3=30, Rc=0)
  299. fnmsubx = A3(63, XO3=30, Rc=1)
  300. fnmsubs = A3(59, XO3=30, Rc=0)
  301. fnmsubsx = A3(59, XO3=30, Rc=1)
  302. fres = A1(59, XO3=24, Rc=0)
  303. fresx = A1(59, XO3=24, Rc=1)
  304. frsp = A1(63, XO3=12, Rc=0)
  305. frspx = A1(63, XO3=12, Rc=1)
  306. frsqrte = A1(63, XO3=26, Rc=0)
  307. frsqrtex = A1(63, XO3=26, Rc=1)
  308. fsel = A3(63, XO3=23, Rc=0)
  309. fselx = A3(63, XO3=23, Rc=1)
  310. frsqrt = A1(63, XO3=22, Rc=0)
  311. frsqrtx = A1(63, XO3=22, Rc=1)
  312. frsqrts = A1(59, XO3=22, Rc=0)
  313. frsqrtsx = A1(59, XO3=22, Rc=1)
  314. fsub = A(63, XO3=20, Rc=0)
  315. fsubx = A(63, XO3=20, Rc=1)
  316. fsubs = A(59, XO3=20, Rc=0)
  317. fsubsx = A(59, XO3=20, Rc=1)
  318. isync = X(19, XO1=150)
  319. mcrf = XL1(19)
  320. mfspr = Form("rD", "spr", "XO1")(31, XO1=339)
  321. mftb = Form("rD", "spr", "XO1")(31, XO1=371)
  322. mtcrf = XFX(31, XO1=144)
  323. mtfsb0 = XL2(63, XO1=70, Rc=0)
  324. mtfsb0x = XL2(63, XO1=70, Rc=1)
  325. mtfsb1 = XL2(63, XO1=38, Rc=0)
  326. mtfsb1x = XL2(63, XO1=38, Rc=1)
  327. mtfsf = XFL(63, XO1=711, Rc=0)
  328. mtfsfx = XFL(63, XO1=711, Rc=1)
  329. mtfsfi = Form("crfD", "IMM", "XO1", "Rc")(63, XO1=134, Rc=0)
  330. mtfsfix = Form("crfD", "IMM", "XO1", "Rc")(63, XO1=134, Rc=1)
  331. mtmsr = Form("rS", "XO1")(31, XO1=146)
  332. mtspr = Form("rS", "spr", "XO1")(31, XO1=467)
  333. mtsr = Form("rS", "SR", "XO1")(31, XO1=210)
  334. mtsrin = Form("rS", "rB", "XO1")(31, XO1=242)
  335. mulhd = XO(31, OE=0, XO2=73, Rc=0)
  336. mulhdx = XO(31, OE=0, XO2=73, Rc=1)
  337. mulhdu = XO(31, OE=0, XO2=9, Rc=0)
  338. mulhdux = XO(31, OE=0, XO2=9, Rc=1)
  339. mulld = XO(31, OE=0, XO2=233, Rc=0)
  340. mulldx = XO(31, OE=0, XO2=233, Rc=1)
  341. mulldo = XO(31, OE=1, XO2=233, Rc=0)
  342. mulldox = XO(31, OE=1, XO2=233, Rc=1)
  343. mulhw = XO(31, OE=0, XO2=75, Rc=0)
  344. mulhwx = XO(31, OE=0, XO2=75, Rc=1)
  345. mulhwu = XO(31, OE=0, XO2=11, Rc=0)
  346. mulhwux = XO(31, OE=0, XO2=11, Rc=1)
  347. mullw = XO(31, OE=0, XO2=235, Rc=0)
  348. mullwx = XO(31, OE=0, XO2=235, Rc=1)
  349. mullwo = XO(31, OE=1, XO2=235, Rc=0)
  350. mullwox = XO(31, OE=1, XO2=235, Rc=1)
  351. nand = XS(31, XO1=476, Rc=0)
  352. nandx = XS(31, XO1=476, Rc=1)
  353. neg = XO0(31, OE=0, XO2=104, Rc=0)
  354. negx = XO0(31, OE=0, XO2=104, Rc=1)
  355. nego = XO0(31, OE=1, XO2=104, Rc=0)
  356. negox = XO0(31, OE=1, XO2=104, Rc=1)
  357. nor = XS(31, XO1=124, Rc=0)
  358. norx = XS(31, XO1=124, Rc=1)
  359. or_ = XS(31, XO1=444, Rc=0)
  360. or_x = XS(31, XO1=444, Rc=1)
  361. orc = XS(31, XO1=412, Rc=0)
  362. orcx = XS(31, XO1=412, Rc=1)
  363. rfi = X(19, XO1=50)
  364. rfid = X(19, XO1=18)
  365. rldcl = MDS(30, XO7=8, Rc=0)
  366. rldclx = MDS(30, XO7=8, Rc=1)
  367. rldcr = MDS(30, XO7=9, Rc=0)
  368. rldcrx = MDS(30, XO7=9, Rc=1)
  369. rldic = MDI(30, XO5=2, Rc=0)
  370. rldicx = MDI(30, XO5=2, Rc=1)
  371. rldicl = MDI(30, XO5=0, Rc=0)
  372. rldiclx = MDI(30, XO5=0, Rc=1)
  373. rldicr = MDI(30, XO5=1, Rc=0)
  374. rldicrx = MDI(30, XO5=1, Rc=1)
  375. rldimi = MDI(30, XO5=3, Rc=0)
  376. rldimix = MDI(30, XO5=3, Rc=1)
  377. rlwimi = MI(20, Rc=0)
  378. rlwimix = MI(20, Rc=1)
  379. rlwinm = MI(21, Rc=0)
  380. rlwinmx = MI(21, Rc=1)
  381. rlwnm = MB(23, Rc=0)
  382. rlwnmx = MB(23, Rc=1)
  383. sld = XS(31, XO1=27, Rc=0)
  384. sldx = XS(31, XO1=27, Rc=1)
  385. slw = XS(31, XO1=24, Rc=0)
  386. slwx = XS(31, XO1=24, Rc=1)
  387. srad = XS(31, XO1=794, Rc=0)
  388. sradx = XS(31, XO1=794, Rc=1)
  389. sradi = Form("rA", "rS", "SH", "XO6", "sh", "Rc")(31, XO6=413, Rc=0)
  390. sradix = Form("rA", "rS", "SH", "XO6", "sh", "Rc")(31, XO6=413, Rc=1)
  391. sraw = XS(31, XO1=792, Rc=0)
  392. srawx = XS(31, XO1=792, Rc=1)
  393. srawi = Form("rA", "rS", "SH", "XO1", "Rc")(31, XO1=824, Rc=0)
  394. srawix = Form("rA", "rS", "SH", "XO1", "Rc")(31, XO1=824, Rc=1)
  395. srd = XS(31, XO1=539, Rc=0)
  396. srdx = XS(31, XO1=539, Rc=1)
  397. srw = XS(31, XO1=536, Rc=0)
  398. srwx = XS(31, XO1=536, Rc=1)
  399. stbux = XSO(31, XO1=247)
  400. stbx = XSO(31, XO1=215)
  401. stdcxx = Form("rS", "rA", "rB", "XO1", "Rc")(31, XO1=214, Rc=1)
  402. stdux = XSO(31, XO1=181)
  403. stdx = XSO(31, XO1=149)
  404. stfdux = XSO(31, XO1=759)
  405. stfdx = XSO(31, XO1=727)
  406. stfiwx = XSO(31, XO1=983)
  407. stfsux = XSO(31, XO1=695)
  408. stfsx = XSO(31, XO1=663)
  409. sthbrx = XSO(31, XO1=918)
  410. sthux = XSO(31, XO1=439)
  411. sthx = XSO(31, XO1=407)
  412. stswi = Form("rS", "rA", "NB", "XO1")(31, XO1=725)
  413. stswx = XSO(31, XO1=661)
  414. stwbrx = XSO(31, XO1=662)
  415. stwcxx = Form("rS", "rA", "rB", "XO1", "Rc")(31, XO1=150, Rc=1)
  416. stwux = XSO(31, XO1=183)
  417. stwx = XSO(31, XO1=151)
  418. subf = XO(31, XO2=40, OE=0, Rc=0)
  419. subfx = XO(31, XO2=40, OE=0, Rc=1)
  420. subfo = XO(31, XO2=40, OE=1, Rc=0)
  421. subfox = XO(31, XO2=40, OE=1, Rc=1)
  422. subfc = XO(31, XO2=8, OE=0, Rc=0)
  423. subfcx = XO(31, XO2=8, OE=0, Rc=1)
  424. subfco = XO(31, XO2=8, OE=1, Rc=0)
  425. subfcox = XO(31, XO2=8, OE=1, Rc=1)
  426. subfe = XO(31, XO2=136, OE=0, Rc=0)
  427. subfex = XO(31, XO2=136, OE=0, Rc=1)
  428. subfeo = XO(31, XO2=136, OE=1, Rc=0)
  429. subfeox = XO(31, XO2=136, OE=1, Rc=1)
  430. subfme = XO0(31, OE=0, XO2=232, Rc=0)
  431. subfmex = XO0(31, OE=0, XO2=232, Rc=1)
  432. subfmeo = XO0(31, OE=1, XO2=232, Rc=0)
  433. subfmeox= XO0(31, OE=1, XO2=232, Rc=1)
  434. subfze = XO0(31, OE=0, XO2=200, Rc=0)
  435. subfzex = XO0(31, OE=0, XO2=200, Rc=1)
  436. subfzeo = XO0(31, OE=1, XO2=200, Rc=0)
  437. subfzeox= XO0(31, OE=1, XO2=200, Rc=1)
  438. sync = XLL(31, LL=0, XO1=598)
  439. lwsync = XLL(31, LL=1, XO1=598)
  440. tlbia = X(31, XO1=370)
  441. tlbie = Form("rB", "XO1")(31, XO1=306)
  442. tlbsync = X(31, XO1=566)
  443. td = Form("TO", "rA", "rB", "XO1")(31, XO1=68)
  444. tw = Form("TO", "rA", "rB", "XO1")(31, XO1=4)
  445. xor = XS(31, XO1=316, Rc=0)
  446. xorx = XS(31, XO1=316, Rc=1)
  447. class PPCAssembler(BasicPPCAssembler):
  448. BA = BasicPPCAssembler
  449. # awkward mnemonics:
  450. # mftb
  451. # most of the branch mnemonics...
  452. # F.2 Simplified Mnemonics for Subtract Instructions
  453. def subi(self, rD, rA, value):
  454. self.addi(rD, rA, -value)
  455. def subis(self, rD, rA, value):
  456. self.addis(rD, rA, -value)
  457. def subic(self, rD, rA, value):
  458. self.addic(rD, rA, -value)
  459. def subicx(self, rD, rA, value):
  460. self.addicx(rD, rA, -value)
  461. def sub(self, rD, rA, rB):
  462. self.subf(rD, rB, rA)
  463. def subc(self, rD, rA, rB):
  464. self.subfc(rD, rB, rA)
  465. def subx(self, rD, rA, rB):
  466. self.subfx(rD, rB, rA)
  467. def subcx(self, rD, rA, rB):
  468. self.subfcx(rD, rB, rA)
  469. def subo(self, rD, rA, rB):
  470. self.subfo(rD, rB, rA)
  471. def subco(self, rD, rA, rB):
  472. self.subfco(rD, rB, rA)
  473. def subox(self, rD, rA, rB):
  474. self.subfox(rD, rB, rA)
  475. def subcox(self, rD, rA, rB):
  476. self.subfcox(rD, rB, rA)
  477. # F.3 Simplified Mnemonics for Compare Instructions
  478. cmpdi = BA.cmpi(L=1)
  479. cmpwi = BA.cmpi(L=0)
  480. cmpldi = BA.cmpli(L=1)
  481. cmplwi = BA.cmpli(L=0)
  482. cmpd = BA.cmp(L=1)
  483. cmpw = BA.cmp(L=0)
  484. cmpld = BA.cmpl(L=1)
  485. cmplw = BA.cmpl(L=0)
  486. # F.4 Simplified Mnemonics for Rotate and Shift Instructions
  487. def extlwi(self, rA, rS, n, b):
  488. self.rlwinm(rA, rS, b, 0, n-1)
  489. def extrwi(self, rA, rS, n, b):
  490. self.rlwinm(rA, rS, b+n, 32-n, 31)
  491. def inslwi(self, rA, rS, n, b):
  492. self.rwlimi(rA, rS, 32-b, b, b + n -1)
  493. def insrwi(self, rA, rS, n, b):
  494. self.rwlimi(rA, rS, 32-(b+n), b, b + n -1)
  495. def rotlwi(self, rA, rS, n):
  496. self.rlwinm(rA, rS, n, 0, 31)
  497. def rotrwi(self, rA, rS, n):
  498. self.rlwinm(rA, rS, 32-n, 0, 31)
  499. def rotlw(self, rA, rS, rB):
  500. self.rlwnm(rA, rS, rB, 0, 31)
  501. def slwi(self, rA, rS, n):
  502. self.rlwinm(rA, rS, n, 0, 31-n)
  503. def srwi(self, rA, rS, n):
  504. self.rlwinm(rA, rS, 32-n, n, 31)
  505. def sldi(self, rA, rS, n):
  506. self.rldicr(rA, rS, n, 63-n)
  507. def srdi(self, rA, rS, n):
  508. self.rldicl(rA, rS, 64-n, n)
  509. # F.5 Simplified Mnemonics for Branch Instructions
  510. # there's a lot of these!
  511. bt = BA.bc(BO=12)
  512. bf = BA.bc(BO=4)
  513. bdnz = BA.bc(BO=16, BI=0)
  514. bdnzt = BA.bc(BO=8)
  515. bdnzf = BA.bc(BO=0)
  516. bdz = BA.bc(BO=18, BI=0)
  517. bdzt = BA.bc(BO=10)
  518. bdzf = BA.bc(BO=2)
  519. bta = BA.bca(BO=12)
  520. bfa = BA.bca(BO=4)
  521. bdnza = BA.bca(BO=16, BI=0)
  522. bdnzta = BA.bca(BO=8)
  523. bdnzfa = BA.bca(BO=0)
  524. bdza = BA.bca(BO=18, BI=0)
  525. bdzta = BA.bca(BO=10)
  526. bdzfa = BA.bca(BO=2)
  527. btl = BA.bcl(BO=12)
  528. bfl = BA.bcl(BO=4)
  529. bdnzl = BA.bcl(BO=16, BI=0)
  530. bdnztl = BA.bcl(BO=8)
  531. bdnzfl = BA.bcl(BO=0)
  532. bdzl = BA.bcl(BO=18, BI=0)
  533. bdztl = BA.bcl(BO=10)
  534. bdzfl = BA.bcl(BO=2)
  535. btla = BA.bcla(BO=12)
  536. bfla = BA.bcla(BO=4)
  537. bdnzla = BA.bcla(BO=16, BI=0)
  538. bdnztla = BA.bcla(BO=8)
  539. bdnzfla = BA.bcla(BO=0)
  540. bdzla = BA.bcla(BO=18, BI=0)
  541. bdztla = BA.bcla(BO=10)
  542. bdzfla = BA.bcla(BO=2)
  543. blr = BA.bclr(BO=20, BI=0)
  544. btlr = BA.bclr(BO=12)
  545. bflr = BA.bclr(BO=4)
  546. bdnzlr = BA.bclr(BO=16, BI=0)
  547. bdnztlr = BA.bclr(BO=8)
  548. bdnzflr = BA.bclr(BO=0)
  549. bdzlr = BA.bclr(BO=18, BI=0)
  550. bdztlr = BA.bclr(BO=10)
  551. bdzflr = BA.bclr(BO=2)
  552. bctr = BA.bcctr(BO=20, BI=0)
  553. btctr = BA.bcctr(BO=12)
  554. bfctr = BA.bcctr(BO=4)
  555. blrl = BA.bclrl(BO=20, BI=0)
  556. btlrl = BA.bclrl(BO=12)
  557. bflrl = BA.bclrl(BO=4)
  558. bdnzlrl = BA.bclrl(BO=16, BI=0)
  559. bdnztlrl = BA.bclrl(BO=8)
  560. bdnzflrl = BA.bclrl(BO=0)
  561. bdzlrl = BA.bclrl(BO=18, BI=0)
  562. bdztlrl = BA.bclrl(BO=10)
  563. bdzflrl = BA.bclrl(BO=2)
  564. bctrl = BA.bcctrl(BO=20, BI=0)
  565. btctrl = BA.bcctrl(BO=12)
  566. bfctrl = BA.bcctrl(BO=4)
  567. # these should/could take a[n optional] crf argument, but it's a
  568. # bit hard to see how to arrange that.
  569. blt = BA.bc(BO=12, BI=0)
  570. ble = BA.bc(BO=4, BI=1)
  571. beq = BA.bc(BO=12, BI=2)
  572. bge = BA.bc(BO=4, BI=0)
  573. bgt = BA.bc(BO=12, BI=1)
  574. bnl = BA.bc(BO=4, BI=0)
  575. bne = BA.bc(BO=4, BI=2)
  576. bng = BA.bc(BO=4, BI=1)
  577. bso = BA.bc(BO=12, BI=3)
  578. bns = BA.bc(BO=4, BI=3)
  579. bun = BA.bc(BO=12, BI=3)
  580. bnu = BA.bc(BO=4, BI=3)
  581. blta = BA.bca(BO=12, BI=0)
  582. blea = BA.bca(BO=4, BI=1)
  583. beqa = BA.bca(BO=12, BI=2)
  584. bgea = BA.bca(BO=4, BI=0)
  585. bgta = BA.bca(BO=12, BI=1)
  586. bnla = BA.bca(BO=4, BI=0)
  587. bnea = BA.bca(BO=4, BI=2)
  588. bnga = BA.bca(BO=4, BI=1)
  589. bsoa = BA.bca(BO=12, BI=3)
  590. bnsa = BA.bca(BO=4, BI=3)
  591. buna = BA.bca(BO=12, BI=3)
  592. bnua = BA.bca(BO=4, BI=3)
  593. bltl = BA.bcl(BO=12, BI=0)
  594. blel = BA.bcl(BO=4, BI=1)
  595. beql = BA.bcl(BO=12, BI=2)
  596. bgel = BA.bcl(BO=4, BI=0)
  597. bgtl = BA.bcl(BO=12, BI=1)
  598. bnll = BA.bcl(BO=4, BI=0)
  599. bnel = BA.bcl(BO=4, BI=2)
  600. bngl = BA.bcl(BO=4, BI=1)
  601. bsol = BA.bcl(BO=12, BI=3)
  602. bnsl = BA.bcl(BO=4, BI=3)
  603. bunl = BA.bcl(BO=12, BI=3)
  604. bnul = BA.bcl(BO=4, BI=3)
  605. bltla = BA.bcla(BO=12, BI=0)
  606. blela = BA.bcla(BO=4, BI=1)
  607. beqla = BA.bcla(BO=12, BI=2)
  608. bgela = BA.bcla(BO=4, BI=0)
  609. bgtla = BA.bcla(BO=12, BI=1)
  610. bnlla = BA.bcla(BO=4, BI=0)
  611. bnela = BA.bcla(BO=4, BI=2)
  612. bngla = BA.bcla(BO=4, BI=1)
  613. bsola = BA.bcla(BO=12, BI=3)
  614. bnsla = BA.bcla(BO=4, BI=3)
  615. bunla = BA.bcla(BO=12, BI=3)
  616. bnula = BA.bcla(BO=4, BI=3)
  617. bltlr = BA.bclr(BO=12, BI=0)
  618. blelr = BA.bclr(BO=4, BI=1)
  619. beqlr = BA.bclr(BO=12, BI=2)
  620. bgelr = BA.bclr(BO=4, BI=0)
  621. bgtlr = BA.bclr(BO=12, BI=1)
  622. bnllr = BA.bclr(BO=4, BI=0)
  623. bnelr = BA.bclr(BO=4, BI=2)
  624. bnglr = BA.bclr(BO=4, BI=1)
  625. bsolr = BA.bclr(BO=12, BI=3)
  626. bnslr = BA.bclr(BO=4, BI=3)
  627. bunlr = BA.bclr(BO=12, BI=3)
  628. bnulr = BA.bclr(BO=4, BI=3)
  629. bltctr = BA.bcctr(BO=12, BI=0)
  630. blectr = BA.bcctr(BO=4, BI=1)
  631. beqctr = BA.bcctr(BO=12, BI=2)
  632. bgectr = BA.bcctr(BO=4, BI=0)
  633. bgtctr = BA.bcctr(BO=12, BI=1)
  634. bnlctr = BA.bcctr(BO=4, BI=0)
  635. bnectr = BA.bcctr(BO=4, BI=2)
  636. bngctr = BA.bcctr(BO=4, BI=1)
  637. bsoctr = BA.bcctr(BO=12, BI=3)
  638. bnsctr = BA.bcctr(BO=4, BI=3)
  639. bunctr = BA.bcctr(BO=12, BI=3)
  640. bnuctr = BA.bcctr(BO=4, BI=3)
  641. bltlrl = BA.bclrl(BO=12, BI=0)
  642. blelrl = BA.bclrl(BO=4, BI=1)
  643. beqlrl = BA.bclrl(BO=12, BI=2)
  644. bgelrl = BA.bclrl(BO=4, BI=0)
  645. bgtlrl = BA.bclrl(BO=12, BI=1)
  646. bnllrl = BA.bclrl(BO=4, BI=0)
  647. bnelrl = BA.bclrl(BO=4, BI=2)
  648. bnglrl = BA.bclrl(BO=4, BI=1)
  649. bsolrl = BA.bclrl(BO=12, BI=3)
  650. bnslrl = BA.bclrl(BO=4, BI=3)
  651. bunlrl = BA.bclrl(BO=12, BI=3)
  652. bnulrl = BA.bclrl(BO=4, BI=3)
  653. bltctrl = BA.bcctrl(BO=12, BI=0)
  654. blectrl = BA.bcctrl(BO=4, BI=1)
  655. beqctrl = BA.bcctrl(BO=12, BI=2)
  656. bgectrl = BA.bcctrl(BO=4, BI=0)
  657. bgtctrl = BA.bcctrl(BO=12, BI=1)
  658. bnlctrl = BA.bcctrl(BO=4, BI=0)
  659. bnectrl = BA.bcctrl(BO=4, BI=2)
  660. bngctrl = BA.bcctrl(BO=4, BI=1)
  661. bsoctrl = BA.bcctrl(BO=12, BI=3)
  662. bnsctrl = BA.bcctrl(BO=4, BI=3)
  663. bunctrl = BA.bcctrl(BO=12, BI=3)
  664. bnuctrl = BA.bcctrl(BO=4, BI=3)
  665. # whew! and we haven't even begun the predicted versions...
  666. # F.6 Simplified Mnemonics for Condition Register
  667. # Logical Instructions
  668. crset = BA.creqv(crbA="crbD", crbB="crbD")
  669. crclr = BA.crxor(crbA="crbD", crbB="crbD")
  670. crmove = BA.cror(crbA="crbB")
  671. crnot = BA.crnor(crbA="crbB")
  672. # F.7 Simplified Mnemonics for Trap Instructions
  673. trap = BA.tw(TO=31, rA=0, rB=0)
  674. twlt = BA.tw(TO=16)
  675. twle = BA.tw(TO=20)
  676. tweq = BA.tw(TO=4)
  677. twge = BA.tw(TO=12)
  678. twgt = BA.tw(TO=8)
  679. twnl = BA.tw(TO=12)
  680. twng = BA.tw(TO=24)
  681. twllt = BA.tw(TO=2)
  682. twlle = BA.tw(TO=6)
  683. twlge = BA.tw(TO=5)
  684. twlgt = BA.tw(TO=1)
  685. twlnl = BA.tw(TO=5)
  686. twlng = BA.tw(TO=6)
  687. twlti = BA.twi(TO=16)
  688. twlei = BA.twi(TO=20)
  689. tweqi = BA.twi(TO=4)
  690. twgei = BA.twi(TO=12)
  691. twgti = BA.twi(TO=8)
  692. twnli = BA.twi(TO=12)
  693. twnei = BA.twi(TO=24)
  694. twngi = BA.twi(TO=20)
  695. twllti = BA.twi(TO=2)
  696. twllei = BA.twi(TO=6)
  697. twlgei = BA.twi(TO=5)
  698. twlgti = BA.twi(TO=1)
  699. twlnli = BA.twi(TO=5)
  700. twlngi = BA.twi(TO=6)
  701. # F.8 Simplified Mnemonics for Special-Purpose
  702. # Registers
  703. mfctr = BA.mfspr(spr=9)
  704. mflr = BA.mfspr(spr=8)
  705. mftbl = BA.mftb(spr=268)
  706. mftbu = BA.mftb(spr=269)
  707. mfxer = BA.mfspr(spr=1)
  708. mtctr = BA.mtspr(spr=9)
  709. mtlr = BA.mtspr(spr=8)
  710. mtxer = BA.mtspr(spr=1)
  711. # F.9 Recommended Simplified Mnemonics
  712. nop = BA.ori(rS=0, rA=0, UIMM=0)
  713. li = BA.addi(rA=0)
  714. lis = BA.addis(rA=0)
  715. mr = BA.or_(rB="rS")
  716. mrx = BA.or_x(rB="rS")
  717. not_ = BA.nor(rB="rS")
  718. not_x = BA.norx(rB="rS")
  719. mtcr = BA.mtcrf(CRM=0xFF)
  720. PPCAssembler = make_rassembler(PPCAssembler)
  721. def hi(w):
  722. return w >> 16
  723. def ha(w):
  724. if (w >> 15) & 1:
  725. return (w >> 16) + 1
  726. else:
  727. return w >> 16
  728. def lo(w):
  729. return w & 0x0000FFFF
  730. def la(w):
  731. v = w & 0x0000FFFF
  732. if v & 0x8000:
  733. return -((v ^ 0xFFFF) + 1) # "sign extend" to 32 bits
  734. return v
  735. def highest(w):
  736. return w >> 48
  737. def higher(w):
  738. return (w >> 32) & 0x0000FFFF
  739. def high(w):
  740. return (w >> 16) & 0x0000FFFF
  741. _eci = ExternalCompilationInfo(post_include_bits=[
  742. '#define rpython_flush_icache() asm("isync":::"memory")\n'
  743. ])
  744. flush_icache = rffi.llexternal(
  745. "rpython_flush_icache",
  746. [],
  747. lltype.Void,
  748. compilation_info=_eci,
  749. _nowrapper=True,
  750. sandboxsafe=True)
  751. class PPCGuardToken(GuardToken):
  752. def __init__(self, cpu, gcmap, descr, failargs, faillocs,
  753. guard_opnum, frame_depth, faildescrindex, fcond=c.cond_none):
  754. GuardToken.__init__(self, cpu, gcmap, descr, failargs, faillocs,
  755. guard_opnum, frame_depth, faildescrindex)
  756. self.fcond = fcond
  757. class OverwritingBuilder(PPCAssembler):
  758. def __init__(self, mc, start, num_insts=0):
  759. PPCAssembler.__init__(self)
  760. self.mc = mc
  761. self.index = start
  762. def currpos(self):
  763. assert 0, "not implemented"
  764. def write32(self, word):
  765. index = self.index
  766. if IS_BIG_ENDIAN:
  767. self.mc.overwrite(index, chr((word >> 24) & 0xff))
  768. self.mc.overwrite(index + 1, chr((word >> 16) & 0xff))
  769. self.mc.overwrite(index + 2, chr((word >> 8) & 0xff))
  770. self.mc.overwrite(index + 3, chr(word & 0xff))
  771. elif IS_LITTLE_ENDIAN:
  772. self.mc.overwrite(index , chr(word & 0xff))
  773. self.mc.overwrite(index + 1, chr((word >> 8) & 0xff))
  774. self.mc.overwrite(index + 2, chr((word >> 16) & 0xff))
  775. self.mc.overwrite(index + 3, chr((word >> 24) & 0xff))
  776. self.index = index + 4
  777. def overwrite(self):
  778. pass
  779. class PPCBuilder(BlockBuilderMixin, PPCAssembler):
  780. def __init__(self):
  781. PPCAssembler.__init__(self)
  782. self.init_block_builder()
  783. self.ops_offset = {}
  784. def mark_op(self, op):
  785. pos = self.get_relative_pos()
  786. self.ops_offset[op] = pos
  787. def check(self, desc, v, *args):
  788. desc.__get__(self)(*args)
  789. ins = self.insts.pop()
  790. expected = ins.assemble()
  791. if expected < 0:
  792. expected += 1<<32
  793. assert v == expected
  794. def load_imm(self, dest_reg, word):
  795. rD = dest_reg.value
  796. if word <= 32767 and word >= -32768:
  797. self.li(rD, word)
  798. elif IS_PPC_32 or (word <= 2147483647 and word >= -2147483648):
  799. self.lis(rD, hi(word))
  800. if word & 0xFFFF != 0:
  801. self.ori(rD, rD, lo(word))
  802. else:
  803. self.load_imm(dest_reg, word>>32)
  804. self.sldi(rD, rD, 32)
  805. if word & 0xFFFF0000 != 0:
  806. self.oris(rD, rD, high(word))
  807. if word & 0xFFFF != 0:
  808. self.ori(rD, rD, lo(word))
  809. def load_imm_plus(self, dest_reg, word):
  810. """Like load_imm(), but with one instruction less, and
  811. leaves the loaded value off by some signed 16-bit difference.
  812. Returns that difference."""
  813. diff = rffi.cast(lltype.Signed, rffi.cast(rffi.SHORT, word))
  814. word -= diff
  815. assert word & 0xFFFF == 0
  816. self.load_imm(dest_reg, word)
  817. return diff
  818. def load_from_addr(self, rD, rT, addr):
  819. # load [addr] into rD. rT is a temporary register which can be
  820. # equal to rD, but can't be r0.
  821. assert rT is not r.r0
  822. diff = self.load_imm_plus(rT, addr)
  823. if IS_PPC_32:
  824. self.lwz(rD.value, rT.value, diff)
  825. else:
  826. self.ld(rD.value, rT.value, diff)
  827. def b_offset(self, target):
  828. curpos = self.currpos()
  829. offset = target - curpos
  830. assert offset < (1 << 24)
  831. self.b(offset)
  832. def b_cond_offset(self, offset, condition):
  833. assert condition != c.cond_none
  834. BI, BO = c.encoding[condition]
  835. pos = self.currpos()
  836. target_ofs = offset - pos
  837. self.bc(BO, BI, target_ofs)
  838. def b_cond_abs(self, addr, condition):
  839. assert condition != c.cond_none
  840. BI, BO = c.encoding[condition]
  841. with scratch_reg(self):
  842. self.load_imm(r.SCRATCH, addr)
  843. self.mtctr(r.SCRATCH.value)
  844. self.bcctr(BO, BI)
  845. def b_abs(self, address, trap=False):
  846. with scratch_reg(self):
  847. self.load_imm(r.SCRATCH, address)
  848. self.mtctr(r.SCRATCH.value)
  849. if trap:
  850. self.trap()
  851. self.bctr()
  852. def bl_abs(self, address):
  853. with scratch_reg(self):
  854. self.load_imm(r.SCRATCH, address)
  855. self.mtctr(r.SCRATCH.value)
  856. self.bctrl()
  857. if IS_BIG_ENDIAN:
  858. RAW_CALL_REG = r.r2
  859. else:
  860. RAW_CALL_REG = r.r12
  861. def raw_call(self, call_reg=RAW_CALL_REG):
  862. """Emit a call to the address stored in the register 'call_reg',
  863. which must be either RAW_CALL_REG or r12. This is a regular C
  864. function pointer, which means on big-endian that it is actually
  865. the address of a three-words descriptor.
  866. """
  867. if IS_BIG_ENDIAN:
  868. # Load the function descriptor (currently in r2) from memory:
  869. # [r2 + 0] -> ctr
  870. # [r2 + 16] -> r11
  871. # [r2 + 8] -> r2 (= TOC)
  872. assert self.RAW_CALL_REG is r.r2
  873. assert call_reg is r.r2 or call_reg is r.r12
  874. self.ld(r.SCRATCH.value, call_reg.value, 0)
  875. self.ld(r.r11.value, call_reg.value, 16)
  876. self.mtctr(r.SCRATCH.value)
  877. self.ld(r.TOC.value, call_reg.value, 8) # must be last: TOC is r2
  878. elif IS_LITTLE_ENDIAN:
  879. assert self.RAW_CALL_REG is r.r12 # 'r12' is fixed by this ABI
  880. assert call_reg is r.r12
  881. self.mtctr(r.r12.value)
  882. # Call the function
  883. self.bctrl()
  884. def load(self, target_reg, base_reg, offset):
  885. if IS_PPC_32:
  886. self.lwz(target_reg, base_reg, offset)
  887. else:
  888. self.ld(target_reg, base_reg, offset)
  889. def loadx(self, target_reg, base_reg, offset_reg):
  890. if IS_PPC_32:
  891. self.lwzx(target_reg, base_reg, offset_reg)
  892. else:
  893. self.ldx(target_reg, base_reg, offset_reg)
  894. def store(self, from_reg, base_reg, offset):
  895. if IS_PPC_32:
  896. self.stw(from_reg, base_reg, offset)
  897. else:
  898. self.std(from_reg, base_reg, offset)
  899. def storex(self, from_reg, base_reg, offset_reg):
  900. if IS_PPC_32:
  901. self.stwx(from_reg, base_reg, offset_reg)
  902. else:
  903. self.stdx(from_reg, base_reg, offset_reg)
  904. def store_update(self, target_reg, from_reg, offset):
  905. if IS_PPC_32:
  906. self.stwu(target_reg, from_reg, offset)
  907. else:
  908. self.stdu(target_reg, from_reg, offset)
  909. def srli_op(self, target_reg, from_reg, numbits):
  910. if IS_PPC_32:
  911. self.srwi(target_reg, from_reg, numbits)
  912. else:
  913. self.srdi(target_reg, from_reg, numbits)
  914. def sl_op(self, target_reg, from_reg, numbit_reg):
  915. if IS_PPC_32:
  916. self.slw(target_reg, from_reg, numbit_reg)
  917. else:
  918. self.sld(target_reg, from_reg, numbit_reg)
  919. def _dump_trace(self, addr, name, formatter=-1):
  920. if not we_are_translated():
  921. if formatter != -1:
  922. name = name % formatter
  923. dir = udir.ensure('asm', dir=True)
  924. f = dir.join(name).open('wb')
  925. data = rffi.cast(rffi.CCHARP, addr)
  926. for i in range(self.currpos()):
  927. f.write(data[i])
  928. f.close()
  929. def write32(self, word):
  930. if IS_BIG_ENDIAN:
  931. self.writechar(chr((word >> 24) & 0xFF))
  932. self.writechar(chr((word >> 16) & 0xFF))
  933. self.writechar(chr((word >> 8) & 0xFF))
  934. self.writechar(chr(word & 0xFF))
  935. elif IS_LITTLE_ENDIAN:
  936. self.writechar(chr(word & 0xFF))
  937. self.writechar(chr((word >> 8) & 0xFF))
  938. self.writechar(chr((word >> 16) & 0xFF))
  939. self.writechar(chr((word >> 24) & 0xFF))
  940. def write64(self, word):
  941. if IS_BIG_ENDIAN:
  942. self.writechar(chr((word >> 56) & 0xFF))
  943. self.writechar(chr((word >> 48) & 0xFF))
  944. self.writechar(chr((word >> 40) & 0xFF))
  945. self.writechar(chr((word >> 32) & 0xFF))
  946. self.writechar(chr((word >> 24) & 0xFF))
  947. self.writechar(chr((word >> 16) & 0xFF))
  948. self.writechar(chr((word >> 8) & 0xFF))
  949. self.writechar(chr(word & 0xFF))
  950. elif IS_LITTLE_ENDIAN:
  951. self.writechar(chr(word & 0xFF))
  952. self.writechar(chr((word >> 8) & 0xFF))
  953. self.writechar(chr((word >> 16) & 0xFF))
  954. self.writechar(chr((word >> 24) & 0xFF))
  955. self.writechar(chr((word >> 32) & 0xFF))
  956. self.writechar(chr((word >> 40) & 0xFF))
  957. self.writechar(chr((word >> 48) & 0xFF))
  958. self.writechar(chr((word >> 56) & 0xFF))
  959. def currpos(self):
  960. return self.get_relative_pos()
  961. def copy_to_raw_memory(self, addr):
  962. self._copy_to_raw_memory(addr)
  963. if we_are_translated():
  964. flush_icache()
  965. self._dump(addr, "jit-backend-dump", 'ppc')
  966. def cmp_op(self, block, a, b, imm=False, signed=True, fp=False):
  967. if fp == True:
  968. self.fcmpu(block, a, b)
  969. elif IS_PPC_32:
  970. if signed:
  971. if imm:
  972. # 32 bit immediate signed
  973. self.cmpwi(block, a, b)
  974. else:
  975. # 32 bit signed
  976. self.cmpw(block, a, b)
  977. else:
  978. if imm:
  979. # 32 bit immediate unsigned
  980. self.cmplwi(block, a, b)
  981. else:
  982. # 32 bit unsigned
  983. self.cmplw(block, a, b)
  984. else:
  985. if signed:
  986. if imm:
  987. # 64 bit immediate signed
  988. self.cmpdi(block, a, b)
  989. else:
  990. # 64 bit signed
  991. self.cmpd(block, a, b)
  992. else:
  993. if imm:
  994. # 64 bit immediate unsigned
  995. self.cmpldi(block, a, b)
  996. else:
  997. # 64 bit unsigned
  998. self.cmpld(block, a, b)
  999. def alloc_scratch_reg(self):
  1000. pass
  1001. #assert not self.r0_in_use
  1002. #self.r0_in_use = True
  1003. def free_scratch_reg(self):
  1004. pass
  1005. #assert self.r0_in_use
  1006. #self.r0_in_use = False
  1007. def get_assembler_function(self):
  1008. "NOT_RPYTHON: tests only"
  1009. from rpython.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
  1010. class FakeCPU:
  1011. HAS_CODEMAP = False
  1012. asmmemmgr = AsmMemoryManager()
  1013. addr = self.materialize(FakeCPU(), [])
  1014. if IS_BIG_ENDIAN:
  1015. mc = PPCBuilder()
  1016. mc.write64(addr) # the 3-words descriptor
  1017. mc.write64(0)
  1018. mc.write64(0)
  1019. addr = mc.materialize(FakeCPU(), [])
  1020. return rffi.cast(lltype.Ptr(lltype.FuncType([], lltype.Signed)), addr)
  1021. class scratch_reg(object):
  1022. def __init__(self, mc):
  1023. self.mc = mc
  1024. def __enter__(self):
  1025. self.mc.alloc_scratch_reg()
  1026. def __exit__(self, *args):
  1027. self.mc.free_scratch_reg()
  1028. class BranchUpdater(PPCAssembler):
  1029. def __init__(self):
  1030. PPCAssembler.__init__(self)
  1031. self.init_block_builder()
  1032. def write_to_mem(self, addr):
  1033. self.assemble()
  1034. self.copy_to_raw_memory(addr)
  1035. def assemble(self, dump=os.environ.has_key('PYPY_DEBUG')):
  1036. insns = self.assemble0(dump)
  1037. for i in insns:
  1038. self.emit(i)
  1039. def b(n):
  1040. r = []
  1041. for i in range(32):
  1042. r.append(n&1)
  1043. n >>= 1
  1044. r.reverse()
  1045. return ''.join(map(str, r))
  1046. def make_operations():
  1047. def not_implemented(builder, trace_op, cpu, *rest_args):
  1048. import pdb; pdb.set_trace()
  1049. oplist = [None] * (rop._LAST + 1)
  1050. for key, val in rop.__dict__.items():
  1051. if key.startswith("_") or not isinstance(val, int):
  1052. continue
  1053. opname = key.lower()
  1054. methname = "emit_%s" % opname
  1055. if hasattr(PPCBuilder, methname):
  1056. oplist[val] = getattr(PPCBuilder, methname).im_func
  1057. else:
  1058. oplist[val] = not_implemented
  1059. return oplist
  1060. PPCBuilder.operations = make_operations()