0015-memxxx-align-version-with-merge-tech-or-B-ext.patch 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
  1. From 58e09fded3cf5222461c2a0198b47368bb69d3d6 Mon Sep 17 00:00:00 2001
  2. From: "demin.han" <demin.han@starfivetech.com>
  3. Date: Fri, 2 Dec 2022 15:06:20 +0800
  4. Subject: [PATCH 15/19] memxxx align version with merge tech or B ext
  5. ---
  6. sysdeps/riscv/rv64/multiarch/memchr_as.S | 115 +++++++--------
  7. sysdeps/riscv/rv64/multiarch/memcmp_as.S | 171 ++++++++++------------
  8. sysdeps/riscv/rv64/multiarch/memcpy_as.S | 145 +++++++++---------
  9. sysdeps/riscv/rv64/multiarch/memmove_as.S | 62 +++++++-
  10. sysdeps/riscv/rv64/multiarch/memrchr.S | 114 +++++++--------
  11. sysdeps/riscv/rv64/multiarch/memset_as.S | 129 ++++++++--------
  12. 6 files changed, 374 insertions(+), 362 deletions(-)
  13. diff --git a/sysdeps/riscv/rv64/multiarch/memchr_as.S b/sysdeps/riscv/rv64/multiarch/memchr_as.S
  14. index aa6c22a3d0..ad559e6a11 100644
  15. --- a/sysdeps/riscv/rv64/multiarch/memchr_as.S
  16. +++ b/sysdeps/riscv/rv64/multiarch/memchr_as.S
  17. @@ -21,90 +21,75 @@
  18. .option arch, +zbb
  19. -.macro chr_8B
  20. - ld a4, 0(a0)
  21. - xor a4, a4, a1
  22. - sub a3, a4, t1
  23. - andn a3, a3, a4
  24. - and a3, a3, a5
  25. - bnez a3, .L_find
  26. -.endm
  27. -.macro gen_pat
  28. - slli a3, a1, 8
  29. - or a1, a1, a3
  30. - slli a3, a1, 16
  31. - or a1, a1, a3
  32. - slli a3, a1, 32
  33. - or a1, a1, a3
  34. -
  35. - li a5, 0x80
  36. - slli a3, a5, 8
  37. - or a5, a5, a3
  38. - slli a3, a5, 16
  39. - or a5, a5, a3
  40. - slli a3, a5, 32
  41. - or a5, a5, a3 # 0x8080808080808080
  42. - srli t1, a5, 7 # 0x0101010101010101
  43. -.endm
  44. -
  45. .p2align 6
  46. ENTRY (memchr)
  47. - li a3, 7
  48. - bgtu a2, a3, .L_8_to_16
  49. -.L_0_to_7:
  50. - beqz a2, 1f
  51. + beqz a2, .L_not_find
  52. + li a4, 9
  53. + bltu a2, a4, .L_0_to_8
  54. +
  55. + neg a4, a0
  56. + andi a4, a4, 0x7
  57. + beqz a4, .L_dst_aligned
  58. +
  59. +.L_0_to_8:
  60. + min a4, a4, a2
  61. +.L_head:
  62. + sub a2, a2, a4
  63. 0:
  64. - lbu a4, 0(a0)
  65. - beq a1, a4, 2f
  66. - addi a2, a2, -1
  67. + lbu a3, 0(a0)
  68. + beq a1, a3, .L_find_byte
  69. + addi a4, a4, -1
  70. addi a0, a0, 1
  71. - bnez a2, 0b
  72. -1:
  73. - li a0, 0
  74. - ret
  75. -2:
  76. - ret
  77. -.L_8_to_16:
  78. - gen_pat
  79. - li a3, 16
  80. - bgtu a2, a3, .L_over_16
  81. - addi a2, a2, -8
  82. - chr_8B
  83. - add a0, a0, a2
  84. - chr_8B
  85. - j .L_not_find
  86. -.L_over_16:
  87. - neg t4, a0
  88. - andi t4, t4, 0x7
  89. - beqz t4, .L_dst_aligned
  90. - chr_8B
  91. - sub a2, a2, t4
  92. - add a0, a0, t4
  93. + bnez a4, 0b
  94. + beqz a2, .L_not_find
  95. +
  96. .L_dst_aligned:
  97. - andi t0, a2, (16-1)
  98. + andi a4, a2, (16-1)
  99. srli a2, a2, 4
  100. beqz a2, .L_tail
  101. +
  102. + slli a3, a1, 8
  103. + or a1, a1, a3
  104. + slli a3, a1, 16
  105. + or a1, a1, a3
  106. + slli a3, a1, 32
  107. + or a1, a1, a3
  108. + li a5, -1
  109. .L_loop:
  110. - chr_8B
  111. - add a0, a0, 8
  112. - chr_8B
  113. + ld a3, 0(a0)
  114. + xor a3, a3, a1
  115. + orc.b a3, a3
  116. + bne a3, a5, .L_find
  117. + addi a0, a0, 8
  118. +
  119. + ld a3, 0(a0)
  120. + xor a3, a3, a1
  121. + orc.b a3, a3
  122. + bne a3, a5, .L_find
  123. +
  124. addi a2, a2, -1
  125. add a0, a0, 8
  126. bnez a2, .L_loop
  127. - beqz t0, .L_not_find
  128. + beqz a4, .L_not_find
  129. +
  130. .L_tail:
  131. - add a0, a0, t0
  132. - addi a0, a0, -16
  133. - chr_8B
  134. - add a0, a0, 8
  135. - chr_8B
  136. + andi a1, a1, 0xff
  137. +0:
  138. + lbu a3, 0(a0)
  139. + beq a1, a3, .L_find_byte
  140. + addi a4, a4, -1
  141. + addi a0, a0, 1
  142. + bnez a4, 0b
  143. +
  144. .L_not_find:
  145. li a0, 0
  146. ret
  147. .L_find:
  148. + not a3, a3
  149. ctz a3, a3
  150. srli a3, a3, 3
  151. add a0, a0, a3
  152. +.L_find_byte:
  153. ret
  154. END (memchr)
  155. libc_hidden_builtin_def (memchr)
  156. diff --git a/sysdeps/riscv/rv64/multiarch/memcmp_as.S b/sysdeps/riscv/rv64/multiarch/memcmp_as.S
  157. index 984aeb7645..972f6cb5fd 100644
  158. --- a/sysdeps/riscv/rv64/multiarch/memcmp_as.S
  159. +++ b/sysdeps/riscv/rv64/multiarch/memcmp_as.S
  160. @@ -17,84 +17,46 @@
  161. <http://www.gnu.org/licenses/>. */
  162. #include <sysdep.h>
  163. +.option arch, +zbb
  164. .p2align 6
  165. ENTRY (memcmp)
  166. - li a3, 32
  167. mv a5, a0
  168. - bgtu a2, a3, .L_over_32
  169. - li a3, 3
  170. - bgtu a2, a3, .L_4_to_8
  171. -.L_0_to_3:
  172. - beqz a2, 2f
  173. + li a4, 9
  174. + bltu a2, a4, .L_0_to_8
  175. +
  176. + neg a4, a5
  177. + andi a4, a4, 0x7
  178. + beqz a4, .L_8B_aligned
  179. +
  180. +.L_0_to_8:
  181. + min a4, a4, a2
  182. +.L_head:
  183. + beqz a4, 2f
  184. + sub a2, a2, a4
  185. + add a4, a4, a5
  186. 0:
  187. lbu a3, 0(a1)
  188. - lbu a4, 0(a5)
  189. - bne a3, a4, 1f
  190. - addi a2, a2, -1
  191. + lbu a0, 0(a5)
  192. + bne a3, a0, 1f
  193. addi a1, a1, 1
  194. addi a5, a5, 1
  195. - bnez a2, 0b
  196. + bltu a5, a4, 0b
  197. + beqz a2, 2f
  198. + j .L_8B_aligned
  199. 1:
  200. - sub a0, a4, a3
  201. + sub a0, a0, a3
  202. ret
  203. 2:
  204. li a0, 0
  205. ret
  206. -.L_4_to_8:
  207. - li a3, 8
  208. - bgtu a2, a3, .L_9_to_16
  209. - lwu a3, 0(a1)
  210. - lwu a0, 0(a5)
  211. - bne a3, a0, .L_end
  212. - add a1, a1, a2
  213. - add a5, a5, a2
  214. - lwu a3, -4(a1)
  215. - lwu a0, -4(a5)
  216. - j .L_end
  217. -.L_9_to_16:
  218. - li a3, 16
  219. - bgtu a2, a3, .L_17_to_32
  220. - addi a2, a2, -8
  221. - ld a3, 0(a1)
  222. - ld a0, 0(a5)
  223. - bne a3, a0, .L_end
  224. - add a1, a1, a2
  225. - add a5, a5, a2
  226. - ld a3, 0(a1)
  227. - ld a0, 0(a5)
  228. - j .L_end
  229. -.L_17_to_32:
  230. - addi a2, a2, -16
  231. - ld a3, 0(a1)
  232. - ld a0, 0(a5)
  233. - bne a3, a0, .L_end
  234. - ld a3, 8(a1)
  235. - ld a0, 8(a5)
  236. - bne a3, a0, .L_end
  237. - add a1, a1, a2
  238. - add a5, a5, a2
  239. - ld a3, 0(a1)
  240. - ld a0, 0(a5)
  241. - bne a3, a0, .L_end
  242. - ld a3, 8(a1)
  243. - ld a0, 8(a5)
  244. - j .L_end
  245. -.L_over_32:
  246. - neg a4, a5
  247. - andi a4, a4, 0x7
  248. - beqz a4, .L_dst_aligned
  249. - ld a3, 0(a1)
  250. - ld a0, 0(a5)
  251. - bne a3, a0, .L_end
  252. - sub a2, a2, a4
  253. - add a5, a5, a4
  254. - add a1, a1, a4
  255. -.L_dst_aligned:
  256. - andi a4, a2, -32
  257. - andi a2, a2, (32-1)
  258. - beqz a4, .L_tail
  259. +.L_8B_aligned:
  260. + andi a4, a2, -16
  261. + beqz a4, .L_byte
  262. add a4, a4, a5
  263. + andi t5, a1, 0x7
  264. + andi a2, a2, (16-1)
  265. + bnez t5, .L_merge
  266. .L_loop:
  267. ld a3, 0(a1)
  268. ld a0, 0(a5)
  269. @@ -102,36 +64,14 @@ ENTRY (memcmp)
  270. ld a3, 8(a1)
  271. ld a0, 8(a5)
  272. bne a3, a0, .L_end
  273. - ld a3, 16(a1)
  274. - ld a0, 16(a5)
  275. - bne a3, a0, .L_end
  276. - ld a3, 24(a1)
  277. - ld a0, 24(a5)
  278. - bne a3, a0, .L_end
  279. - addi a5, a5, 32
  280. - addi a1, a1, 32
  281. + addi a5, a5, 16
  282. + addi a1, a1, 16
  283. bltu a5, a4, .L_loop
  284. - beqz a2, .L_end
  285. -.L_tail:
  286. - andi a4, a2, -8
  287. - beqz a4, .L_last
  288. - add a4, a4, a5
  289. -0:
  290. - ld a3, 0(a1)
  291. - ld a0, 0(a5)
  292. - bne a3, a0, .L_end
  293. - add a5, a5, 8
  294. - add a1, a1, 8
  295. - bltu a5, a4, 0b
  296. + bnez a2, .L_byte
  297. -.L_last:
  298. - andi a2, a2, (8-1)
  299. - beqz a2, 3f
  300. - add a1, a1, a2
  301. - add a5, a5, a2
  302. - ld a3, -8(a1)
  303. - ld a0, -8(a5)
  304. .L_end:
  305. + rev8 a0, a0
  306. + rev8 a3, a3
  307. bltu a0, a3, 2f
  308. beq a0, a3, 3f
  309. li a0, 1
  310. @@ -142,6 +82,55 @@ ENTRY (memcmp)
  311. 3:
  312. li a0, 0
  313. ret
  314. +
  315. +.L_byte:
  316. + add a2, a2, a5
  317. +0:
  318. + lbu a3, 0(a1)
  319. + lbu a4, 0(a5)
  320. + bne a3, a4, 1f
  321. + addi a5, a5, 1
  322. + addi a1, a1, 1
  323. + bltu a5, a2, 0b
  324. +1:
  325. + sub a0, a4, a3
  326. + ret
  327. +2:
  328. + li a0, 0
  329. + ret
  330. +
  331. + .balign 4
  332. + .option push
  333. + .option norvc
  334. +.L_merge:
  335. + andi a1, a1, -8
  336. + ld t2, 0(a1)
  337. + slli t3, t5, 3
  338. + neg t4, t3
  339. + andi t4, t4, (64 - 1)
  340. + srl t1, t2, t3
  341. +1:
  342. + ld t2, 8(a1)
  343. + sll a3, t2, t4
  344. + or a3, a3, t1
  345. + ld a0, 0(a5)
  346. + bne a3, a0, .L_end
  347. + srl t1, t2, t3
  348. +
  349. + ld t2, 16(a1)
  350. + sll a3, t2, t4
  351. + or a3, a3, t1
  352. + ld a0, 8(a5)
  353. + bne a3, a0, .L_end
  354. + srl t1, t2, t3
  355. + .option pop
  356. +
  357. + addi a5, a5, 16
  358. + addi a1, a1, 16
  359. + bltu a5, a4, 1b
  360. + beqz a2, .L_end
  361. + add a1, a1, t5
  362. + j .L_byte
  363. END (memcmp)
  364. libc_hidden_builtin_def (memcmp)
  365. diff --git a/sysdeps/riscv/rv64/multiarch/memcpy_as.S b/sysdeps/riscv/rv64/multiarch/memcpy_as.S
  366. index 4a97d75545..fae522684c 100644
  367. --- a/sysdeps/riscv/rv64/multiarch/memcpy_as.S
  368. +++ b/sysdeps/riscv/rv64/multiarch/memcpy_as.S
  369. @@ -32,73 +32,50 @@
  370. .p2align 6
  371. ENTRY (memcpy)
  372. - li a3, 32
  373. mv a5, a0
  374. - bgtu a2, a3, .L_over_32
  375. - li a3, 4
  376. - bgtu a2, a3, .L_5_to_8
  377. -.L_0_to_4:
  378. - beqz a2, 1f
  379. - lb a4, 0(a1)
  380. - sb a4, 0(a5)
  381. - /* process [n-1] */
  382. - add t1, a1, a2
  383. - lb a4, -1(t1)
  384. - add t0, a5, a2
  385. - sb a4, -1(t0)
  386. - li a3, 2
  387. - bleu a2, a3, 1f
  388. - lb a4, 2(a1)
  389. - sb a4, 2(a5)
  390. - lb a4, 1(a1)
  391. - sb a4, 1(a5)
  392. -1:
  393. - ret
  394. -.L_5_to_8:
  395. - li a3, 8
  396. - bgtu a2, a3, .L_9_to_16
  397. - lw a3, 0(a1)
  398. - sw a3, 0(a5)
  399. - add a1, a1, a2
  400. - add a5, a5, a2
  401. - lw a3, -4(a1)
  402. - sw a3, -4(a5)
  403. - ret
  404. -.L_9_to_16:
  405. - li a3, 16
  406. - bgtu a2, a3, .L_17_to_32
  407. - ld a3, 0(a1)
  408. - sd a3, 0(a5)
  409. - add a1, a1, a2
  410. - add a5, a5, a2
  411. - ld a3, -8(a1)
  412. - sd a3, -8(a5)
  413. - ret
  414. -.L_17_to_32:
  415. - addi a2, a2, -16
  416. - ld a3, 0(a1)
  417. - sd a3, 0(a5)
  418. - ld a3, 8(a1)
  419. - sd a3, 8(a5)
  420. - add a1, a1, a2
  421. - add a5, a5, a2
  422. - ld a3, 0(a1)
  423. - sd a3, 0(a5)
  424. - ld a3, 8(a1)
  425. - sd a3, 8(a5)
  426. - ret
  427. -.L_over_32:
  428. + li a4, 9
  429. + bltu a2, a4, .L_byte
  430. +
  431. neg a4, a5
  432. andi a4, a4, 0x7
  433. beqz a4, .L_dst_aligned
  434. - ld a3, 0(a1)
  435. - sd a3, 0(a5)
  436. - sub a2, a2, a4
  437. + j .L_pc_0
  438. +
  439. +.L_byte:
  440. + mv a4, a2
  441. +
  442. +.L_pc_0:
  443. + auipc a3, 0
  444. + slli t0, a4, 3
  445. + sub a3, a3, t0
  446. + .equ offset_0, .L_jmp_end_0 - .L_pc_0
  447. + jalr x0, a3, %lo(offset_0)
  448. + lb a3, 7(a1)
  449. + sb a3, 7(a5)
  450. + lb a3, 6(a1)
  451. + sb a3, 6(a5)
  452. + lb a3, 5(a1)
  453. + sb a3, 5(a5)
  454. + lb a3, 4(a1)
  455. + sb a3, 4(a5)
  456. + lb a3, 3(a1)
  457. + sb a3, 3(a5)
  458. + lb a3, 2(a1)
  459. + sb a3, 2(a5)
  460. + lb a3, 1(a1)
  461. + sb a3, 1(a5)
  462. + lb a3, 0(a1)
  463. + sb a3, 0(a5)
  464. +.L_jmp_end_0:
  465. + sub a2, a2, a4 /* update cnt */
  466. + beqz a2, .L_ret
  467. add a5, a5, a4
  468. add a1, a1, a4
  469. +
  470. .L_dst_aligned:
  471. + andi t5, a1, 0x7
  472. + bnez t5, .L_merge
  473. andi a4, a2, -32
  474. - andi a2, a2, (32-1)
  475. beqz a4, .L_tail
  476. add a4, a4, a5
  477. .L_loop:
  478. @@ -106,29 +83,57 @@ ENTRY (memcpy)
  479. addi a5, a5, 32
  480. addi a1, a1, 32
  481. bltu a5, a4, .L_loop
  482. + andi a2, a2, (32-1)
  483. beqz a2, .L_ret
  484. +
  485. .L_tail:
  486. - andi a4, a2, -1
  487. + andi a4, a2, -8
  488. .L_pc:
  489. auipc a3, 0
  490. - andi a4, a4, -8
  491. - srli a4, a4, 1
  492. - sub a3, a3, a4
  493. + srli t0, a4, 1
  494. + sub a3, a3, t0
  495. .equ offset, .L_jmp_end - .L_pc
  496. jalr x0, a3, %lo(offset)
  497. - ld a3, 16(a1) # offset-12
  498. + ld a3, 16(a1)
  499. sd a3, 16(a5)
  500. - ld a3, 8(a1) # offset-8
  501. + ld a3, 8(a1)
  502. sd a3, 8(a5)
  503. - ld a3, 0(a1) # offset-4
  504. + ld a3, 0(a1)
  505. sd a3, 0(a5)
  506. .L_jmp_end:
  507. - add a1, a1, a2
  508. - add a5, a5, a2
  509. - ld a3, -8(a1)
  510. - sd a3, -8(a5)
  511. + add a1, a1, a4
  512. + add a5, a5, a4
  513. + andi a2, a2, (8 - 1) /* update cnt */
  514. + j .L_byte
  515. +
  516. .L_ret:
  517. ret
  518. +
  519. + .balign 4
  520. +.L_merge:
  521. + andi a4, a2, -8
  522. + andi a2, a2, (8 - 1) /* update cnt */
  523. + beqz a4, .L_byte
  524. + add a4, a4, a5
  525. + andi a1, a1, -8
  526. + ld t2, 0(a1)
  527. + slli t3, t5, 3
  528. + neg t4, t3
  529. + andi t4, t4, (64 - 1)
  530. + srl t1, t2, t3
  531. +1:
  532. + ld t2, 8(a1)
  533. + sll a3, t2, t4
  534. + or a3, a3, t1
  535. + sd a3, 0(a5)
  536. + srl t1, t2, t3
  537. +
  538. + addi a5, a5, 8
  539. + addi a1, a1, 8
  540. + bltu a5, a4, 1b
  541. + beqz a2, .L_ret
  542. + add a1, a1, t5
  543. + j .L_byte
  544. END (memcpy)
  545. libc_hidden_builtin_def (memcpy)
  546. diff --git a/sysdeps/riscv/rv64/multiarch/memmove_as.S b/sysdeps/riscv/rv64/multiarch/memmove_as.S
  547. index 222b87b9c8..b8275b6dd7 100644
  548. --- a/sysdeps/riscv/rv64/multiarch/memmove_as.S
  549. +++ b/sysdeps/riscv/rv64/multiarch/memmove_as.S
  550. @@ -35,10 +35,10 @@ ENTRY (memmove)
  551. bltu a3, a2, .L_overlap
  552. j memcpy
  553. .L_overlap:
  554. - li a4, 8
  555. bltu a1, a0, .L_backward
  556. mv a5, a0
  557. - bltu a2, a4, .L_byte_fwd
  558. + li a3, 8
  559. + bltu a2, a3, .L_byte_fwd
  560. neg a4, a0
  561. andi a4, a4, 0x7
  562. beqz a4, .L_32B_fwd
  563. @@ -52,6 +52,8 @@ ENTRY (memmove)
  564. addi a1, a1, 1
  565. bltu a5, a4, 0b
  566. .L_32B_fwd:
  567. + andi t5, a1, 0x7
  568. + bnez t5, .L_merge_fwd
  569. andi a4, a2, -32
  570. andi a2, a2, (32 - 1)
  571. beqz a4, .L_8B_fwd
  572. @@ -100,11 +102,36 @@ ENTRY (memmove)
  573. .L_ret_fwd:
  574. ret
  575. + .balign 4
  576. +.L_merge_fwd:
  577. + andi a4, a2, -8
  578. + beqz a4, .L_byte_tail_fwd
  579. + add a4, a4, a5
  580. + andi a1, a1, -8
  581. + ld t2, 0(a1)
  582. + slli t3, t5, 3
  583. + neg t4, t3
  584. + andi t4, t4, (64 - 1)
  585. + srl t1, t2, t3
  586. +1:
  587. + ld t2, 8(a1)
  588. + sll a3, t2, t4
  589. + or a3, a3, t1
  590. + sd a3, 0(a5)
  591. + srl t1, t2, t3
  592. +
  593. + addi a5, a5, 8
  594. + addi a1, a1, 8
  595. + bltu a5, a4, 1b
  596. + add a1, a1, t5
  597. + j .L_byte_tail_fwd
  598. +
  599. .L_backward:
  600. add a1, a1, a2
  601. add a5, a0, a2
  602. - bltu a2, a4, .L_byte_bwd
  603. - andi a4, a5, 0x7
  604. + li a3, 8
  605. + bltu a2, a3, .L_byte_bwd
  606. + andi a4, a0, 0x7
  607. beqz a4, .L_32B_bwd
  608. .L_byte_head_bwd:
  609. sub a2, a2, a4
  610. @@ -116,6 +143,8 @@ ENTRY (memmove)
  611. sb a3, 0(a5)
  612. bltu a4, a5, 0b
  613. .L_32B_bwd:
  614. + andi t5, a1, 0x7
  615. + bnez t5, .L_merge_bwd
  616. andi a4, a2, -32
  617. andi a2, a2, (32 - 1)
  618. beqz a4, .L_8B_bwd
  619. @@ -163,6 +192,31 @@ ENTRY (memmove)
  620. bltu a0, a5, 0b
  621. .L_ret_bwd:
  622. ret
  623. +
  624. + .balign 4
  625. +.L_merge_bwd:
  626. + andi a4, a2, -8
  627. + beqz a4, .L_byte_tail_bwd
  628. + sub a4, a5, a4
  629. + andi a1, a1, -8
  630. + ld t2, 0(a1)
  631. + slli t3, t5, 3
  632. + neg t4, t3
  633. + andi t4, t4, (64 - 1)
  634. + sll t1, t2, t4
  635. +1:
  636. + ld t2, -8(a1)
  637. + srl a3, t2, t3
  638. + or a3, a3, t1
  639. + sd a3, -8(a5)
  640. + sll t1, t2, t4
  641. +
  642. + addi a5, a5, -8
  643. + addi a1, a1, -8
  644. + bltu a4, a5, 1b
  645. + add a1, a1, t5
  646. + j .L_byte_tail_bwd
  647. +
  648. END (memmove)
  649. libc_hidden_builtin_def (memmove)
  650. diff --git a/sysdeps/riscv/rv64/multiarch/memrchr.S b/sysdeps/riscv/rv64/multiarch/memrchr.S
  651. index 01c2d949de..b72a13e62a 100644
  652. --- a/sysdeps/riscv/rv64/multiarch/memrchr.S
  653. +++ b/sysdeps/riscv/rv64/multiarch/memrchr.S
  654. @@ -21,96 +21,80 @@
  655. .option arch, +zbb
  656. -.macro chr_8B
  657. - ld a4, -8(a0)
  658. - xor a4, a4, a1
  659. - sub a3, a4, t1
  660. - andn a3, a3, a4
  661. - and a3, a3, a5
  662. - bnez a3, .L_find
  663. -.endm
  664. -.macro gen_pat
  665. - slli a3, a1, 8
  666. - or a1, a1, a3
  667. - slli a3, a1, 16
  668. - or a1, a1, a3
  669. - slli a3, a1, 32
  670. - or a1, a1, a3
  671. -
  672. - li a5, 0x80
  673. - slli a3, a5, 8
  674. - or a5, a5, a3
  675. - slli a3, a5, 16
  676. - or a5, a5, a3
  677. - slli a3, a5, 32
  678. - or a5, a5, a3 # 0x8080808080808080
  679. - srli t1, a5, 7 # 0x0101010101010101
  680. -.endm
  681. -
  682. .p2align 6
  683. #ifndef MEMRCHR
  684. ENTRY (__memrchr)
  685. #else
  686. ENTRY (MEMRCHR)
  687. #endif
  688. - li a3, 7
  689. + beqz a2, .L_not_find
  690. add a0, a0, a2
  691. - bgtu a2, a3, .L_8_to_16
  692. -.L_0_to_7:
  693. - beqz a2, 1f
  694. + li a4, 9
  695. + bltu a2, a4, .L_0_to_8
  696. +
  697. + andi a4, a0, 0x7
  698. + beqz a4, .L_dst_aligned
  699. +
  700. +.L_0_to_8:
  701. + min a4, a4, a2
  702. +.L_head:
  703. + sub a2, a2, a4
  704. 0:
  705. - lbu a4, -1(a0)
  706. - beq a1, a4, 2f
  707. - addi a2, a2, -1
  708. + lbu a3, -1(a0)
  709. + beq a1, a3, .L_find_byte
  710. + addi a4, a4, -1
  711. addi a0, a0, -1
  712. - bnez a2, 0b
  713. -1:
  714. - li a0, 0
  715. - ret
  716. -2:
  717. - addi a0, a0, -1
  718. - ret
  719. -.L_8_to_16:
  720. - gen_pat
  721. - li a3, 16
  722. - bgtu a2, a3, .L_over_16
  723. - addi a2, a2, -8
  724. - chr_8B
  725. - sub a0, a0, a2
  726. - chr_8B
  727. - j .L_not_find
  728. -.L_over_16:
  729. - and t4, a0, 0x7
  730. - beqz t4, .L_dst_aligned
  731. - chr_8B
  732. - sub a2, a2, t4
  733. - sub a0, a0, t4
  734. + bnez a4, 0b
  735. + beqz a2, .L_not_find
  736. +
  737. .L_dst_aligned:
  738. - andi t0, a2, (16-1)
  739. + andi a4, a2, (16-1)
  740. srli a2, a2, 4
  741. beqz a2, .L_tail
  742. +
  743. + slli a3, a1, 8
  744. + or a1, a1, a3
  745. + slli a3, a1, 16
  746. + or a1, a1, a3
  747. + slli a3, a1, 32
  748. + or a1, a1, a3
  749. + li a5, -1
  750. .L_loop:
  751. - chr_8B
  752. + ld a3, -8(a0)
  753. + xor a3, a3, a1
  754. + orc.b a3, a3
  755. + bne a3, a5, .L_find
  756. addi a0, a0, -8
  757. - chr_8B
  758. +
  759. + ld a3, -8(a0)
  760. + xor a3, a3, a1
  761. + orc.b a3, a3
  762. + bne a3, a5, .L_find
  763. +
  764. addi a2, a2, -1
  765. addi a0, a0, -8
  766. bnez a2, .L_loop
  767. - beqz t0, .L_not_find
  768. + beqz a4, .L_not_find
  769. +
  770. .L_tail:
  771. - sub a0, a0, t0
  772. - addi a0, a0, 16
  773. - chr_8B
  774. - addi a0, a0, -8
  775. - chr_8B
  776. + andi a1, a1, 0xff
  777. +0:
  778. + lbu a3, -1(a0)
  779. + beq a1, a3, .L_find_byte
  780. + addi a4, a4, -1
  781. + addi a0, a0, -1
  782. + bnez a4, 0b
  783. +
  784. .L_not_find:
  785. li a0, 0
  786. ret
  787. .L_find:
  788. + not a3, a3
  789. clz a3, a3
  790. - addi a0, a0, -1
  791. srli a3, a3, 3
  792. sub a0, a0, a3
  793. +.L_find_byte:
  794. + addi a0, a0, -1
  795. ret
  796. #ifndef MEMRCHR
  797. END (__memrchr)
  798. diff --git a/sysdeps/riscv/rv64/multiarch/memset_as.S b/sysdeps/riscv/rv64/multiarch/memset_as.S
  799. index 7f67c79215..455033adf0 100644
  800. --- a/sysdeps/riscv/rv64/multiarch/memset_as.S
  801. +++ b/sysdeps/riscv/rv64/multiarch/memset_as.S
  802. @@ -21,53 +21,38 @@
  803. .p2align 6
  804. ENTRY (memset)
  805. - li a3, 32
  806. - andi a1, a1, 0xff
  807. mv a5, a0
  808. - bgtu a2, a3, .L_over_32
  809. - li a3, 4
  810. - bgtu a2, a3, .L_5_to_8
  811. -.L_0_to_4:
  812. - beqz a2, 1f
  813. - sb a1, 0(a5)
  814. - add t0, a5, a2
  815. - sb a1, -1(t0)
  816. - li a3, 2
  817. - bleu a2, a3, 1f
  818. - sb a1, 1(a5)
  819. + andi a1, a1, 0xff
  820. + li a4, 9
  821. + bltu a2, a4, .L_0_to_8
  822. +
  823. + neg a4, a5
  824. + andi a4, a4, 0x7
  825. + beqz a4, .L_dst_aligned
  826. + j .L_pc_0
  827. +.L_0_to_8:
  828. + mv a4, a2
  829. +
  830. +.L_pc_0:
  831. + auipc a3, 0
  832. + slli t0, a4, 2
  833. + sub a3, a3, t0
  834. + .equ offset_0, .L_jmp_end_0 - .L_pc_0
  835. + jalr x0, a3, %lo(offset_0)
  836. + sb a1, 7(a5)
  837. + sb a1, 6(a5)
  838. + sb a1, 5(a5)
  839. + sb a1, 4(a5)
  840. + sb a1, 3(a5)
  841. sb a1, 2(a5)
  842. -1:
  843. - ret
  844. -.L_5_to_8:
  845. - slli a3, a1, 8
  846. - or a1, a1, a3
  847. - slli a3, a1, 16
  848. - or a1, a1, a3
  849. - li a3, 8
  850. - bgtu a2, a3, .L_9_to_16
  851. - sw a1, 0(a5)
  852. - add a5, a5, a2
  853. - sw a1, -4(a5)
  854. - ret
  855. -.L_9_to_16:
  856. - li a3, 16
  857. - bgtu a2, a3, .L_17_to_32
  858. - sw a1, 0(a5)
  859. - sw a1, 4(a5)
  860. - add a5, a5, a2
  861. - sw a1, -8(a5)
  862. - sw a1, -4(a5)
  863. - ret
  864. -.L_17_to_32:
  865. - slli a3, a1, 32
  866. - or a1, a1, a3
  867. - sd a1, 0(a5)
  868. - sd a1, 8(a5)
  869. - add a5, a5, a2
  870. - sd a1, -16(a5)
  871. - sd a1, -8(a5)
  872. - ret
  873. -.L_over_32:
  874. + sb a1, 1(a5)
  875. + sb a1, 0(a5)
  876. +.L_jmp_end_0:
  877. + sub a2, a2, a4 /* update cnt */
  878. + beqz a2, .L_ret
  879. + add a5, a5, a4
  880. +
  881. +.L_dst_aligned:
  882. slli a3, a1, 8
  883. or a1, a1, a3
  884. slli a3, a1, 16
  885. @@ -75,17 +60,10 @@ ENTRY (memset)
  886. slli a3, a1, 32
  887. or a1, a1, a3
  888. - neg a4, a5
  889. - andi a4, a4, 0x7
  890. - beqz a4, .L_dst_aligned
  891. - sd a1, 0(a5)
  892. - sub a2, a2, a4
  893. - add a5, a5, a4
  894. -.L_dst_aligned:
  895. andi a4, a2, -64
  896. - andi a2, a2, (64-1)
  897. beqz a4, .L_tail
  898. add a4, a4, a5
  899. +
  900. .L_loop:
  901. sd a1, 0(a5)
  902. sd a1, 8(a5)
  903. @@ -97,27 +75,44 @@ ENTRY (memset)
  904. sd a1, 56(a5)
  905. addi a5, a5, 64
  906. bltu a5, a4, .L_loop
  907. + andi a2, a2, (64-1) /* update cnt */
  908. beqz a2, .L_ret
  909. +
  910. .L_tail:
  911. - andi a4, a2, -1
  912. + andi a4, a2, -8
  913. .L_pc:
  914. auipc a3, 0
  915. - andi a4, a4, -8
  916. - srli a4, a4, 2
  917. - sub a3, a3, a4
  918. + srli t0, a4, 2
  919. + sub a3, a3, t0
  920. .equ offset, .L_jmp_end - .L_pc
  921. jalr x0, a3, %lo(offset)
  922. - sd a1, 48(a5)
  923. - sd a1, 40(a5)
  924. - sd a1, 32(a5)
  925. - sd a1, 24(a5)
  926. - sd a1, 16(a5)
  927. - sd a1, 8(a5)
  928. - sd a1, 0(a5)
  929. + sd a1, 6*8(a5)
  930. + sd a1, 5*8(a5)
  931. + sd a1, 4*8(a5)
  932. + sd a1, 3*8(a5)
  933. + sd a1, 2*8(a5)
  934. + sd a1, 1*8(a5)
  935. + sd a1, 0*8(a5)
  936. .L_jmp_end:
  937. - add a5, a5, a2
  938. - sd a1, -8(a5)
  939. - .L_ret:
  940. + add a5, a5, a4
  941. + andi a4, a2, (8 - 1) /* update cnt */
  942. +
  943. +.L_tail_byte:
  944. +.L_pc_2:
  945. + auipc a3, 0
  946. + slli a4, a4, 2
  947. + sub a3, a3, a4
  948. + .equ offset_2, .L_jmp_end_2 - .L_pc_2
  949. + jalr x0, a3, %lo(offset_2)
  950. + sb a1, 6(a5)
  951. + sb a1, 5(a5)
  952. + sb a1, 4(a5)
  953. + sb a1, 3(a5)
  954. + sb a1, 2(a5)
  955. + sb a1, 1(a5)
  956. + sb a1, 0(a5)
  957. +.L_jmp_end_2:
  958. +.L_ret:
  959. ret
  960. END (memset)
  961. libc_hidden_builtin_def (memset)
  962. --
  963. 2.25.1