cc-alu.S 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. # Blackfin testcase for CC/A0/A1 compares
  2. # mach: bfin
  3. #include "test.h"
  4. .include "testutils.inc"
  5. start
  6. /* Clear ASTAT before test */
  7. #define CHECK_ASTAT(op, exp) ASTAT = R2; CC = A0 op A1; check_astat exp
  8. .macro check_astat exp:req
  9. R5 = ASTAT;
  10. R6 = \exp;
  11. CC = R5 == R6;
  12. IF !CC JUMP 1f;
  13. .endm
  14. .macro _acc_test exp_eq:req, exp_le:req, exp_lt:req
  15. CHECK_ASTAT(==, \exp_eq)
  16. CHECK_ASTAT(<=, \exp_le)
  17. CHECK_ASTAT(<, \exp_lt)
  18. jump 2f;
  19. 1: fail
  20. 2:
  21. .endm
  22. .macro acc_test acc0:req, acc1:req, eq:req, le:req, lt:req
  23. dmm32 A0, \acc0
  24. dmm32 A1, \acc1
  25. _acc_test \eq, \le, \lt
  26. .endm
  27. .macro acc_ex_test a0x:req, a0w:req, a1x:req, a1w:req, eq:req, le:req, lt:req
  28. imm32 R0, \a0w
  29. A0.W = R0;
  30. R0 = \a0x;
  31. A0.X = R0;
  32. imm32 R1, \a1w
  33. A1.W = R1;
  34. R1 = \a1x;
  35. A1.X = R1;
  36. _acc_test \eq, \le, \lt
  37. .endm
  38. # Keep R2 with a value of 0
  39. imm32 R2, 0
  40. #define _EQ _AC0|_CC|_AC0_COPY|_AZ, _AC0|_CC|_AC0_COPY|_AZ, _AC0| _AC0_COPY|_AZ
  41. #define _POS_GT _AN, _CC| _AN, _CC| _AN
  42. #define _POS_LT _AC0| _AC0_COPY , _AC0| _AC0_COPY , _AC0| _AC0_COPY
  43. #define _NEG_GT _AC0| _AC0_COPY|_AN, _AC0|_CC|_AC0_COPY|_AN, _AC0|_CC|_AC0_COPY|_AN
  44. #define _NEG_LT 0, 0, 0
  45. # Simple tests around zero
  46. acc_test 0, 0, _EQ
  47. acc_test 0, 1, _POS_GT
  48. acc_test 0, 10000, _POS_GT
  49. acc_test 1, 0, _POS_LT
  50. acc_test 10000, 0, _POS_LT
  51. acc_test 0, -1, _NEG_LT
  52. acc_test 0, -10000, _NEG_LT
  53. acc_test -1, 0, _NEG_GT
  54. acc_test -10000, 0, _NEG_GT
  55. # Simple positive-only tests
  56. acc_test 1, 1, _EQ
  57. acc_test 10000, 10000, _EQ
  58. acc_test 1, 2, _POS_GT
  59. acc_test 1, 20000, _POS_GT
  60. acc_test 2, 1, _POS_LT
  61. acc_test 20000, 1, _POS_LT
  62. # Simple negative-only tests
  63. acc_test -1, -1, _EQ
  64. acc_test -10000, -10000, _EQ
  65. acc_test -1, -2, _POS_LT
  66. acc_test -1, -20000, _POS_LT
  67. acc_test -2, -1, _POS_GT
  68. acc_test -20000, -1, _POS_GT
  69. # Simple postitive/negative tests
  70. acc_test 1, -1, _NEG_LT
  71. acc_test -1, 1, _NEG_GT
  72. acc_test 1, -10000, _NEG_LT
  73. acc_test -10000, 1, _NEG_GT
  74. acc_test -1, 10000, _NEG_GT
  75. acc_test 10000, -1, _NEG_LT
  76. acc_test -10000, 10000, _NEG_GT
  77. acc_test 10000, -10000, _NEG_LT
  78. # Max boundary limits
  79. #define MAX_POS 0x7f, 0xffffffff
  80. #define MAX_NEG 0x80, 0x00000000
  81. acc_ex_test 0, 0, MAX_POS, _POS_GT
  82. acc_ex_test MAX_POS, 0, 0, _POS_LT
  83. acc_ex_test 0, 1, MAX_POS, _POS_GT
  84. acc_ex_test MAX_POS, 0, 1, _POS_LT
  85. acc_ex_test -1, -1, MAX_POS, _NEG_GT
  86. acc_ex_test MAX_POS, -1, -1, _NEG_LT
  87. acc_ex_test MAX_POS, MAX_POS, _EQ
  88. acc_ex_test 0, 0, MAX_POS, _POS_GT
  89. acc_ex_test MAX_POS, 0, 0, _POS_LT
  90. acc_ex_test 0, 1, MAX_POS, _POS_GT
  91. acc_ex_test MAX_POS, 0, 1, _POS_LT
  92. acc_ex_test -1, -1, MAX_POS, _NEG_GT
  93. acc_ex_test MAX_POS, -1, -1, _NEG_LT
  94. acc_ex_test 0, 0, MAX_NEG, _NEG_LT
  95. acc_ex_test MAX_NEG, 0, 0, _NEG_GT
  96. acc_ex_test 0, 1, MAX_NEG, _NEG_LT
  97. acc_ex_test MAX_NEG, 0, 1, _NEG_GT
  98. acc_ex_test -1, -1, MAX_NEG, _POS_LT
  99. acc_ex_test MAX_NEG, -1, -1, _POS_GT
  100. acc_ex_test MAX_NEG, MAX_NEG, _EQ
  101. acc_ex_test 0, 0, MAX_NEG, _NEG_LT
  102. acc_ex_test MAX_NEG, 0, 0, _NEG_GT
  103. acc_ex_test 0, 1, MAX_NEG, _NEG_LT
  104. acc_ex_test MAX_NEG, 0, 1, _NEG_GT
  105. acc_ex_test -1, -1, MAX_NEG, _POS_LT
  106. acc_ex_test MAX_NEG, -1, -1, _POS_GT
  107. acc_ex_test MAX_POS, MAX_NEG, _NEG_LT
  108. acc_ex_test MAX_NEG, MAX_POS, _NEG_GT
  109. pass