PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/external/valgrind/main/memcheck/tests/amd64/bt_everything.c

https://gitlab.com/brian0218/rk3188_r-box_android4.2.2_sdk
C | 498 lines | 398 code | 74 blank | 26 comment | 11 complexity | 4b05e89a243c48278e022bf7f0764556 MD5 | raw file
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. typedef unsigned long long int ULong;
  5. typedef unsigned int UInt;
  6. typedef unsigned short UShort;
  7. typedef unsigned char UChar;
  8. typedef signed int Int;
  9. typedef signed short Short;
  10. typedef signed long int Word;
  11. /* ------------ MEM, Q ------------ */
  12. ULong btsq_mem ( char* base, Word bitno )
  13. {
  14. UChar res;
  15. __asm__
  16. __volatile__("btsq\t%2, %0\n\t"
  17. "setc\t%1"
  18. : "=m" (*base), "=q" (res)
  19. : "r" (bitno));
  20. /* Pretty meaningless to dereference base here, but that's what you
  21. have to do to get a btsl insn which refers to memory starting at
  22. base. */
  23. return res;
  24. }
  25. ULong btrq_mem ( char* base, Word bitno )
  26. {
  27. UChar res;
  28. __asm__
  29. __volatile__("btrq\t%2, %0\n\t"
  30. "setc\t%1"
  31. : "=m" (*base), "=q" (res)
  32. : "r" (bitno));
  33. return res;
  34. }
  35. ULong btcq_mem ( char* base, Word bitno )
  36. {
  37. UChar res;
  38. __asm__
  39. __volatile__("btcq\t%2, %0\n\t"
  40. "setc\t%1"
  41. : "=m" (*base), "=q" (res)
  42. : "r" (bitno));
  43. return res;
  44. }
  45. ULong btq_mem ( char* base, Word bitno )
  46. {
  47. UChar res;
  48. __asm__
  49. __volatile__("btq\t%2, %0\n\t"
  50. "setc\t%1"
  51. : "=m" (*base), "=q" (res)
  52. : "r" (bitno)
  53. : "cc", "memory");
  54. return res;
  55. }
  56. /* ------------ MEM, L ------------ */
  57. ULong btsl_mem ( char* base, Word bitno )
  58. {
  59. UChar res;
  60. __asm__
  61. __volatile__("btsl\t%2, %0\n\t"
  62. "setc\t%1"
  63. : "=m" (*base), "=q" (res)
  64. : "r" ((Int)bitno));
  65. /* Pretty meaningless to dereference base here, but that's what you
  66. have to do to get a btsl insn which refers to memory starting at
  67. base. */
  68. return res;
  69. }
  70. ULong btrl_mem ( char* base, Word bitno )
  71. {
  72. UChar res;
  73. __asm__
  74. __volatile__("btrl\t%2, %0\n\t"
  75. "setc\t%1"
  76. : "=m" (*base), "=q" (res)
  77. : "r" ((Int)bitno));
  78. return res;
  79. }
  80. ULong btcl_mem ( char* base, Word bitno )
  81. {
  82. UChar res;
  83. __asm__
  84. __volatile__("btcl\t%2, %0\n\t"
  85. "setc\t%1"
  86. : "=m" (*base), "=q" (res)
  87. : "r" ((Int)bitno));
  88. return res;
  89. }
  90. ULong btl_mem ( char* base, Word bitno )
  91. {
  92. UChar res;
  93. __asm__
  94. __volatile__("btl\t%2, %0\n\t"
  95. "setc\t%1"
  96. : "=m" (*base), "=q" (res)
  97. : "r" ((Int)bitno)
  98. : "cc", "memory");
  99. return res;
  100. }
  101. /* ------------ MEM, W ------------ */
  102. ULong btsw_mem ( char* base, Word bitno )
  103. {
  104. UChar res;
  105. __asm__
  106. __volatile__("btsw\t%2, %0\n\t"
  107. "setc\t%1"
  108. : "=m" (*base), "=q" (res)
  109. : "r" ((Short)bitno));
  110. /* Pretty meaningless to dereference base here, but that's what you
  111. have to do to get a btsl insn which refers to memory starting at
  112. base. */
  113. return res;
  114. }
  115. ULong btrw_mem ( char* base, Word bitno )
  116. {
  117. UChar res;
  118. __asm__
  119. __volatile__("btrw\t%2, %0\n\t"
  120. "setc\t%1"
  121. : "=m" (*base), "=q" (res)
  122. : "r" ((Short)bitno));
  123. return res;
  124. }
  125. ULong btcw_mem ( char* base, Word bitno )
  126. {
  127. UChar res;
  128. __asm__
  129. __volatile__("btcw\t%2, %0\n\t"
  130. "setc\t%1"
  131. : "=m" (*base), "=q" (res)
  132. : "r" ((Short)bitno));
  133. return res;
  134. }
  135. ULong btw_mem ( char* base, Word bitno )
  136. {
  137. UChar res;
  138. __asm__
  139. __volatile__("btw\t%2, %0\n\t"
  140. "setc\t%1"
  141. : "=m" (*base), "=q" (res)
  142. : "r" ((Short)bitno)
  143. : "cc", "memory");
  144. return res;
  145. }
  146. /* ------------ REG, Q ------------ */
  147. ULong btsq_reg ( ULong reg_in, Word bitno,
  148. ULong* reg_out_p )
  149. {
  150. UChar res;
  151. ULong reg_out;
  152. __asm__
  153. __volatile__("movq\t%3, %%rax\n\t"
  154. "btsq\t%2, %%rax\n\t"
  155. "movq\t%%rax, %1\n\t"
  156. "setc\t%0"
  157. : "=q" (res), "=r" (reg_out)
  158. : "r" (bitno), "r" (reg_in)
  159. : "cc", "eax");
  160. *reg_out_p = reg_out;
  161. return res;
  162. }
  163. ULong btrq_reg ( ULong reg_in, Word bitno,
  164. ULong* reg_out_p )
  165. {
  166. UChar res;
  167. ULong reg_out;
  168. __asm__
  169. __volatile__("movq\t%3, %%rax\n\t"
  170. "btrq\t%2, %%rax\n\t"
  171. "movq\t%%rax, %1\n\t"
  172. "setc\t%0"
  173. : "=q" (res), "=r" (reg_out)
  174. : "r" (bitno), "r" (reg_in)
  175. : "cc", "eax");
  176. *reg_out_p = reg_out;
  177. return res;
  178. }
  179. ULong btcq_reg ( ULong reg_in, Word bitno,
  180. ULong* reg_out_p )
  181. {
  182. UChar res;
  183. ULong reg_out;
  184. __asm__
  185. __volatile__("movq\t%3, %%rax\n\t"
  186. "btcq\t%2, %%rax\n\t"
  187. "movq\t%%rax, %1\n\t"
  188. "setc\t%0"
  189. : "=q" (res), "=r" (reg_out)
  190. : "r" (bitno), "r" (reg_in)
  191. : "cc", "eax");
  192. *reg_out_p = reg_out;
  193. return res;
  194. }
  195. ULong btq_reg ( ULong reg_in, Word bitno,
  196. ULong* reg_out_p )
  197. {
  198. UChar res;
  199. ULong reg_out;
  200. __asm__
  201. __volatile__("movq\t%3, %%rax\n\t"
  202. "btq\t%2, %%rax\n\t"
  203. "movq\t%%rax, %1\n\t"
  204. "setc\t%0"
  205. : "=q" (res), "=r" (reg_out)
  206. : "r" (bitno), "r" (reg_in)
  207. : "cc", "eax");
  208. *reg_out_p = reg_out;
  209. return res;
  210. }
  211. /* ------------ REG, L ------------ */
  212. ULong btsl_reg ( ULong reg_in, Word bitno,
  213. ULong* reg_out_p )
  214. {
  215. UChar res;
  216. ULong reg_out;
  217. __asm__
  218. __volatile__("movq\t%3, %%rax\n\t"
  219. "btsl\t%2, %%eax\n\t"
  220. "movq\t%%rax, %1\n\t"
  221. "setc\t%0"
  222. : "=q" (res), "=r" (reg_out)
  223. : "r" ((Int)bitno), "r" (reg_in)
  224. : "cc", "eax");
  225. *reg_out_p = reg_out;
  226. return res;
  227. }
  228. ULong btrl_reg ( ULong reg_in, Word bitno,
  229. ULong* reg_out_p )
  230. {
  231. UChar res;
  232. ULong reg_out;
  233. __asm__
  234. __volatile__("movq\t%3, %%rax\n\t"
  235. "btrl\t%2, %%eax\n\t"
  236. "movq\t%%rax, %1\n\t"
  237. "setc\t%0"
  238. : "=q" (res), "=r" (reg_out)
  239. : "r" ((Int)bitno), "r" (reg_in)
  240. : "cc", "eax");
  241. *reg_out_p = reg_out;
  242. return res;
  243. }
  244. ULong btcl_reg ( ULong reg_in, Word bitno,
  245. ULong* reg_out_p )
  246. {
  247. UChar res;
  248. ULong reg_out;
  249. __asm__
  250. __volatile__("movq\t%3, %%rax\n\t"
  251. "btcl\t%2, %%eax\n\t"
  252. "movq\t%%rax, %1\n\t"
  253. "setc\t%0"
  254. : "=q" (res), "=r" (reg_out)
  255. : "r" ((Int)bitno), "r" (reg_in)
  256. : "cc", "eax");
  257. *reg_out_p = reg_out;
  258. return res;
  259. }
  260. ULong btl_reg ( ULong reg_in, Word bitno,
  261. ULong* reg_out_p )
  262. {
  263. UChar res;
  264. ULong reg_out;
  265. __asm__
  266. __volatile__("movq\t%3, %%rax\n\t"
  267. "btl\t%2, %%eax\n\t"
  268. "movq\t%%rax, %1\n\t"
  269. "setc\t%0"
  270. : "=q" (res), "=r" (reg_out)
  271. : "r" ((Int)bitno), "r" (reg_in)
  272. : "cc", "eax");
  273. *reg_out_p = reg_out;
  274. return res;
  275. }
  276. /* ------------ REG, W ------------ */
  277. ULong btsw_reg ( ULong reg_in, Word bitno,
  278. ULong* reg_out_p )
  279. {
  280. UChar res;
  281. ULong reg_out;
  282. __asm__
  283. __volatile__("movq\t%3, %%rax\n\t"
  284. "btsw\t%2, %%ax\n\t"
  285. "movq\t%%rax, %1\n\t"
  286. "setc\t%0"
  287. : "=q" (res), "=r" (reg_out)
  288. : "r" ((Short)bitno), "r" (reg_in)
  289. : "cc", "eax");
  290. *reg_out_p = reg_out;
  291. return res;
  292. }
  293. ULong btrw_reg ( ULong reg_in, Word bitno,
  294. ULong* reg_out_p )
  295. {
  296. UChar res;
  297. ULong reg_out;
  298. __asm__
  299. __volatile__("movq\t%3, %%rax\n\t"
  300. "btrw\t%2, %%ax\n\t"
  301. "movq\t%%rax, %1\n\t"
  302. "setc\t%0"
  303. : "=q" (res), "=r" (reg_out)
  304. : "r" ((Short)bitno), "r" (reg_in)
  305. : "cc", "eax");
  306. *reg_out_p = reg_out;
  307. return res;
  308. }
  309. ULong btcw_reg ( ULong reg_in, Word bitno,
  310. ULong* reg_out_p )
  311. {
  312. UChar res;
  313. ULong reg_out;
  314. __asm__
  315. __volatile__("movq\t%3, %%rax\n\t"
  316. "btcw\t%2, %%ax\n\t"
  317. "movq\t%%rax, %1\n\t"
  318. "setc\t%0"
  319. : "=q" (res), "=r" (reg_out)
  320. : "r" ((Short)bitno), "r" (reg_in)
  321. : "cc", "eax");
  322. *reg_out_p = reg_out;
  323. return res;
  324. }
  325. ULong btw_reg ( ULong reg_in, Word bitno,
  326. ULong* reg_out_p )
  327. {
  328. UChar res;
  329. ULong reg_out;
  330. __asm__
  331. __volatile__("movq\t%3, %%rax\n\t"
  332. "btw\t%2, %%ax\n\t"
  333. "movq\t%%rax, %1\n\t"
  334. "setc\t%0"
  335. : "=q" (res), "=r" (reg_out)
  336. : "r" ((Short)bitno), "r" (reg_in)
  337. : "cc", "eax");
  338. *reg_out_p = reg_out;
  339. return res;
  340. }
  341. ULong rol1 ( ULong x )
  342. {
  343. return (x << 1) | (x >> 63);
  344. }
  345. int main ( void )
  346. {
  347. UInt n, op;
  348. ULong carrydep, c, res;
  349. UChar* block;
  350. ULong reg;
  351. Word bitoff;
  352. /*------------------------ MEM-L -----------------------*/
  353. carrydep = 0;
  354. block = calloc(200,1);
  355. block += 100;
  356. /* Valid bit offsets are -800 .. 799 inclusive. */
  357. for (n = 0; n < 10000; n++) {
  358. bitoff = (random() % 1600) - 800;
  359. op = random() % 12;
  360. c = 2;
  361. switch (op) {
  362. case 0: c = btsl_mem(block, bitoff); break;
  363. case 1: c = btrl_mem(block, bitoff); break;
  364. case 2: c = btcl_mem(block, bitoff); break;
  365. case 3: c = btl_mem(block, bitoff); break;
  366. case 4: c = btsq_mem(block, bitoff); break;
  367. case 5: c = btrq_mem(block, bitoff); break;
  368. case 6: c = btcq_mem(block, bitoff); break;
  369. case 7: c = btq_mem(block, bitoff); break;
  370. case 8: c = btsw_mem(block, bitoff); break;
  371. case 9: c = btrw_mem(block, bitoff); break;
  372. case 10: c = btcw_mem(block, bitoff); break;
  373. case 11: c = btw_mem(block, bitoff); break;
  374. default: assert(0);
  375. }
  376. assert(c == 0 || c == 1);
  377. carrydep = c ? (rol1(carrydep) ^ bitoff) : carrydep;
  378. }
  379. /* Compute final result */
  380. block -= 100;
  381. res = 0;
  382. for (n = 0; n < 200; n++) {
  383. UChar ch = block[n];
  384. /* printf("%d ", (int)block[n]); */
  385. res = rol1(res) ^ (UInt)ch;
  386. }
  387. printf("MEM-L: final res 0x%llx, carrydep 0x%llx\n", res, carrydep);
  388. /*------------------------ REG-L -----------------------*/
  389. carrydep = 0;
  390. reg = 0;
  391. for (n = 0; n < 1000; n++) {
  392. bitoff = (random() % 100) - 50;
  393. op = random() % 12;
  394. c = 2;
  395. switch (op) {
  396. case 0: c = btsl_reg(reg, bitoff, &reg); break;
  397. case 1: c = btrl_reg(reg, bitoff, &reg); break;
  398. case 2: c = btcl_reg(reg, bitoff, &reg); break;
  399. case 3: c = btl_reg(reg, bitoff, &reg); break;
  400. case 4: c = btsq_reg(reg, bitoff, &reg); break;
  401. case 5: c = btrq_reg(reg, bitoff, &reg); break;
  402. case 6: c = btcq_reg(reg, bitoff, &reg); break;
  403. case 7: c = btq_reg(reg, bitoff, &reg); break;
  404. case 8: c = btsw_reg(reg, bitoff, &reg); break;
  405. case 9: c = btrw_reg(reg, bitoff, &reg); break;
  406. case 10: c = btcw_reg(reg, bitoff, &reg); break;
  407. case 11: c = btw_reg(reg, bitoff, &reg); break;
  408. default: assert(0);
  409. }
  410. assert(c == 0 || c == 1);
  411. carrydep = c ? (rol1(carrydep) ^ bitoff) : carrydep;
  412. }
  413. printf("REG-L: final res 0x%llx, carrydep 0x%llx\n", reg, carrydep);
  414. block += 100;
  415. /* Just try one of these at once; more than one can cause a
  416. confusing merging of error messages. */
  417. //btsl_mem(block, -800); /* should not complain */
  418. //btsl_mem(block, -801); /* should complain */
  419. //btsl_mem(block, 799); /* should not complain */
  420. //btsl_mem(block, 800); /* should complain */
  421. block -= 100;
  422. free(block);
  423. return 0;
  424. }