se_cc2stat_haz.S 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. //Original:/proj/frio/dv/testcases/seq/se_cc2stat_haz/se_cc2stat_haz.dsp
  2. // Description:
  3. // Verify CC hazards under the following condition:
  4. //
  5. // (1a) cc2stat (that modifies CC) followed by that uses CC
  6. // (1b) same as (1a) but kill cc2stat instruction in WB
  7. //
  8. // (2a) cc2stat (that modifies CC) followed by conditional branch (predicted)
  9. // (2b) same as (2a) but kill cc2stat instruction in WB
  10. //
  11. // (3a) cc2stat (that modifies CC) followed by conditional branch (mispredicted)
  12. // (3b) same as (3a) but kill cc2stat instruction in WB
  13. //
  14. // (4a) cc2stat (that modifies CC) followed by testset
  15. // (4b) same as (4a) but kill cc2stat instruction in WB
  16. //
  17. // (5a) cc2stat (that modifies CC) followed by dag instruction that modifies CC
  18. // (5b) same as (5a) but kill cc2stat instruction in WB
  19. # mach: bfin
  20. # sim: --environment operating
  21. #include "test.h"
  22. .include "testutils.inc"
  23. start
  24. // ----------------------------------------------------------------
  25. // Include Files
  26. // ----------------------------------------------------------------
  27. include(std.inc)
  28. include(selfcheck.inc)
  29. include(symtable.inc)
  30. include(mmrs.inc)
  31. // ----------------------------------------------------------------
  32. // Defines
  33. // ----------------------------------------------------------------
  34. #ifndef STACKSIZE
  35. #define STACKSIZE 0x00000010
  36. #endif
  37. #ifndef ITABLE
  38. #define ITABLE CODE_ADDR_1 //
  39. #endif
  40. // ----------------------------------------------------------------
  41. // Reset ISR
  42. // - set the processor operating modes
  43. // - initialize registers
  44. // - etc ...
  45. // ----------------------------------------------------------------
  46. RST_ISR:
  47. // Initialize data registers
  48. //INIT_R_REGS(0);
  49. R7 = 0;
  50. R6 = 0;
  51. R5 = 0;
  52. R4 = 0;
  53. R3 = 0;
  54. R2 = 0;
  55. R1 = 0;
  56. R0 = 0;
  57. // Initialize pointer registers
  58. INIT_P_REGS(0);
  59. // Initialize address registers
  60. INIT_I_REGS(0);
  61. INIT_M_REGS(0);
  62. INIT_L_REGS(0);
  63. INIT_B_REGS(0);
  64. // Initialize the address of the checkreg data segment
  65. // **** THIS IS NEEDED WHENEVER CHECKREG IS USED ****
  66. CHECK_INIT_DEF(p5); //CHECK_INIT(p5, 0x00BFFFFC);
  67. // Inhibit events during MMR writes
  68. CLI R1;
  69. // Setup user stack
  70. LD32_LABEL(sp, USTACK);
  71. USP = SP;
  72. // Setup kernel stack
  73. LD32_LABEL(sp, KSTACK);
  74. // Setup frame pointer
  75. FP = SP;
  76. // Setup event vector table
  77. LD32(p0, EVT0);
  78. LD32_LABEL(r0, EMU_ISR); // Emulation Handler (EVT0)
  79. [ P0 ++ ] = R0;
  80. LD32_LABEL(r0, RST_ISR); // Reset Handler (EVT1)
  81. [ P0 ++ ] = R0;
  82. LD32_LABEL(r0, NMI_ISR); // NMI Handler (EVT2)
  83. [ P0 ++ ] = R0;
  84. LD32_LABEL(r0, EXC_ISR); // Exception Handler (EVT3)
  85. [ P0 ++ ] = R0;
  86. [ P0 ++ ] = R0; // EVT4 not used
  87. LD32_LABEL(r0, HWE_ISR); // HW Error Handler (EVT5)
  88. [ P0 ++ ] = R0;
  89. LD32_LABEL(r0, TMR_ISR); // Timer Handler (EVT6)
  90. [ P0 ++ ] = R0;
  91. LD32_LABEL(r0, IGV7_ISR); // IVG7 Handler
  92. [ P0 ++ ] = R0;
  93. LD32_LABEL(r0, IGV8_ISR); // IVG8 Handler
  94. [ P0 ++ ] = R0;
  95. LD32_LABEL(r0, IGV9_ISR); // IVG9 Handler
  96. [ P0 ++ ] = R0;
  97. LD32_LABEL(r0, IGV10_ISR); // IVG10 Handler
  98. [ P0 ++ ] = R0;
  99. LD32_LABEL(r0, IGV11_ISR); // IVG11 Handler
  100. [ P0 ++ ] = R0;
  101. LD32_LABEL(r0, IGV12_ISR); // IVG12 Handler
  102. [ P0 ++ ] = R0;
  103. LD32_LABEL(r0, IGV13_ISR); // IVG13 Handler
  104. [ P0 ++ ] = R0;
  105. LD32_LABEL(r0, IGV14_ISR); // IVG14 Handler
  106. [ P0 ++ ] = R0;
  107. LD32_LABEL(r0, IGV15_ISR); // IVG15 Handler
  108. [ P0 ++ ] = R0;
  109. // Set the EVT_OVERRIDE MMR
  110. LD32(p0, EVT_OVERRIDE);
  111. R0 = 0;
  112. [ P0 ++ ] = R0;
  113. // Disable L1 data cache
  114. WR_MMR(DMEM_CONTROL, 0x00000000, p0, r0);
  115. // Mask interrupts (*)
  116. R1 = -1;
  117. // Wait for MMR writes to finish
  118. CSYNC;
  119. // Re-enable events
  120. STI R1;
  121. // Reset accumulator registers
  122. A0 = 0;
  123. A1 = 0;
  124. // Reset loop counters to deterministic values
  125. R0 = 0 (Z);
  126. LT0 = R0;
  127. LB0 = R0;
  128. LC0 = R0;
  129. LT1 = R0;
  130. LB1 = R0;
  131. LC1 = R0;
  132. // Reset other internal regs
  133. ASTAT = R0;
  134. SYSCFG = R0;
  135. RETS = R0;
  136. // Setup the test to run in USER mode
  137. LD32_LABEL(r0, USER_CODE);
  138. RETI = R0;
  139. // Setup the test to run in SUPERVISOR mode
  140. // Comment the following line for a USER mode test
  141. JUMP.S SUPERVISOR_CODE;
  142. RTI;
  143. SUPERVISOR_CODE:
  144. // Load IVG15 general handler (Int15) with MAIN_CODE
  145. LD32_LABEL(p1, MAIN_CODE);
  146. LD32(p0, EVT15);
  147. CLI R1;
  148. [ P0 ] = P1;
  149. CSYNC;
  150. STI R1;
  151. // Take Int15 which branch to MAIN_CODE after RTI
  152. RAISE 15;
  153. RTI;
  154. USER_CODE:
  155. // Setup the stack pointer and the frame pointer
  156. LD32_LABEL(sp, USTACK);
  157. FP = SP;
  158. JUMP.S MAIN_CODE;
  159. .dw 0xFFFF
  160. .dw 0xFFFF
  161. .dw 0xFFFF
  162. .dw 0xFFFF
  163. .dw 0xFFFF
  164. .dw 0xFFFF
  165. .dw 0xFFFF
  166. // ----------------------------------------------------------------
  167. // ISR Table
  168. // ----------------------------------------------------------------
  169. // ----------------------------------------------------------------
  170. // EMU ISR
  171. // ----------------------------------------------------------------
  172. EMU_ISR :
  173. RTE;
  174. .dw 0xFFFF
  175. .dw 0xFFFF
  176. .dw 0xFFFF
  177. .dw 0xFFFF
  178. .dw 0xFFFF
  179. .dw 0xFFFF
  180. .dw 0xFFFF
  181. // ----------------------------------------------------------------
  182. // NMI ISR
  183. // ----------------------------------------------------------------
  184. NMI_ISR :
  185. RTN;
  186. .dw 0xFFFF
  187. .dw 0xFFFF
  188. .dw 0xFFFF
  189. .dw 0xFFFF
  190. .dw 0xFFFF
  191. .dw 0xFFFF
  192. .dw 0xFFFF
  193. // ----------------------------------------------------------------
  194. // EXC ISR
  195. // ----------------------------------------------------------------
  196. EXC_ISR :
  197. RTX;
  198. .dw 0xFFFF
  199. .dw 0xFFFF
  200. .dw 0xFFFF
  201. .dw 0xFFFF
  202. .dw 0xFFFF
  203. .dw 0xFFFF
  204. .dw 0xFFFF
  205. // ----------------------------------------------------------------
  206. // HWE ISR
  207. // ----------------------------------------------------------------
  208. HWE_ISR :
  209. RTI;
  210. .dw 0xFFFF
  211. .dw 0xFFFF
  212. .dw 0xFFFF
  213. .dw 0xFFFF
  214. .dw 0xFFFF
  215. .dw 0xFFFF
  216. .dw 0xFFFF
  217. // ----------------------------------------------------------------
  218. // TMR ISR
  219. // ----------------------------------------------------------------
  220. TMR_ISR :
  221. RTI;
  222. .dw 0xFFFF
  223. .dw 0xFFFF
  224. .dw 0xFFFF
  225. .dw 0xFFFF
  226. .dw 0xFFFF
  227. .dw 0xFFFF
  228. .dw 0xFFFF
  229. // ----------------------------------------------------------------
  230. // IGV7 ISR
  231. // ----------------------------------------------------------------
  232. IGV7_ISR :
  233. RTI;
  234. .dw 0xFFFF
  235. .dw 0xFFFF
  236. .dw 0xFFFF
  237. .dw 0xFFFF
  238. .dw 0xFFFF
  239. .dw 0xFFFF
  240. .dw 0xFFFF
  241. // ----------------------------------------------------------------
  242. // IGV8 ISR
  243. // ----------------------------------------------------------------
  244. IGV8_ISR :
  245. RTI;
  246. .dw 0xFFFF
  247. .dw 0xFFFF
  248. .dw 0xFFFF
  249. .dw 0xFFFF
  250. .dw 0xFFFF
  251. .dw 0xFFFF
  252. .dw 0xFFFF
  253. // ----------------------------------------------------------------
  254. // IGV9 ISR
  255. // ----------------------------------------------------------------
  256. IGV9_ISR :
  257. RTI;
  258. .dw 0xFFFF
  259. .dw 0xFFFF
  260. .dw 0xFFFF
  261. .dw 0xFFFF
  262. .dw 0xFFFF
  263. .dw 0xFFFF
  264. .dw 0xFFFF
  265. // ----------------------------------------------------------------
  266. // IGV10 ISR
  267. // ----------------------------------------------------------------
  268. IGV10_ISR :
  269. RTI;
  270. .dw 0xFFFF
  271. .dw 0xFFFF
  272. .dw 0xFFFF
  273. .dw 0xFFFF
  274. .dw 0xFFFF
  275. .dw 0xFFFF
  276. .dw 0xFFFF
  277. // ----------------------------------------------------------------
  278. // IGV11 ISR
  279. // ----------------------------------------------------------------
  280. IGV11_ISR :
  281. RTI;
  282. .dw 0xFFFF
  283. .dw 0xFFFF
  284. .dw 0xFFFF
  285. .dw 0xFFFF
  286. .dw 0xFFFF
  287. .dw 0xFFFF
  288. .dw 0xFFFF
  289. // ----------------------------------------------------------------
  290. // IGV12 ISR
  291. // ----------------------------------------------------------------
  292. IGV12_ISR :
  293. RTI;
  294. .dw 0xFFFF
  295. .dw 0xFFFF
  296. .dw 0xFFFF
  297. .dw 0xFFFF
  298. .dw 0xFFFF
  299. .dw 0xFFFF
  300. .dw 0xFFFF
  301. // ----------------------------------------------------------------
  302. // IGV13 ISR
  303. // ----------------------------------------------------------------
  304. IGV13_ISR :
  305. RTI;
  306. .dw 0xFFFF
  307. .dw 0xFFFF
  308. .dw 0xFFFF
  309. .dw 0xFFFF
  310. .dw 0xFFFF
  311. .dw 0xFFFF
  312. .dw 0xFFFF
  313. // ----------------------------------------------------------------
  314. // IGV14 ISR
  315. // ----------------------------------------------------------------
  316. IGV14_ISR :
  317. RTI;
  318. .dw 0xFFFF
  319. .dw 0xFFFF
  320. .dw 0xFFFF
  321. .dw 0xFFFF
  322. .dw 0xFFFF
  323. .dw 0xFFFF
  324. .dw 0xFFFF
  325. // ----------------------------------------------------------------
  326. // IGV15 ISR
  327. // ----------------------------------------------------------------
  328. IGV15_ISR :
  329. RTI;
  330. .dw 0xFFFF
  331. .dw 0xFFFF
  332. .dw 0xFFFF
  333. .dw 0xFFFF
  334. .dw 0xFFFF
  335. .dw 0xFFFF
  336. .dw 0xFFFF
  337. // ----------------------------------------------------------------
  338. // Main Code
  339. // ----------------------------------------------------------------
  340. MAIN_CODE:
  341. // Enable interrupts in SUPERVISOR mode
  342. // Comment the following line for a USER mode test
  343. [ -- SP ] = RETI;
  344. // Start of the program code
  345. R0 = 0;
  346. R1 = 1;
  347. R2 = 2;
  348. // Verify CC hazards under the following condition:
  349. //
  350. // (1a) cc2stat (that modifies CC) followed by that uses CC
  351. A0 = 0;
  352. A1 = R1;
  353. CC = R0 < R2;
  354. CC = AV0;
  355. A0 = BXORSHIFT( A0 , A1, CC );
  356. R7 = CC; CHECKREG(R7, 0);
  357. R6 = A0; CHECKREG(R6, 0);
  358. R6 = A0.X; CHECKREG(R6, 0);
  359. R7 = A1; CHECKREG(R7, 1);
  360. R7 = A1.X; CHECKREG(R7, 0);
  361. // (1b) same as (1a) but kill cc2stat instruction in WB
  362. A0 = R1;
  363. A1 = R1;
  364. CC = R0 < R2;
  365. EXCPT 3;
  366. CC = AV0;
  367. A0 = BXORSHIFT( A0 , A1, CC );
  368. R7 = CC; CHECKREG(R7, 0);
  369. R6 = A0; CHECKREG(R6, 3);
  370. R6 = A0.X; CHECKREG(R6, 0);
  371. R7 = A1; CHECKREG(R7, 1);
  372. R7 = A1.X; CHECKREG(R7, 0);
  373. // (2a) cc2stat (that modifies CC) followed by conditional branch (predicted)
  374. R3 = 0;
  375. A0 = 0;
  376. A1 = R1;
  377. CC = R0 < R2;
  378. CC = AV0;
  379. IF !CC JUMP INC_R3_TO_10 (BP);
  380. R3 += 2;
  381. R3 += 2;
  382. R3 += 2;
  383. R3 += 2;
  384. R3 += 2;
  385. R3 += 2;
  386. R3 += 2;
  387. R3 += 2;
  388. R3 += 2;
  389. R3 += 2;
  390. INC_R3_TO_10:
  391. R3 += 1;
  392. R3 += 1;
  393. R3 += 1;
  394. R3 += 1;
  395. R3 += 1;
  396. R3 += 1;
  397. R3 += 1;
  398. R3 += 1;
  399. R3 += 1;
  400. R3 += 1;
  401. // (2b) same as (2a) but kill cc2stat instruction in WB
  402. A0 = 0;
  403. A1 = R1;
  404. CC = R0 < R2;
  405. EXCPT 3;
  406. CC = AV0;
  407. IF !CC JUMP INC_R3_TO_20 (BP);
  408. R3 += 2;
  409. R3 += 2;
  410. R3 += 2;
  411. R3 += 2;
  412. R3 += 2;
  413. R3 += 2;
  414. R3 += 2;
  415. R3 += 2;
  416. R3 += 2;
  417. R3 += 2;
  418. INC_R3_TO_20:
  419. R3 += 1;
  420. R3 += 1;
  421. R3 += 1;
  422. R3 += 1;
  423. R3 += 1;
  424. R3 += 1;
  425. R3 += 1;
  426. R3 += 1;
  427. R3 += 1;
  428. R3 += 1;
  429. // (3a) cc2stat (that modifies CC) followed by conditional branch (mispredicted)
  430. A0 = 0;
  431. A1 = R1;
  432. CC = R0 < R2;
  433. CC = AV0;
  434. IF CC JUMP INC_R3_TO_20 (BP);
  435. R3 += 2;
  436. R3 += 2;
  437. R3 += 2;
  438. R3 += 2;
  439. R3 += 2;
  440. R3 += 2;
  441. R3 += 2;
  442. R3 += 2;
  443. R3 += 2;
  444. R3 += 2;
  445. // (3b) same as (3a) but kill cc2stat instruction in WB
  446. A0 = 0;
  447. A1 = R1;
  448. CC = R0 < R2;
  449. EXCPT 3;
  450. CC = AV0;
  451. IF CC JUMP INC_R3_TO_20 (BP);
  452. R3 += 2;
  453. R3 += 2;
  454. R3 += 2;
  455. R3 += 2;
  456. R3 += 2;
  457. R3 += 2;
  458. R3 += 2;
  459. R3 += 2;
  460. R3 += 2;
  461. R3 += 2;
  462. CHECKREG(r3, 60);
  463. dbg_pass;
  464. // (4a) cc2stat (that modifies CC) followed by testset
  465. LD32(p0, DATA_ADDR_3); //LD32(p0, 0xff000000);
  466. LD32(p1, DATA_ADDR_2); //LD32(p1, 0xffe00000);
  467. [ P0 ] = R0;
  468. A0 = 0;
  469. A1 = R1;
  470. CC = R0 < R2;
  471. CC = AV0;
  472. QUERY_0:
  473. TESTSET ( P0 );
  474. IF !CC JUMP QUERY_0;
  475. [ P0 ] = R1;
  476. CHECKMEM32(DATA_ADDR_3, 1); //CHECKMEM32(0xff000000, 1);
  477. [ P0 ] = R0;
  478. CHECKMEM32(DATA_ADDR_3, 0); //CHECKMEM32(0xff000000, 0);
  479. // (4b) same as (4a) but kill cc2stat instruction in WB
  480. A0 = 0;
  481. A1 = R1;
  482. CC = R0 < R2;
  483. EXCPT 3;
  484. CC = AV0;
  485. QUERY_1:
  486. TESTSET ( P0 );
  487. IF !CC JUMP QUERY_1;
  488. [ P0 ] = R2;
  489. CHECKMEM32(DATA_ADDR_3, 2); //CHECKMEM32(0xff000000, 2);
  490. [ P0 ] = R0;
  491. CHECKMEM32(DATA_ADDR_3, 0); //CHECKMEM32(0xff000000, 0);
  492. // (5a) cc2stat (that modifies CC) followed by dag instruction that modifies CC
  493. A0 = 0;
  494. A1 = R1;
  495. CC = R0 < R2;
  496. CC = AV0;
  497. CC = P0 < P1;
  498. // (5b) same as (5a) but kill cc2stat instruction in WB
  499. A0 = 0;
  500. A1 = R1;
  501. CC = R0 < R2;
  502. EXCPT 3;
  503. CC = AV0;
  504. CC = P0 < P1;
  505. END:
  506. dbg_pass;
  507. // ----------------------------------------------------------------
  508. // Data Segment
  509. // - define kernel and user stacks
  510. // ----------------------------------------------------------------
  511. .data
  512. DATA:
  513. .space (STACKSIZE);
  514. .space (STACKSIZE);
  515. KSTACK:
  516. .space (STACKSIZE);
  517. USTACK: