Hi all I need add 256bits-register support for our MIPS-based processor, so I add some codes. When I build gcc and test it, get a error "unable to find a register to spill in class 'XX_REGS'" can you tell me how to add 256bits register file to a MIPS port?
Thanks! codes: gcc/config/mips/constraints.md : (define_register_constraint 'Z' 'XX_REGS' '@internal') gcc/config/mips/mips-ftypes.def : DEF_MIPS_FTYPE (2, (UV32QI, UV32QI, UV32QI)) DEF_MIPS_FTYPE (2, (V32QI, V32QI, V32QI)) gcc/config/mips/mips.h : #define FIXED_REGISTERS /* XX regusters */ \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 \ #define CALL_USED_REGISTERS /* XX regusters */ \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 \ #define CALL_REALLY_USED_REGISTERS /* XX regusters */ \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ #define XX_REG_FIRST 188 #define XX_REG_LAST 251 #define XX_REG_NUM (XX_REG_LAST - XX_REG_FIRST + 1) #define XX_REG_P(REGNO) \ ((unsigned int) ((int) (REGNO) - XX_REG_FIRST) < XX_REG_NUM) enum reg_class XX_REGS, #define REG_CLASS_NAMES XX_REGS, #define REG_CLASS_CONTENTS add bits into it. #define REG_ALLOC_ORDER 188,189,190,191,192,193,194,195,196,197, \ 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213, \ 214,215,216,217,218,219,229,221,222,223,224,225,226,227,228,229, \ 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245, \ 246,247,248,249,250,251 #define REGISTER_NAMES '$z0', '$z1', '$z2', '$z3', '$z4', '$z5', '$z6', '$z7', '$z8', '$z9', \ '$z10', '$z11', '$z12', '$z13', '$z14', '$z15', '$z16', '$z17', '$z18', '$z19', \ '$z20', '$z21', '$z22', '$z23', '$z24', '$z25', '$z26', '$z27', '$z28', '$z29', \ '$z30', '$z31', '$z32', '$z33', '$z34', '$z35', '$z36', '$z37', '$z38', '$z39', \ '$z40', '$z41', '$z42', '$z43', '$z44', '$z45', '$z46', '$z47', '$z48', '$z49', \ '$z50', '$z51', '$z52', '$z53', '$z54', '$z55', '$z56', '$z57', '$z58', '$z59', \ '$z60', '$z61', '$z62', '$z63' } gcc/config/mips/mips-modes.def : /* XX Vec modes */ VECTOR_MODES (INT, 32); /* V32QI V16HI V8SI V4DI */ gcc/config/mips/xx.h : vpaddb_u (uint8x32_t s, uint8x32_t t) { return __builtin_xx_vpaddb_u (s, t); } __extension__ static __inline int8x32_t __attribute__ ((__always_inline__)) vpaddb_s (int8x32_t s, int8x32_t t) { return __builtin_xx_vpaddb_s (s, t); } gcc/config/mips/xx.md : (define_mode_iterator ZB [V32QI]) (define_mode_iterator ZH [V16HI]) (define_mode_iterator ZW [V8SI]) (define_mode_iterator ZD [V4DI]) (define_mode_iterator ZHB [V16HI V32QI]) (define_mode_iterator ZWH [V8SI V16HI]) (define_mode_iterator ZDW [V4DI V8SI]) (define_mode_iterator ZWHB [V8SI V16HI V32QI]) (define_mode_iterator ZDWH [V4DI V8SI V16HI]) (define_mode_iterator ZDWHB [V4DI V8SI V16HI V32QI]) (define_mode_attr Z_suffix [(V4DI 'd')(V8SI 'w') (V16HI 'h') (V32QI 'b')]) (define_insn 'xx_vpadd<mode>' [(set (match_operand:ZDWHB 0 'register_operand' '=Z') (plus:ZDWHB (match_operand:ZDWHB 1 'register_operand' 'Z') (match_operand:ZDWHB 2 'register_operand' 'Z')))] 'TARGET_HARD_FLOAT && TARGET_XX_VECTORS' 'vpadd<Z_suffix>\t%0,%1,%2' [(set_attr 'type' 'fadd')]) gcc/config/mips/mips.c : if (TARGET_XX_VECTORS && (mode == V32QImode || mode == V16HImode || mode == V8SImode || mode == V4DImode)) return true; case V32QImode: case V16HImode: case V8SImode: case V4DImode: return TARGET_XX_VECTORS; #define CODE_FOR_xx_vpaddb CODE_FOR_xx_vpaddv32qi XX_BUILTIN_SUFFIX (vpaddb, u, MIPS_UV32QI_FTYPE_UV32QI_UV32QI), XX_BUILTIN_SUFFIX (vpaddb, s, MIPS_V32QI_FTYPE_V32QI_V32QI), #define MIPS_ATYPE_V32QI mips_builtin_vector_type (intQI_type_node, V32QImode) #define MIPS_ATYPE_V16HI mips_builtin_vector_type (intHI_type_node, V16HImode) #define MIPS_ATYPE_V8SI mips_builtin_vector_type (intSI_type_node, V8SImode) #define MIPS_ATYPE_V4DI mips_builtin_vector_type (intDI_type_node, V4DImode) #define MIPS_ATYPE_UV32QI \ mips_builtin_vector_type (unsigned_intQI_type_node, V32QImode) #define MIPS_ATYPE_UV16HI \ mips_builtin_vector_type (unsigned_intHI_type_node, V16HImode) #define MIPS_ATYPE_UV8SI \ mips_builtin_vector_type (unsigned_intSI_type_node, V8SImode) #define MIPS_ATYPE_UV4DI \ mips_builtin_vector_type (unsigned_intDI_type_node, V4DImode) testcase: #include "xx.h" #include <stdio.h> #include <stdint.h> #include <assert.h> #include <limits.h> typedef union { int8x32_t v; int8_t a[32]; } int8x32_encap_t; typedef union { uint8x32_t v; uint8_t a[32]; } uint8x32_encap_t; static void test_vpaddb_u (void) { uint8x32_encap_t s, t; uint8x32_encap_t r; s.a[0] = 1; s.a[1] = 2; s.a[2] = 3; s.a[3] = 4; s.a[4] = 5; s.a[5] = 6; s.a[6] = 7; s.a[7] = 8; s.a[8] = 9; s.a[9] = 10; s.a[10] = 11; s.a[11] = 12; s.a[12] = 13; s.a[13] = 14; s.a[14] = 15; s.a[15] = 16; s.a[16] = 17; s.a[17] = 18; s.a[18] = 19; s.a[19] = 20; s.a[20] = 21; s.a[21] = 22; s.a[22] = 23; s.a[23] = 24; s.a[24] = 25; s.a[25] = 26; s.a[26] = 27; s.a[27] = 28; s.a[28] = 29; s.a[29] = 30; s.a[30] = 31; s.a[31] = 32; t.a[0] = 33; t.a[1] = 34; t.a[2] = 35; t.a[3] = 36; t.a[4] = 37; t.a[5] = 38; t.a[6] = 39; t.a[7] = 40; t.a[8] = 41; t.a[9] = 42; t.a[10] = 43; t.a[11] = 44; t.a[12] = 45; t.a[13] = 46; t.a[14] = 47; t.a[15] = 48; t.a[16] = 49; t.a[17] = 50; t.a[18] = 51; t.a[19] = 52; t.a[20] = 53; t.a[21] = 54; t.a[22] = 55; t.a[23] = 56; t.a[24] = 57; t.a[25] = 58; t.a[26] = 59; t.a[27] = 60; t.a[28] = 61; t.a[29] = 62; t.a[30] = 63; t.a[31] = 64; r.v = vpaddb_u (s.v, t.v); assert (r.a[0] == 34); assert (r.a[1] == 36); assert (r.a[2] == 38); assert (r.a[3] == 40); assert (r.a[4] == 42); assert (r.a[5] == 44); assert (r.a[6] == 46); assert (r.a[7] == 48); assert (r.a[8] == 50); assert (r.a[9] == 52); assert (r.a[10] == 54); assert (r.a[11] == 56); assert (r.a[12] == 58); assert (r.a[13] == 60); assert (r.a[14] == 62); assert (r.a[15] == 64); assert (r.a[16] == 66); assert (r.a[17] == 68); assert (r.a[18] == 70); assert (r.a[19] == 72); assert (r.a[20] == 74); assert (r.a[21] == 76); assert (r.a[22] == 78); assert (r.a[23] == 80); assert (r.a[24] == 82); assert (r.a[25] == 84); assert (r.a[26] == 86); assert (r.a[27] == 88); assert (r.a[28] == 90); assert (r.a[29] == 92); assert (r.a[30] == 94); assert (r.a[31] == 96); } static void test_vpaddb_s (void) { int8x32_encap_t s, t; int8x32_encap_t r; s.a[0] = -32; s.a[1] = -31; s.a[2] = -30; s.a[3] = -29; s.a[4] = -28; s.a[5] = -27; s.a[6] = -26; s.a[7] = -25; s.a[8] = -24; s.a[9] = -23; s.a[10] = -22; s.a[11] = -21; s.a[12] = -20; s.a[13] = -19; s.a[14] = -18; s.a[15] = -17; s.a[16] = -16; s.a[17] = -15; s.a[18] = -14; s.a[19] = -13; s.a[20] = -12; s.a[21] = -11; s.a[22] = -10; s.a[23] = -9; s.a[24] = -8; s.a[25] = -7; s.a[26] = -6; s.a[27] = -5; s.a[28] = -4; s.a[29] = -3; s.a[30] = -2; s.a[31] = -1; t.a[0] = 0; t.a[1] = 1; t.a[2] = 2; t.a[3] = 3; t.a[4] = 4; t.a[5] = 5; t.a[6] = 6; t.a[7] = 7; t.a[8] = 8; t.a[9] = 9; t.a[10] = 10; t.a[11] = 11; t.a[12] = 12; t.a[13] = 13; t.a[14] = 14; t.a[15] = 15; t.a[16] = 16; t.a[17] = 17; t.a[18] = 18; t.a[19] = 19; t.a[20] = 20; t.a[21] = 21; t.a[22] = 22; t.a[23] = 23; t.a[24] = 24; t.a[25] = 25; t.a[26] = 26; t.a[27] = 27; t.a[28] = 28; t.a[29] = 29; t.a[30] = 30; t.a[31] = 31; r.v = vpaddb_s (s.v, t.v); assert (r.a[0] == -32); assert (r.a[1] == -30); assert (r.a[2] == -28); assert (r.a[3] == -26); assert (r.a[4] == -24); assert (r.a[5] == -22); assert (r.a[6] == -20); assert (r.a[7] == -18); assert (r.a[8] == -16); assert (r.a[9] == -14); assert (r.a[10] == -12); assert (r.a[11] == -10); assert (r.a[12] == -8); assert (r.a[13] == -6); assert (r.a[14] == -4); assert (r.a[15] == -2); assert (r.a[16] == 0); assert (r.a[17] == 2); assert (r.a[18] == 4); assert (r.a[19] == 6); assert (r.a[20] == 8); assert (r.a[21] == 10); assert (r.a[22] == 12); assert (r.a[23] == 14); assert (r.a[24] == 16); assert (r.a[25] == 18); assert (r.a[26] == 20); assert (r.a[27] == 22); assert (r.a[28] == 24); assert (r.a[29] == 26); assert (r.a[30] == 28); assert (r.a[31] == 30); } int main (void) { test_vpaddb_u (); test_vpaddb_s (); return 0; }