Add "memory" clobbers to the x86 inline asm of strncmp and friends

They don't actually clobber memory, but gcc doesn't even know they
_read_ memory, so can apparently re-order memory accesses around them.

Which obviously does the wrong thing if the memory access happens to
change the memory that the compare function is accessing..

Verified to fix a strange boot problem by Jens Axboe.

+22 -10
+22 -10
include/asm-i386/string.h
··· 116 "orb $1,%%al\n" 117 "3:" 118 :"=a" (__res), "=&S" (d0), "=&D" (d1) 119 - :"1" (cs),"2" (ct)); 120 return __res; 121 } 122 ··· 139 "3:\tsbbl %%eax,%%eax\n\t" 140 "orb $1,%%al\n" 141 "4:" 142 - :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) 143 - :"1" (cs),"2" (ct),"3" (count)); 144 return __res; 145 } 146 ··· 160 "movl $1,%1\n" 161 "2:\tmovl %1,%0\n\t" 162 "decl %0" 163 - :"=a" (__res), "=&S" (d0) : "1" (s),"0" (c)); 164 return __res; 165 } 166 ··· 179 "leal -1(%%esi),%0\n" 180 "2:\ttestb %%al,%%al\n\t" 181 "jne 1b" 182 - :"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c)); 183 return __res; 184 } 185 ··· 195 "scasb\n\t" 196 "notl %0\n\t" 197 "decl %0" 198 - :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffffu)); 199 return __res; 200 } 201 ··· 341 "je 1f\n\t" 342 "movl $1,%0\n" 343 "1:\tdecl %0" 344 - :"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count)); 345 return __res; 346 } 347 ··· 379 "je 2f\n\t" 380 "stosb\n" 381 "2:" 382 - : "=&c" (d0), "=&D" (d1) 383 :"a" (c), "q" (count), "0" (count/4), "1" ((long) s) 384 :"memory"); 385 return (s); ··· 402 "jne 1b\n" 403 "3:\tsubl %2,%0" 404 :"=a" (__res), "=&d" (d0) 405 - :"c" (s),"1" (count)); 406 return __res; 407 } 408 /* end of additional stuff */ ··· 484 "dec %%edi\n" 485 "1:" 486 : "=D" (addr), "=c" (size) 487 - : "0" (addr), "1" (size), "a" (c)); 488 return addr; 489 } 490
··· 116 "orb $1,%%al\n" 117 "3:" 118 :"=a" (__res), "=&S" (d0), "=&D" (d1) 119 + :"1" (cs),"2" (ct) 120 + :"memory"); 121 return __res; 122 } 123 ··· 138 "3:\tsbbl %%eax,%%eax\n\t" 139 "orb $1,%%al\n" 140 "4:" 141 + :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) 142 + :"1" (cs),"2" (ct),"3" (count) 143 + :"memory"); 144 return __res; 145 } 146 ··· 158 "movl $1,%1\n" 159 "2:\tmovl %1,%0\n\t" 160 "decl %0" 161 + :"=a" (__res), "=&S" (d0) 162 + :"1" (s),"0" (c) 163 + :"memory"); 164 return __res; 165 } 166 ··· 175 "leal -1(%%esi),%0\n" 176 "2:\ttestb %%al,%%al\n\t" 177 "jne 1b" 178 + :"=g" (__res), "=&S" (d0), "=&a" (d1) 179 + :"0" (0),"1" (s),"2" (c) 180 + :"memory"); 181 return __res; 182 } 183 ··· 189 "scasb\n\t" 190 "notl %0\n\t" 191 "decl %0" 192 + :"=c" (__res), "=&D" (d0) 193 + :"1" (s),"a" (0), "0" (0xffffffffu) 194 + :"memory"); 195 return __res; 196 } 197 ··· 333 "je 1f\n\t" 334 "movl $1,%0\n" 335 "1:\tdecl %0" 336 + :"=D" (__res), "=&c" (d0) 337 + :"a" (c),"0" (cs),"1" (count) 338 + :"memory"); 339 return __res; 340 } 341 ··· 369 "je 2f\n\t" 370 "stosb\n" 371 "2:" 372 + :"=&c" (d0), "=&D" (d1) 373 :"a" (c), "q" (count), "0" (count/4), "1" ((long) s) 374 :"memory"); 375 return (s); ··· 392 "jne 1b\n" 393 "3:\tsubl %2,%0" 394 :"=a" (__res), "=&d" (d0) 395 + :"c" (s),"1" (count) 396 + :"memory"); 397 return __res; 398 } 399 /* end of additional stuff */ ··· 473 "dec %%edi\n" 474 "1:" 475 : "=D" (addr), "=c" (size) 476 + : "0" (addr), "1" (size), "a" (c) 477 + : "memory"); 478 return addr; 479 } 480