> Eric and Rainer, I think that functionally this patch is fully ready
> to go into the tree except for the Solaris aspects which I do not have
> the means to work on. Have either of you made any progress in this
> area?
Not yet, but I'll have a look at the beginning of next week.
Some remarks:
> @@ -1088,7 +1093,12 @@ sparc_option_override (void)
> if (TARGET_VIS3)
> target_flags |= MASK_VIS2 | MASK_VIS;
>
> - /* Don't allow -mvis, -mvis2, -mvis3, or -mfmaf if FPU is disabled. */
> + /* -mcbcond implies -mvis3, -mvis2 and -mvis */
> + if (TARGET_CBCOND)
> + target_flags |= MASK_VIS3 | MASK_VIS2 | MASK_VIS;
> +@item -mcbcond
> +@itemx -mno-cbcond
> +@opindex mcbcond
> +@opindex mno-cbcond
> +With @option{-mcbcond}, GCC generates code that takes advantage of
> +compare-and-branch instructions, as defined in the Sparc Architecture 2011.
> +The default is @option{-mcbcond} when targeting a cpu that supports such
> +instructions, such as niagara-4 and later. Setting @option{-mcbcond} also
> +sets @option{-mvis3}, @option{-mvis2}, and @option{-mvis}.
Why? If -mcpu=niagara4 implies -mcbcond and -mvis3, I don't see the point.
> + /* If we can tell early on that the comparison is against a constant
> + that won't fit in the 5-bit signed immediate field of a cbcond,
> + use one of the other v9 conditional branch sequences. */
> + if (TARGET_CBCOND
> + && GET_CODE (operands[1]) == REG
> + && (GET_MODE (operands[1]) == SImode
> + || (TARGET_ARCH64 && GET_MODE (operands[1]) == DImode))
> + && (GET_CODE (operands[2]) != CONST_INT
> + || SPARC_SIMM5_P (INTVAL (operands[2]))))
> + {
> + emit_cbcond_insn (GET_CODE (operands[0]), operands[1], operands[2],
> operands[3]); + return;
> + }
Long line.
> +#ifndef HAVE_AS_SPARC4
> +#define AS_NIAGARA4_FLAG " -xarch=v9b"
> +#else
> +#define AS_NIAGARA4_FLAG " -xarch=sparc4"
> +#endif
Won't this override the AS_NIAGARA3_FLAG logic for -mcpu=niagara4? You'll
have v9d for -mcpu=niagara3 but v9b for -mcpu=niagara4 if the assembler
doesn't support sparc4.
> +;; True if we are making use of compare-and-branch instructions.
> +;; True if we should emit a nop after a cbcond instruction
> +(define_attr "emit_cbcond_nop" "false,true"
> + (symbol_ref "(emit_cbcond_nop (insn)
> + ? EMIT_CBCOND_NOP_TRUE : EMIT_CBCOND_NOP_FALSE)"))
> +
> (define_attr "branch_type" "none,icc,fcc,reg"
> (const_string "none"))
There seems to be one superfluous comment line.
Otherwise looks good. Thanks for having introduced the -mcbcond switch, I
think that's perfectly appropriate for a feature like this brand new set of
branch instructions.
--
Eric Botcazou