Похоже на memrchr
, с проверкой cmpq
для позиции поиска, возвращающейся к началу буфера, и проверкой cmpb
на соответствующий байт.
cmp
просто устанавливает флаги в соответствии с dst - src
, точно так же как sub
.Так что он сравнивает свои входные операнды, конечно.В этом случае оба регистра qword содержат указатели.
Я бы не рекомендовал jle
для сравнения адресов;лучше относиться к адресам как к неподписанным.Хотя для x86-64 это на самом деле не имеет значения;Вы не можете иметь массив, который охватывает границу переполнения со знаком, потому что там есть неканоническая "дыра". Должны ли сравнения указателей быть подписаны или не подписаны в 64-битной x86?
Тем не менее, jbe
будет иметь больше смысла.Если у вас нет массивов, которые пересекают границу от самого высокого адреса до самого низкого адреса, указатель переносится с 0xfff...fff
на 0
.Но в любом случае вы могли бы исправить эту ошибку, выполнив if (p == start) break
вместо p <= start
.
Хотя в этой функции есть ошибка , при условии, что она написана для x86-64 System V ABI: его сигнатура принимает аргумент размером int
, но она предполагает, что его знак расширяется до ширины указателя, когда он char *endp = start + len
.
ABI позволяет узким аргументам иметь мусор в старших битахих реестра. Требуется ли расширение знака или нуля при добавлении 32-битного смещения к указателю для ABI x86-64?
При этом также возникают серьезные проблемы с производительностью: проверяется 1 байт за раз.общее количество мусора против SSE2 16 байт за раз.Кроме того, он не использует ни одну условную ветвь в качестве ветви цикла, поэтому он имеет 3 перехода на каждую итерацию вместо 2. т. Е. Дополнительную неиспользованную условную ветвь.
Кроме того, после цикла он вычитает указатель-вычитаетвместо того, чтобы тратить inc %eax
внутри цикла.Если вы собираетесь делать inc %eax
внутри цикла, вы можете также сравнить его с размером вместо сравнения указателя.
В любом случае, функция написана так, чтобы ее было легко перепроектировать, а небыть эффективным.jmp
, а также 2 условных ветви ухудшают эту IMO по сравнению с идиоматическим циклом с условием внизу.