/tests/gcc.c-torture/builtins/bin/strrchr.asm

https://github.com/kframework/X86-64-semantics · Assembly · 527 lines · 524 code · 3 blank · 0 comment · 0 complexity · eb2220d99e979bf8cfe0f0ca53ce4e7f MD5 · raw file

  1. .text
  2. .globl strchr
  3. strchr:
  4. pushq %rbp
  5. movq %rsp, %rbp
  6. movq %rdi, -8(%rbp)
  7. movl %esi, -12(%rbp)
  8. nop
  9. movq -8(%rbp), %rax
  10. movzbl (%rax), %eax
  11. movl -12(%rbp), %edx
  12. cmpb %dl, %al
  13. je L6
  14. movq -8(%rbp), %rax
  15. leaq 1(%rax), %rdx
  16. movq %rdx, -8(%rbp)
  17. movzbl (%rax), %eax
  18. testb %al, %al
  19. jne L3
  20. movl $0, %eax
  21. jmp L1
  22. L3:
  23. movq -8(%rbp), %rax
  24. jmp L1
  25. L6:
  26. L1:
  27. popq %rbp
  28. ret
  29. .globl strlen
  30. strlen:
  31. pushq %rbp
  32. movq %rsp, %rbp
  33. movq %rdi, -24(%rbp)
  34. movq $0, -8(%rbp)
  35. jmp L8
  36. L9:
  37. addq $1, -8(%rbp)
  38. L8:
  39. movq -24(%rbp), %rdx
  40. movq -8(%rbp), %rax
  41. addq %rdx, %rax
  42. movzbl (%rax), %eax
  43. testb %al, %al
  44. jne L9
  45. movq -8(%rbp), %rax
  46. popq %rbp
  47. ret
  48. .globl strcpy
  49. strcpy:
  50. pushq %rbp
  51. movq %rsp, %rbp
  52. movq %rdi, -24(%rbp)
  53. movq %rsi, -32(%rbp)
  54. movq -24(%rbp), %rax
  55. movq %rax, -8(%rbp)
  56. nop
  57. L12:
  58. movq -24(%rbp), %rax
  59. leaq 1(%rax), %rdx
  60. movq %rdx, -24(%rbp)
  61. movq -32(%rbp), %rdx
  62. leaq 1(%rdx), %rcx
  63. movq %rcx, -32(%rbp)
  64. movzbl (%rdx), %edx
  65. movb %dl, (%rax)
  66. movzbl (%rax), %eax
  67. testb %al, %al
  68. jne L12
  69. movq -8(%rbp), %rax
  70. popq %rbp
  71. ret
  72. .globl strcmp
  73. strcmp:
  74. pushq %rbp
  75. movq %rsp, %rbp
  76. movq %rdi, -8(%rbp)
  77. movq %rsi, -16(%rbp)
  78. jmp L15
  79. L17:
  80. addq $1, -8(%rbp)
  81. addq $1, -16(%rbp)
  82. L15:
  83. movq -8(%rbp), %rax
  84. movzbl (%rax), %eax
  85. testb %al, %al
  86. je L16
  87. movq -8(%rbp), %rax
  88. movzbl (%rax), %edx
  89. movq -16(%rbp), %rax
  90. movzbl (%rax), %eax
  91. cmpb %al, %dl
  92. je L17
  93. L16:
  94. movq -8(%rbp), %rax
  95. movzbl (%rax), %eax
  96. movzbl %al, %edx
  97. movq -16(%rbp), %rax
  98. movzbl (%rax), %eax
  99. movzbl %al, %eax
  100. subl %eax, %edx
  101. movl %edx, %eax
  102. popq %rbp
  103. ret
  104. .globl strcat
  105. strcat:
  106. pushq %rbp
  107. movq %rsp, %rbp
  108. movq %rdi, -24(%rbp)
  109. movq %rsi, -32(%rbp)
  110. movq -24(%rbp), %rax
  111. movq %rax, -8(%rbp)
  112. jmp L20
  113. L21:
  114. addq $1, -8(%rbp)
  115. L20:
  116. movq -8(%rbp), %rax
  117. movzbl (%rax), %eax
  118. testb %al, %al
  119. jne L21
  120. nop
  121. L22:
  122. movq -8(%rbp), %rax
  123. leaq 1(%rax), %rdx
  124. movq %rdx, -8(%rbp)
  125. movq -32(%rbp), %rdx
  126. leaq 1(%rdx), %rcx
  127. movq %rcx, -32(%rbp)
  128. movzbl (%rdx), %edx
  129. movb %dl, (%rax)
  130. movzbl (%rax), %eax
  131. testb %al, %al
  132. jne L22
  133. movq -24(%rbp), %rax
  134. popq %rbp
  135. ret
  136. .globl memcmp
  137. memcmp:
  138. pushq %rbp
  139. movq %rsp, %rbp
  140. movq %rdi, -24(%rbp)
  141. movq %rsi, -32(%rbp)
  142. movq %rdx, -40(%rbp)
  143. movq -24(%rbp), %rax
  144. movq %rax, -16(%rbp)
  145. movq -32(%rbp), %rax
  146. movq %rax, -8(%rbp)
  147. jmp L25
  148. L28:
  149. movq -16(%rbp), %rax
  150. movzbl (%rax), %edx
  151. movq -8(%rbp), %rax
  152. movzbl (%rax), %eax
  153. cmpb %al, %dl
  154. je L26
  155. movq -16(%rbp), %rax
  156. movzbl (%rax), %eax
  157. movzbl %al, %edx
  158. movq -8(%rbp), %rax
  159. movzbl (%rax), %eax
  160. movzbl %al, %eax
  161. subl %eax, %edx
  162. movl %edx, %eax
  163. jmp L27
  164. L26:
  165. addq $1, -16(%rbp)
  166. addq $1, -8(%rbp)
  167. L25:
  168. movq -40(%rbp), %rax
  169. leaq -1(%rax), %rdx
  170. movq %rdx, -40(%rbp)
  171. testq %rax, %rax
  172. jne L28
  173. movl $0, %eax
  174. L27:
  175. popq %rbp
  176. ret
  177. .globl __stack_chk_fail
  178. __stack_chk_fail:
  179. pushq %rbp
  180. movq %rsp, %rbp
  181. movq $-1, %rax
  182. jmp %rax
  183. nop
  184. popq %rbp
  185. ret
  186. .globl exit
  187. exit:
  188. pushq %rbp
  189. movq %rsp, %rbp
  190. movl %edi, -4(%rbp)
  191. movq $-1, %rax
  192. jmp %rax
  193. nop
  194. popq %rbp
  195. ret
  196. .globl abort
  197. abort:
  198. pushq %rbp
  199. movq %rsp, %rbp
  200. movq $-1, %rax
  201. jmp %rax
  202. nop
  203. popq %rbp
  204. ret
  205. .globl memset
  206. memset:
  207. pushq %rbp
  208. movq %rsp, %rbp
  209. movq %rdi, -24(%rbp)
  210. movl %esi, -28(%rbp)
  211. movq %rdx, -40(%rbp)
  212. movq -24(%rbp), %rax
  213. movq %rax, -8(%rbp)
  214. jmp L33
  215. L34:
  216. movq -8(%rbp), %rax
  217. leaq 1(%rax), %rdx
  218. movq %rdx, -8(%rbp)
  219. movl -28(%rbp), %edx
  220. movb %dl, (%rax)
  221. L33:
  222. movq -40(%rbp), %rax
  223. leaq -1(%rax), %rdx
  224. movq %rdx, -40(%rbp)
  225. testq %rax, %rax
  226. jne L34
  227. movq -24(%rbp), %rax
  228. popq %rbp
  229. ret
  230. .globl memcpy
  231. memcpy:
  232. pushq %rbp
  233. movq %rsp, %rbp
  234. movq %rdi, -24(%rbp)
  235. movq %rsi, -32(%rbp)
  236. movq %rdx, -40(%rbp)
  237. movq -24(%rbp), %rax
  238. movq %rax, -16(%rbp)
  239. movq -32(%rbp), %rax
  240. movq %rax, -8(%rbp)
  241. jmp L37
  242. L38:
  243. movq -16(%rbp), %rax
  244. leaq 1(%rax), %rdx
  245. movq %rdx, -16(%rbp)
  246. movq -8(%rbp), %rdx
  247. leaq 1(%rdx), %rcx
  248. movq %rcx, -8(%rbp)
  249. movzbl (%rdx), %edx
  250. movb %dl, (%rax)
  251. L37:
  252. movq -40(%rbp), %rax
  253. leaq -1(%rax), %rdx
  254. movq %rdx, -40(%rbp)
  255. testq %rax, %rax
  256. jne L38
  257. movq -24(%rbp), %rax
  258. popq %rbp
  259. ret
  260. .globl malloc
  261. malloc:
  262. pushq %rbp
  263. movq %rsp, %rbp
  264. movq %rdi, -8(%rbp)
  265. movl $1000, %eax
  266. popq %rbp
  267. ret
  268. .globl calloc
  269. calloc:
  270. pushq %rbp
  271. movq %rsp, %rbp
  272. movq %rdi, -8(%rbp)
  273. movq %rsi, -16(%rbp)
  274. movl $1000, %eax
  275. popq %rbp
  276. ret
  277. .globl free
  278. free:
  279. pushq %rbp
  280. movq %rsp, %rbp
  281. movq %rdi, -8(%rbp)
  282. nop
  283. popq %rbp
  284. ret
  285. .globl isprint
  286. isprint:
  287. pushq %rbp
  288. movq %rsp, %rbp
  289. movl %edi, -4(%rbp)
  290. cmpl $96, -4(%rbp)
  291. jle L46
  292. cmpl $122, -4(%rbp)
  293. jg L46
  294. movl $1, %eax
  295. jmp L47
  296. L46:
  297. cmpl $64, -4(%rbp)
  298. jle L48
  299. cmpl $90, -4(%rbp)
  300. jg L48
  301. movl $1, %eax
  302. jmp L47
  303. L48:
  304. cmpl $47, -4(%rbp)
  305. jle L49
  306. cmpl $57, -4(%rbp)
  307. jg L49
  308. movl $1, %eax
  309. jmp L47
  310. L49:
  311. movl $0, %eax
  312. L47:
  313. popq %rbp
  314. ret
  315. .globl strrchr
  316. strrchr:
  317. pushq %rbp
  318. movq %rsp, %rbp
  319. movq %rdi, -24(%rbp)
  320. movl %esi, -28(%rbp)
  321. movq $0, -8(%rbp)
  322. jmp L51
  323. L52:
  324. addq $1, -8(%rbp)
  325. L51:
  326. movq -24(%rbp), %rdx
  327. movq -8(%rbp), %rax
  328. addq %rdx, %rax
  329. movzbl (%rax), %eax
  330. testb %al, %al
  331. jne L52
  332. L55:
  333. movq -24(%rbp), %rdx
  334. movq -8(%rbp), %rax
  335. addq %rdx, %rax
  336. movzbl (%rax), %eax
  337. movsbl %al, %eax
  338. cmpl -28(%rbp), %eax
  339. jne L53
  340. movq -24(%rbp), %rdx
  341. movq -8(%rbp), %rax
  342. addq %rdx, %rax
  343. jmp L54
  344. L53:
  345. movq -8(%rbp), %rax
  346. leaq -1(%rax), %rdx
  347. movq %rdx, -8(%rbp)
  348. testq %rax, %rax
  349. jne L55
  350. movl $0, %eax
  351. L54:
  352. popq %rbp
  353. ret
  354. .globl rindex
  355. rindex:
  356. pushq %rbp
  357. movq %rsp, %rbp
  358. subq $16, %rsp
  359. movq %rdi, -8(%rbp)
  360. movl %esi, -12(%rbp)
  361. movl -12(%rbp), %edx
  362. movq -8(%rbp), %rax
  363. movl %edx, %esi
  364. movq %rax, %rdi
  365. call strrchr
  366. leave
  367. ret
  368. .comm inside_main,4,4
  369. .globl main
  370. .globl _start
  371. _start:
  372. pushq %rbp
  373. movq %rsp, %rbp
  374. movl $1, inside_main(%rip)
  375. call main_test
  376. movl $0, inside_main(%rip)
  377. movl $0, %eax
  378. popq %rbp
  379. ret
  380. .globl link_error
  381. link_error:
  382. pushq %rbp
  383. movq %rsp, %rbp
  384. call abort
  385. .globl bar
  386. .section .rodata
  387. LC0:
  388. .string "hi world"
  389. .data
  390. bar:
  391. .quad LC0
  392. .globl x
  393. x:
  394. .long 7
  395. .section .rodata
  396. LC1:
  397. .string "hello world"
  398. .text
  399. .globl main_test
  400. main_test:
  401. pushq %rbp
  402. movq %rsp, %rbp
  403. subq $16, %rsp
  404. movq $LC1, -8(%rbp)
  405. movq -8(%rbp), %rax
  406. movl $120, %esi
  407. movq %rax, %rdi
  408. call strrchr
  409. testq %rax, %rax
  410. je L62
  411. call abort
  412. L62:
  413. movq -8(%rbp), %rax
  414. movl $111, %esi
  415. movq %rax, %rdi
  416. call strrchr
  417. movq %rax, %rdx
  418. movq -8(%rbp), %rax
  419. addq $7, %rax
  420. cmpq %rax, %rdx
  421. je L63
  422. call abort
  423. L63:
  424. movq -8(%rbp), %rax
  425. movl $101, %esi
  426. movq %rax, %rdi
  427. call strrchr
  428. movq %rax, %rdx
  429. movq -8(%rbp), %rax
  430. addq $1, %rax
  431. cmpq %rax, %rdx
  432. je L64
  433. call abort
  434. L64:
  435. movq -8(%rbp), %rax
  436. addq $3, %rax
  437. movl $101, %esi
  438. movq %rax, %rdi
  439. call strrchr
  440. testq %rax, %rax
  441. je L65
  442. call abort
  443. L65:
  444. movq -8(%rbp), %rax
  445. movl $0, %esi
  446. movq %rax, %rdi
  447. call strchr
  448. movq %rax, %rdx
  449. movq -8(%rbp), %rax
  450. addq $11, %rax
  451. cmpq %rax, %rdx
  452. je L66
  453. call abort
  454. L66:
  455. movq bar(%rip), %rax
  456. movl $0, %esi
  457. movq %rax, %rdi
  458. call strchr
  459. movq %rax, %rdx
  460. movq bar(%rip), %rax
  461. addq $8, %rax
  462. cmpq %rax, %rdx
  463. je L67
  464. call abort
  465. L67:
  466. movq bar(%rip), %rax
  467. addq $4, %rax
  468. movl $0, %esi
  469. movq %rax, %rdi
  470. call strchr
  471. movq %rax, %rdx
  472. movq bar(%rip), %rax
  473. addq $8, %rax
  474. cmpq %rax, %rdx
  475. je L68
  476. call abort
  477. L68:
  478. movq bar(%rip), %rcx
  479. movl x(%rip), %eax
  480. leal 1(%rax), %edx
  481. movl %edx, x(%rip)
  482. cltq
  483. andl $3, %eax
  484. addq %rcx, %rax
  485. movl $0, %esi
  486. movq %rax, %rdi
  487. call strchr
  488. movq %rax, %rdx
  489. movq bar(%rip), %rax
  490. addq $8, %rax
  491. cmpq %rax, %rdx
  492. je L69
  493. call abort
  494. L69:
  495. movl x(%rip), %eax
  496. cmpl $8, %eax
  497. je L70
  498. call abort
  499. L70:
  500. movq -8(%rbp), %rax
  501. movl $111, %esi
  502. movq %rax, %rdi
  503. call strrchr
  504. movq %rax, %rdx
  505. movq -8(%rbp), %rax
  506. addq $7, %rax
  507. cmpq %rax, %rdx
  508. je L71
  509. call abort
  510. L71:
  511. movq -8(%rbp), %rax
  512. movl $111, %esi
  513. movq %rax, %rdi
  514. call rindex
  515. movq %rax, %rdx
  516. movq -8(%rbp), %rax
  517. addq $7, %rax
  518. cmpq %rax, %rdx
  519. je L73
  520. call abort
  521. L73:
  522. nop
  523. leave
  524. ret