diff options
author | mwahab <mwahab@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-09-22 09:41:15 +0000 |
---|---|---|
committer | mwahab <mwahab@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-09-22 09:41:15 +0000 |
commit | eeae6940a4b25ee6270e8e06a67229eef09f0dbc (patch) | |
tree | 59c5a33c77435f868488239bdf21d29239bee1be /gcc/config/aarch64/atomics.md | |
parent | b8a8b19c3622f5945ca6da03d0531228f0c4b78c (diff) | |
download | gcc-eeae6940a4b25ee6270e8e06a67229eef09f0dbc.tar.gz |
[AArch64] Use atomic load-operate instructions for update-fetch patterns.
2015-09-22 Matthew Wahab <matthew.wahab@arm.com>
* config/aarch64/aarch64-protos.h (aarch64_gen_atomic_ldop):
Adjust declaration.
* config/aarch64/aarch64.c (aarch64_emit_bic): New.
(aarch64_gen_atomic_ldop): Adjust comment. Add parameter
out_result. Update to support update-fetch operations.
* config/aarch64/atomics.md (aarch64_atomic_exchange<mode>_lse):
Adjust for change to aarch64_gen_atomic_ldop.
(aarch64_atomic_<atomic_optab><mode>_lse): Likewise.
(aarch64_atomic_fetch_<atomic_optab><mode>_lse): Likewise.
(atomic_<atomic_optab>_fetch<mode>): Change to an expander.
(aarch64_atomic_<atomic_optab>_fetch<mode>): New.
(aarch64_atomic_<atomic_optab>_fetch<mode>_lse): New.
gcc/testsuite
2015-09-22 Matthew Wahab <matthew.wahab@arm.com>
* gcc.target/aarch64/atomic-inst-ldadd.c: Add tests for
update-fetch operations.
* gcc.target/aarch64/atomic-inst-ldlogic.c: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@228002 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/aarch64/atomics.md')
-rw-r--r-- | gcc/config/aarch64/atomics.md | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/gcc/config/aarch64/atomics.md b/gcc/config/aarch64/atomics.md index e0d885668f1..e7ac5f6fc1c 100644 --- a/gcc/config/aarch64/atomics.md +++ b/gcc/config/aarch64/atomics.md @@ -219,7 +219,7 @@ "&& reload_completed" [(const_int 0)] { - aarch64_gen_atomic_ldop (SET, operands[0], operands[1], + aarch64_gen_atomic_ldop (SET, operands[0], NULL, operands[1], operands[2], operands[3]); DONE; } @@ -280,7 +280,7 @@ "&& reload_completed" [(const_int 0)] { - aarch64_gen_atomic_ldop (<CODE>, operands[3], operands[0], + aarch64_gen_atomic_ldop (<CODE>, operands[3], NULL, operands[0], operands[1], operands[2]); DONE; } @@ -368,7 +368,7 @@ "&& reload_completed" [(const_int 0)] { - aarch64_gen_atomic_ldop (<CODE>, operands[0], operands[1], + aarch64_gen_atomic_ldop (<CODE>, operands[0], NULL, operands[1], operands[2], operands[3]); DONE; } @@ -398,7 +398,31 @@ } ) -(define_insn_and_split "atomic_<atomic_optab>_fetch<mode>" +;; Load-operate-store, returning the original memory data. + +(define_expand "atomic_<atomic_optab>_fetch<mode>" + [(match_operand:ALLI 0 "register_operand" "") + (atomic_op:ALLI + (match_operand:ALLI 1 "aarch64_sync_memory_operand" "") + (match_operand:ALLI 2 "<atomic_op_operand>" "")) + (match_operand:SI 3 "const_int_operand")] + "" +{ + rtx (*gen) (rtx, rtx, rtx, rtx); + rtx value = operands[2]; + + /* Use an atomic load-operate instruction when possible. */ + if (aarch64_atomic_ldop_supported_p (<CODE>)) + gen = gen_aarch64_atomic_<atomic_optab>_fetch<mode>_lse; + else + gen = gen_aarch64_atomic_<atomic_optab>_fetch<mode>; + + emit_insn (gen (operands[0], operands[1], value, operands[3])); + + DONE; +}) + +(define_insn_and_split "aarch64_atomic_<atomic_optab>_fetch<mode>" [(set (match_operand:ALLI 0 "register_operand" "=&r") (atomic_op:ALLI (match_operand:ALLI 1 "aarch64_sync_memory_operand" "+Q") @@ -421,6 +445,29 @@ } ) +(define_insn_and_split "aarch64_atomic_<atomic_optab>_fetch<mode>_lse" + [(set (match_operand:ALLI 0 "register_operand" "=&r") + (atomic_op:ALLI + (match_operand:ALLI 1 "aarch64_sync_memory_operand" "+Q") + (match_operand:ALLI 2 "<atomic_op_operand>" "r<const_atomic>"))) + (set (match_dup 1) + (unspec_volatile:ALLI + [(match_dup 1) + (match_dup 2) + (match_operand:SI 3 "const_int_operand")] + UNSPECV_ATOMIC_LDOP)) + (clobber (match_scratch:ALLI 4 "=r"))] + "TARGET_LSE" + "#" + "&& reload_completed" + [(const_int 0)] + { + aarch64_gen_atomic_ldop (<CODE>, operands[4], operands[0], operands[1], + operands[2], operands[3]); + DONE; + } +) + (define_insn_and_split "atomic_nand_fetch<mode>" [(set (match_operand:ALLI 0 "register_operand" "=&r") (not:ALLI |