lkml.org 
[lkml]   [2003]   [Aug]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: generic strncpy - off-by-one error
On Tue, Aug 12, 2003 at 11:38:31PM -0400, Albert Cahalan wrote:
> That's excellent. On ppc I count 12 instructions,
> 4 of which would go away for typical usage if inlined.
> Annoyingly, gcc doesn't get the same assembly from my
> attempt at that general idea:
>
> char * strncpy_5(char *dest, const char *src, size_t count){
> char *tmp = dest;
> while (count--){
> if(( *tmp++ = *src )) src++;
> }
> return dest;
> }
>
> I suppose that gcc could use a bug report.

I often noticed that using '++' and '--' within or just before assignments
and/or comparisons often break the code and make it suboptimal. C provides
enough flexibility to code what you think nearly at the instruction level.
Since 'while' loops often start with a jump to the end, you can sometimes help
the compiler by enclosing them within an 'if' statement such as below. BTW, in
your case, count ends with -1.

I've absolutely not tried this one, but it could produce different code on your
PPC, and can trivially be derived to cleaner constructs. I proceeded the same
way when I wrote my own optimized strlcpy() implementation which is 45 bytes
long and copies 1 char per CPU cycle on i686.

char *strncpy(char *dest, const char *src, size_t count)
{
if (count) {
char *tmp = dest;
while (1) {
*tmp = *src;
if (*src) src++;
tmp++;
if (!count--) break;
}
}
return dest;
}

Cheers,
Willy

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:47    [W:0.897 / U:0.396 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site