andb.s 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. # Hitachi H8 testcase 'and.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. # and.b #xx:8, rd ; e rd xxxxxxxx
  13. # and.b #xx:8, @erd ; 7 d rd ???? e ???? xxxxxxxx
  14. # and.b #xx:8, @erd+ ; 0 1 7 4 6 c rd 1??? e ???? xxxxxxxx
  15. # and.b #xx:8, @erd- ; 0 1 7 6 6 c rd 1??? e ???? xxxxxxxx
  16. # and.b #xx:8, @+erd ; 0 1 7 5 6 c rd 1??? e ???? xxxxxxxx
  17. # and.b #xx:8, @-erd ; 0 1 7 7 6 c rd 1??? e ???? xxxxxxxx
  18. # and.b rs, rd ; 1 6 rs rd
  19. # and.b reg8, @erd ; 7 d rd ???? 1 6 rs ????
  20. # and.b reg8, @erd+ ; 0 1 7 9 8 rd 6 rs
  21. # and.b reg8, @erd- ; 0 1 7 9 a rd 6 rs
  22. # and.b reg8, @+erd ; 0 1 7 9 9 rd 6 rs
  23. # and.b reg8, @-erd ; 0 1 7 9 b rd 6 rs
  24. #
  25. # andc #xx:8, ccr ; 0 6 xxxxxxxx
  26. # andc #xx:8, exr ; 0 1 4 1 0 6 xxxxxxxx
  27. # Coming soon:
  28. # ...
  29. .data
  30. pre_byte: .byte 0
  31. byte_dest: .byte 0xa5
  32. post_byte: .byte 0
  33. start
  34. and_b_imm8_reg8:
  35. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  36. ;; fixme set ccr
  37. ;; and.b #xx:8,Rd
  38. and.b #0xaa, r0l ; Immediate 8-bit operand
  39. ;; fixme test ccr ; H=0 N=1 Z=0 V=0 C=0
  40. test_h_gr16 0xa5a0 r0 ; and result: a5 & aa
  41. .if (sim_cpu) ; non-zero means h8300h, s, or sx
  42. test_h_gr32 0xa5a5a5a0 er0 ; and result: a5 & aa
  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. and_b_imm8_rdind:
  53. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  54. set_ccr_zero
  55. ;; and.b #xx:8,@eRd
  56. mov #byte_dest, er0
  57. and.b #0xaa:8, @er0 ; Immediate 8-bit src, reg indirect dst
  58. ;;; .word 0x7d00
  59. ;;; .word 0xe0aa
  60. test_carry_clear ; H=0 N=1 Z=0 V=0 C=0
  61. test_ovf_clear
  62. test_zero_clear
  63. test_neg_set
  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 and to memory.
  73. sub.b r0l, r0l
  74. mov.b @byte_dest, r0l
  75. cmp.b #0xa0, r0l
  76. beq .L1
  77. fail
  78. .L1:
  79. and_b_imm8_rdpostinc:
  80. mov #byte_dest, er0
  81. mov.b #0xa5, r1l
  82. mov.b r1l, @er0
  83. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  84. set_ccr_zero
  85. ;; and.b #xx:8,@eRd+
  86. mov #byte_dest, er0
  87. and.b #0x55:8, @er0+ ; Immediate 8-bit src, reg post-incr dest
  88. ;;; .word 0x0174
  89. ;;; .word 0x6c08
  90. ;;; .word 0xe055
  91. test_carry_clear ; H=0 N=0 Z=0 V=0 C=0
  92. test_ovf_clear
  93. test_zero_clear
  94. test_neg_clear
  95. test_h_gr32 post_byte, er0 ; er0 contains address plus one
  96. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  97. test_gr_a5a5 2
  98. test_gr_a5a5 3
  99. test_gr_a5a5 4
  100. test_gr_a5a5 5
  101. test_gr_a5a5 6
  102. test_gr_a5a5 7
  103. ;; Now check the result of the and to memory.
  104. sub.b r0l, r0l
  105. mov.b @byte_dest, r0l
  106. cmp.b #0x05, r0l
  107. beq .L2
  108. fail
  109. .L2:
  110. ;; special case same register
  111. mov.l #byte_dest, er0
  112. mov.b @er0, r1h
  113. mov.b r0l, r1l
  114. and.b r0l, @er0+
  115. inc.b r1l
  116. and.b r1h, r1l
  117. mov.b @byte_dest, r0l
  118. cmp.b r1l, r0l
  119. beq .L22
  120. fail
  121. .L22:
  122. and_b_imm8_rdpostdec:
  123. mov #byte_dest, er0
  124. mov.b #0xa5, r1l
  125. mov.b r1l, @er0
  126. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  127. set_ccr_zero
  128. ;; and.b #xx:8,@eRd-
  129. mov #byte_dest, er0
  130. and.b #0xaa:8, @er0- ; Immediate 8-bit src, reg post-decr dest
  131. ;;; .word 0x0176
  132. ;;; .word 0x6c08
  133. ;;; .word 0xe0aa
  134. test_carry_clear ; H=0 N=1 Z=0 V=0 C=0
  135. test_ovf_clear
  136. test_zero_clear
  137. test_neg_set
  138. test_h_gr32 pre_byte, er0 ; er0 contains address minus one
  139. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  140. test_gr_a5a5 2
  141. test_gr_a5a5 3
  142. test_gr_a5a5 4
  143. test_gr_a5a5 5
  144. test_gr_a5a5 6
  145. test_gr_a5a5 7
  146. ;; Now check the result of the and to memory.
  147. sub.b r0l, r0l
  148. mov.b @byte_dest, r0l
  149. cmp.b #0xa0, r0l
  150. beq .L3
  151. fail
  152. .L3:
  153. ;; special case same register
  154. mov.l #byte_dest, er0
  155. mov.b @er0, r1h
  156. mov.b r0l, r1l
  157. and.b r0l, @er0-
  158. dec.b r1l
  159. and.b r1h, r1l
  160. mov.b @byte_dest, r0l
  161. cmp.b r1l, r0l
  162. beq .L23
  163. fail
  164. .L23:
  165. and_b_imm8_rdpreinc:
  166. mov #byte_dest, er0
  167. mov.b #0xa5, r1l
  168. mov.b r1l, @er0
  169. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  170. set_ccr_zero
  171. ;; and.b #xx:8,@+eRd
  172. mov #pre_byte, er0
  173. and.b #0x55:8, @+er0 ; Immediate 8-bit src, reg pre-incr dest
  174. ;;; .word 0x0175
  175. ;;; .word 0x6c08
  176. ;;; .word 0xe055
  177. test_carry_clear ; H=0 N=0 Z=0 V=0 C=0
  178. test_ovf_clear
  179. test_zero_clear
  180. test_neg_clear
  181. test_h_gr32 byte_dest, er0 ; er0 contains destination address
  182. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  183. test_gr_a5a5 2
  184. test_gr_a5a5 3
  185. test_gr_a5a5 4
  186. test_gr_a5a5 5
  187. test_gr_a5a5 6
  188. test_gr_a5a5 7
  189. ;; Now check the result of the and to memory.
  190. sub.b r0l, r0l
  191. mov.b @byte_dest, r0l
  192. cmp.b #0x05, r0l
  193. beq .L4
  194. fail
  195. .L4:
  196. ;; special case same register
  197. mov.l #pre_byte, er0
  198. mov.b @byte_dest, r1h
  199. mov.b r0l, r1l
  200. and.b r0l, @+er0
  201. inc.b r1l
  202. and.b r1h, r1l
  203. mov.b @byte_dest, r0l
  204. cmp.b r1l, r0l
  205. beq .L24
  206. fail
  207. .L24:
  208. and_b_imm8_rdpredec:
  209. mov #byte_dest, er0
  210. mov.b #0xa5, r1l
  211. mov.b r1l, @er0
  212. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  213. set_ccr_zero
  214. ;; and.b #xx:8,@-eRd
  215. mov #post_byte, er0
  216. and.b #0xaa:8, @-er0 ; Immediate 8-bit src, reg pre-decr dest
  217. ;;; .word 0x0177
  218. ;;; .word 0x6c08
  219. ;;; .word 0xe0aa
  220. test_carry_clear ; H=0 N=1 Z=0 V=0 C=0
  221. test_ovf_clear
  222. test_zero_clear
  223. test_neg_set
  224. test_h_gr32 byte_dest, er0 ; er0 contains destination address
  225. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  226. test_gr_a5a5 2
  227. test_gr_a5a5 3
  228. test_gr_a5a5 4
  229. test_gr_a5a5 5
  230. test_gr_a5a5 6
  231. test_gr_a5a5 7
  232. ;; Now check the result of the and to memory.
  233. sub.b r0l, r0l
  234. mov.b @byte_dest, r0l
  235. cmp.b #0xa0, r0l
  236. beq .L5
  237. fail
  238. .L5:
  239. ;; special case same register
  240. mov.l #post_byte, er0
  241. mov.b @byte_dest, r1h
  242. mov.b r0l, r1l
  243. and.b r0l, @-er0
  244. dec.b r1l
  245. and.b r1h, r1l
  246. mov.b @byte_dest, r0l
  247. cmp.b r1l, r0l
  248. beq .L25
  249. fail
  250. .L25:
  251. .endif ; h8sx
  252. and_b_reg8_reg8:
  253. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  254. ;; fixme set ccr
  255. ;; and.b Rs,Rd
  256. mov.b #0xaa, r0h
  257. and.b r0h, r0l ; Register operand
  258. ;; fixme test ccr ; H=0 N=1 Z=0 V=0 C=0
  259. test_h_gr16 0xaaa0 r0 ; and result: a5 & aa
  260. .if (sim_cpu) ; non-zero means h8300h, s, or sx
  261. test_h_gr32 0xa5a5aaa0 er0 ; and result: a5 & aa
  262. .endif
  263. test_gr_a5a5 1 ; Make sure other general regs not disturbed
  264. test_gr_a5a5 2
  265. test_gr_a5a5 3
  266. test_gr_a5a5 4
  267. test_gr_a5a5 5
  268. test_gr_a5a5 6
  269. test_gr_a5a5 7
  270. .if (sim_cpu == h8sx)
  271. and_b_reg8_rdind:
  272. mov #byte_dest, er0
  273. mov.b #0xa5, r1l
  274. mov.b r1l, @er0
  275. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  276. set_ccr_zero
  277. ;; and.b rs8,@eRd ; And to register indirect
  278. mov #byte_dest, er0
  279. mov #0x55, r1l
  280. and.b r1l, @er0 ; reg8 src, reg indirect dest
  281. ;;; .word 0x7d00
  282. ;;; .word 0x1690
  283. test_carry_clear ; H=0 N=0 Z=0 V=0 C=0
  284. test_ovf_clear
  285. test_zero_clear
  286. test_neg_clear
  287. test_h_gr32 byte_dest er0 ; er0 still contains address
  288. test_h_gr32 0xa5a5a555 er1 ; er1 has the test load
  289. test_gr_a5a5 2 ; Make sure other general regs not disturbed
  290. test_gr_a5a5 3
  291. test_gr_a5a5 4
  292. test_gr_a5a5 5
  293. test_gr_a5a5 6
  294. test_gr_a5a5 7
  295. ;; Now check the result of the and to memory.
  296. sub.b r0l, r0l
  297. mov.b @byte_dest, r0l
  298. cmp.b #0x05, r0l
  299. beq .L6
  300. fail
  301. .L6:
  302. and_b_reg8_rdpostinc:
  303. mov #byte_dest, er0
  304. mov.b #0xa5, r1l
  305. mov.b r1l, @er0
  306. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  307. set_ccr_zero
  308. ;; and.b rs8,@eRd+ ; And to register post-incr
  309. mov #byte_dest, er0
  310. mov #0xaa, r1l
  311. and.b r1l, @er0+ ; reg8 src, reg post-incr dest
  312. ;;; .word 0x0179
  313. ;;; .word 0x8069
  314. test_carry_clear ; H=0 N=1 Z=0 V=0 C=0
  315. test_ovf_clear
  316. test_zero_clear
  317. test_neg_set
  318. test_h_gr32 post_byte er0 ; er0 contains address plus one
  319. test_h_gr32 0xa5a5a5aa er1 ; er1 has the test load
  320. test_gr_a5a5 2 ; Make sure other general regs not disturbed
  321. test_gr_a5a5 3
  322. test_gr_a5a5 4
  323. test_gr_a5a5 5
  324. test_gr_a5a5 6
  325. test_gr_a5a5 7
  326. ;; Now check the result of the and to memory.
  327. sub.b r0l, r0l
  328. mov.b @byte_dest, r0l
  329. cmp.b #0xa0, r0l
  330. beq .L7
  331. fail
  332. .L7:
  333. and_b_reg8_rdpostdec:
  334. mov #byte_dest, er0
  335. mov.b #0xa5, r1l
  336. mov.b r1l, @er0
  337. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  338. set_ccr_zero
  339. ;; and.b rs8,@eRd- ; And to register post-decr
  340. mov #byte_dest, er0
  341. mov #0x55, r1l
  342. and.b r1l, @er0- ; reg8 src, reg post-decr dest
  343. ;;; .word 0x0179
  344. ;;; .word 0xa069
  345. test_carry_clear ; H=0 N=0 Z=0 V=0 C=0
  346. test_ovf_clear
  347. test_zero_clear
  348. test_neg_clear
  349. test_h_gr32 pre_byte er0 ; er0 contains address minus one
  350. test_h_gr32 0xa5a5a555 er1 ; er1 has the test load
  351. test_gr_a5a5 2 ; Make sure other general regs not disturbed
  352. test_gr_a5a5 3
  353. test_gr_a5a5 4
  354. test_gr_a5a5 5
  355. test_gr_a5a5 6
  356. test_gr_a5a5 7
  357. ;; Now check the result of the and to memory.
  358. sub.b r0l, r0l
  359. mov.b @byte_dest, r0l
  360. cmp.b #0x05, r0l
  361. beq .L8
  362. fail
  363. .L8:
  364. and_b_reg8_rdpreinc:
  365. mov #byte_dest, er0
  366. mov.b #0xa5, r1l
  367. mov.b r1l, @er0
  368. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  369. set_ccr_zero
  370. ;; and.b rs8,@+eRd ; And to register post-incr
  371. mov #pre_byte, er0
  372. mov #0xaa, r1l
  373. and.b r1l, @+er0 ; reg8 src, reg post-incr dest
  374. ;;; .word 0x0179
  375. ;;; .word 0x9069
  376. test_carry_clear ; H=0 N=1 Z=0 V=0 C=0
  377. test_ovf_clear
  378. test_zero_clear
  379. test_neg_set
  380. test_h_gr32 byte_dest er0 ; er0 contains destination address
  381. test_h_gr32 0xa5a5a5aa er1 ; er1 has the test load
  382. test_gr_a5a5 2 ; Make sure other general regs not disturbed
  383. test_gr_a5a5 3
  384. test_gr_a5a5 4
  385. test_gr_a5a5 5
  386. test_gr_a5a5 6
  387. test_gr_a5a5 7
  388. ;; Now check the result of the and to memory.
  389. sub.b r0l, r0l
  390. mov.b @byte_dest, r0l
  391. cmp.b #0xa0, r0l
  392. beq .L9
  393. fail
  394. .L9:
  395. and_b_reg8_rdpredec:
  396. mov #byte_dest, er0
  397. mov.b #0xa5, r1l
  398. mov.b r1l, @er0
  399. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  400. set_ccr_zero
  401. ;; and.b rs8,@-eRd ; And to register post-decr
  402. mov #post_byte, er0
  403. mov #0x55, r1l
  404. and.b r1l, @-er0 ; reg8 src, reg post-decr dest
  405. ;;; .word 0x0179
  406. ;;; .word 0xb069
  407. test_carry_clear ; H=0 N=0 Z=0 V=0 C=0
  408. test_ovf_clear
  409. test_zero_clear
  410. test_neg_clear
  411. test_h_gr32 byte_dest er0 ; er0 contains destination address
  412. test_h_gr32 0xa5a5a555 er1 ; er1 has the test load
  413. test_gr_a5a5 2 ; Make sure other general regs not disturbed
  414. test_gr_a5a5 3
  415. test_gr_a5a5 4
  416. test_gr_a5a5 5
  417. test_gr_a5a5 6
  418. test_gr_a5a5 7
  419. ;; Now check the result of the and to memory.
  420. sub.b r0l, r0l
  421. mov.b @byte_dest, r0l
  422. cmp.b #0x05, r0l
  423. beq .L10
  424. fail
  425. .L10:
  426. .endif ; h8sx
  427. andc_imm8_ccr:
  428. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  429. set_ccr_zero
  430. ;; andc #xx:8,ccr
  431. set_ccr 0xff
  432. test_neg_set
  433. andc #0xf7, ccr ; Immediate 8-bit operand (neg flag)
  434. test_neg_clear
  435. test_zero_set
  436. andc #0xfb, ccr ; Immediate 8-bit operand (zero flag)
  437. test_zero_clear
  438. test_ovf_set
  439. andc #0xfd, ccr ; Immediate 8-bit operand (overflow flag)
  440. test_ovf_clear
  441. test_carry_set
  442. andc #0xfe, ccr ; Immediate 8-bit operand (carry flag)
  443. test_carry_clear
  444. test_gr_a5a5 0 ; Make sure other general regs not disturbed
  445. test_gr_a5a5 1
  446. test_gr_a5a5 2
  447. test_gr_a5a5 3
  448. test_gr_a5a5 4
  449. test_gr_a5a5 5
  450. test_gr_a5a5 6
  451. test_gr_a5a5 7
  452. .if (sim_cpu == h8300s || sim_cpu == h8sx) ; Earlier versions, no exr
  453. andc_imm8_exr:
  454. set_grs_a5a5 ; Fill all general regs with a fixed pattern
  455. ldc #0xff, exr
  456. stc exr, r0l
  457. test_h_gr8 0x87, r0l
  458. ;; andc #xx:8,exr
  459. set_ccr_zero
  460. andc #0x7f, exr
  461. test_cc_clear
  462. stc exr, r0l
  463. test_h_gr8 0x7, r0l
  464. andc #0x3, exr
  465. stc exr, r0l
  466. test_h_gr8 0x3, r0l
  467. andc #0x1, exr
  468. stc exr, r0l
  469. test_h_gr8 0x1, r0l
  470. andc #0x0, exr
  471. stc exr, r0l
  472. test_h_gr8 0x0, r0l
  473. test_h_gr32 0xa5a5a500 er0
  474. test_gr_a5a5 1
  475. test_gr_a5a5 2
  476. test_gr_a5a5 3
  477. test_gr_a5a5 4
  478. test_gr_a5a5 5
  479. test_gr_a5a5 6
  480. test_gr_a5a5 7
  481. .endif ; not h8300 or h8300h
  482. pass
  483. exit 0