diff options
author | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2014-02-07 14:22:41 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2014-02-07 14:22:41 +0000 |
commit | 75cc21e2b7153b7561a7636fd668ba66f10b72eb (patch) | |
tree | 49766e280c6339d4b422b4273878dfd033014f70 | |
parent | f4b83d665915650fb5711732f3edab926425d957 (diff) | |
download | gcc-75cc21e2b7153b7561a7636fd668ba66f10b72eb.zip gcc-75cc21e2b7153b7561a7636fd668ba66f10b72eb.tar.gz gcc-75cc21e2b7153b7561a7636fd668ba66f10b72eb.tar.bz2 |
2014-02-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* config/s390/s390.md ("atomic_load<mode>", "atomic_store<mode>")
("atomic_compare_and_swap<mode>", "atomic_fetch_<atomic><mode>"):
Reject misaligned operands.
From-SVN: r207601
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/s390/s390.md | 12 |
2 files changed, 18 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 106a30d..13fac24 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2014-02-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + * config/s390/s390.md ("atomic_load<mode>", "atomic_store<mode>") + ("atomic_compare_and_swap<mode>", "atomic_fetch_<atomic><mode>"): + Reject misaligned operands. + +2014-02-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + * optabs.c (expand_atomic_compare_and_swap): Allow expander to fail. diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index bccc159..3f86304 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -9108,6 +9108,9 @@ (match_operand:SI 2 "const_int_operand")] ;; model "" { + if (MEM_ALIGN (operands[1]) < GET_MODE_BITSIZE (GET_MODE (operands[1]))) + FAIL; + if (<MODE>mode == TImode) emit_insn (gen_atomic_loadti_1 (operands[0], operands[1])); else if (<MODE>mode == DImode && !TARGET_ZARCH) @@ -9149,6 +9152,9 @@ { enum memmodel model = (enum memmodel) INTVAL (operands[2]); + if (MEM_ALIGN (operands[0]) < GET_MODE_BITSIZE (GET_MODE (operands[0]))) + FAIL; + if (<MODE>mode == TImode) emit_insn (gen_atomic_storeti_1 (operands[0], operands[1])); else if (<MODE>mode == DImode && !TARGET_ZARCH) @@ -9203,6 +9209,9 @@ if (!register_operand (output, <MODE>mode)) output = gen_reg_rtx (<MODE>mode); + if (MEM_ALIGN (operands[2]) < GET_MODE_BITSIZE (GET_MODE (operands[2]))) + FAIL; + emit_insn (gen_atomic_compare_and_swap<mode>_internal (output, operands[2], operands[3], operands[4])); @@ -9319,6 +9328,9 @@ (match_operand:SI 3 "const_int_operand")] ;; model "TARGET_Z196" { + if (MEM_ALIGN (operands[1]) < GET_MODE_BITSIZE (GET_MODE (operands[1]))) + FAIL; + emit_insn (gen_atomic_fetch_<atomic><mode>_iaf (operands[0], operands[1], operands[2])); DONE; |