as.scm 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. ;;; GNU Mes --- Maxwell Equations of Software
  2. ;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
  3. ;;;
  4. ;;; This file is part of GNU Mes.
  5. ;;;
  6. ;;; GNU Mes is free software; you can redistribute it and/or modify it
  7. ;;; under the terms of the GNU General Public License as published by
  8. ;;; the Free Software Foundation; either version 3 of the License, or (at
  9. ;;; your option) any later version.
  10. ;;;
  11. ;;; GNU Mes is distributed in the hope that it will be useful, but
  12. ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. ;;; GNU General Public License for more details.
  15. ;;;
  16. ;;; You should have received a copy of the GNU General Public License
  17. ;;; along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
  18. ;;; Commentary:
  19. ;;; define i386 assembly
  20. ;;; Code:
  21. (define-module (mescc i386 as)
  22. #:use-module (mes guile)
  23. #:use-module (mescc as)
  24. #:use-module (mescc info)
  25. #:export (
  26. i386:instructions
  27. ))
  28. (define (e->x o)
  29. (string-drop o 1))
  30. (define (e->l o)
  31. (string-append (string-drop-right (string-drop o 1) 1) "l"))
  32. (define (i386:function-preamble . rest)
  33. '(("push___%ebp")
  34. ("mov____%esp,%ebp")))
  35. (define (i386:function-locals . rest)
  36. `(("sub____$i32,%esp" (#:immediate ,(+ (* 4 1025) (* 20 4)))))) ; 4*1024 buf, 20 local vars
  37. (define (i386:r->local info n)
  38. (or n (error "invalid value: i386:r->local: " n))
  39. (let ((r (get-r info))
  40. (n (- 0 (* 4 n))))
  41. `(,(if (< (abs n) #x80) `(,(string-append "mov____%" r ",0x8(%ebp)") (#:immediate1 ,n))
  42. `(,(string-append "mov____%" r ",0x32(%ebp)") (#:immediate ,n))))))
  43. (define (i386:value->r info v)
  44. (let ((r (get-r info)))
  45. `((,(string-append "mov____$i32,%" r) (#:immediate ,v)))))
  46. (define (i386:ret . rest)
  47. '(("leave")
  48. ("ret")))
  49. (define (i386:r-zero? info)
  50. (let ((r (get-r info)))
  51. `((,(string-append "test___%" r "," "%" r)))))
  52. (define (i386:local->r info n)
  53. (let ((r (get-r info))
  54. (n (- 0 (* 4 n))))
  55. `(,(if (< (abs n) #x80) `(,(string-append "mov____0x8(%ebp),%" r) (#:immediate1 ,n))
  56. `(,(string-append "mov____0x32(%ebp),%" r) (#:immediate ,n))))))
  57. (define (i386:r0+r1 info)
  58. (let ((r0 (get-r0 info))
  59. (r1 (get-r1 info)))
  60. `((,(string-append "add____%" r1 ",%" r0)))))
  61. (define (i386:call-label info label n)
  62. `((call32 (#:offset ,label))
  63. ("add____$i8,%esp" (#:immediate1 ,(* n 4)))))
  64. (define (i386:r->arg info i)
  65. (let ((r (get-r info)))
  66. `((,(string-append "push___%" r)))))
  67. (define (i386:label->arg info label i)
  68. `(("push___$i32" (#:address ,label))))
  69. (define (i386:r-negate info)
  70. (let* ((r (get-r info))
  71. (l (e->l r)))
  72. `((,(string-append "sete___%" l))
  73. (,(string-append "movzbl_%" l ",%" r)))))
  74. (define (i386:r0-r1 info)
  75. (let ((r0 (get-r0 info))
  76. (r1 (get-r1 info)))
  77. `((,(string-append "sub____%" r1 ",%" r0)))))
  78. (define (i386:zf->r info)
  79. (let* ((r (get-r info))
  80. (l (e->l r)))
  81. `((,(string-append "sete___%" l))
  82. (,(string-append "movzbl_%" l ",%" r)))))
  83. (define (i386:xor-zf info)
  84. '(("lahf")
  85. ("xor____$i8,%ah" (#:immediate1 #x40))
  86. ("sahf")))
  87. (define (i386:r->local+n info id n)
  88. (let ((n (+ (- 0 (* 4 id)) n))
  89. (r (get-r info)))
  90. `(,(if (< (abs n) #x80) `(,(string-append "mov____%" r ",0x8(%ebp)") (#:immediate1 ,n))
  91. `(,(string-append "mov____%" r ",0x32(%ebp)") (#:immediate ,n))))))
  92. (define (i386:r-mem-add info v)
  93. (let ((r (get-r info)))
  94. `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,(%" r ")") (#:immediate1 ,v))
  95. `(,(string-append "add____$i32,(%" r ")") (#:immediate ,v))))))
  96. (define (i386:r-byte-mem-add info v)
  97. (let ((r (get-r info)))
  98. `((,(string-append "addb___$i8,(%" r ")") (#:immediate1 ,v)))))
  99. (define (i386:r-word-mem-add info v)
  100. (let ((r (get-r info)))
  101. `((,(string-append "addw___$i8,(%" r ")") (#:immediate2 ,v)))))
  102. (define (i386:local-ptr->r info n)
  103. (let ((r (get-r info)))
  104. (let ((n (- 0 (* 4 n))))
  105. `((,(string-append "mov____%ebp,%" r))
  106. ,(if (< (abs n) #x80) `(,(string-append "add____$i8,%" r) (#:immediate1 ,n))
  107. `(,(string-append "add____$i32,%" r) (#:immediate ,n)))))))
  108. (define (i386:label->r info label)
  109. (let ((r (get-r info)))
  110. `((,(string-append "mov____$i32,%" r) (#:address ,label)))))
  111. (define (i386:r0->r1 info)
  112. (let ((r0 (get-r0 info))
  113. (r1 (get-r1 info)))
  114. `((,(string-append "mov____%" r0 ",%" r1)))))
  115. (define (i386:byte-mem->r info)
  116. (let ((r (get-r info)))
  117. `((,(string-append "movzbl_(%" r "),%" r)))))
  118. (define (i386:byte-r info)
  119. (let* ((r (get-r info))
  120. (l (e->l r)))
  121. `((,(string-append "movzbl_%" l ",%" r)))))
  122. (define (i386:byte-signed-r info)
  123. (let* ((r (get-r info))
  124. (l (e->l r)))
  125. `((,(string-append "movsbl_%" l ",%" r)))))
  126. (define (i386:word-r info)
  127. (let* ((r (get-r info))
  128. (x (e->x r)))
  129. `((,(string-append "movzwl_%" x ",%" r)))))
  130. (define (i386:word-signed-r info)
  131. (let* ((r (get-r info))
  132. (x (e->x r)))
  133. `((,(string-append "movswl_%" x ",%" r)))))
  134. (define (i386:jump info label)
  135. `(("jmp32 " (#:offset ,label))))
  136. (define (i386:jump-z info label)
  137. `(("je32 " (#:offset ,label))))
  138. (define (i386:jump-nz info label)
  139. `(("jne32 " (#:offset ,label))))
  140. (define (i386:jump-byte-z info label)
  141. `(("test___%al,%al")
  142. ("je32 " (#:offset ,label))))
  143. ;; signed
  144. (define (i386:jump-g info label)
  145. `(("jg32 " (#:offset ,label))))
  146. (define (i386:jump-ge info label)
  147. `(("jge32 " (#:offset ,label))))
  148. (define (i386:jump-l info label)
  149. `(("jl32 " (#:offset ,label))))
  150. (define (i386:jump-le info label)
  151. `(("jle32 " (#:offset ,label))))
  152. ;; unsigned
  153. (define (i386:jump-a info label)
  154. `(("ja32 " (#:offset ,label))))
  155. (define (i386:jump-ae info label)
  156. `(("jae32 " (#:offset ,label))))
  157. (define (i386:jump-b info label)
  158. `(("jb32 " (#:offset ,label))))
  159. (define (i386:jump-be info label)
  160. `(("jbe32 " (#:offset ,label))))
  161. (define (i386:byte-r0->r1-mem info)
  162. (let* ((r0 (get-r0 info))
  163. (r1 (get-r1 info))
  164. (l0 (e->l r0)))
  165. `((,(string-append "mov____%" l0 ",(%" r1 ")")))))
  166. (define (i386:label-mem->r info label)
  167. (let ((r (get-r info)))
  168. `((,(string-append "mov____0x32,%" r) (#:address ,label)))))
  169. (define (i386:word-mem->r info)
  170. (let ((r (get-r info)))
  171. `((,(string-append "movzwl_(%" r "),%" r)))))
  172. (define (i386:mem->r info)
  173. (let ((r (get-r info)))
  174. `((,(string-append "mov____(%" r "),%" r)))))
  175. (define (i386:local-add info n v)
  176. (let ((n (- 0 (* 4 n))))
  177. `(,(if (and (< (abs n) #x80)
  178. (< (abs v) #x80)) `("add____$i8,0x8(%ebp)" (#:immediate1 ,n) (#:immediate1 ,v))
  179. `("add____$i32,0x32(%ebp)" (#:immediate ,n) (#:immediate ,v))))))
  180. (define (i386:label-mem-add info label v)
  181. `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:address ,label) (#:immediate1 ,v))
  182. `("add____$i32,0x32" (#:address ,label) (#:immediate ,v)))))
  183. (define (i386:nop info)
  184. '(("nop")))
  185. (define (i386:swap-r0-r1 info)
  186. (let ((r0 (get-r0 info))
  187. (r1 (get-r1 info)))
  188. `((,(string-append "xchg___%" r0 ",%" r1)))))
  189. ;; signed
  190. (define (i386:g?->r info)
  191. (let* ((r (get-r info))
  192. (l (e->l r)))
  193. `((,(string-append "setg___%" l))
  194. (,(string-append "movzbl_%" l ",%" r)))))
  195. (define (i386:ge?->r info)
  196. (let* ((r (get-r info))
  197. (l (e->l r)))
  198. `((,(string-append "setge__%" l))
  199. (,(string-append "movzbl_%" l ",%" r)))))
  200. (define (i386:l?->r info)
  201. (let* ((r (get-r info))
  202. (l (e->l r)))
  203. `((,(string-append "setl___%" l))
  204. (,(string-append "movzbl_%" l ",%" r)))))
  205. (define (i386:le?->r info)
  206. (let* ((r (get-r info))
  207. (l (e->l r)))
  208. `((,(string-append "setle__%" l))
  209. (,(string-append "movzbl_%" l ",%" r)))))
  210. ;; unsigned
  211. (define (i386:a?->r info)
  212. (let* ((r (get-r info))
  213. (l (e->l r)))
  214. `((,(string-append "seta___%" l))
  215. (,(string-append "movzbl_%" l ",%" r)))))
  216. (define (i386:ae?->r info)
  217. (let* ((r (get-r info))
  218. (l (e->l r)))
  219. `((,(string-append "setae__%" l))
  220. (,(string-append "movzbl_%" l ",%" r)))))
  221. (define (i386:b?->r info)
  222. (let* ((r (get-r info))
  223. (l (e->l r)))
  224. `((,(string-append "setb___%" l))
  225. (,(string-append "movzbl_%" l ",%" r)))))
  226. (define (i386:be?->r info)
  227. (let* ((r (get-r info))
  228. (l (e->l r)))
  229. `((,(string-append "setbe__%" l))
  230. (,(string-append "movzbl_%" l ",%" r)))))
  231. (define (i386:test-r info)
  232. (let ((r (get-r info)))
  233. `((,(string-append "test___%" r ",%" r)))))
  234. (define (i386:r->label info label)
  235. (let ((r (get-r info)))
  236. `((,(string-append "mov____%" r ",0x32") (#:address ,label)))))
  237. (define (i386:r->byte-label info label)
  238. (let* ((r (get-r info))
  239. (l (e->l r)))
  240. `((,(string-append "movb___%" l ",0x32") (#:address ,label)))))
  241. (define (i386:r->word-label info label)
  242. (let* ((r (get-r info))
  243. (x (e->x r)))
  244. `((,(string-append "movw___%" x ",0x32") (#:address ,label)))))
  245. (define (i386:call-r info n)
  246. (let ((r (get-r info)))
  247. `((,(string-append "call___*%" r))
  248. ("add____$i8,%esp" (#:immediate1 ,(* n 4))))))
  249. (define (i386:r0*r1 info)
  250. (let ((allocated (.allocated info))
  251. (r0 (get-r0 info))
  252. (r1 (get-r1 info)))
  253. (if (not (member "edx" allocated))
  254. `(,@(if (equal? r0 "eax") '()
  255. `(("push___%eax")
  256. (,(string-append "mov____%" r0 ",%eax"))))
  257. (,(string-append "mul____%" r1))
  258. ,@(if (equal? r0 "eax") '()
  259. `((,(string-append "mov____%eax,%" r0))
  260. ("pop____%eax"))))
  261. `(("push___%eax")
  262. ("push___%ebx")
  263. ("push___%edx")
  264. (,(string-append "mov____%" r1 ",%ebx"))
  265. (,(string-append "mov____%" r0 ",%eax"))
  266. (,(string-append "mul____%" r1))
  267. ("pop____%edx")
  268. ("pop____%ebx")
  269. (,(string-append "mov____%eax,%" r0))
  270. ("pop____%eax")))))
  271. (define (i386:r0<<r1 info)
  272. (let ((r0 (get-r0 info))
  273. (r1 (get-r1 info)))
  274. `((,(string-append "mov____%" r1 ",%ecx"))
  275. (,(string-append "shl____%cl,%" r0)))))
  276. (define (i386:r0>>r1 info)
  277. (let ((r0 (get-r0 info))
  278. (r1 (get-r1 info)))
  279. `((,(string-append "mov____%" r1 ",%ecx"))
  280. (,(string-append "shr____%cl,%" r0)))))
  281. (define (i386:r0-and-r1 info)
  282. (let ((r0 (get-r0 info))
  283. (r1 (get-r1 info)))
  284. `((,(string-append "and____%" r1 ",%" r0)))))
  285. (define (i386:r0/r1 info signed?)
  286. (let ((allocated (.allocated info))
  287. (r0 (get-r0 info))
  288. (r1 (get-r1 info)))
  289. (if (not (member "edx" allocated))
  290. `(,@(if (equal? r0 "eax") '()
  291. `(("push___%eax")
  292. (,(string-append "mov____%" r0 ",%eax"))))
  293. ,(if signed? '("cltd") '("xor____%edx,%edx"))
  294. ,(if signed? `(,(string-append "idiv___%" r1)) `(,(string-append "div___%" r1)))
  295. ,@(if (equal? r0 "eax") '()
  296. `((,(string-append "mov____%eax,%" r0))
  297. ("pop____%eax"))))
  298. `(("push___%eax")
  299. ("push___%ebx")
  300. ("push___%edx")
  301. (,(string-append "mov____%" r1 ",%ebx"))
  302. (,(string-append "mov____%" r0 ",%eax"))
  303. ,(if signed? '("cltd") '("xor____%edx,%edx"))
  304. ,(if signed? `(,(string-append "idiv___%ebx")) `(,(string-append "div___%ebx")))
  305. ("pop____%edx")
  306. ("pop____%ebx")
  307. (,(string-append "mov____%eax,%" r0))
  308. ("pop____%eax")))))
  309. (define (i386:r0%r1 info signed?)
  310. (let ((allocated (.allocated info))
  311. (r0 (get-r0 info))
  312. (r1 (get-r1 info)))
  313. (if (not (member "edx" allocated))
  314. `(,@(if (equal? r0 "eax") '()
  315. `(("push___%eax")
  316. (,(string-append "mov____%" r0 ",%eax"))))
  317. ,(if signed? '("cltd") '("xor____%edx,%edx"))
  318. ,(if signed? `(,(string-append "idiv___%" r1)) `(,(string-append "div___%" r1)))
  319. (,(string-append "mov____%edx,%" r0)))
  320. `(("push___%eax")
  321. ("push___%ebx")
  322. ("push___%edx")
  323. (,(string-append "mov____%" r1 ",%ebx"))
  324. (,(string-append "mov____%" r0 ",%eax"))
  325. ,(if signed? '("cltd") '("xor____%edx,%edx"))
  326. ,(if signed? `(,(string-append "idiv___%ebx")) `(,(string-append "div___%ebx")))
  327. ("pop____%edx")
  328. ("pop____%ebx")
  329. (,(string-append "mov____%edx,%" r0))
  330. ("pop____%eax")))))
  331. (define (i386:r+value info v)
  332. (let ((r (get-r info)))
  333. `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,%" r) (#:immediate1 ,v))
  334. `(,(string-append "add____$i32,%" r) (#:immediate ,v))))))
  335. (define (i386:r0->r1-mem info)
  336. (let ((r0 (get-r0 info))
  337. (r1 (get-r1 info)))
  338. `((,(string-append "mov____%" r0 ",(%" r1 ")")))))
  339. (define (i386:byte-r0->r1-mem info)
  340. (let* ((r0 (get-r0 info))
  341. (r1 (get-r1 info))
  342. (l0 (e->l r0)))
  343. `((,(string-append "mov____%" l0 ",(%" r1 ")")))))
  344. (define (i386:word-r0->r1-mem info)
  345. (let* ((r0 (get-r0 info))
  346. (r1 (get-r1 info))
  347. (x0 (e->x r0)))
  348. `((,(string-append "mov____%" x0 ",(%" r1 ")")))))
  349. (define (i386:r-cmp-value info v)
  350. (let ((r (get-r info)))
  351. `(,(if (< (abs v) #x80) `(,(string-append "cmp____$i8,%" r) (#:immediate1 ,v))
  352. `(,(string-append "cmp____$i32,%" r) (#:immediate ,v))))))
  353. (define (i386:push-register info r)
  354. `((,(string-append "push___%" r))))
  355. (define (i386:pop-register info r)
  356. `((,(string-append "pop____%" r))))
  357. (define (i386:return->r info)
  358. (let ((r (get-r info)))
  359. (if (equal? r "eax") '()
  360. `((,(string-append "mov____%eax,%" r))))))
  361. (define (i386:r0-or-r1 info)
  362. (let ((r0 (get-r0 info))
  363. (r1 (get-r1 info)))
  364. `((,(string-append "or_____%" r1 ",%" r0)))))
  365. (define (i386:shl-r info n)
  366. (let ((r (get-r info)))
  367. `((,(string-append "shl____$i8,%" r) (#:immediate1 ,n)))))
  368. (define (i386:r+r info)
  369. (let ((r (get-r info)))
  370. `((,(string-append "add____%" r ",%" r)))))
  371. (define (i386:not-r info)
  372. (let ((r (get-r info)))
  373. `((,(string-append "not____%" r)))))
  374. (define (i386:r0-xor-r1 info)
  375. (let ((r0 (get-r0 info))
  376. (r1 (get-r1 info)))
  377. `((,(string-append "xor____%" r1 ",%" r0)))))
  378. (define (i386:r0-mem->r1-mem info)
  379. (let* ((registers (.registers info))
  380. (r0 (get-r0 info))
  381. (r1 (get-r1 info))
  382. (r2 (car registers)))
  383. `((,(string-append "mov____(%" r0 "),%" r2))
  384. (,(string-append "mov____%" r2 ",(%" r1 ")")))))
  385. (define (i386:byte-r0-mem->r1-mem info)
  386. (let* ((registers (.registers info))
  387. (r0 (get-r0 info))
  388. (r1 (get-r1 info))
  389. (r2 (car registers))
  390. (l2 (e->l r2)))
  391. `((,(string-append "mov____(%" r0 "),%" l2))
  392. (,(string-append "mov____%" l2 ",(%" r1 ")")))))
  393. (define (i386:word-r0-mem->r1-mem info)
  394. (let* ((registers (.registers info))
  395. (r0 (get-r0 info))
  396. (r1 (get-r1 info))
  397. (r2 (car registers))
  398. (x2 (e->x r2)))
  399. `((,(string-append "mov____(%" r0 "),%" x2))
  400. (,(string-append "mov____%" x2 ",(%" r1 ")")))))
  401. (define (i386:r0+value info v)
  402. (let ((r0 (get-r0 info)))
  403. `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,%" r0) (#:immediate1 ,v))
  404. `(,(string-append "add____$i32,%" r0) (#:immediate ,v))))))
  405. (define (i386:value->r0 info v)
  406. (let ((r0 (get-r0 info)))
  407. `((,(string-append "mov____$i32,%" r0) (#:immediate ,v)))))
  408. (define (i386:byte-r->local+n info id n)
  409. (let* ((n (+ (- 0 (* 4 id)) n))
  410. (r (get-r info))
  411. (l (e->l r) ))
  412. `(,(if (< (abs n) #x80) `(,(string-append "mov____%" l ",0x8(%ebp)") (#:immediate1 ,n))
  413. `(,(string-append "mov____%" l ",0x32(%ebp)") (#:immediate ,n))))))
  414. (define (i386:word-r->local+n info id n)
  415. (let* ((n (+ (- 0 (* 4 id)) n))
  416. (r (get-r info))
  417. (x (e->x r)))
  418. `(,(if (< (abs n) #x80) `(,(string-append "mov____%" x ",0x8(%ebp)") (#:immediate1 ,n))
  419. `(,(string-append "mov____%" x ",0x32(%ebp)") (#:immediate ,n))))))
  420. (define (i386:r-and info v)
  421. (let ((r (get-r info)))
  422. `((,(string-append "and____$i32,%" r) (#:immediate ,v)))))
  423. (define (i386:push-r0 info)
  424. (let ((r0 (get-r0 info)))
  425. `((,(string-append "push___%" r0)))))
  426. (define (i386:r1->r0 info)
  427. (let ((r0 (get-r0 info))
  428. (r1 (get-r1 info)))
  429. `((,(string-append "mov____%" r1 ",%" r0)))))
  430. (define (i386:pop-r0 info)
  431. (let ((r0 (get-r0 info)))
  432. `((,(string-append "pop____%" r0)))))
  433. (define (i386:swap-r-stack info)
  434. (let ((r (get-r info)))
  435. `((,(string-append "xchg___%" r ",(%esp)")))))
  436. (define (i386:swap-r1-stack info)
  437. (let ((r0 (get-r0 info)))
  438. `((,(string-append "xchg___%" r0 ",(%esp)")))))
  439. (define (i386:r2->r0 info)
  440. (let ((r0 (get-r0 info))
  441. (r1 (get-r1 info))
  442. (allocated (.allocated info)))
  443. (if (> (length allocated) 2)
  444. (let ((r2 (cadddr allocated)))
  445. `((,(string-append "mov____%" r2 ",%" r1))))
  446. `((,(string-append "pop____%" r0))
  447. (,(string-append "push___%" r0))))))
  448. (define i386:instructions
  449. `(
  450. (a?->r . ,i386:a?->r)
  451. (ae?->r . ,i386:ae?->r)
  452. (b?->r . ,i386:b?->r)
  453. (be?->r . ,i386:be?->r)
  454. (byte-mem->r . ,i386:byte-mem->r)
  455. (byte-r . ,i386:byte-r)
  456. (byte-r->local+n . ,i386:byte-r->local+n)
  457. (byte-r0->r1-mem . ,i386:byte-r0->r1-mem)
  458. (byte-r0->r1-mem . ,i386:byte-r0->r1-mem)
  459. (byte-r0-mem->r1-mem . ,i386:byte-r0-mem->r1-mem)
  460. (byte-signed-r . ,i386:byte-signed-r)
  461. (call-label . ,i386:call-label)
  462. (call-r . ,i386:call-r)
  463. (function-locals . ,i386:function-locals)
  464. (function-preamble . ,i386:function-preamble)
  465. (g?->r . ,i386:g?->r)
  466. (ge?->r . ,i386:ge?->r)
  467. (jump . ,i386:jump)
  468. (jump-a . ,i386:jump-a)
  469. (jump-ae . ,i386:jump-ae)
  470. (jump-b . ,i386:jump-b)
  471. (jump-be . ,i386:jump-be)
  472. (jump-byte-z . ,i386:jump-byte-z)
  473. (jump-g . , i386:jump-g)
  474. (jump-ge . , i386:jump-ge)
  475. (jump-l . ,i386:jump-l)
  476. (jump-le . ,i386:jump-le)
  477. (jump-nz . ,i386:jump-nz)
  478. (jump-z . ,i386:jump-z)
  479. (l?->r . ,i386:l?->r)
  480. (label->arg . ,i386:label->arg)
  481. (label->r . ,i386:label->r)
  482. (label-mem->r . ,i386:label-mem->r)
  483. (label-mem-add . ,i386:label-mem-add)
  484. (le?->r . ,i386:le?->r)
  485. (local->r . ,i386:local->r)
  486. (local-add . ,i386:local-add)
  487. (local-ptr->r . ,i386:local-ptr->r)
  488. (long-r0->r1-mem . ,i386:r0->r1-mem)
  489. (long-r0-mem->r1-mem . ,i386:r0-mem->r1-mem)
  490. (mem->r . ,i386:mem->r)
  491. (nop . ,i386:nop)
  492. (not-r . ,i386:not-r)
  493. (pop-r0 . ,i386:pop-r0)
  494. (pop-register . ,i386:pop-register)
  495. (push-r0 . ,i386:push-r0)
  496. (push-register . ,i386:push-register)
  497. (r+r . ,i386:r+r)
  498. (r+value . ,i386:r+value)
  499. (r->arg . ,i386:r->arg)
  500. (r->byte-label . ,i386:r->byte-label)
  501. (r->label . ,i386:r->label)
  502. (r->local . ,i386:r->local)
  503. (r->local+n . ,i386:r->local+n)
  504. (r->word-label . ,i386:r->word-label)
  505. (r-and . ,i386:r-and)
  506. (r-byte-mem-add . ,i386:r-byte-mem-add)
  507. (r-cmp-value . ,i386:r-cmp-value)
  508. (r-mem-add . ,i386:r-mem-add)
  509. (r-negate . ,i386:r-negate)
  510. (r-word-mem-add . ,i386:r-word-mem-add)
  511. (r-zero? . ,i386:r-zero?)
  512. (r0%r1 . ,i386:r0%r1)
  513. (r0*r1 . ,i386:r0*r1)
  514. (r0+r1 . ,i386:r0+r1)
  515. (r0+value . ,i386:r0+value)
  516. (r0->r1 . ,i386:r0->r1)
  517. (r0->r1-mem . ,i386:r0->r1-mem)
  518. (r0-and-r1 . ,i386:r0-and-r1)
  519. (r0-mem->r1-mem . ,i386:r0-mem->r1-mem)
  520. (r0-or-r1 . ,i386:r0-or-r1)
  521. (r0-r1 . ,i386:r0-r1)
  522. (r0-xor-r1 . ,i386:r0-xor-r1)
  523. (r0/r1 . ,i386:r0/r1)
  524. (r0<<r1 . ,i386:r0<<r1)
  525. (r0>>r1 . ,i386:r0>>r1)
  526. (r1->r0 . ,i386:r1->r0)
  527. (r2->r0 . ,i386:r2->r0)
  528. (ret . ,i386:ret)
  529. (return->r . ,i386:return->r)
  530. (shl-r . ,i386:shl-r)
  531. (swap-r-stack . ,i386:swap-r-stack)
  532. (swap-r0-r1 . ,i386:swap-r0-r1)
  533. (swap-r1-stack . ,i386:swap-r1-stack)
  534. (test-r . ,i386:test-r)
  535. (value->r . ,i386:value->r)
  536. (value->r0 . ,i386:value->r0)
  537. (word-mem->r . ,i386:word-mem->r)
  538. (word-r . ,i386:word-r)
  539. (word-r->local+n . ,i386:word-r->local+n)
  540. (word-r0->r1-mem . ,i386:word-r0->r1-mem)
  541. (word-r0-mem->r1-mem . ,i386:word-r0-mem->r1-mem)
  542. (word-signed-r . ,i386:word-signed-r)
  543. (xor-zf . ,i386:xor-zf)
  544. (zf->r . ,i386:zf->r)
  545. ))