c_seq_ex3_ls_brcc_mvp.S 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. //Original:/proj/frio/dv/testcases/core/c_seq_ex3_ls_brcc_mvp/c_seq_ex3_ls_brcc_mvp.dsp
  2. // Spec Reference: sequencer stage ex3 (ldst + brcc + regmv + pushpopmultiple)
  3. # mach: bfin
  4. # sim: --environment operating
  5. #include "test.h"
  6. .include "testutils.inc"
  7. start
  8. include(std.inc)
  9. include(selfcheck.inc)
  10. include(gen_int.inc)
  11. INIT_R_REGS(0);
  12. INIT_P_REGS(0);
  13. INIT_I_REGS(0); // initialize the dsp address regs
  14. INIT_M_REGS(0);
  15. INIT_L_REGS(0);
  16. INIT_B_REGS(0);
  17. //CHECK_INIT(p5, 0xe0000000);
  18. include(symtable.inc)
  19. CHECK_INIT_DEF(p5);
  20. #ifndef STACKSIZE
  21. #define STACKSIZE 0x10
  22. #endif
  23. #ifndef EVT
  24. #define EVT 0xFFE02000
  25. #endif
  26. #ifndef EVT15
  27. #define EVT15 0xFFE0203C
  28. #endif
  29. #ifndef EVT_OVERRIDE
  30. #define EVT_OVERRIDE 0xFFE02100
  31. #endif
  32. #ifndef ITABLE
  33. #define ITABLE DATA_ADDR_1
  34. #endif
  35. GEN_INT_INIT(ITABLE) // set location for interrupt table
  36. //
  37. // Reset/Bootstrap Code
  38. // (Here we should set the processor operating modes, initialize registers,
  39. //
  40. BOOT:
  41. // in reset mode now
  42. LD32_LABEL(sp, KSTACK); // setup the stack pointer
  43. FP = SP; // and frame pointer
  44. LD32(p0, EVT); // Setup Event Vectors and Handlers
  45. LD32_LABEL(r0, EHANDLE); // Emulation Handler (Int0)
  46. [ P0 ++ ] = R0;
  47. LD32_LABEL(r0, RHANDLE); // Reset Handler (Int1)
  48. [ P0 ++ ] = R0;
  49. LD32_LABEL(r0, NHANDLE); // NMI Handler (Int2)
  50. [ P0 ++ ] = R0;
  51. LD32_LABEL(r0, XHANDLE); // Exception Handler (Int3)
  52. [ P0 ++ ] = R0;
  53. [ P0 ++ ] = R0; // IVT4 not used
  54. LD32_LABEL(r0, HWHANDLE); // HW Error Handler (Int5)
  55. [ P0 ++ ] = R0;
  56. LD32_LABEL(r0, THANDLE); // Timer Handler (Int6)
  57. [ P0 ++ ] = R0;
  58. LD32_LABEL(r0, I7HANDLE); // IVG7 Handler
  59. [ P0 ++ ] = R0;
  60. LD32_LABEL(r0, I8HANDLE); // IVG8 Handler
  61. [ P0 ++ ] = R0;
  62. LD32_LABEL(r0, I9HANDLE); // IVG9 Handler
  63. [ P0 ++ ] = R0;
  64. LD32_LABEL(r0, I10HANDLE);// IVG10 Handler
  65. [ P0 ++ ] = R0;
  66. LD32_LABEL(r0, I11HANDLE);// IVG11 Handler
  67. [ P0 ++ ] = R0;
  68. LD32_LABEL(r0, I12HANDLE);// IVG12 Handler
  69. [ P0 ++ ] = R0;
  70. LD32_LABEL(r0, I13HANDLE);// IVG13 Handler
  71. [ P0 ++ ] = R0;
  72. LD32_LABEL(r0, I14HANDLE);// IVG14 Handler
  73. [ P0 ++ ] = R0;
  74. LD32_LABEL(r0, I15HANDLE);// IVG15 Handler
  75. [ P0 ++ ] = R0;
  76. LD32(p0, EVT_OVERRIDE);
  77. R0 = 0;
  78. [ P0 ++ ] = R0;
  79. R0 = -1; // Change this to mask interrupts (*)
  80. [ P0 ] = R0; // IMASK
  81. CSYNC;
  82. DUMMY:
  83. R0 = 0 (Z);
  84. LT0 = r0; // set loop counters to something deterministic
  85. LB0 = r0;
  86. LC0 = r0;
  87. LT1 = r0;
  88. LB1 = r0;
  89. LC1 = r0;
  90. ASTAT = r0; // reset other internal regs
  91. // The following code sets up the test for running in USER mode
  92. LD32_LABEL(r0, STARTUSER);// One gets to user mode by doing a
  93. // ReturnFromInterrupt (RTI)
  94. RETI = r0; // We need to load the return address
  95. // Comment the following line for a USER Mode test
  96. JUMP STARTSUP; // jump to code start for SUPERVISOR mode
  97. RTI;
  98. STARTSUP:
  99. LD32_LABEL(p1, BEGIN);
  100. LD32(p0, EVT15);
  101. [ P0 ] = P1; // IVG15 (General) handler (Int 15) load with start
  102. RAISE 15; // after we RTI, INT 15 should be taken,& return to BEGIN in
  103. // SUPERVISOR MODE & go to different RAISE in supervisor mode
  104. // until the end of the test.
  105. NOP; // Workaround for Bug 217
  106. RTI;
  107. //
  108. // The Main Program
  109. //
  110. STARTUSER:
  111. LD32_LABEL(sp, USTACK); // setup the stack pointer
  112. FP = SP; // set frame pointer
  113. JUMP BEGIN;
  114. //*********************************************************************
  115. BEGIN:
  116. // COMMENT the following line for USER MODE tests
  117. [ -- SP ] = RETI; // enable interrupts in supervisor mode
  118. // **** YOUR CODE GOES HERE ****
  119. R0 = 0;
  120. ASTAT = R0;
  121. // PUT YOUR TEST HERE!
  122. // PUSH
  123. R0 = 0x01;
  124. R1 = 0x02;
  125. R2 = 0x03;
  126. R3 = 0x04;
  127. R4 = 0x05;
  128. R5 = 0x06;
  129. R6 = 0x07;
  130. R7 = 0x08;
  131. LD32(p3, 0xab5fd490);
  132. LD32(p4, 0xa581bd94);
  133. [ -- SP ] = ( R7:0 );
  134. LD32(p1, 0xFFE02034); // wrt-rd EVT13 = 0xFFE02034
  135. //LD32(p2, DATA_ADDR_1);
  136. loadsym p2, DATA;
  137. LD32(r0, 0x55552345);
  138. // RAISE 2; // RTN
  139. // r0 = [p2++];
  140. R1 = [ P1 ];
  141. IF !CC JUMP LABEL1 (BP);
  142. P3 = R7;
  143. R4 = P3;
  144. [ -- SP ] = ( R7:0 );
  145. R1 = 0x12;
  146. R2 = 0x13;
  147. R3 = 0x14;
  148. R4 = 0x15;
  149. R5 = 0x16;
  150. R6 = 0x17;
  151. R7 = 0x18;
  152. LABEL1:
  153. // RAISE 5; // RTI
  154. // r2 = [p2++];
  155. R3 = [ P1 ];
  156. IF CC JUMP LABEL2 (BP); // not taken
  157. P4 = R6;
  158. R4 = P4;
  159. [ -- SP ] = ( R7:0 );
  160. R2 = 0x23;
  161. R3 = 0x24;
  162. R4 = 0x25;
  163. R5 = 0x26;
  164. R6 = 0x27;
  165. R7 = 0x28;
  166. // wrt-rd EVT5 = 0xFFE02034
  167. LD32(p1, 0xFFE02034); // wrt-rd EVT13 = 0xFFE02034
  168. // RAISE 6; // RTI
  169. // r4 = [p2++];
  170. R5 = [ P1 ];
  171. IF !CC JUMP LABEL2 (BP);
  172. P3 = R3;
  173. R6 = P3;
  174. [ -- SP ] = ( R7:0 );
  175. // POP
  176. R0 = 0x00;
  177. R1 = 0x00;
  178. R2 = 0x00;
  179. R3 = 0x00;
  180. R4 = 0x00;
  181. R5 = 0x00;
  182. R6 = 0x00;
  183. R7 = 0x00;
  184. LABEL2:
  185. CSYNC;
  186. CHECKREG(r0, 0x55552345);
  187. //CHECKREG(r1, 0x000002B8);
  188. CHECKREG(r2, 0x00000023);
  189. CHECKREG(r3, 0x00000024);
  190. CHECKREG(r4, 0x00000025);
  191. //CHECKREG(r5, 0x000002B8);
  192. // RAISE 7; // RTI
  193. // r0 = [p2++];
  194. R1 = [ P1 ];
  195. P4 = R4;
  196. R2 = P4;
  197. ( R7:0 ) = [ SP ++ ];
  198. CHECKREG(r0, 0x55552345);
  199. //CHECKREG(r1, 0x000002B8);
  200. CHECKREG(r2, 0x00000003);
  201. //CHECKREG(r3, 0x000002B8);
  202. CHECKREG(r4, 0x00000007);
  203. CHECKREG(r5, 0x00000006);
  204. CHECKREG(r6, 0x00000007);
  205. CHECKREG(r7, 0x00000008);
  206. // wrt-rd EVT13 = 0xFFE02034
  207. LD32(p1, 0xFFE02034);
  208. // RAISE 8; // RTI
  209. // r0 = [p2++];
  210. R1 = [ P1 ];
  211. IF !CC JUMP LABEL3;
  212. P1 = R5;
  213. R6 = P1;
  214. ( R7:0 ) = [ SP ++ ];
  215. //CHECKREG(r0, 0x000000a1); // CHECKREG can not be skipped
  216. //CHECKREG(r1, 0x000000b2); // so they cannot appear here
  217. //CHECKREG(r2, 0x000000c3);
  218. //CHECKREG(r3, 0x000000d4);
  219. //CHECKREG(r4, 0x000000e5);
  220. //CHECKREG(r5, 0x000000f6);
  221. //CHECKREG(r6, 0x00000017);
  222. //CHECKREG(r7, 0x00000028);
  223. R0 = 12;
  224. R1 = 13;
  225. R2 = 14;
  226. R3 = 15;
  227. R4 = 16;
  228. R5 = 17;
  229. R6 = 18;
  230. R7 = 19;
  231. LABEL3:
  232. CSYNC;
  233. CHECKREG(r0, 0x55552345);
  234. //CHECKREG(r1, 0x000002B8);
  235. // RAISE 9; // RTI
  236. P3 = R6;
  237. R7 = P3;
  238. ( R7:0 ) = [ SP ++ ];
  239. CHECKREG(r0, 0x00000001);
  240. CHECKREG(r1, 0x00000002);
  241. CHECKREG(r2, 0x00000003);
  242. CHECKREG(r3, 0x00000004);
  243. CHECKREG(r4, 0x00000005);
  244. CHECKREG(r5, 0x00000006);
  245. CHECKREG(r6, 0x00000007);
  246. CHECKREG(r7, 0x00000008);
  247. R0 = I0;
  248. R1 = I1;
  249. R2 = I2;
  250. R3 = I3;
  251. CHECKREG(r0, 0x00000000);
  252. CHECKREG(r1, 0x00000000);
  253. CHECKREG(r2, 0x00000000);
  254. CHECKREG(r3, 0x00000000);
  255. END:
  256. dbg_pass; // End the test
  257. //*********************************************************************
  258. //
  259. // Handlers for Events
  260. //
  261. EHANDLE: // Emulation Handler 0
  262. RTE;
  263. RHANDLE: // Reset Handler 1
  264. RTI;
  265. NHANDLE: // NMI Handler 2
  266. I0 += 2;
  267. RTN;
  268. XHANDLE: // Exception Handler 3
  269. R1 = 3;
  270. RTX;
  271. HWHANDLE: // HW Error Handler 5
  272. I1 += 2;
  273. RTI;
  274. THANDLE: // Timer Handler 6
  275. I2 += 2;
  276. RTI;
  277. I7HANDLE: // IVG 7 Handler
  278. I3 += 2;
  279. RTI;
  280. I8HANDLE: // IVG 8 Handler
  281. I0 += 2;
  282. RTI;
  283. I9HANDLE: // IVG 9 Handler
  284. I0 += 2;
  285. RTI;
  286. I10HANDLE: // IVG 10 Handler
  287. R7 = 10;
  288. RTI;
  289. I11HANDLE: // IVG 11 Handler
  290. I0 = R0;
  291. I1 = R1;
  292. I2 = R2;
  293. I3 = R3;
  294. M0 = R4;
  295. R0 = 11;
  296. RTI;
  297. I12HANDLE: // IVG 12 Handler
  298. R1 = 12;
  299. RTI;
  300. I13HANDLE: // IVG 13 Handler
  301. R2 = 13;
  302. RTI;
  303. I14HANDLE: // IVG 14 Handler
  304. R3 = 14;
  305. RTI;
  306. I15HANDLE: // IVG 15 Handler
  307. R4 = 15;
  308. RTI;
  309. NOP;NOP;NOP;NOP;NOP;NOP;NOP; // needed for icache bug
  310. //
  311. // Data Segment
  312. //
  313. .section MEM_DATA_ADDR_1,"aw"
  314. DATA:
  315. // .space (0x10);
  316. .dd 0x00010203
  317. .dd 0x04050607
  318. .dd 0x08090A0B
  319. .dd 0x0C0D0E0F
  320. .dd 0x10111213
  321. .dd 0x14151617
  322. .dd 0x18191A1B
  323. .dd 0x1C1D1E1F
  324. .dd 0x11223344
  325. .dd 0x55667788
  326. .dd 0x99717273
  327. .dd 0x74757677
  328. .dd 0x82838485
  329. .dd 0x86878889
  330. .dd 0x80818283
  331. .dd 0x84858687
  332. .dd 0x01020304
  333. .dd 0x05060708
  334. .dd 0x09101112
  335. .dd 0x14151617
  336. .dd 0x18192021
  337. // Stack Segments (Both Kernel and User)
  338. .space (STACKSIZE);
  339. KSTACK:
  340. .space (STACKSIZE);
  341. USTACK:
  342. .section MEM_DATA_ADDR_2,"aw"
  343. .dd 0x20212223
  344. .dd 0x24252627
  345. .dd 0x28292A2B
  346. .dd 0x2C2D2E2F
  347. .dd 0x30313233
  348. .dd 0x34353637
  349. .dd 0x38393A3B
  350. .dd 0x3C3D3E3F
  351. .dd 0x91929394
  352. .dd 0x95969798
  353. .dd 0x99A1A2A3
  354. .dd 0xA5A6A7A8
  355. .dd 0xA9B0B1B2
  356. .dd 0xB3B4B5B6
  357. .dd 0xB7B8B9C0