fp_cond.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * fp_cond.S
  3.  *
  4.  * Copyright Roman Zippel, 1997.  All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, and the entire permission notice in its entirety,
  11.  *    including the disclaimer of warranties.
  12.  * 2. Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in the
  14.  *    documentation and/or other materials provided with the distribution.
  15.  * 3. The name of the author may not be used to endorse or promote
  16.  *    products derived from this software without specific prior
  17.  *    written permission.
  18.  *
  19.  * ALTERNATIVELY, this product may be distributed under the terms of
  20.  * the GNU General Public License, in which case the provisions of the GPL are
  21.  * required INSTEAD OF the above restrictions.  (This clause is
  22.  * necessary due to a potential bad interaction between the GPL and
  23.  * the restrictions contained in a BSD-style copyright.)
  24.  *
  25.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  26.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  27.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  28.  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
  29.  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  30.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  31.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  33.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  34.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  35.  * OF THE POSSIBILITY OF SUCH DAMAGE.
  36.  */
  37. #include "fp_emu.h"
  38. #include "fp_decode.h"
  39. .globl fp_fscc, fp_fbccw, fp_fbccl
  40. #ifdef FPU_EMU_DEBUG
  41. fp_fnop:
  42. printf PDECODE,"fnopn"
  43. jra fp_end
  44. #else
  45. #define fp_fnop fp_end
  46. #endif
  47. fp_fbccw:
  48. tst.w %d2
  49. jeq fp_fnop
  50. printf PDECODE,"fbccw "
  51. fp_get_pc %a0
  52. lea (-2,%a0,%d2.w),%a0
  53. jra 1f
  54. fp_fbccl:
  55. printf PDECODE,"fbccl "
  56. fp_get_pc %a0
  57. move.l %d2,%d0
  58. swap %d0
  59. fp_get_instr_word %d0,fp_err_ua1
  60. lea (-2,%a0,%d0.l),%a0
  61. 1: printf PDECODE,"%x",1,%a0
  62. move.l %d2,%d0
  63. swap %d0
  64. jsr fp_compute_cond
  65. tst.l %d0
  66. jeq 1f
  67. fp_put_pc %a0,1
  68. 1: printf PDECODE,"n"
  69. jra fp_end
  70. fp_fdbcc:
  71. printf PDECODE,"fdbcc "
  72. fp_get_pc %a1 | calculate new pc
  73. fp_get_instr_word %d0,fp_err_ua1
  74. add.w %d0,%a1
  75. fp_decode_addr_reg
  76. printf PDECODE,"d%d,%xn",2,%d0,%a1
  77. swap %d1 | test condition in %d1
  78. tst.w %d1
  79. jne 2f
  80. move.l %d0,%d1
  81. jsr fp_get_data_reg
  82. subq.w #1,%d0
  83. jcs 1f
  84. fp_put_pc %a1,1
  85. 1: jsr fp_put_data_reg
  86. 2: jra fp_end
  87. | set flags for decode macros for fs<cc>
  88. do_fscc=1
  89. do_no_pc_mode=1
  90. fp_fscc:
  91. printf PDECODE,"fscc "
  92. move.l %d2,%d0
  93. jsr fp_compute_cond
  94. move.w %d0,%d1
  95. swap %d1
  96. | decode addressing mode
  97. fp_decode_addr_mode
  98. .long  fp_data, fp_fdbcc
  99. .long  fp_indirect, fp_postinc
  100. .long  fp_predecr, fp_disp16
  101. .long  fp_extmode0, fp_extmode1
  102. | addressing mode: data register direct
  103. fp_data:
  104. fp_mode_data_direct
  105. move.w %d0,%d1 | save register nr
  106. jsr fp_get_data_reg
  107. swap %d1
  108. move.b %d1,%d0
  109. swap %d1
  110. jsr fp_put_data_reg
  111. printf PDECODE,"n"
  112. jra fp_end
  113. fp_indirect:
  114. fp_mode_addr_indirect
  115. jra fp_do_scc
  116. fp_postinc:
  117. fp_mode_addr_indirect_postinc
  118. jra fp_do_scc
  119. fp_predecr:
  120. fp_mode_addr_indirect_predec
  121. jra fp_do_scc
  122. fp_disp16:
  123. fp_mode_addr_indirect_disp16
  124. jra fp_do_scc
  125. fp_extmode0:
  126. fp_mode_addr_indirect_extmode0
  127. jra fp_do_scc
  128. fp_extmode1:
  129. bfextu %d2{#13,#3},%d0
  130. jmp ([0f:w,%pc,%d0*4])
  131. .align 4
  132. 0:
  133. .long fp_absolute_short, fp_absolute_long
  134. .long fp_ill, fp_ill | NOTE: jump here to ftrap.x
  135. .long fp_ill, fp_ill
  136. .long fp_ill, fp_ill
  137. fp_absolute_short:
  138. fp_mode_abs_short
  139. jra fp_do_scc
  140. fp_absolute_long:
  141. fp_mode_abs_long
  142. | jra fp_do_scc
  143. fp_do_scc:
  144. swap %d1
  145. putuser.b %d1,(%a0),fp_err_ua1,%a0
  146. printf PDECODE,"n"
  147. jra fp_end
  148. #define tst_NAN btst #24,%d1
  149. #define tst_Z btst #26,%d1
  150. #define tst_N btst #27,%d1
  151. fp_compute_cond:
  152. move.l (FPD_FPSR,FPDATA),%d1
  153. btst #4,%d0
  154. jeq 1f
  155. tst_NAN
  156. jeq 1f
  157. bset #15,%d1
  158. bset #7,%d1
  159. move.l %d1,(FPD_FPSR,FPDATA)
  160. 1: and.w #0xf,%d0
  161. jmp ([0f:w,%pc,%d0.w*4])
  162. .align 4
  163. 0:
  164. .long fp_f  , fp_eq , fp_ogt, fp_oge
  165. .long fp_olt, fp_ole, fp_ogl, fp_or
  166. .long fp_un , fp_ueq, fp_ugt, fp_uge
  167. .long fp_ult, fp_ule, fp_ne , fp_t
  168. fp_f:
  169. moveq #0,%d0
  170. rts
  171. fp_eq:
  172. moveq #0,%d0
  173. tst_Z
  174. jeq 1f
  175. moveq #-1,%d0
  176. 1: rts
  177. fp_ogt:
  178. moveq #0,%d0
  179. tst_NAN
  180. jne 1f
  181. tst_Z
  182. jne 1f
  183. tst_N
  184. jne 1f
  185. moveq #-1,%d0
  186. 1: rts
  187. fp_oge:
  188. moveq #-1,%d0
  189. tst_Z
  190. jne 2f
  191. tst_NAN
  192. jne 1f
  193. tst_N
  194. jeq 2f
  195. 1: moveq #0,%d0
  196. 2: rts
  197. fp_olt:
  198. moveq #0,%d0
  199. tst_NAN
  200. jne 1f
  201. tst_Z
  202. jne 1f
  203. tst_N
  204. jeq 1f
  205. moveq #-1,%d0
  206. 1: rts
  207. fp_ole:
  208. moveq #-1,%d0
  209. tst_Z
  210. jne 2f
  211. tst_NAN
  212. jne 1f
  213. tst_N
  214. jne 2f
  215. 1: moveq #0,%d0
  216. 2: rts
  217. fp_ogl:
  218. moveq #0,%d0
  219. tst_NAN
  220. jne 1f
  221. tst_Z
  222. jne 1f
  223. moveq #-1,%d0
  224. 1: rts
  225. fp_or:
  226. moveq #0,%d0
  227. tst_NAN
  228. jne 1f
  229. moveq #-1,%d0
  230. 1: rts
  231. fp_un:
  232. moveq #0,%d0
  233. tst_NAN
  234. jeq 1f
  235. moveq #-1,%d0
  236. rts
  237. fp_ueq:
  238. moveq #-1,%d0
  239. tst_NAN
  240. jne 1f
  241. tst_Z
  242. jne 1f
  243. moveq #0,%d0
  244. 1: rts
  245. fp_ugt:
  246. moveq #-1,%d0
  247. tst_NAN
  248. jne 2f
  249. tst_N
  250. jne 1f
  251. tst_Z
  252. jeq 2f
  253. 1: moveq #0,%d0
  254. 2: rts
  255. fp_uge:
  256. moveq #-1,%d0
  257. tst_NAN
  258. jne 1f
  259. tst_Z
  260. jne 1f
  261. tst_N
  262. jeq 1f
  263. moveq #0,%d0
  264. 1: rts
  265. fp_ult:
  266. moveq #-1,%d0
  267. tst_NAN
  268. jne 2f
  269. tst_Z
  270. jne 1f
  271. tst_N
  272. jne 2f
  273. 1: moveq #0,%d0
  274. 2: rts
  275. fp_ule:
  276. moveq #-1,%d0
  277. tst_NAN
  278. jne 1f
  279. tst_Z
  280. jne 1f
  281. tst_N
  282. jne 1f
  283. moveq #0,%d0
  284. 1: rts
  285. fp_ne:
  286. moveq #0,%d0
  287. tst_Z
  288. jne 1f
  289. moveq #-1,%d0
  290. 1: rts
  291. fp_t:
  292. moveq #-1,%d0
  293. rts