"@internal Like @code{b}, if @option{-mpowerpc64} is used; otherwise,
@code{NO_REGS}.")
+(define_register_constraint "wD" "rs6000_constraints[RS6000_CONSTRAINT_wD]"
+ "@internal Floating point register @code{FPR} if TARGET_MMA is enabled.
+ 1024 bit Dense math register @code{DMR} if TARGET_DMF is enabled.")
+
;; wB needs ISA 2.07 VUPKHSW
(define_constraint "wB"
"@internal Signed 5-bit constant integer that can be loaded into an
return VINT_REGNO_P (REGNO (op));
})
+;; Return 1 if op is an accumulator. On power10/11 systems, the accumulators
+;; overlap with the FPRs. If TARGET_DMF is true, it will be Dense math register.
+(define_predicate "accumulator_operand"
+ (match_operand 0 "register_operand")
+{
+ if (SUBREG_P (op))
+ op = SUBREG_REG (op);
+
+ if (!REG_P (op))
+ return 0;
+
+ if (!HARD_REGISTER_P (op))
+ return 1;
+
+ int r = REGNO (op);
+ return TARGET_DMF ? DMR_REGNO_P (r) : (FP_REGNO_P (r) && (r & 3) == 0);
+})
+
;; Return 1 if op is a vector register to do logical operations on (and, or,
;; xor, etc.)
(define_predicate "vlogical_operand"
"wr reg_class = %s\n"
"wx reg_class = %s\n"
"wA reg_class = %s\n"
+ "wD reg_class = %s\n"
"\n",
reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_d]],
reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_v]],
reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_we]],
reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wr]],
reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wx]],
- reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wA]]);
+ reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wA]],
+ reg_class_names[rs6000_constraints[RS6000_CONSTRAINT_wD]]);
nl = "\n";
for (m = 0; m < NUM_MACHINE_MODES; ++m)
wc - Reserved to represent individual CR bits (used in LLVM).
wn - always NO_REGS.
wr - GPR if 64-bit mode is permitted.
- wx - Float register if we can do 32-bit int stores. */
+ wx - Float register if we can do 32-bit int stores.
+ wD - Dense math register if TARGET_DMF is enabled, else float register. */
if (TARGET_HARD_FLOAT)
rs6000_constraints[RS6000_CONSTRAINT_d] = FLOAT_REGS;
rs6000_constraints[RS6000_CONSTRAINT_v] = ALTIVEC_REGS;
if (TARGET_VSX)
rs6000_constraints[RS6000_CONSTRAINT_wa] = VSX_REGS;
+ if (TARGET_DMF)
+ rs6000_constraints[RS6000_CONSTRAINT_wD] = DMR_REGS;
+ else if (TARGET_MMA)
+ rs6000_constraints[RS6000_CONSTRAINT_wD] = FLOAT_REGS;
if (TARGET_POWERPC64)
{
RS6000_CONSTRAINT_wr, /* GPR register if 64-bit */
RS6000_CONSTRAINT_wx, /* FPR register for STFIWX */
RS6000_CONSTRAINT_wA, /* BASE_REGS if 64-bit. */
+ RS6000_CONSTRAINT_wD, /* Accumulator registers. */
RS6000_CONSTRAINT_MAX
};
@item wB
Signed 5-bit constant integer that can be loaded into an Altivec register.
+@item wD
+Dense math register if @option{-mdense-math} is used; floating point register if
+@option{-mmma} with @option{-mno-dense-math}; otherwise, @code{NO_REGS}.
+
@item wE
Vector constant that can be loaded with the XXSPLTIB instruction.