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