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

https://github.com/kframework/X86-64-semantics · Assembly · 513 lines · 510 code · 3 blank · 0 comment · 0 complexity · 033eb5a5ebb46dd1509d7d369116e604 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. .comm inside_main,4,4
  316. .globl main
  317. .globl _start
  318. _start:
  319. pushq %rbp
  320. movq %rsp, %rbp
  321. movl $1, inside_main(%rip)
  322. call main_test
  323. movl $0, inside_main(%rip)
  324. movl $0, %eax
  325. popq %rbp
  326. ret
  327. .globl link_error
  328. link_error:
  329. pushq %rbp
  330. movq %rsp, %rbp
  331. call abort
  332. .globl x
  333. .data
  334. x:
  335. .long 6
  336. .section .rodata
  337. LC0:
  338. .string "hello world"
  339. .text
  340. .globl main_test
  341. main_test:
  342. pushq %rbp
  343. movq %rsp, %rbp
  344. subq $32, %rsp
  345. movq $40, %rax
  346. movq %rax, -8(%rbp)
  347. xorl %eax, %eax
  348. movq $LC0, -32(%rbp)
  349. movq -32(%rbp), %rax
  350. movq %rax, %rdi
  351. call strlen
  352. cmpq $11, %rax
  353. je L54
  354. call abort
  355. L54:
  356. movq -32(%rbp), %rax
  357. addq $4, %rax
  358. movq %rax, %rdi
  359. call strlen
  360. cmpq $7, %rax
  361. je L55
  362. call abort
  363. L55:
  364. movl x(%rip), %eax
  365. leal 1(%rax), %edx
  366. movl %edx, x(%rip)
  367. cltq
  368. andl $7, %eax
  369. movq %rax, %rdx
  370. movq -32(%rbp), %rax
  371. addq %rdx, %rax
  372. movq %rax, %rdi
  373. call strlen
  374. cmpq $5, %rax
  375. je L56
  376. call abort
  377. L56:
  378. movl x(%rip), %eax
  379. cmpl $7, %eax
  380. je L57
  381. call abort
  382. L57:
  383. leaq -16(%rbp), %rax
  384. movq %rax, -24(%rbp)
  385. movq -24(%rbp), %rax
  386. movb $110, (%rax)
  387. movq -24(%rbp), %rax
  388. addq $1, %rax
  389. movb $116, (%rax)
  390. movq -24(%rbp), %rax
  391. addq $2, %rax
  392. movb $115, (%rax)
  393. movq -24(%rbp), %rax
  394. addq $3, %rax
  395. movb $0, (%rax)
  396. movq -24(%rbp), %rax
  397. movzbl (%rax), %eax
  398. testb %al, %al
  399. jne L58
  400. call abort
  401. L58:
  402. movq -24(%rbp), %rax
  403. movb $110, (%rax)
  404. movq -24(%rbp), %rax
  405. addq $1, %rax
  406. movb $116, (%rax)
  407. movq -24(%rbp), %rax
  408. addq $2, %rax
  409. movb $115, (%rax)
  410. movq -24(%rbp), %rax
  411. addq $3, %rax
  412. movb $0, (%rax)
  413. movq -24(%rbp), %rax
  414. movzbl (%rax), %eax
  415. testb %al, %al
  416. jne L59
  417. call abort
  418. L59:
  419. movq -24(%rbp), %rax
  420. movb $110, (%rax)
  421. movq -24(%rbp), %rax
  422. addq $1, %rax
  423. movb $116, (%rax)
  424. movq -24(%rbp), %rax
  425. addq $2, %rax
  426. movb $115, (%rax)
  427. movq -24(%rbp), %rax
  428. addq $3, %rax
  429. movb $0, (%rax)
  430. movq -24(%rbp), %rax
  431. movzbl (%rax), %eax
  432. testb %al, %al
  433. jne L60
  434. call abort
  435. L60:
  436. movq -24(%rbp), %rax
  437. movb $110, (%rax)
  438. movq -24(%rbp), %rax
  439. addq $1, %rax
  440. movb $116, (%rax)
  441. movq -24(%rbp), %rax
  442. addq $2, %rax
  443. movb $115, (%rax)
  444. movq -24(%rbp), %rax
  445. addq $3, %rax
  446. movb $0, (%rax)
  447. movq -24(%rbp), %rax
  448. addq $3, %rax
  449. movzbl (%rax), %eax
  450. testb %al, %al
  451. je L61
  452. call abort
  453. L61:
  454. movq -24(%rbp), %rax
  455. movb $110, (%rax)
  456. movq -24(%rbp), %rax
  457. addq $1, %rax
  458. movb $116, (%rax)
  459. movq -24(%rbp), %rax
  460. addq $2, %rax
  461. movb $115, (%rax)
  462. movq -24(%rbp), %rax
  463. addq $3, %rax
  464. movb $0, (%rax)
  465. movq -24(%rbp), %rax
  466. addq $3, %rax
  467. movzbl (%rax), %eax
  468. testb %al, %al
  469. je L62
  470. call abort
  471. L62:
  472. movq -24(%rbp), %rax
  473. movb $110, (%rax)
  474. movq -24(%rbp), %rax
  475. addq $1, %rax
  476. movb $116, (%rax)
  477. movq -24(%rbp), %rax
  478. addq $2, %rax
  479. movb $115, (%rax)
  480. movq -24(%rbp), %rax
  481. addq $3, %rax
  482. movb $0, (%rax)
  483. leaq -16(%rbp), %rax
  484. addq $3, %rax
  485. movzbl (%rax), %eax
  486. testb %al, %al
  487. je L63
  488. call abort
  489. L63:
  490. movq -32(%rbp), %rax
  491. movq $-1, %rcx
  492. movq %rax, %rdx
  493. movl $0, %eax
  494. movq %rdx, %rdi
  495. repnz scasb
  496. movq %rcx, %rax
  497. notq %rax
  498. subq $1, %rax
  499. cmpq $11, %rax
  500. je L66
  501. call abort
  502. L66:
  503. nop
  504. movq -8(%rbp), %rax
  505. xorq $40, %rax
  506. je L65
  507. call __stack_chk_fail
  508. L65:
  509. leave
  510. ret