mac.s 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. # Hitachi H8 testcase 'mac'
  2. # mach(): h8300s h8sx
  3. # as(h8300): --defsym sim_cpu=0
  4. # as(h8300h): --defsym sim_cpu=1
  5. # as(h8300s): --defsym sim_cpu=2
  6. # as(h8sx): --defsym sim_cpu=3
  7. # ld(h8300h): -m h8300helf
  8. # ld(h8300s): -m h8300self
  9. # ld(h8sx): -m h8300sxelf
  10. .include "testutils.inc"
  11. .data
  12. src1: .word 0
  13. src2: .word 0
  14. array: .word 0x7fff
  15. .word 0x7fff
  16. .word 0x7fff
  17. .word 0x7fff
  18. .word 0x7fff
  19. .word 0x7fff
  20. .word 0x7fff
  21. .word 0x7fff
  22. .word 0x7fff
  23. .word 0x7fff
  24. .word 0x7fff
  25. .word 0x7fff
  26. .word 0x7fff
  27. .word 0x7fff
  28. .word 0x7fff
  29. .word 0x7fff
  30. start
  31. .if (sim_cpu)
  32. _clrmac:
  33. set_grs_a5a5
  34. set_ccr_zero
  35. clrmac
  36. test_cc_clear
  37. test_grs_a5a5
  38. ;; Now see if the mac is actually clear...
  39. stmac mach, er0
  40. test_zero_set
  41. test_neg_clear
  42. test_ovf_clear
  43. test_h_gr32 0 er0
  44. stmac macl, er1
  45. test_zero_set
  46. test_neg_clear
  47. test_ovf_clear
  48. test_h_gr32 0 er1
  49. ld_stmac:
  50. set_grs_a5a5
  51. sub.l er2, er2
  52. set_ccr_zero
  53. ldmac er1, macl
  54. stmac macl, er2
  55. test_ovf_clear
  56. test_carry_clear
  57. ;; neg and zero are undefined
  58. test_h_gr32 0xa5a5a5a5 er2
  59. sub.l er2, er2
  60. set_ccr_zero
  61. ldmac er1, mach
  62. stmac mach, er2
  63. test_ovf_clear
  64. test_carry_clear
  65. ;; neg and zero are undefined
  66. test_h_gr32 0x0001a5 er2
  67. test_gr_a5a5 0 ; Make sure other general regs not disturbed
  68. test_gr_a5a5 1
  69. test_gr_a5a5 3
  70. test_gr_a5a5 4
  71. test_gr_a5a5 5
  72. test_gr_a5a5 6
  73. test_gr_a5a5 7
  74. mac_2x2:
  75. set_grs_a5a5
  76. mov.w #2, r1
  77. mov.w r1, @src1
  78. mov.w #2, r2
  79. mov.w r2, @src2
  80. mov #src1, er1
  81. mov #src2, er2
  82. set_ccr_zero
  83. clrmac
  84. mac @er1+, @er2+
  85. test_cc_clear
  86. test_h_gr32 0xa5a5a5a5 er0
  87. test_h_gr32 src1+2 er1
  88. test_h_gr32 src2+2 er2
  89. test_h_gr32 0xa5a5a5a5 er3
  90. test_h_gr32 0xa5a5a5a5 er4
  91. test_h_gr32 0xa5a5a5a5 er5
  92. test_h_gr32 0xa5a5a5a5 er6
  93. test_h_gr32 0xa5a5a5a5 er7
  94. stmac macl, er0
  95. test_zero_clear
  96. test_neg_clear
  97. test_ovf_clear
  98. test_h_gr32 4 er0
  99. stmac mach, er0
  100. test_zero_clear
  101. test_neg_clear
  102. test_ovf_clear
  103. test_h_gr32 0 er0
  104. mac_same_reg_2x4:
  105. ;; Use same reg for src and dst. Should be incremented twice,
  106. ;; and fetch values from consecutive locations.
  107. set_grs_a5a5
  108. mov.w #2, r1
  109. mov.w r1, @src1
  110. mov.w #4, r2
  111. mov.w r2, @src2
  112. mov #src1, er1
  113. set_ccr_zero
  114. clrmac
  115. mac @er1+, @er1+ ; same register for src and dst
  116. test_cc_clear
  117. test_h_gr32 0xa5a5a5a5 er0
  118. test_h_gr32 src1+4 er1
  119. test_h_gr32 0xa5a50004 er2
  120. test_h_gr32 0xa5a5a5a5 er3
  121. test_h_gr32 0xa5a5a5a5 er4
  122. test_h_gr32 0xa5a5a5a5 er5
  123. test_h_gr32 0xa5a5a5a5 er6
  124. test_h_gr32 0xa5a5a5a5 er7
  125. stmac macl, er0
  126. test_zero_clear
  127. test_neg_clear
  128. test_ovf_clear
  129. test_h_gr32 8 er0
  130. stmac mach, er0
  131. test_zero_clear
  132. test_neg_clear
  133. test_ovf_clear
  134. test_h_gr32 0 er0
  135. mac_0x0:
  136. set_grs_a5a5
  137. mov.w #0, r1
  138. mov.w r1, @src1
  139. mov.w #0, r2
  140. mov.w r2, @src2
  141. mov #src1, er1
  142. mov #src2, er2
  143. set_ccr_zero
  144. clrmac
  145. mac @er1+, @er2+
  146. test_cc_clear
  147. test_h_gr32 0xa5a5a5a5 er0
  148. test_h_gr32 src1+2 er1
  149. test_h_gr32 src2+2 er2
  150. test_h_gr32 0xa5a5a5a5 er3
  151. test_h_gr32 0xa5a5a5a5 er4
  152. test_h_gr32 0xa5a5a5a5 er5
  153. test_h_gr32 0xa5a5a5a5 er6
  154. test_h_gr32 0xa5a5a5a5 er7
  155. stmac macl, er0
  156. test_zero_set ; zero flag is set
  157. test_neg_clear
  158. test_ovf_clear
  159. test_h_gr32 0 er0 ; result is zero
  160. stmac mach, er0
  161. test_zero_set
  162. test_neg_clear
  163. test_ovf_clear
  164. test_h_gr32 0 er0
  165. mac_neg2x2:
  166. set_grs_a5a5
  167. mov.w #-2, r1
  168. mov.w r1, @src1
  169. mov.w #2, r2
  170. mov.w r2, @src2
  171. mov #src1, er1
  172. mov #src2, er2
  173. set_ccr_zero
  174. clrmac
  175. mac @er1+, @er2+
  176. test_cc_clear
  177. test_h_gr32 0xa5a5a5a5 er0
  178. test_h_gr32 src1+2 er1
  179. test_h_gr32 src2+2 er2
  180. test_h_gr32 0xa5a5a5a5 er3
  181. test_h_gr32 0xa5a5a5a5 er4
  182. test_h_gr32 0xa5a5a5a5 er5
  183. test_h_gr32 0xa5a5a5a5 er6
  184. test_h_gr32 0xa5a5a5a5 er7
  185. stmac macl, er0
  186. test_zero_clear
  187. test_neg_set ; neg flag is set
  188. test_ovf_clear
  189. test_h_gr32 -4 er0 ; result is negative
  190. stmac mach, er0
  191. test_zero_clear
  192. test_neg_set
  193. test_ovf_clear
  194. test_h_gr32 -1 er0 ; negative sign extend
  195. mac_array:
  196. ;; Use same reg for src and dst, pointing to an array of shorts
  197. set_grs_a5a5
  198. mov #array, er1
  199. set_ccr_zero
  200. clrmac
  201. mac @er1+, @er1+ ; same register for src and dst
  202. mac @er1+, @er1+ ; repeat 8 times
  203. mac @er1+, @er1+
  204. mac @er1+, @er1+
  205. mac @er1+, @er1+
  206. mac @er1+, @er1+
  207. mac @er1+, @er1+
  208. mac @er1+, @er1+
  209. test_cc_clear
  210. test_h_gr32 0xa5a5a5a5 er0
  211. test_h_gr32 array+32 er1
  212. test_h_gr32 0xa5a5a5a5 er2
  213. test_h_gr32 0xa5a5a5a5 er3
  214. test_h_gr32 0xa5a5a5a5 er4
  215. test_h_gr32 0xa5a5a5a5 er5
  216. test_h_gr32 0xa5a5a5a5 er6
  217. test_h_gr32 0xa5a5a5a5 er7
  218. stmac macl, er0
  219. test_zero_clear
  220. test_neg_clear
  221. test_ovf_clear
  222. test_h_gr32 0xfff80008 er0
  223. stmac mach, er0
  224. test_zero_clear
  225. test_neg_clear
  226. test_ovf_clear
  227. test_h_gr32 1 er0 ; result is greater than 32 bits
  228. .endif
  229. pass
  230. exit 0