or1korfpx.cpu 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. ; OpenRISC 1000 architecture. -*- Scheme -*-
  2. ; Copyright 2000-2019 Free Software Foundation, Inc.
  3. ; Contributed by Peter Gavin, pgavin@gmail.com
  4. ; Modified by Andrey Bacherov, avbacherov@opencores.org
  5. ;
  6. ; This program is free software; you can redistribute it and/or modify
  7. ; it under the terms of the GNU General Public License as published by
  8. ; the Free Software Foundation; either version 3 of the License, or
  9. ; (at your option) any later version.
  10. ;
  11. ; This program is distributed in the hope that it will be useful,
  12. ; but 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 this program; if not, see <http://www.gnu.org/licenses/>
  18. ; Initial ORFPX32 instruction set
  19. ; I'm not sure how CGEN handles rounding in FP operations, except for
  20. ; in conversions to/from integers. So lf.add, lf.sub, lf.mul, and
  21. ; lf.div do not round according to the FPCSR RM field.
  22. ; NaN, overflow, and underflow are not yet handled either.
  23. (define-normal-insn-enum insn-opcode-float-regreg
  24. "floating point reg/reg insn opcode enums" ()
  25. OPC_FLOAT_REGREG_ f-op-7-8
  26. (("ADD_S" #x00)
  27. ("SUB_S" #x01)
  28. ("MUL_S" #x02)
  29. ("DIV_S" #x03)
  30. ("ITOF_S" #x04)
  31. ("FTOI_S" #x05)
  32. ("REM_S" #x06)
  33. ("MADD_S" #x07)
  34. ("SFEQ_S" #x08)
  35. ("SFNE_S" #x09)
  36. ("SFGT_S" #x0a)
  37. ("SFGE_S" #x0b)
  38. ("SFLT_S" #x0c)
  39. ("SFLE_S" #x0d)
  40. ("ADD_D" #x10)
  41. ("SUB_D" #x11)
  42. ("MUL_D" #x12)
  43. ("DIV_D" #x13)
  44. ("ITOF_D" #x14)
  45. ("FTOI_D" #x15)
  46. ("REM_D" #x16)
  47. ("MADD_D" #x17)
  48. ("SFEQ_D" #x18)
  49. ("SFNE_D" #x19)
  50. ("SFGT_D" #x1a)
  51. ("SFGE_D" #x1b)
  52. ("SFLT_D" #x1c)
  53. ("SFLE_D" #x1d)
  54. ("SFUEQ_S" #x28)
  55. ("SFUNE_S" #x29)
  56. ("SFUGT_S" #x2a)
  57. ("SFUGE_S" #x2b)
  58. ("SFULT_S" #x2c)
  59. ("SFULE_S" #x2d)
  60. ("SFUN_S" #x2e)
  61. ("SFUEQ_D" #x38)
  62. ("SFUNE_D" #x39)
  63. ("SFUGT_D" #x3a)
  64. ("SFUGE_D" #x3b)
  65. ("SFULT_D" #x3c)
  66. ("SFULE_D" #x3d)
  67. ("SFUN_D" #x3e)
  68. ("CUST1_S" #xd0)
  69. ("CUST1_D" #xe0)
  70. )
  71. )
  72. ; Register offset flags, if set offset is 2 otherwise offset is 1
  73. (dnf f-rdoff-10-1 "destination register pair offset flag" ((MACH ORFPX64A32-MACHS)) 10 1)
  74. (dnf f-raoff-9-1 "source register A pair offset flag" ((MACH ORFPX64A32-MACHS)) 9 1)
  75. (dnf f-rboff-8-1 "source register B pair offset flag" ((MACH ORFPX64A32-MACHS)) 8 1)
  76. (dsh h-roff1 "1-bit offset flag" () (register BI))
  77. (dnop rDSF "destination register (single floating point mode)" ((MACH ORFPX32-MACHS)) h-fsr f-r1)
  78. (dnop rASF "source register A (single floating point mode)" ((MACH ORFPX32-MACHS)) h-fsr f-r2)
  79. (dnop rBSF "source register B (single floating point mode)" ((MACH ORFPX32-MACHS)) h-fsr f-r3)
  80. (define-pmacro (double-field-and-ops mnemonic reg offbit op-comment)
  81. (begin
  82. (define-multi-ifield
  83. (name (.sym "f-r" (.downcase mnemonic) "d32"))
  84. (comment op-comment)
  85. (attrs (MACH ORFPX64A32-MACHS))
  86. (mode SI)
  87. (subfields reg offbit)
  88. ; From the multi-ifield insert the bits into subfields
  89. (insert (sequence
  90. ()
  91. (set (ifield reg)
  92. (and (ifield (.sym "f-r" (.downcase mnemonic) "d32"))
  93. (const #x1f))
  94. )
  95. (set (ifield offbit)
  96. (and (sra (ifield (.sym "f-r" (.downcase mnemonic) "d32"))
  97. (const 5))
  98. (const 1))
  99. )
  100. )
  101. )
  102. ; Extract the multi-ifield from the subfield bits
  103. (extract
  104. (set (ifield (.sym "f-r" (.downcase mnemonic) "d32"))
  105. (or (ifield reg)
  106. (sll (ifield offbit)
  107. (const 5)))
  108. )
  109. )
  110. )
  111. (define-operand
  112. (name (.sym "r" (.upcase mnemonic) "D32F"))
  113. (comment (.str op-comment " (double floating point pair)"))
  114. (attrs (MACH ORFPX64A32-MACHS))
  115. (type h-fd32r)
  116. (index (.sym "f-r" (.downcase mnemonic) "d32"))
  117. (handlers (parse "regpair") (print "regpair"))
  118. )
  119. (define-operand
  120. (name (.sym "r" (.upcase mnemonic) "DI"))
  121. (comment (.str op-comment " (double integer pair)"))
  122. (attrs (MACH ORFPX64A32-MACHS))
  123. (type h-i64r)
  124. (index (.sym "f-r" (.downcase mnemonic) "d32"))
  125. (handlers (parse "regpair") (print "regpair"))
  126. )
  127. )
  128. )
  129. (double-field-and-ops D f-r1 f-rdoff-10-1 "destination register")
  130. (double-field-and-ops A f-r2 f-raoff-9-1 "source register A")
  131. (double-field-and-ops B f-r3 f-rboff-8-1 "source register B")
  132. (define-pmacro (float-regreg-insn mnemonic)
  133. (begin
  134. (dni (.sym lf- mnemonic -s)
  135. (.str "lf." mnemonic ".s reg/reg/reg")
  136. ((MACH ORFPX32-MACHS))
  137. (.str "lf." mnemonic ".s $rDSF,$rASF,$rBSF")
  138. (+ OPC_FLOAT rDSF rASF rBSF (f-resv-10-3 0) (.sym OPC_FLOAT_REGREG_ (.upcase mnemonic) _S))
  139. (set SF rDSF (mnemonic SF rASF rBSF))
  140. ()
  141. )
  142. (dni (.sym lf- mnemonic -d32)
  143. (.str "lf." mnemonic ".d regpair/regpair/regpair")
  144. ((MACH ORFPX64A32-MACHS))
  145. (.str "lf." mnemonic ".d $rDD32F,$rAD32F,$rBD32F")
  146. (+ OPC_FLOAT rDD32F rAD32F rBD32F (.sym OPC_FLOAT_REGREG_ (.upcase mnemonic) _D))
  147. (set DF rDD32F (mnemonic DF rAD32F rBD32F))
  148. ()
  149. )
  150. )
  151. )
  152. (float-regreg-insn add)
  153. (float-regreg-insn sub)
  154. (float-regreg-insn mul)
  155. (float-regreg-insn div)
  156. (dni lf-rem-s
  157. "lf.rem.s reg/reg/reg"
  158. ((MACH ORFPX32-MACHS))
  159. "lf.rem.s $rDSF,$rASF,$rBSF"
  160. (+ OPC_FLOAT rDSF rASF rBSF (f-resv-10-3 0) OPC_FLOAT_REGREG_REM_S)
  161. (set SF rDSF (rem SF rASF rBSF))
  162. ()
  163. )
  164. (dni lf-rem-d32
  165. "lf.rem.d regpair/regpair/regpair"
  166. ((MACH ORFPX64A32-MACHS))
  167. "lf.rem.d $rDD32F,$rAD32F,$rBD32F"
  168. (+ OPC_FLOAT rDD32F rAD32F rBD32F OPC_FLOAT_REGREG_REM_D)
  169. (set DF rDD32F (rem DF rAD32F rBD32F))
  170. ()
  171. )
  172. (define-pmacro (get-rounding-mode)
  173. (case INT sys-fpcsr-rm
  174. ((0) 1) ; TIES-TO-EVEN -- I'm assuming this is what is meant by "round to nearest"
  175. ((1) 3) ; TOWARD-ZERO
  176. ((2) 4) ; TOWARD-POSITIVE
  177. (else 5) ; TOWARD-NEGATIVE
  178. )
  179. )
  180. (dni lf-itof-s
  181. "lf.itof.s reg/reg"
  182. ((MACH ORFPX32-MACHS))
  183. "lf.itof.s $rDSF,$rA"
  184. (+ OPC_FLOAT rDSF rA (f-r3 0) (f-resv-10-3 0) OPC_FLOAT_REGREG_ITOF_S)
  185. (set SF rDSF (float SF (get-rounding-mode) (trunc SI rA)))
  186. ()
  187. )
  188. (dni lf-itof-d32
  189. "lf.itof.d regpair/regpair"
  190. ((MACH ORFPX64A32-MACHS))
  191. "lf.itof.d $rDD32F,$rADI"
  192. (+ OPC_FLOAT rDD32F rADI (f-r3 0) (f-resv-8-1 0) OPC_FLOAT_REGREG_ITOF_D)
  193. (set DF rDD32F (float DF (get-rounding-mode) rADI))
  194. ()
  195. )
  196. (dni lf-ftoi-s
  197. "lf.ftoi.s reg/reg"
  198. ((MACH ORFPX32-MACHS))
  199. "lf.ftoi.s $rD,$rASF"
  200. (+ OPC_FLOAT rD rASF (f-r3 0) (f-resv-10-3 0) OPC_FLOAT_REGREG_FTOI_S)
  201. (set WI rD (ext WI (fix SI (get-rounding-mode) rASF)))
  202. ()
  203. )
  204. (dni lf-ftoi-d32
  205. "lf.ftoi.d regpair/regpair"
  206. ((MACH ORFPX64A32-MACHS))
  207. "lf.ftoi.d $rDDI,$rAD32F"
  208. (+ OPC_FLOAT rDDI rAD32F (f-r3 0) (f-resv-8-1 0) OPC_FLOAT_REGREG_FTOI_D)
  209. (set DI rDDI (fix DI (get-rounding-mode) rAD32F))
  210. ()
  211. )
  212. (define-pmacro (float-setflag-insn-base mnemonic rtx-mnemonic symantics)
  213. (begin
  214. (dni (.sym lf-sf mnemonic -s)
  215. (.str "lf.sf" mnemonic ".s reg/reg")
  216. ((MACH ORFPX32-MACHS))
  217. (.str "lf.sf" mnemonic ".s $rASF,$rBSF")
  218. (+ OPC_FLOAT (f-r1 0) rASF rBSF (f-resv-10-3 0) (.sym OPC_FLOAT_REGREG_SF (.upcase mnemonic) _S))
  219. (symantics rtx-mnemonic SF rASF rBSF)
  220. ()
  221. )
  222. (dni (.sym lf-sf mnemonic -d32)
  223. (.str "lf.sf" mnemonic ".d regpair/regpair")
  224. ((MACH ORFPX64A32-MACHS))
  225. (.str "lf.sf" mnemonic ".d $rAD32F,$rBD32F")
  226. (+ OPC_FLOAT (f-r1 0) rAD32F rBD32F (f-resv-10-1 0) (.sym OPC_FLOAT_REGREG_SF (.upcase mnemonic) _D))
  227. (symantics rtx-mnemonic DF rAD32F rBD32F)
  228. ()
  229. )
  230. )
  231. )
  232. (define-pmacro (float-setflag-symantics mnemonic mode r1 r2)
  233. (set BI sys-sr-f (mnemonic mode r1 r2)))
  234. (define-pmacro (float-setflag-insn mnemonic)
  235. (float-setflag-insn-base mnemonic mnemonic float-setflag-symantics))
  236. (define-pmacro (float-setflag-unordered-cmp-symantics mnemonic mode r1 r2)
  237. (set BI sys-sr-f (or (unordered mode r1 r2)
  238. (mnemonic mode r1 r2))))
  239. (define-pmacro (float-setflag-unordered-symantics mnemonic mode r1 r2)
  240. (set BI sys-sr-f (unordered mode r1 r2)))
  241. (define-pmacro (float-setflag-unordered-insn mnemonic)
  242. (float-setflag-insn-base (.str "u" mnemonic)
  243. mnemonic
  244. float-setflag-unordered-cmp-symantics))
  245. (float-setflag-insn eq)
  246. (float-setflag-insn ne)
  247. (float-setflag-insn ge)
  248. (float-setflag-insn gt)
  249. (float-setflag-insn lt)
  250. (float-setflag-insn le)
  251. (float-setflag-unordered-insn eq)
  252. (float-setflag-unordered-insn ne)
  253. (float-setflag-unordered-insn gt)
  254. (float-setflag-unordered-insn ge)
  255. (float-setflag-unordered-insn lt)
  256. (float-setflag-unordered-insn le)
  257. (float-setflag-insn-base un () float-setflag-unordered-symantics)
  258. (dni lf-madd-s
  259. "lf.madd.s reg/reg/reg"
  260. ((MACH ORFPX32-MACHS))
  261. "lf.madd.s $rDSF,$rASF,$rBSF"
  262. (+ OPC_FLOAT rDSF rASF rBSF (f-resv-10-3 0) OPC_FLOAT_REGREG_MADD_S)
  263. (set SF rDSF (add SF (mul SF rASF rBSF) rDSF))
  264. ()
  265. )
  266. (dni lf-madd-d32
  267. "lf.madd.d regpair/regpair/regpair"
  268. ((MACH ORFPX64A32-MACHS))
  269. "lf.madd.d $rDD32F,$rAD32F,$rBD32F"
  270. (+ OPC_FLOAT rDD32F rAD32F rBD32F OPC_FLOAT_REGREG_MADD_D)
  271. (set DF rDD32F (add DF (mul DF rAD32F rBD32F) rDD32F))
  272. ()
  273. )
  274. (define-pmacro (float-cust-insn cust-num)
  275. (begin
  276. (dni (.sym "lf-cust" cust-num "-s")
  277. (.str "lf.cust" cust-num ".s")
  278. ((MACH ORFPX32-MACHS))
  279. (.str "lf.cust" cust-num ".s $rASF,$rBSF")
  280. (+ OPC_FLOAT (f-resv-25-5 0) rASF rBSF (f-resv-10-3 0) (.sym "OPC_FLOAT_REGREG_CUST" cust-num "_S"))
  281. (nop)
  282. ()
  283. )
  284. (dni (.sym "lf-cust" cust-num "-d32")
  285. (.str "lf.cust" cust-num ".d")
  286. ((MACH ORFPX64A32-MACHS))
  287. (.str "lf.cust" cust-num ".d")
  288. (+ OPC_FLOAT (f-resv-25-5 0) rAD32F rBD32F (f-resv-10-1 0) (.sym "OPC_FLOAT_REGREG_CUST" cust-num "_D"))
  289. (nop)
  290. ()
  291. )
  292. )
  293. )
  294. (float-cust-insn "1")