m4.s 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // MAC test program.
  2. // Test basic edge values
  3. // SIGNED INTEGER mode
  4. // test ops: "+=" "-=" "=" "NOP"
  5. # mach: bfin
  6. .include "testutils.inc"
  7. start
  8. // load r0=0x80007fff
  9. // load r1=0x80007fff
  10. // load r2=0xf0000000
  11. // load r3=0x0000007f
  12. // load r4=0x00000080
  13. loadsym P0, data0;
  14. R0 = [ P0 ++ ];
  15. R1 = [ P0 ++ ];
  16. R2 = [ P0 ++ ];
  17. R3 = [ P0 ++ ];
  18. R4 = [ P0 ++ ];
  19. // 0x7fff * 0x7fff = 0x003fff0001
  20. A1 = A0 = 0;
  21. A1 += R0.L * R1.L, A0 += R0.L * R1.L (IS);
  22. R6 = A1.w;
  23. R7.L = A1.x;
  24. DBGA ( R6.L , 0x0001 );
  25. DBGA ( R6.H , 0x3fff );
  26. DBGA ( R7.L , 0x0000 );
  27. // 0x8000 * 0x7fff = 0xffc0008000
  28. A1 = A0 = 0;
  29. A1 += R0.H * R1.L, A0 += R0.H * R1.L (IS);
  30. R6 = A1.w;
  31. R7.L = A1.x;
  32. DBGA ( R6.L , 0x8000 );
  33. DBGA ( R6.H , 0xc000 );
  34. DBGA ( R7.L , 0xffff );
  35. // 0x8000 * 0x8000 = 0x0040000000
  36. A1 = A0 = 0;
  37. A1 += R0.H * R1.H, A0 += R0.H * R1.H (IS);
  38. R6 = A1.w;
  39. R7.L = A1.x;
  40. DBGA ( R6.L , 0x0000 );
  41. DBGA ( R6.H , 0x4000 );
  42. DBGA ( R7.L , 0x0000 );
  43. // saturate positive by first loading large value into accums
  44. // expected value is 0x7fffffffff
  45. A1 = A0 = 0;
  46. A1.w = R2;
  47. A1.x = R3.L;
  48. A0.w = R2;
  49. A0.x = R3.L;
  50. A1 += R0.L * R1.L, A0 += R0.L * R1.L (IS);
  51. R6 = A1.w;
  52. R7.L = A1.x;
  53. DBGA ( R6.L , 0xffff );
  54. DBGA ( R6.H , 0xffff );
  55. DBGA ( R7.L , 0x007f );
  56. // saturate negative
  57. // expected value is 0x8000000000
  58. A1 = A0 = 0;
  59. A1.x = R4.L;
  60. A0.x = R4.L;
  61. A1 += R0.L * R1.H, A0 += R0.L * R1.H (IS);
  62. R6 = A1.w;
  63. R7.L = A1.x;
  64. DBGA ( R6.L , 0x0000 );
  65. DBGA ( R6.H , 0x0000 );
  66. DBGA ( R7.L , 0xff80 );
  67. // saturate positive with "-="
  68. // expected value is 0x7fffffffff
  69. A1 = A0 = 0;
  70. A1.w = R2;
  71. A1.x = R3.L;
  72. A0.w = R2;
  73. A0.x = R3.L;
  74. A1 -= R0.H * R1.L, A0 -= R0.H * R1.L (IS);
  75. R6 = A1.w;
  76. R7.L = A1.x;
  77. DBGA ( R6.L , 0xffff );
  78. DBGA ( R6.H , 0xffff );
  79. DBGA ( R7.L , 0x007f );
  80. // saturate negative with "-="
  81. // expected value is 0x8000000000
  82. A1 = A0 = 0;
  83. A1.x = R4.L;
  84. A0.x = R4.L;
  85. A1 -= R0.L * R1.L, A0 -= R0.L * R1.L (IS);
  86. R6 = A1.w;
  87. R7.L = A1.x;
  88. DBGA ( R6.L , 0x0000 );
  89. DBGA ( R6.H , 0x0000 );
  90. DBGA ( R7.L , 0xff80 );
  91. // 0x8000 * 0x8000 = 0xffc0000000 with "-="
  92. A1 = A0 = 0;
  93. A1 -= R0.H * R1.H, A0 -= R0.H * R1.H (IS);
  94. R6 = A1.w;
  95. R7.L = A1.x;
  96. DBGA ( R6.L , 0x0000 );
  97. DBGA ( R6.H , 0xc000 );
  98. DBGA ( R7.L , 0xffff );
  99. pass
  100. .data 0x1000;
  101. data0:
  102. .dw 0x7fff
  103. .dw 0x8000
  104. .dw 0x7fff
  105. .dw 0x8000
  106. .dw 0x0000
  107. .dw 0xf000
  108. .dw 0x007f
  109. .dw 0x0000
  110. .dw 0x0080
  111. .dw 0x0000