hwloop-branch-out.s 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # Blackfin testcase for branching out of the middle of a hardware loop
  2. # mach: bfin
  3. .include "testutils.inc"
  4. .macro test_prep lc:req, sym:req
  5. imm32 P0, \lc
  6. loadsym P1, \sym
  7. R5 = 0;
  8. R6 = 0;
  9. R7 = 0;
  10. LSETUP (1f, 2f) LC0 = P0;
  11. .endm
  12. .macro test_check exp5:req, exp6:req, exp7:req, expLC
  13. imm32 R4, \exp5;
  14. CC = R4 == R5;
  15. IF !CC JUMP 2f;
  16. imm32 R4, \exp6;
  17. CC = R4 == R6;
  18. IF !CC JUMP 2f;
  19. imm32 R4, \exp7;
  20. CC = R4 == R7;
  21. IF !CC JUMP 2f;
  22. R3 = LC0;
  23. imm32 R4, \expLC;
  24. CC = R4 == R3;
  25. IF !CC JUMP 2f;
  26. JUMP 3f;
  27. 2: fail
  28. 3:
  29. .endm
  30. start
  31. mnop;
  32. test_jump_s:
  33. .macro test_jump_s lc:req
  34. test_prep \lc, 3f
  35. 1: JUMP (P1);
  36. R5 += 1;
  37. 2: R6 += 1;
  38. fail
  39. 3: R7 += 1;
  40. test_check 0, 0, 1, \lc
  41. .endm
  42. test_jump_s 0
  43. test_jump_s 1
  44. test_jump_s 2
  45. test_jump_s 10
  46. test_jump_m:
  47. .macro test_jump_m lc:req
  48. test_prep \lc, 3f
  49. 1: R5 += 1;
  50. JUMP (P1);
  51. 2: R6 += 1;
  52. fail
  53. 3: R7 += 1;
  54. test_check 1, 0, 1, \lc
  55. .endm
  56. test_jump_m 0
  57. test_jump_m 1
  58. test_jump_m 2
  59. test_jump_m 10
  60. test_jump_e:
  61. .macro test_jump_e lc:req, lcend:req
  62. test_prep \lc, 3f
  63. 1: R5 += 1;
  64. R6 += 1;
  65. 2: JUMP (P1);
  66. fail
  67. 3: R7 += 1;
  68. test_check 1, 1, 1, \lcend
  69. .endm
  70. test_jump_e 0, 0
  71. test_jump_e 1, 0
  72. test_jump_e 2, 1
  73. test_jump_e 10, 9
  74. test_call_s:
  75. .macro test_call_s lc:req, exp5:req, exp6:req, exp7:req
  76. test_prep \lc, __ret
  77. 1: CALL (P1);
  78. R5 += 1;
  79. 2: R6 += 1;
  80. 3: R7 += 1;
  81. test_check \exp5, \exp6, \exp7, 0
  82. .endm
  83. test_call_s 0, 1, 1, 2
  84. test_call_s 1, 1, 1, 2
  85. test_call_s 2, 2, 2, 3
  86. test_call_s 10, 10, 10, 11
  87. test_call_m:
  88. .macro test_call_m lc:req, exp5:req, exp6:req, exp7:req
  89. test_prep \lc, __ret
  90. 1: R5 += 1;
  91. CALL (P1);
  92. 2: R6 += 1;
  93. 3: R7 += 1;
  94. test_check \exp5, \exp6, \exp7, 0
  95. .endm
  96. test_call_m 0, 1, 1, 2
  97. test_call_m 1, 1, 1, 2
  98. test_call_m 2, 2, 2, 3
  99. test_call_m 10, 10, 10, 11
  100. test_call_e:
  101. .macro test_call_e lc:req, exp5:req, exp6:req, exp7:req
  102. test_prep \lc, __ret
  103. 1: R5 += 1;
  104. R6 += 1;
  105. 2: CALL (P1);
  106. 3: R7 += 1;
  107. test_check \exp5, \exp6, \exp7, 0
  108. .endm
  109. test_call_e 0, 1, 1, 2
  110. test_call_e 1, 1, 1, 2
  111. test_call_e 2, 2, 2, 3
  112. test_call_e 10, 10, 10, 11
  113. pass
  114. __ret:
  115. nop;nop;nop;
  116. R7 += 1;
  117. rts;