xorb.s 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. # Hitachi H8 testcase 'xor.b'
  2. # mach(): all
  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. # Instructions tested:
  12. # xor.b #xx:8, rd ; d rd xxxxxxxx
  13. # xor.b #xx:8, @erd ; 7 d rd ???? d ???? xxxxxxxx
  14. # xor.b #xx:8, @erd+ ; 0 1 7 4 6 c rd 1??? d ???? xxxxxxxx
  15. # xor.b #xx:8, @erd- ; 0 1 7 6 6 c rd 1??? d ???? xxxxxxxx
  16. # xor.b #xx:8, @+erd ; 0 1 7 5 6 c rd 1??? d ???? xxxxxxxx
  17. # xor.b #xx:8, @-erd ; 0 1 7 7 6 c rd 1??? d ???? xxxxxxxx
  18. # xor.b rs, rd ; 1 5 rs rd
  19. # xor.b reg8, @erd ; 7 d rd ???? 1 5 rs ????
  20. # xor.b reg8, @erd+ ; 0 1 7 9 8 rd 5 rs
  21. # xor.b reg8, @erd- ; 0 1 7 9 a rd 5 rs
  22. # xor.b reg8, @+erd ; 0 1 7 9 9 rd 5 rs
  23. # xor.b reg8, @-erd ; 0 1 7 9 b rd 5 rs
  24. #
  25. # xorc #xx:8, ccr ;
  26. # xorc #xx:8, exr ;
  27. # Coming soon:
  28. # ...
  29. .data
  30. pre_byte: .byte 0
  31. byte_dest: .byte 0xa5
  32. post_byte: .byte 0
  33. start
  34. xor_b_imm8_reg:
  35. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  36. ;; fixme set ccr
  37. ;; xor.b #xx:8,Rd
  38. xor.b #0xff, r0l ; Immediate 8-bit operand
  39. ;; fixme test ccr ; H=0 N=1 Z=0 V=0 C=0
  40. test_h_gr16 0xa55a r0 ; xor result: a5 ^ ff
  41. .if (sim_cpu) ; non-zero means h8300h, s, or sx
  42. test_h_gr32 0xa5a5a55a er0 ; xor result: a5 ^ ff
  43. .endif
  44. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  45. test_gr_a5a5 2
  46. test_gr_a5a5 3
  47. test_gr_a5a5 4
  48. test_gr_a5a5 5
  49. test_gr_a5a5 6
  50. test_gr_a5a5 7
  51. .if (sim_cpu == h8sx)
  52. xor_b_imm8_rdind:
  53. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  54. set_ccr_zero
  55. ;; xor.b #xx:8,@eRd
  56. mov #byte_dest, er0
  57. xor.b #0xff:8, @er0 ; Immediate 8-bit src, reg indirect dst
  58. ;;; .word 0x7d00
  59. ;;; .word 0xd0ff
  60. test_carry_clear ; H=0 N=0 Z=0 V=0 C=0
  61. test_ovf_clear
  62. test_zero_clear
  63. test_neg_clear
  64. test_h_gr32 byte_dest, er0 ; er0 still contains address
  65. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  66. test_gr_a5a5 2
  67. test_gr_a5a5 3
  68. test_gr_a5a5 4
  69. test_gr_a5a5 5
  70. test_gr_a5a5 6
  71. test_gr_a5a5 7
  72. ;; Now check the result of the xor to memory.
  73. sub.b r0l, r0l
  74. mov.b @byte_dest, r0l
  75. cmp.b #0x5a, r0l
  76. beq .L1
  77. fail
  78. .L1:
  79. xor_b_imm8_postinc:
  80. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  81. set_ccr_zero
  82. ;; xor.b #xx:8,@eRd+
  83. mov #byte_dest, er0
  84. xor.b #0xff:8, @er0+ ; Immediate 8-bit src, reg indirect dst
  85. ;;; .word 0x0174
  86. ;;; .word 0x6c08
  87. ;;; .word 0xd0ff
  88. test_carry_clear ; H=0 N=1 Z=0 V=0 C=0
  89. test_ovf_clear
  90. test_zero_clear
  91. test_neg_set
  92. test_h_gr32 post_byte, er0 ; er0 contains address plus one
  93. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  94. test_gr_a5a5 2
  95. test_gr_a5a5 3
  96. test_gr_a5a5 4
  97. test_gr_a5a5 5
  98. test_gr_a5a5 6
  99. test_gr_a5a5 7
  100. ;; Now check the result of the xor to memory.
  101. sub.b r0l, r0l
  102. mov.b @byte_dest, r0l
  103. cmp.b #0xa5, r0l
  104. beq .L2
  105. fail
  106. .L2:
  107. xor_b_imm8_rdpostdec:
  108. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  109. set_ccr_zero
  110. ;; xor.b #xx:8,@eRd-
  111. mov #byte_dest, er0
  112. xor.b #0xff:8, @er0- ; Immediate 8-bit src, reg indirect dst
  113. ;;; .word 0x0176
  114. ;;; .word 0x6c08
  115. ;;; .word 0xd0ff
  116. test_carry_clear ; H=0 N=0 Z=0 V=0 C=0
  117. test_ovf_clear
  118. test_zero_clear
  119. test_neg_clear
  120. test_h_gr32 pre_byte, er0 ; er0 contains address minus one
  121. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  122. test_gr_a5a5 2
  123. test_gr_a5a5 3
  124. test_gr_a5a5 4
  125. test_gr_a5a5 5
  126. test_gr_a5a5 6
  127. test_gr_a5a5 7
  128. ;; Now check the result of the xor to memory.
  129. sub.b r0l, r0l
  130. mov.b @byte_dest, r0l
  131. cmp.b #0x5a, r0l
  132. beq .L3
  133. fail
  134. .L3:
  135. .endif
  136. xor_b_reg8_reg8:
  137. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  138. ;; fixme set ccr
  139. ;; xor.b Rs,Rd
  140. mov.b #0xff, r0h
  141. xor.b r0h, r0l ; Register operand
  142. ;; fixme test ccr ; H=0 N=1 Z=0 V=0 C=0
  143. test_h_gr16 0xff5a r0 ; xor result: a5 ^ ff
  144. .if (sim_cpu) ; non-zero means h8300h, s, or sx
  145. test_h_gr32 0xa5a5ff5a er0 ; xor result: a5 ^ ff
  146. .endif
  147. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  148. test_gr_a5a5 2
  149. test_gr_a5a5 3
  150. test_gr_a5a5 4
  151. test_gr_a5a5 5
  152. test_gr_a5a5 6
  153. test_gr_a5a5 7
  154. .if (sim_cpu == h8sx)
  155. xor_b_reg8_rdind:
  156. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  157. set_ccr_zero
  158. ;; xor.b rs8,@eRd ; xor reg8 to register indirect
  159. mov #byte_dest, er0
  160. mov #0xff, r1l
  161. xor.b r1l, @er0 ; reg8 src, reg indirect dest
  162. ;;; .word 0x7d00
  163. ;;; .word 0x1590
  164. test_carry_clear ; H=0 N=1 Z=0 V=0 C=0
  165. test_ovf_clear
  166. test_zero_clear
  167. test_neg_set
  168. test_h_gr32 byte_dest er0 ; er0 still contains address
  169. test_h_gr32 0xa5a5a5ff er1 ; er1 has the test load
  170. test_gr_a5a5 2 ; Make sure other general regs not disturbed
  171. test_gr_a5a5 3
  172. test_gr_a5a5 4
  173. test_gr_a5a5 5
  174. test_gr_a5a5 6
  175. test_gr_a5a5 7
  176. ;; Now check the result of the or to memory.
  177. sub.b r0l, r0l
  178. mov.b @byte_dest, r0l
  179. cmp.b #0xa5, r0l
  180. beq .L4
  181. fail
  182. .L4:
  183. xor_b_reg8_rdpostinc:
  184. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  185. set_ccr_zero
  186. ;; xor.b rs8,@eRd+ ; xor reg8 to register post-increment
  187. mov #byte_dest, er0
  188. mov #0xff, r1l
  189. xor.b r1l, @er0+ ; reg8 src, reg post-increment dest
  190. ;;; .word 0x0179
  191. ;;; .word 0x8059
  192. test_carry_clear ; H=0 N=0 Z=0 V=0 C=0
  193. test_ovf_clear
  194. test_zero_clear
  195. test_neg_clear
  196. test_h_gr32 post_byte er0 ; er0 contains address plus one
  197. test_h_gr32 0xa5a5a5ff er1 ; er1 has the test load
  198. test_gr_a5a5 2 ; Make sure other general regs not disturbed
  199. test_gr_a5a5 3
  200. test_gr_a5a5 4
  201. test_gr_a5a5 5
  202. test_gr_a5a5 6
  203. test_gr_a5a5 7
  204. ;; Now check the result of the or to memory.
  205. sub.b r0l, r0l
  206. mov.b @byte_dest, r0l
  207. cmp.b #0x5a, r0l
  208. beq .L5
  209. fail
  210. .L5:
  211. ;; special case same register
  212. mov.l #byte_dest, er0
  213. mov.b r0l, r1l
  214. mov.b @er0, r1h
  215. xor.b r0l, @er0+
  216. inc.b r1l
  217. xor.b r1h, r1l
  218. mov.b @byte_dest, r0l
  219. cmp.b r1l, r0l
  220. beq .L25
  221. fail
  222. .L25:
  223. mov.b r1h, @byte_dest
  224. xor_b_reg8_rdpostdec:
  225. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  226. set_ccr_zero
  227. ;; xor.b rs8,@eRd- ; xor reg8 to register post-decrement
  228. mov #byte_dest, er0
  229. mov #0xff, r1l
  230. xor.b r1l, @er0- ; reg8 src, reg indirect dest
  231. ;;; .word 0x0179
  232. ;;; .word 0xa059
  233. test_carry_clear ; H=0 N=1 Z=0 V=0 C=0
  234. test_ovf_clear
  235. test_zero_clear
  236. test_neg_set
  237. test_h_gr32 pre_byte er0 ; er0 contains address minus one
  238. test_h_gr32 0xa5a5a5ff er1 ; er1 has the test load
  239. test_gr_a5a5 2 ; Make sure other general regs not disturbed
  240. test_gr_a5a5 3
  241. test_gr_a5a5 4
  242. test_gr_a5a5 5
  243. test_gr_a5a5 6
  244. test_gr_a5a5 7
  245. ;; Now check the result of the or to memory.
  246. sub.b r0l, r0l
  247. mov.b @byte_dest, r0l
  248. cmp.b #0xa5, r0l
  249. beq .L6
  250. fail
  251. .L6:
  252. ;; special case same register
  253. mov.l #byte_dest, er0
  254. mov.b r0l, r1l
  255. mov.b @er0, r1h
  256. xor.b r0l, @er0-
  257. dec.b r1l
  258. xor.b r1h, r1l
  259. mov.b @byte_dest, r0l
  260. cmp.b r1l, r0l
  261. beq .L26
  262. fail
  263. .L26:
  264. .endif ; h8sx
  265. xorc_imm8_ccr:
  266. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  267. set_ccr_zero
  268. ;; xorc #xx:8,ccr
  269. test_neg_clear
  270. xorc #0x8, ccr ; Immediate 8-bit operand (neg flag)
  271. test_neg_set
  272. xorc #0x8, ccr
  273. test_neg_clear
  274. test_zero_clear
  275. xorc #0x4, ccr ; Immediate 8-bit operand (zero flag)
  276. test_zero_set
  277. xorc #0x4, ccr
  278. test_zero_clear
  279. test_ovf_clear
  280. xorc #0x2, ccr ; Immediate 8-bit operand (overflow flag)
  281. test_ovf_set
  282. xorc #0x2, ccr
  283. test_ovf_clear
  284. test_carry_clear
  285. xorc #0x1, ccr ; Immediate 8-bit operand (carry flag)
  286. test_carry_set
  287. xorc #0x1, ccr
  288. test_carry_clear
  289. test_gr_a5a5 0 ; Make sure other general regs not disturbed
  290. test_gr_a5a5 1
  291. test_gr_a5a5 2
  292. test_gr_a5a5 3
  293. test_gr_a5a5 4
  294. test_gr_a5a5 5
  295. test_gr_a5a5 6
  296. test_gr_a5a5 7
  297. .if (sim_cpu == h8300s || sim_cpu == h8sx) ; Earlier versions, no exr
  298. xorc_imm8_exr:
  299. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  300. ldc #0, exr
  301. stc exr, r0l
  302. test_h_gr8 0, r0l
  303. set_ccr_zero
  304. ;; xorc #xx:8,exr
  305. xorc #0x80, exr
  306. test_cc_clear
  307. stc exr, r0l
  308. test_h_gr8 0x80, r0l
  309. xorc #0x80, exr
  310. stc exr, r0l
  311. test_h_gr8 0, r0l
  312. xorc #0x4, exr
  313. stc exr, r0l
  314. test_h_gr8 4, r0l
  315. xorc #0x4, exr
  316. stc exr, r0l
  317. test_h_gr8 0, r0l
  318. xorc #0x2, exr ; Immediate 8-bit operand (overflow flag)
  319. stc exr, r0l
  320. test_h_gr8 2, r0l
  321. xorc #0x2, exr
  322. stc exr, r0l
  323. test_h_gr8 0, r0l
  324. xorc #0x1, exr ; Immediate 8-bit operand (carry flag)
  325. stc exr, r0l
  326. test_h_gr8 1, r0l
  327. xorc #0x1, exr
  328. stc exr, r0l
  329. test_h_gr8 0, r0l
  330. test_h_gr32 0xa5a5a500 er0
  331. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  332. test_gr_a5a5 2
  333. test_gr_a5a5 3
  334. test_gr_a5a5 4
  335. test_gr_a5a5 5
  336. test_gr_a5a5 6
  337. test_gr_a5a5 7
  338. .endif ; not h8300 or h8300h
  339. pass
  340. exit 0