Like LWU, MIPS16 LBU and LHU only allow offset(base) addresses,
so they should use "W" rather than "o" as the memory constraint.
This fixes g++.dg/torture/vshuf-v8hi.C on mips64el-linux-gnu,
where the constraints matched a PC-relative address instead.

Tested on mips64el-linux-gnu and applied.

Richard


gcc/
        * config/mips/mips.md (*and<mode>3_mips16): Use the "W" constraint
        for the first two alternatives.

Index: gcc/config/mips/mips.md
===================================================================
--- gcc/config/mips/mips.md     2013-01-12 10:13:07.000000000 +0000
+++ gcc/config/mips/mips.md     2013-01-24 09:20:24.128211222 +0000
@@ -2898,7 +2898,7 @@ (define_insn "*and<mode>3"
 
 (define_insn "*and<mode>3_mips16"
   [(set (match_operand:GPR 0 "register_operand" "=d,d,d,d,d")
-       (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "%o,o,W,d,0")
+       (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "%W,W,W,d,0")
                 (match_operand:GPR 2 "and_operand" "Yb,Yh,Yw,Yw,d")))]
   "TARGET_MIPS16 && and_operands_ok (<MODE>mode, operands[1], operands[2])"
 {

Reply via email to