Существуют ли функции memset, которые заполняют буфер в обратном порядке?

Я знаю, что существуют реализации memcpy, которые копируют память в обратном порядке для оптимизации для некоторых процессоров. В свое время с этим связана ошибка " Странный звук на веб-сайте flash flash. Ну, это была интересная история, но мой вопрос касается другой функции.

Мне интересно, есть функция memset в мире, которая заполняет буфер, начиная с конца. Понятно, что в теории ничего не мешает делать такую ​​реализацию функции. Но меня интересует именно то, что эта функция на практике была реализована кем-то. Я был бы особенно благодарен за ссылку в библиотеке с такой функцией.

P.S. Я понимаю, что с точки зрения программирования приложений совершенно неважно, заполняется ли буфер в порядке возрастания или убывания. Однако для меня важно выяснить, была ли реализована реализация "обратной" функции. Мне нужно это для написания статьи.

Ответ 1

Ядро memset для ядра SuperH имеет следующее свойство:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/sh/lib/memset.S?id=v4.14

Предположительно, это было сделано так, потому что инструкция mov существует в предопределенной форме (mov.l Rm,@-Rn), но не в форме постинкремента. См:

http://shared-ptr.com/sh_insns.html

Если вы хотите что-то, что не является технически внутренним ядром в автономной реализации, а фактическая размещенная реализация C, к которой может быть привязан код приложения, musl libc также имеет пример:

https://git.musl-libc.org/cgit/musl/tree/src/string/memset.c?id=v1.1.18

Здесь C-версия memset (используется для многих, но не для всех целевых арков) фактически не заполняет весь буфер назад, а скорее начинается с начала и конца способом, который уменьшает количество условных ветвей и делает все они предсказуемы для очень маленьких memsets. См. Сообщение о фиксации, где оно было добавлено для деталей:

https://git.musl-libc.org/cgit/musl/commit/src/string/memset.c?id=a543369e3b06a51eacd392c738fc10c5267a195f

Некоторые из арх-специфических версий memset asm также обладают следующим свойством:

https://git.musl-libc.org/cgit/musl/tree/src/string/x86_64/memset.s?id=v1.1.18