On Tuesday 23 June 2015 10:17:40 Knoll Lars wrote:
> Qt 5.7:
> 
> * New compiler baseline with gcc 4.7 and VC++ 2012
> * Enable and use the C++11 features supported by these compilers
> unconditionally

BTW, there's one more C++11 feature I'd like to use unconditionally starting 
in Qt 5.7: atomics. They've been supported since Clang 3.1, ICC 13.0, GCC 4.7, 
MSVC 2012.

This is needed because our assembly apparently has problems, as in QTBUG-46949 
(see especially 
https://bugreports.qt.io/browse/QTBUG-46949?focusedCommentId=285873#comment-285873
). I don't want to maintain non-x86 assembly anymore. 

So here's the plan:
* Qt 5.6: will use std::atomic, if available
* Qt 5.7: will use std::atomic unconditionally

In any case, this is a net improvement:

Arch                            Qt assembly                     GCC 4.9 atomics
All                             all are lock-free                       all 
sizes are supported
ARMv5                   4-byte only, Linux-only out-of-line, lock-free on Linux
ARMv6                   4-byte only                     4-byte inline, others 
out-of-line
ARMv7A, v7M, v8 all sizes                               all sizes inline and 
lock-free
IA-64                           all sizes                               all 
sizes inline and lock-free
MIPS32                  4-byte only                     1 through 4 bytes inline
MIPS64                  4- and 8-bytes only             all sizes inline and 
lock-free
x86                             1-4 bytes only                  all sizes 
inline and lock-free
x86-64                  all sizes                               all sizes 
inline and lock-free

There is no case where the Qt inline, lock-free assembly would be replaced by 
non-lock-free code. On ARMv5, there's a slight drop in performance as the 
inline assembly is replaced by an out-of-line function call, that's all.

Any architecture not listed above (notably AArch64) is only supported by 
qatomic_cxx11.h and qatomic_gcc.h, so either this is a no-op for them, or net 
improvement by supporting more sizes and not doing a full barrier.

I've only tested with GCC 4.9. I'm pretty sure support in GCC 4.8 is the same. 
However, GCC 4.7 is not very good at atomics anywhere except on x86. I don't 
care. You can easily upgrade to 4.8 to get better (non-full barrier for 
everything) performance.

The only compiler I currently know that will have problems with this is the 
Intel compiler on OS X when using libc++ older than Subversion r215305. 
Unfortunately, _LIBCPP_VERSION has been at value 1101 since way before that 
change. To restore functionality, I will revert 
1b961e8b5d508d054e31c0050f27891606714393 after 5.6 branches off from dev.

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center

_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to