comparison src/os/unix/ngx_gcc_atomic_x86.h @ 138:8e6d4d96ec4c NGINX_0_3_16

nginx 0.3.16 *) Feature: the ngx_http_map_module. *) Feature: the "types_hash_max_size" and "types_hash_bucket_size" directives. *) Feature: the "ssi_value_length" directive. *) Feature: the "worker_rlimit_core" directive. *) Workaround: the connection number in logs was always 1 if nginx was built by the icc 8.1 or 9.0 compilers with optimization for Pentium 4. *) Bugfix: the "config timefmt" SSI command set incorrect time format. *) Bugfix: nginx did not close connection to IMAP/POP3 backend for the SSL connections; bug appeared in 0.3.13. Thanks to Rob Mueller. *) Bugfix: segmentation fault may occurred in at SSL shutdown; bug appeared in 0.3.13.
author Igor Sysoev <http://sysoev.ru>
date Fri, 16 Dec 2005 00:00:00 +0300
parents df17fbafec8f
children 73e8476f9142
comparison
equal deleted inserted replaced
137:768f51dd150b 138:8e6d4d96ec4c
59 * The "+q" is any of the %eax, %ebx, %ecx, or %edx registers. 59 * The "+q" is any of the %eax, %ebx, %ecx, or %edx registers.
60 * The "cc" means that flags were changed. 60 * The "cc" means that flags were changed.
61 */ 61 */
62 62
63 63
64 #if !(__GNUC__ == 2 && __GNUC_MINOR__ <= 7) 64 #if !(( __GNUC__ == 2 && __GNUC_MINOR__ <= 7 ) || ( __INTEL_COMPILER >= 800 ))
65
66 /*
67 * icc 8.1 and 9.0 compile broken code with -march=pentium4 option:
68 * ngx_atomic_fetch_add() always return the input "add" value,
69 * so we use the gcc 2.7 version.
70 *
71 * icc 8.1 and 9.0 with -march=pentiumpro option or icc 7.1 compile
72 * correct code.
73 */
65 74
66 static ngx_inline ngx_atomic_int_t 75 static ngx_inline ngx_atomic_int_t
67 ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) 76 ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
68 { 77 {
69 __asm__ volatile ( 78 __asm__ volatile (
75 84
76 return add; 85 return add;
77 } 86 }
78 87
79 88
80 #else /* (__GNUC__ == 2 && __GNUC_MINOR__ <= 7) */ 89 #else
81 90
82 /* 91 /*
83 * gcc 2.7 does not support "+q", so we have to use the fixed %eax ("=a" and 92 * gcc 2.7 does not support "+q", so we have to use the fixed %eax ("=a" and
84 * "a") and this adds two superfluous instructions in the end of code, 93 * "a") and this adds two superfluous instructions in the end of code,
85 * something like this: "mov %eax, %edx / mov %edx, %eax". 94 * something like this: "mov %eax, %edx / mov %edx, %eax".