aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>2014-02-07 14:22:41 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2014-02-07 14:22:41 +0000
commit75cc21e2b7153b7561a7636fd668ba66f10b72eb (patch)
tree49766e280c6339d4b422b4273878dfd033014f70
parentf4b83d665915650fb5711732f3edab926425d957 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/s390/s390.md12
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;