diff options
author | Martin Liska <mliska@suse.cz> | 2022-08-01 05:53:37 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2022-08-01 05:53:37 +0200 |
commit | 89eca196c99645ee1abefcf8b4a9dd84edd87ad6 (patch) | |
tree | 185cc8907ce37e82132f395cb52611f029215355 /gcc/config | |
parent | 3a4cd5dc6faca8fed7fa256c4c06f4999b5a1f9c (diff) | |
parent | 4a7274ddc4970c1ad011343ed285d6219dffa396 (diff) | |
download | gcc-89eca196c99645ee1abefcf8b4a9dd84edd87ad6.zip gcc-89eca196c99645ee1abefcf8b4a9dd84edd87ad6.tar.gz gcc-89eca196c99645ee1abefcf8b4a9dd84edd87ad6.tar.bz2 |
Merge branch 'master' into devel/sphinx
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/gcn/gcn-valu.md | 18 | ||||
-rw-r--r-- | gcc/config/gcn/gcn.md | 20 | ||||
-rw-r--r-- | gcc/config/i386/i386-features.cc | 46 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 20 | ||||
-rw-r--r-- | gcc/config/loongarch/loongarch.h | 5 | ||||
-rw-r--r-- | gcc/config/riscv/riscv.md | 69 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa.cc | 1 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa.md | 10 |
8 files changed, 123 insertions, 66 deletions
diff --git a/gcc/config/gcn/gcn-valu.md b/gcc/config/gcn/gcn-valu.md index abe4620..8c33ae0 100644 --- a/gcc/config/gcn/gcn-valu.md +++ b/gcc/config/gcn/gcn-valu.md @@ -60,6 +60,8 @@ (define_mode_iterator V_INT_noQI [V64HI V64SI V64DI]) +(define_mode_iterator V_INT_noHI + [V64SI V64DI]) ; All of above (define_mode_iterator V_ALL @@ -2086,10 +2088,10 @@ }) (define_insn "<expander><mode>3<exec>" - [(set (match_operand:V_SI 0 "register_operand" "= v") - (shiftop:V_SI - (match_operand:V_SI 1 "gcn_alu_operand" " v") - (vec_duplicate:V_SI + [(set (match_operand:V_INT_noHI 0 "register_operand" "= v") + (shiftop:V_INT_noHI + (match_operand:V_INT_noHI 1 "gcn_alu_operand" " v") + (vec_duplicate:<VnSI> (match_operand:SI 2 "gcn_alu_operand" "SvB"))))] "" "v_<revmnemonic>0\t%0, %2, %1" @@ -2117,10 +2119,10 @@ }) (define_insn "v<expander><mode>3<exec>" - [(set (match_operand:V_SI 0 "register_operand" "=v") - (shiftop:V_SI - (match_operand:V_SI 1 "gcn_alu_operand" " v") - (match_operand:V_SI 2 "gcn_alu_operand" "vB")))] + [(set (match_operand:V_INT_noHI 0 "register_operand" "=v") + (shiftop:V_INT_noHI + (match_operand:V_INT_noHI 1 "gcn_alu_operand" " v") + (match_operand:<VnSI> 2 "gcn_alu_operand" "vB")))] "" "v_<revmnemonic>0\t%0, %2, %1" [(set_attr "type" "vop2") diff --git a/gcc/config/gcn/gcn.md b/gcc/config/gcn/gcn.md index 033c170..70a769b 100644 --- a/gcc/config/gcn/gcn.md +++ b/gcc/config/gcn/gcn.md @@ -1676,6 +1676,26 @@ ;; }}} ;; {{{ ALU: generic 64-bit +(define_insn_and_split "one_cmpldi2" + [(set (match_operand:DI 0 "register_operand" "=Sg, v") + (not:DI (match_operand:DI 1 "gcn_alu_operand" "SgA,vSvDB"))) + (clobber (match_scratch:BI 2 "=cs, X"))] + "" + "#" + "reload_completed" + [(parallel [(set (match_dup 3) (not:SI (match_dup 4))) + (clobber (match_dup 2))]) + (parallel [(set (match_dup 5) (not:SI (match_dup 6))) + (clobber (match_dup 2))])] + { + operands[3] = gcn_operand_part (DImode, operands[0], 0); + operands[4] = gcn_operand_part (DImode, operands[1], 0); + operands[5] = gcn_operand_part (DImode, operands[0], 1); + operands[6] = gcn_operand_part (DImode, operands[1], 1); + } + [(set_attr "type" "mult")] +) + (define_code_iterator vec_and_scalar64_com [and ior xor]) (define_insn_and_split "<expander>di3" diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc index aa5de71..e4cc4a3 100644 --- a/gcc/config/i386/i386-features.cc +++ b/gcc/config/i386/i386-features.cc @@ -1808,6 +1808,11 @@ static void timode_check_non_convertible_regs (bitmap candidates, bitmap regs, unsigned int regno) { + /* Do nothing if REGNO is already in REGS or is a hard reg. */ + if (bitmap_bit_p (regs, regno) + || HARD_REGISTER_NUM_P (regno)) + return; + for (df_ref def = DF_REG_DEF_CHAIN (regno); def; def = DF_REF_NEXT_REG (def)) @@ -1843,7 +1848,13 @@ timode_check_non_convertible_regs (bitmap candidates, bitmap regs, } } -/* The TImode version of remove_non_convertible_regs. */ +/* For a given bitmap of insn UIDs scans all instructions and + remove insn from CANDIDATES in case it has both convertible + and not convertible definitions. + + All insns in a bitmap are conversion candidates according to + scalar_to_vector_candidate_p. Currently it implies all insns + are single_set. */ static void timode_remove_non_convertible_regs (bitmap candidates) @@ -1857,25 +1868,20 @@ timode_remove_non_convertible_regs (bitmap candidates) changed = false; EXECUTE_IF_SET_IN_BITMAP (candidates, 0, id, bi) { - rtx def_set = single_set (DF_INSN_UID_GET (id)->insn); - rtx dest = SET_DEST (def_set); - rtx src = SET_SRC (def_set); - - if ((!REG_P (dest) - || bitmap_bit_p (regs, REGNO (dest)) - || HARD_REGISTER_P (dest)) - && (!REG_P (src) - || bitmap_bit_p (regs, REGNO (src)) - || HARD_REGISTER_P (src))) - continue; - - if (REG_P (dest)) - timode_check_non_convertible_regs (candidates, regs, - REGNO (dest)); - - if (REG_P (src)) - timode_check_non_convertible_regs (candidates, regs, - REGNO (src)); + rtx_insn *insn = DF_INSN_UID_GET (id)->insn; + df_ref ref; + + FOR_EACH_INSN_DEF (ref, insn) + if (!DF_REF_REG_MEM_P (ref) + && GET_MODE (DF_REF_REG (ref)) == TImode) + timode_check_non_convertible_regs (candidates, regs, + DF_REF_REGNO (ref)); + + FOR_EACH_INSN_USE (ref, insn) + if (!DF_REF_REG_MEM_P (ref) + && GET_MODE (DF_REF_REG (ref)) == TImode) + timode_check_non_convertible_regs (candidates, regs, + DF_REF_REGNO (ref)); } EXECUTE_IF_SET_IN_BITMAP (regs, 0, id, bi) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index fab6aed..f1158e1 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -13820,6 +13820,8 @@ if (const_1_to_63_operand (operands[2], VOIDmode)) emit_insn (gen_ix86_<insn>ti3_doubleword (operands[0], operands[1], operands[2])); + else if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 64) + emit_insn (gen_<insn>64ti2_doubleword (operands[0], operands[1])); else { rtx amount = force_reg (QImode, operands[2]); @@ -14045,6 +14047,24 @@ } }) +(define_insn_and_split "<insn>64ti2_doubleword" + [(set (match_operand:TI 0 "register_operand" "=r,r,r") + (any_rotate:TI (match_operand:TI 1 "nonimmediate_operand" "0,r,o") + (const_int 64)))] + "TARGET_64BIT" + "#" + "&& reload_completed" + [(set (match_dup 0) (match_dup 3)) + (set (match_dup 2) (match_dup 1))] +{ + split_double_mode (TImode, &operands[0], 2, &operands[0], &operands[2]); + if (rtx_equal_p (operands[0], operands[1])) + { + emit_insn (gen_swapdi (operands[0], operands[2])); + DONE; + } +}) + (define_mode_attr rorx_immediate_operand [(SI "const_0_to_31_operand") (DI "const_0_to_63_operand")]) diff --git a/gcc/config/loongarch/loongarch.h b/gcc/config/loongarch/loongarch.h index 89a5bd7..8b12889 100644 --- a/gcc/config/loongarch/loongarch.h +++ b/gcc/config/loongarch/loongarch.h @@ -1127,8 +1127,13 @@ struct GTY (()) machine_function }; #endif +#ifdef HAVE_AS_EH_FRAME_PCREL_ENCODING_SUPPORT +#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ + (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4) +#else #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_absptr) +#endif /* Do emit .note.GNU-stack by default. */ #ifndef NEED_INDICATE_EXEC_STACK diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index aa43d5f..0796f91 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -57,6 +57,7 @@ ;; Floating-point unspecs. UNSPECV_FRFLAGS UNSPECV_FSFLAGS + UNSPECV_FSNVSNAN ;; Interrupt handler instructions. UNSPECV_MRET @@ -360,6 +361,7 @@ ;; Iterator and attributes for quiet comparisons. (define_int_iterator QUIET_COMPARISON [UNSPEC_FLT_QUIET UNSPEC_FLE_QUIET]) (define_int_attr quiet_pattern [(UNSPEC_FLT_QUIET "lt") (UNSPEC_FLE_QUIET "le")]) +(define_int_attr QUIET_PATTERN [(UNSPEC_FLT_QUIET "LT") (UNSPEC_FLE_QUIET "LE")]) ;; This code iterator allows signed and unsigned widening multiplications ;; to use the same template. @@ -2326,39 +2328,31 @@ (set_attr "mode" "<UNITMODE>")]) (define_expand "f<quiet_pattern>_quiet<ANYF:mode><X:mode>4" - [(parallel [(set (match_operand:X 0 "register_operand") - (unspec:X - [(match_operand:ANYF 1 "register_operand") - (match_operand:ANYF 2 "register_operand")] - QUIET_COMPARISON)) - (clobber (match_scratch:X 3))])] - "TARGET_HARD_FLOAT") - -(define_insn "*f<quiet_pattern>_quiet<ANYF:mode><X:mode>4_default" - [(set (match_operand:X 0 "register_operand" "=r") - (unspec:X - [(match_operand:ANYF 1 "register_operand" " f") - (match_operand:ANYF 2 "register_operand" " f")] - QUIET_COMPARISON)) - (clobber (match_scratch:X 3 "=&r"))] - "TARGET_HARD_FLOAT && ! HONOR_SNANS (<ANYF:MODE>mode)" - "frflags\t%3\n\tf<quiet_pattern>.<fmt>\t%0,%1,%2\n\tfsflags\t%3" - [(set_attr "type" "fcmp") - (set_attr "mode" "<UNITMODE>") - (set (attr "length") (const_int 12))]) - -(define_insn "*f<quiet_pattern>_quiet<ANYF:mode><X:mode>4_snan" - [(set (match_operand:X 0 "register_operand" "=r") - (unspec:X - [(match_operand:ANYF 1 "register_operand" " f") - (match_operand:ANYF 2 "register_operand" " f")] - QUIET_COMPARISON)) - (clobber (match_scratch:X 3 "=&r"))] - "TARGET_HARD_FLOAT && HONOR_SNANS (<ANYF:MODE>mode)" - "frflags\t%3\n\tf<quiet_pattern>.<fmt>\t%0,%1,%2\n\tfsflags\t%3\n\tfeq.<fmt>\tzero,%1,%2" - [(set_attr "type" "fcmp") - (set_attr "mode" "<UNITMODE>") - (set (attr "length") (const_int 16))]) + [(set (match_operand:X 0 "register_operand") + (unspec:X [(match_operand:ANYF 1 "register_operand") + (match_operand:ANYF 2 "register_operand")] + QUIET_COMPARISON))] + "TARGET_HARD_FLOAT" +{ + rtx op0 = operands[0]; + rtx op1 = operands[1]; + rtx op2 = operands[2]; + rtx tmp = gen_reg_rtx (SImode); + rtx cmp = gen_rtx_<QUIET_PATTERN> (<X:MODE>mode, op1, op2); + rtx frflags = gen_rtx_UNSPEC_VOLATILE (SImode, gen_rtvec (1, const0_rtx), + UNSPECV_FRFLAGS); + rtx fsflags = gen_rtx_UNSPEC_VOLATILE (SImode, gen_rtvec (1, tmp), + UNSPECV_FSFLAGS); + + emit_insn (gen_rtx_SET (tmp, frflags)); + emit_insn (gen_rtx_SET (op0, cmp)); + emit_insn (fsflags); + if (HONOR_SNANS (<ANYF:MODE>mode)) + emit_insn (gen_rtx_UNSPEC_VOLATILE (<ANYF:MODE>mode, + gen_rtvec (2, op1, op2), + UNSPECV_FSNVSNAN)); + DONE; +}) (define_insn "*seq_zero_<X:mode><GPR:mode>" [(set (match_operand:GPR 0 "register_operand" "=r") @@ -2766,6 +2760,15 @@ "TARGET_HARD_FLOAT" "fsflags\t%0") +(define_insn "*riscv_fsnvsnan<mode>2" + [(unspec_volatile [(match_operand:ANYF 0 "register_operand" "f") + (match_operand:ANYF 1 "register_operand" "f")] + UNSPECV_FSNVSNAN)] + "TARGET_HARD_FLOAT" + "feq.<fmt>\tzero,%0,%1" + [(set_attr "type" "fcmp") + (set_attr "mode" "<UNITMODE>")]) + (define_insn "riscv_mret" [(return) (unspec_volatile [(const_int 0)] UNSPECV_MRET)] diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc index a851a7a..6ac879c 100644 --- a/gcc/config/xtensa/xtensa.cc +++ b/gcc/config/xtensa/xtensa.cc @@ -4273,6 +4273,7 @@ xtensa_rtx_costs (rtx x, machine_mode mode, int outer_code, case ZERO_EXTRACT: case ZERO_EXTEND: + case IF_THEN_ELSE: *total = COSTS_N_INSNS (1); return true; diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md index 899ce27..1294aab 100644 --- a/gcc/config/xtensa/xtensa.md +++ b/gcc/config/xtensa/xtensa.md @@ -25,7 +25,7 @@ (A7_REG 7) (A8_REG 8) (A9_REG 9) - (A10_REG 10) + (A11_REG 11) (UNSPEC_NOP 2) (UNSPEC_PLT 3) @@ -2295,9 +2295,9 @@ "reload_completed && !TARGET_WINDOWED_ABI && SIBLING_CALL_P (insn) && ! call_used_or_fixed_reg_p (REGNO (operands[0]))" - [(set (reg:SI A10_REG) + [(set (reg:SI A11_REG) (match_dup 0)) - (call (mem:SI (reg:SI A10_REG)) + (call (mem:SI (reg:SI A11_REG)) (match_dup 1))]) (define_expand "sibcall_value" @@ -2328,10 +2328,10 @@ "reload_completed && !TARGET_WINDOWED_ABI && SIBLING_CALL_P (insn) && ! call_used_or_fixed_reg_p (REGNO (operands[1]))" - [(set (reg:SI A10_REG) + [(set (reg:SI A11_REG) (match_dup 1)) (set (match_dup 0) - (call (mem:SI (reg:SI A10_REG)) + (call (mem:SI (reg:SI A11_REG)) (match_dup 2)))]) (define_insn "entry" |