Hello,
I am trying to model a predicate register mode that acts like a vector. We have
a few predicate registers that have 8 bits in size but they are set accordingly
to the mode of operation (not necessarily a comparison). Word size is 64.
Here's an example, for a scalar comparison leq p0, r0, 1: p0 will be set to
0xff if r0 <= but if I use simd operations the predicate register is not set as
a single register.
For example, if I do tsteqw p0, r0, 0x0000 0000 0000 0001 (test equal on 32bits
at a time), p0 will be 0b11110000. I could use tsteqb p0, r0, 0x0100 0100 0100
0100 (test equal on 8bits at a time), p0 will be 0b01010101.
It seems to me that the best way to represent this is by using a vector mode of
BIs.
So in modes.def:
FRACTIONAL_INT_MODE (B2, 2, 1); // Two bits
FRACTIONAL_INT_MODE (B4, 4, 1); // Four bits
// use QI for 8 bits and BI for 1 bit
VECTOR_MODE (INT, BI, 8);
VECTOR_MODE (INT, B2, 4);
VECTOR_MODE (INT, B4, 2);
VECTOR_MODE (INT, QI, 1); // which probably doesn't make sense and QImode can
simply be used instead.
Then I could model tsteqw as:
(define_insn "*tsteqw"
[(set (match_operand:V2B4 0 "predicate_register" "=p")
(eq:V2B4 (match_operand:V2SI 1 "register_operand")
(match_operand:V2SI 2 "general_operand")))]
...)
Is this something reasonable or will GCC simply choke since I am pushing the
limits of vector modes?
Paulo Matos