Mercurial > hg > CbC > CbC_gcc
diff gcc/config/arm/arm-fixed.md @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
line wrap: on
line diff
--- a/gcc/config/arm/arm-fixed.md Thu Oct 25 07:37:49 2018 +0900 +++ b/gcc/config/arm/arm-fixed.md Thu Feb 13 11:34:05 2020 +0900 @@ -1,4 +1,4 @@ -;; Copyright (C) 2011-2018 Free Software Foundation, Inc. +;; Copyright (C) 2011-2020 Free Software Foundation, Inc. ;; ;; This file is part of GCC. ;; @@ -28,11 +28,22 @@ (set_attr "predicable_short_it" "yes,no") (set_attr "type" "alu_sreg")]) -(define_insn "add<mode>3" +(define_expand "add<mode>3" + [(set (match_operand:ADDSUB 0 "s_register_operand") + (plus:ADDSUB (match_operand:ADDSUB 1 "s_register_operand") + (match_operand:ADDSUB 2 "s_register_operand")))] + "TARGET_INT_SIMD" + { + if (ARM_GE_BITS_READ) + FAIL; + } +) + +(define_insn "*arm_add<mode>3" [(set (match_operand:ADDSUB 0 "s_register_operand" "=r") (plus:ADDSUB (match_operand:ADDSUB 1 "s_register_operand" "r") (match_operand:ADDSUB 2 "s_register_operand" "r")))] - "TARGET_INT_SIMD" + "TARGET_INT_SIMD && !ARM_GE_BITS_READ" "sadd<qaddsub_suf>%?\\t%0, %1, %2" [(set_attr "predicable" "yes") (set_attr "type" "alu_dsp_reg")]) @@ -46,11 +57,22 @@ [(set_attr "predicable" "yes") (set_attr "type" "alu_dsp_reg")]) -(define_insn "ssadd<mode>3" +(define_expand "ssadd<mode>3" + [(set (match_operand:QADDSUB 0 "s_register_operand") + (ss_plus:QADDSUB (match_operand:QADDSUB 1 "s_register_operand") + (match_operand:QADDSUB 2 "s_register_operand")))] + "TARGET_INT_SIMD" + { + if (<qaddsub_clob_q>) + FAIL; + } +) + +(define_insn "*arm_ssadd<mode>3" [(set (match_operand:QADDSUB 0 "s_register_operand" "=r") (ss_plus:QADDSUB (match_operand:QADDSUB 1 "s_register_operand" "r") (match_operand:QADDSUB 2 "s_register_operand" "r")))] - "TARGET_INT_SIMD" + "TARGET_INT_SIMD && !<qaddsub_clob_q>" "qadd<qaddsub_suf>%?\\t%0, %1, %2" [(set_attr "predicable" "yes") (set_attr "type" "alu_dsp_reg")]) @@ -65,11 +87,22 @@ (set_attr "predicable_short_it" "yes,no") (set_attr "type" "alu_sreg")]) -(define_insn "sub<mode>3" +(define_expand "sub<mode>3" + [(set (match_operand:ADDSUB 0 "s_register_operand") + (minus:ADDSUB (match_operand:ADDSUB 1 "s_register_operand") + (match_operand:ADDSUB 2 "s_register_operand")))] + "TARGET_INT_SIMD" + { + if (ARM_GE_BITS_READ) + FAIL; + } +) + +(define_insn "*arm_sub<mode>3" [(set (match_operand:ADDSUB 0 "s_register_operand" "=r") (minus:ADDSUB (match_operand:ADDSUB 1 "s_register_operand" "r") (match_operand:ADDSUB 2 "s_register_operand" "r")))] - "TARGET_INT_SIMD" + "TARGET_INT_SIMD && !ARM_GE_BITS_READ" "ssub<qaddsub_suf>%?\\t%0, %1, %2" [(set_attr "predicable" "yes") (set_attr "type" "alu_dsp_reg")]) @@ -84,11 +117,22 @@ [(set_attr "predicable" "yes") (set_attr "type" "alu_dsp_reg")]) -(define_insn "sssub<mode>3" +(define_expand "sssub<mode>3" + [(set (match_operand:QADDSUB 0 "s_register_operand") + (ss_minus:QADDSUB (match_operand:QADDSUB 1 "s_register_operand") + (match_operand:QADDSUB 2 "s_register_operand")))] + "TARGET_INT_SIMD" + { + if (<qaddsub_clob_q>) + FAIL; + } +) + +(define_insn "*arm_sssub<mode>3" [(set (match_operand:QADDSUB 0 "s_register_operand" "=r") (ss_minus:QADDSUB (match_operand:QADDSUB 1 "s_register_operand" "r") (match_operand:QADDSUB 2 "s_register_operand" "r")))] - "TARGET_INT_SIMD" + "TARGET_INT_SIMD && !<qaddsub_clob_q>" "qsub<qaddsub_suf>%?\\t%0, %1, %2" [(set_attr "predicable" "yes") (set_attr "type" "alu_dsp_reg")]) @@ -98,9 +142,9 @@ ; Note: none of these do any rounding. (define_expand "mulqq3" - [(set (match_operand:QQ 0 "s_register_operand" "") - (mult:QQ (match_operand:QQ 1 "s_register_operand" "") - (match_operand:QQ 2 "s_register_operand" "")))] + [(set (match_operand:QQ 0 "s_register_operand") + (mult:QQ (match_operand:QQ 1 "s_register_operand") + (match_operand:QQ 2 "s_register_operand")))] "TARGET_DSP_MULTIPLY && arm_arch_thumb2" { rtx tmp1 = gen_reg_rtx (HImode); @@ -116,9 +160,9 @@ }) (define_expand "mulhq3" - [(set (match_operand:HQ 0 "s_register_operand" "") - (mult:HQ (match_operand:HQ 1 "s_register_operand" "") - (match_operand:HQ 2 "s_register_operand" "")))] + [(set (match_operand:HQ 0 "s_register_operand") + (mult:HQ (match_operand:HQ 1 "s_register_operand") + (match_operand:HQ 2 "s_register_operand")))] "TARGET_DSP_MULTIPLY && arm_arch_thumb2" { rtx tmp = gen_reg_rtx (SImode); @@ -134,9 +178,9 @@ }) (define_expand "mulsq3" - [(set (match_operand:SQ 0 "s_register_operand" "") - (mult:SQ (match_operand:SQ 1 "s_register_operand" "") - (match_operand:SQ 2 "s_register_operand" "")))] + [(set (match_operand:SQ 0 "s_register_operand") + (mult:SQ (match_operand:SQ 1 "s_register_operand") + (match_operand:SQ 2 "s_register_operand")))] "TARGET_32BIT" { rtx tmp1 = gen_reg_rtx (DImode); @@ -156,9 +200,9 @@ ;; Accumulator multiplies. (define_expand "mulsa3" - [(set (match_operand:SA 0 "s_register_operand" "") - (mult:SA (match_operand:SA 1 "s_register_operand" "") - (match_operand:SA 2 "s_register_operand" "")))] + [(set (match_operand:SA 0 "s_register_operand") + (mult:SA (match_operand:SA 1 "s_register_operand") + (match_operand:SA 2 "s_register_operand")))] "TARGET_32BIT" { rtx tmp1 = gen_reg_rtx (DImode); @@ -175,9 +219,9 @@ }) (define_expand "mulusa3" - [(set (match_operand:USA 0 "s_register_operand" "") - (mult:USA (match_operand:USA 1 "s_register_operand" "") - (match_operand:USA 2 "s_register_operand" "")))] + [(set (match_operand:USA 0 "s_register_operand") + (mult:USA (match_operand:USA 1 "s_register_operand") + (match_operand:USA 2 "s_register_operand")))] "TARGET_32BIT" { rtx tmp1 = gen_reg_rtx (DImode); @@ -193,19 +237,31 @@ DONE; }) -;; The code sequence emitted by this insn pattern uses the Q flag, which GCC -;; doesn't generally know about, so we don't bother expanding to individual -;; instructions. It may be better to just use an out-of-line asm libcall for -;; this. +;; The code sequence emitted by this insn pattern uses the Q flag, so we need +;; to bail out when ARM_Q_BIT_READ and resort to a library sequence instead. -(define_insn "ssmulsa3" +(define_expand "ssmulsa3" + [(parallel [(set (match_operand:SA 0 "s_register_operand") + (ss_mult:SA (match_operand:SA 1 "s_register_operand") + (match_operand:SA 2 "s_register_operand"))) + (clobber (match_scratch:DI 3)) + (clobber (match_scratch:SI 4)) + (clobber (reg:CC CC_REGNUM))])] + "TARGET_32BIT && arm_arch6" + { + if (ARM_Q_BIT_READ) + FAIL; + } +) + +(define_insn "*arm_ssmulsa3" [(set (match_operand:SA 0 "s_register_operand" "=r") (ss_mult:SA (match_operand:SA 1 "s_register_operand" "r") (match_operand:SA 2 "s_register_operand" "r"))) (clobber (match_scratch:DI 3 "=r")) (clobber (match_scratch:SI 4 "=r")) (clobber (reg:CC CC_REGNUM))] - "TARGET_32BIT && arm_arch6" + "TARGET_32BIT && arm_arch6 && !ARM_Q_BIT_READ" { /* s16.15 * s16.15 -> s32.30. */ output_asm_insn ("smull\\t%Q3, %R3, %1, %2", operands); @@ -256,16 +312,28 @@ (const_int 38)) (const_int 32)))]) -;; Same goes for this. +(define_expand "usmulusa3" + [(parallel [(set (match_operand:USA 0 "s_register_operand") + (us_mult:USA (match_operand:USA 1 "s_register_operand") + (match_operand:USA 2 "s_register_operand"))) + (clobber (match_scratch:DI 3)) + (clobber (match_scratch:SI 4)) + (clobber (reg:CC CC_REGNUM))])] + "TARGET_32BIT && arm_arch6" + { + if (ARM_Q_BIT_READ) + FAIL; + } +) -(define_insn "usmulusa3" +(define_insn "*arm_usmulusa3" [(set (match_operand:USA 0 "s_register_operand" "=r") (us_mult:USA (match_operand:USA 1 "s_register_operand" "r") (match_operand:USA 2 "s_register_operand" "r"))) (clobber (match_scratch:DI 3 "=r")) (clobber (match_scratch:SI 4 "=r")) (clobber (reg:CC CC_REGNUM))] - "TARGET_32BIT && arm_arch6" + "TARGET_32BIT && arm_arch6 && !ARM_Q_BIT_READ" { /* 16.16 * 16.16 -> 32.32. */ output_asm_insn ("umull\\t%Q3, %R3, %1, %2", operands); @@ -317,9 +385,9 @@ (const_int 32)))]) (define_expand "mulha3" - [(set (match_operand:HA 0 "s_register_operand" "") - (mult:HA (match_operand:HA 1 "s_register_operand" "") - (match_operand:HA 2 "s_register_operand" "")))] + [(set (match_operand:HA 0 "s_register_operand") + (mult:HA (match_operand:HA 1 "s_register_operand") + (match_operand:HA 2 "s_register_operand")))] "TARGET_DSP_MULTIPLY && arm_arch_thumb2" { rtx tmp = gen_reg_rtx (SImode); @@ -333,9 +401,9 @@ }) (define_expand "muluha3" - [(set (match_operand:UHA 0 "s_register_operand" "") - (mult:UHA (match_operand:UHA 1 "s_register_operand" "") - (match_operand:UHA 2 "s_register_operand" "")))] + [(set (match_operand:UHA 0 "s_register_operand") + (mult:UHA (match_operand:UHA 1 "s_register_operand") + (match_operand:UHA 2 "s_register_operand")))] "TARGET_DSP_MULTIPLY" { rtx tmp1 = gen_reg_rtx (SImode); @@ -353,11 +421,13 @@ }) (define_expand "ssmulha3" - [(set (match_operand:HA 0 "s_register_operand" "") - (ss_mult:HA (match_operand:HA 1 "s_register_operand" "") - (match_operand:HA 2 "s_register_operand" "")))] + [(set (match_operand:HA 0 "s_register_operand") + (ss_mult:HA (match_operand:HA 1 "s_register_operand") + (match_operand:HA 2 "s_register_operand")))] "TARGET_32BIT && TARGET_DSP_MULTIPLY && arm_arch6" { + if (ARM_Q_BIT_READ) + FAIL; rtx tmp = gen_reg_rtx (SImode); rtx rshift; @@ -373,11 +443,14 @@ }) (define_expand "usmuluha3" - [(set (match_operand:UHA 0 "s_register_operand" "") - (us_mult:UHA (match_operand:UHA 1 "s_register_operand" "") - (match_operand:UHA 2 "s_register_operand" "")))] + [(set (match_operand:UHA 0 "s_register_operand") + (us_mult:UHA (match_operand:UHA 1 "s_register_operand") + (match_operand:UHA 2 "s_register_operand")))] "TARGET_INT_SIMD" { + if (ARM_Q_BIT_READ) + FAIL; + rtx tmp1 = gen_reg_rtx (SImode); rtx tmp2 = gen_reg_rtx (SImode); rtx tmp3 = gen_reg_rtx (SImode); @@ -405,7 +478,7 @@ (ss_truncate:HI (match_operator:SI 1 "sat_shift_operator" [(match_operand:SI 2 "s_register_operand" "r") (match_operand:SI 3 "immediate_operand" "I")])))] - "TARGET_32BIT && arm_arch6" + "TARGET_32BIT && arm_arch6 && !ARM_Q_BIT_READ" "ssat%?\\t%0, #16, %2%S1" [(set_attr "predicable" "yes") (set_attr "shift" "1") @@ -414,7 +487,7 @@ (define_insn "arm_usatsihi" [(set (match_operand:HI 0 "s_register_operand" "=r") (us_truncate:HI (match_operand:SI 1 "s_register_operand")))] - "TARGET_INT_SIMD" + "TARGET_INT_SIMD && !ARM_Q_BIT_READ" "usat%?\\t%0, #16, %1" [(set_attr "predicable" "yes") (set_attr "type" "alu_imm")]