testutils.inc 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. # Support macros for the Hitachi H8 assembly test cases.
  2. ; Set up a minimal machine state
  3. .macro start
  4. .equ h8300, 0
  5. .equ h8300h, 1
  6. .equ h8300s, 2
  7. .equ h8sx, 3
  8. .if (sim_cpu == h8300s)
  9. .h8300s
  10. .else
  11. .if (sim_cpu == h8300h)
  12. .h8300h
  13. .else
  14. .if (sim_cpu == h8sx)
  15. .h8300sx
  16. .endif
  17. .endif
  18. .endif
  19. .text
  20. .align 2
  21. .global _start
  22. _start:
  23. jmp _main
  24. .data
  25. .align 2
  26. .global pass_str
  27. .global fail_str
  28. .global ok_str
  29. .global pass_loc
  30. .global fail_loc
  31. .global ok_loc
  32. pass_str:
  33. .ascii "pass\n"
  34. fail_str:
  35. .ascii "fail\n"
  36. ok_str:
  37. .ascii "ok\n"
  38. pass_loc16:
  39. .word pass_str
  40. pass_loc32:
  41. .long pass_str
  42. fail_loc16:
  43. .word fail_str
  44. fail_loc32:
  45. .long fail_str
  46. ok_loc16:
  47. .word ok_str
  48. ok_loc32:
  49. .long ok_str
  50. .text
  51. .global _write_and_exit
  52. _write_and_exit:
  53. ;ssize_t write(int fd, const void *buf, size_t count);
  54. ;Integer arguments have to be zero extended.
  55. .if (sim_cpu)
  56. #if __INT_MAX__ == 32767
  57. extu.l er0
  58. #endif
  59. .endif
  60. jsr @@0xc7
  61. mov #0, r0
  62. jmp _exit
  63. .global _exit
  64. _exit:
  65. mov.b r0l, r0h
  66. mov.w #0xdead, r1
  67. mov.w #0xbeef, r2
  68. sleep
  69. .global _main
  70. _main:
  71. .endm
  72. ; Exit with an exit code
  73. .macro exit code
  74. mov.w #\code, r0
  75. jmp _exit
  76. .endm
  77. ; Output "pass\n"
  78. .macro pass
  79. mov.w #0, r0 ; fd == stdout
  80. .if (sim_cpu == h8300)
  81. mov.w #pass_str, r1 ; buf == "pass\n"
  82. mov.w #5, r2 ; len == 5
  83. .else
  84. mov.l #pass_str, er1 ; buf == "pass\n"
  85. mov.l #5, er2 ; len == 5
  86. .endif
  87. jmp _write_and_exit
  88. .endm
  89. ; Output "fail\n"
  90. .macro fail
  91. mov.w #0, r0 ; fd == stdout
  92. .if (sim_cpu == h8300)
  93. mov.w #fail_str, r1 ; buf == "fail\n"
  94. mov.w #5, r2 ; len == 5
  95. .else
  96. mov.l #fail_str, er1 ; buf == "fail\n"
  97. mov.l #5, er2 ; len == 5
  98. .endif
  99. jmp _write_and_exit
  100. .endm
  101. ; Load an 8-bit immediate value into a general register
  102. ; (reg must be r0l - r7l or r0h - r7h)
  103. .macro mvi_h_gr8 val reg
  104. mov.b #\val, \reg
  105. .endm
  106. ; Load a 16-bit immediate value into a general register
  107. ; (reg must be r0 - r7)
  108. .macro mvi_h_gr16 val reg
  109. mov.w #\val, \reg
  110. .endm
  111. ; Load a 32-bit immediate value into a general register
  112. ; (reg must be er0 - er7)
  113. .macro mvi_h_gr32 val reg
  114. mov.l #\val, \reg
  115. .endm
  116. ; Test the value of an 8-bit immediate against a general register
  117. ; (reg must be r0l - r7l or r0h - r7h)
  118. .macro test_h_gr8 val reg
  119. cmp.b #\val, \reg
  120. beq .Ltest_gr8\@
  121. fail
  122. .Ltest_gr8\@:
  123. .endm
  124. ; Test the value of a 16-bit immediate against a general register
  125. ; (reg must be r0 - r7)
  126. .macro test_h_gr16 val reg h=h l=l
  127. .if (sim_cpu == h8300)
  128. test_h_gr8 (\val >> 8) \reg\h
  129. test_h_gr8 (\val & 0xff) \reg\l
  130. .else
  131. cmp.w #\val, \reg
  132. beq .Ltest_gr16\@
  133. fail
  134. .Ltest_gr16\@:
  135. .endif
  136. .endm
  137. ; Test the value of a 32-bit immediate against a general register
  138. ; (reg must be er0 - er7)
  139. .macro test_h_gr32 val reg
  140. cmp.l #\val, \reg
  141. beq .Ltest_gr32\@
  142. fail
  143. .Ltest_gr32\@:
  144. .endm
  145. ; Set a general register to the fixed pattern 'a5a5a5a5'
  146. .macro set_gr_a5a5 reg
  147. .if (sim_cpu == 0)
  148. ; h8300
  149. mov.w #0xa5a5, r\reg
  150. .else
  151. mov.l #0xa5a5a5a5, er\reg
  152. .endif
  153. .endm
  154. ; Set all general registers to the fixed pattern 'a5a5a5a5'
  155. .macro set_grs_a5a5
  156. .if (sim_cpu == 0)
  157. ; h8300
  158. mov.w #0xa5a5, r0
  159. mov.w #0xa5a5, r1
  160. mov.w #0xa5a5, r2
  161. mov.w #0xa5a5, r3
  162. mov.w #0xa5a5, r4
  163. mov.w #0xa5a5, r5
  164. mov.w #0xa5a5, r6
  165. mov.w #0xa5a5, r7
  166. .else
  167. mov.l #0xa5a5a5a5, er0
  168. mov.l #0xa5a5a5a5, er1
  169. mov.l #0xa5a5a5a5, er2
  170. mov.l #0xa5a5a5a5, er3
  171. mov.l #0xa5a5a5a5, er4
  172. mov.l #0xa5a5a5a5, er5
  173. mov.l #0xa5a5a5a5, er6
  174. mov.l #0xa5a5a5a5, er7
  175. .endif
  176. .endm
  177. ; Test that a general register contains the fixed pattern 'a5a5a5a5'
  178. .macro test_gr_a5a5 reg
  179. .if (sim_cpu == 0)
  180. ; h8300
  181. test_h_gr16 0xa5a5 r\reg
  182. .else
  183. test_h_gr32 0xa5a5a5a5 er\reg
  184. .endif
  185. .endm
  186. ; Test that all general regs contain the fixed pattern 'a5a5a5a5'
  187. .macro test_grs_a5a5
  188. test_gr_a5a5 0
  189. test_gr_a5a5 1
  190. test_gr_a5a5 2
  191. test_gr_a5a5 3
  192. test_gr_a5a5 4
  193. test_gr_a5a5 5
  194. test_gr_a5a5 6
  195. test_gr_a5a5 7
  196. .endm
  197. ; Set condition code register to an explicit value
  198. .macro set_ccr val
  199. ldc #\val, ccr
  200. .endm
  201. ; Set all condition code flags to zero
  202. .macro set_ccr_zero
  203. ldc #0, ccr
  204. .endm
  205. ; Set carry flag true
  206. .macro set_carry_flag
  207. orc #1, ccr
  208. .endm
  209. ; Clear carry flag
  210. .macro clear_carry_flag
  211. andc 0xfe, ccr
  212. .endm
  213. ; Set zero flag true
  214. .macro set_zero_flag
  215. orc #4, ccr
  216. .endm
  217. ; Clear zero flag
  218. .macro clear_zero_flag
  219. andc 0xfb, ccr
  220. .endm
  221. ; Set neg flag true
  222. .macro set_neg_flag
  223. orc #8, ccr
  224. .endm
  225. ; Clear neg flag
  226. .macro clear_neg_flag
  227. andc 0xf7, ccr
  228. .endm
  229. ; Test that carry flag is clear
  230. .macro test_carry_clear
  231. bcc .Lcc\@
  232. fail ; carry flag not clear
  233. .Lcc\@:
  234. .endm
  235. ; Test that carry flag is set
  236. .macro test_carry_set
  237. bcs .Lcs\@
  238. fail ; carry flag not clear
  239. .Lcs\@:
  240. .endm
  241. ; Test that overflow flag is clear
  242. .macro test_ovf_clear
  243. bvc .Lvc\@
  244. fail ; overflow flag not clear
  245. .Lvc\@:
  246. .endm
  247. ; Test that overflow flag is set
  248. .macro test_ovf_set
  249. bvs .Lvs\@
  250. fail ; overflow flag not clear
  251. .Lvs\@:
  252. .endm
  253. ; Test that zero flag is clear
  254. .macro test_zero_clear
  255. bne .Lne\@
  256. fail ; zero flag not clear
  257. .Lne\@:
  258. .endm
  259. ; Test that zero flag is set
  260. .macro test_zero_set
  261. beq .Leq\@
  262. fail ; zero flag not clear
  263. .Leq\@:
  264. .endm
  265. ; Test that neg flag is clear
  266. .macro test_neg_clear
  267. bpl .Lneg\@
  268. fail ; negative flag not clear
  269. .Lneg\@:
  270. .endm
  271. ; Test that neg flag is set
  272. .macro test_neg_set
  273. bmi .Lneg\@
  274. fail ; negative flag not clear
  275. .Lneg\@:
  276. .endm
  277. ; Test ccr against an explicit value
  278. .macro test_ccr val
  279. .data
  280. tccr\@: .byte 0
  281. .text
  282. mov.b r0l, @tccr\@
  283. stc ccr, r0l
  284. cmp.b #\val, r0l
  285. bne .Ltcc\@
  286. fail
  287. .Ltcc\@:
  288. mov.b @tccr\@, r0l
  289. .endm
  290. ; Test that all (accessable) condition codes are clear
  291. .macro test_cc_clear
  292. test_carry_clear
  293. test_ovf_clear
  294. test_zero_clear
  295. test_neg_clear
  296. ; leaves H, I, U, and UI untested
  297. .endm
  298. ; Compare memory, fail if not equal (h8sx only, len > 0).
  299. .macro memcmp src dst len
  300. mov.l #\src, er5
  301. mov.l #\dst, er6
  302. mov.l #\len, er4
  303. .Lmemcmp_\@:
  304. cmp.b @er5+, @er6+
  305. beq .Lmemcmp2_\@
  306. fail
  307. .Lmemcmp2_\@:
  308. dec.l #1, er4
  309. bne .Lmemcmp_\@
  310. .endm