On 16/04/15 08:32, Jakub Jelinek wrote: > On Thu, Apr 16, 2015 at 08:27:24AM +1000, Kugan wrote: >> + if (<CODE> == LSHIFTRT) >> + { >> + emit_insn (gen_aarch64_lshr_sisd_or_int_<mode>3 (operands[0], >> operands[1], operands[2])); > > That is way too long line, please wrap it. > >> + DONE; >> + } >> } >> ) >> >> @@ -3361,11 +3367,12 @@ >> ) >> >> ;; Logical right shift using SISD or Integer instruction >> -(define_insn "*aarch64_lshr_sisd_or_int_<mode>3" >> - [(set (match_operand:GPI 0 "register_operand" "=w,&w,r") >> +(define_insn "aarch64_lshr_sisd_or_int_<mode>3" >> + [(set (match_operand:GPI 0 "register_operand" "=w,w,r") >> (lshiftrt:GPI >> (match_operand:GPI 1 "register_operand" "w,w,r") >> - (match_operand:QI 2 "aarch64_reg_or_shift_imm_<mode>" >> "Us<cmode>,w,rUs<cmode>")))] >> + (match_operand:QI 2 "aarch64_reg_or_shift_imm_<mode>" >> "Us<cmode>,w,rUs<cmode>"))) > > Though, this one too... >
Fixed in the attached patch. Thanks, Kugan
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 534a862..72a9f05 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -3277,6 +3277,14 @@ DONE; } } + + if (<CODE> == LSHIFTRT) + { + emit_insn (gen_aarch64_lshr_sisd_or_int_<mode>3 (operands[0], + operands[1], + operands[2])); + DONE; + } } ) @@ -3361,11 +3369,13 @@ ) ;; Logical right shift using SISD or Integer instruction -(define_insn "*aarch64_lshr_sisd_or_int_<mode>3" - [(set (match_operand:GPI 0 "register_operand" "=w,&w,r") +(define_insn "aarch64_lshr_sisd_or_int_<mode>3" + [(set (match_operand:GPI 0 "register_operand" "=w,w,r") (lshiftrt:GPI (match_operand:GPI 1 "register_operand" "w,w,r") - (match_operand:QI 2 "aarch64_reg_or_shift_imm_<mode>" "Us<cmode>,w,rUs<cmode>")))] + (match_operand:QI 2 "aarch64_reg_or_shift_imm_<mode>" + "Us<cmode>,w,rUs<cmode>"))) + (clobber (match_scratch:QI 3 "=X,w,X"))] "" "@ ushr\t%<rtn>0<vas>, %<rtn>1<vas>, %2 @@ -3379,30 +3389,28 @@ [(set (match_operand:DI 0 "aarch64_simd_register") (lshiftrt:DI (match_operand:DI 1 "aarch64_simd_register") - (match_operand:QI 2 "aarch64_simd_register")))] + (match_operand:QI 2 "aarch64_simd_register"))) + (clobber (match_scratch:QI 3))] "TARGET_SIMD && reload_completed" [(set (match_dup 3) (unspec:QI [(match_dup 2)] UNSPEC_SISD_NEG)) (set (match_dup 0) (unspec:DI [(match_dup 1) (match_dup 3)] UNSPEC_SISD_USHL))] - { - operands[3] = gen_lowpart (QImode, operands[0]); - } + "" ) (define_split [(set (match_operand:SI 0 "aarch64_simd_register") (lshiftrt:SI (match_operand:SI 1 "aarch64_simd_register") - (match_operand:QI 2 "aarch64_simd_register")))] + (match_operand:QI 2 "aarch64_simd_register"))) + (clobber (match_scratch:QI 3))] "TARGET_SIMD && reload_completed" [(set (match_dup 3) (unspec:QI [(match_dup 2)] UNSPEC_SISD_NEG)) (set (match_dup 0) (unspec:SI [(match_dup 1) (match_dup 3)] UNSPEC_USHL_2S))] - { - operands[3] = gen_lowpart (QImode, operands[0]); - } + "" ) ;; Arithmetic right shift using SISD or Integer instruction