1*9880d681SAndroid Build Coastguard Worker 2*9880d681SAndroid Build Coastguard Workerclass R600Reg <string name, bits<16> encoding> : Register<name> { 3*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 4*9880d681SAndroid Build Coastguard Worker let HWEncoding = encoding; 5*9880d681SAndroid Build Coastguard Worker} 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerclass R600RegWithChan <string name, bits<9> sel, string chan> : 8*9880d681SAndroid Build Coastguard Worker Register <name> { 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker field bits<2> chan_encoding = !if(!eq(chan, "X"), 0, 11*9880d681SAndroid Build Coastguard Worker !if(!eq(chan, "Y"), 1, 12*9880d681SAndroid Build Coastguard Worker !if(!eq(chan, "Z"), 2, 13*9880d681SAndroid Build Coastguard Worker !if(!eq(chan, "W"), 3, 0)))); 14*9880d681SAndroid Build Coastguard Worker let HWEncoding{8-0} = sel; 15*9880d681SAndroid Build Coastguard Worker let HWEncoding{10-9} = chan_encoding; 16*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerclass R600Reg_128<string n, list<Register> subregs, bits<16> encoding> : 20*9880d681SAndroid Build Coastguard Worker RegisterWithSubRegs<n, subregs> { 21*9880d681SAndroid Build Coastguard Worker field bits<2> chan_encoding = 0; 22*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 23*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub0, sub1, sub2, sub3]; 24*9880d681SAndroid Build Coastguard Worker let HWEncoding{8-0} = encoding{8-0}; 25*9880d681SAndroid Build Coastguard Worker let HWEncoding{10-9} = chan_encoding; 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerclass R600Reg_64<string n, list<Register> subregs, bits<16> encoding> : 29*9880d681SAndroid Build Coastguard Worker RegisterWithSubRegs<n, subregs> { 30*9880d681SAndroid Build Coastguard Worker field bits<2> chan_encoding = 0; 31*9880d681SAndroid Build Coastguard Worker let Namespace = "AMDGPU"; 32*9880d681SAndroid Build Coastguard Worker let SubRegIndices = [sub0, sub1]; 33*9880d681SAndroid Build Coastguard Worker let HWEncoding = encoding; 34*9880d681SAndroid Build Coastguard Worker let HWEncoding{8-0} = encoding{8-0}; 35*9880d681SAndroid Build Coastguard Worker let HWEncoding{10-9} = chan_encoding; 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerclass R600Reg_64Vertical<int lo, int hi, string chan> : R600Reg_64 < 39*9880d681SAndroid Build Coastguard Worker "V"#lo#hi#"_"#chan, 40*9880d681SAndroid Build Coastguard Worker [!cast<Register>("T"#lo#"_"#chan), !cast<Register>("T"#hi#"_"#chan)], 41*9880d681SAndroid Build Coastguard Worker lo 42*9880d681SAndroid Build Coastguard Worker>; 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerforeach Index = 0-127 in { 45*9880d681SAndroid Build Coastguard Worker foreach Chan = [ "X", "Y", "Z", "W" ] in { 46*9880d681SAndroid Build Coastguard Worker // 32-bit Temporary Registers 47*9880d681SAndroid Build Coastguard Worker def T#Index#_#Chan : R600RegWithChan <"T"#Index#"."#Chan, Index, Chan>; 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker // Indirect addressing offset registers 50*9880d681SAndroid Build Coastguard Worker def Addr#Index#_#Chan : R600RegWithChan <"T("#Index#" + AR.x)."#Chan, 51*9880d681SAndroid Build Coastguard Worker Index, Chan>; 52*9880d681SAndroid Build Coastguard Worker } 53*9880d681SAndroid Build Coastguard Worker // 128-bit Temporary Registers 54*9880d681SAndroid Build Coastguard Worker def T#Index#_XYZW : R600Reg_128 <"T"#Index#"", 55*9880d681SAndroid Build Coastguard Worker [!cast<Register>("T"#Index#"_X"), 56*9880d681SAndroid Build Coastguard Worker !cast<Register>("T"#Index#"_Y"), 57*9880d681SAndroid Build Coastguard Worker !cast<Register>("T"#Index#"_Z"), 58*9880d681SAndroid Build Coastguard Worker !cast<Register>("T"#Index#"_W")], 59*9880d681SAndroid Build Coastguard Worker Index>; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker def T#Index#_XY : R600Reg_64 <"T"#Index#"", 62*9880d681SAndroid Build Coastguard Worker [!cast<Register>("T"#Index#"_X"), 63*9880d681SAndroid Build Coastguard Worker !cast<Register>("T"#Index#"_Y")], 64*9880d681SAndroid Build Coastguard Worker Index>; 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerforeach Chan = [ "X", "Y", "Z", "W"] in { 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker let chan_encoding = !if(!eq(Chan, "X"), 0, 70*9880d681SAndroid Build Coastguard Worker !if(!eq(Chan, "Y"), 1, 71*9880d681SAndroid Build Coastguard Worker !if(!eq(Chan, "Z"), 2, 72*9880d681SAndroid Build Coastguard Worker !if(!eq(Chan, "W"), 3, 0)))) in { 73*9880d681SAndroid Build Coastguard Worker def V0123_#Chan : R600Reg_128 <"V0123_"#Chan, 74*9880d681SAndroid Build Coastguard Worker [!cast<Register>("T0_"#Chan), 75*9880d681SAndroid Build Coastguard Worker !cast<Register>("T1_"#Chan), 76*9880d681SAndroid Build Coastguard Worker !cast<Register>("T2_"#Chan), 77*9880d681SAndroid Build Coastguard Worker !cast<Register>("T3_"#Chan)], 78*9880d681SAndroid Build Coastguard Worker 0>; 79*9880d681SAndroid Build Coastguard Worker def V01_#Chan : R600Reg_64Vertical<0, 1, Chan>; 80*9880d681SAndroid Build Coastguard Worker def V23_#Chan : R600Reg_64Vertical<2, 3, Chan>; 81*9880d681SAndroid Build Coastguard Worker } 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker// KCACHE_BANK0 86*9880d681SAndroid Build Coastguard Workerforeach Index = 159-128 in { 87*9880d681SAndroid Build Coastguard Worker foreach Chan = [ "X", "Y", "Z", "W" ] in { 88*9880d681SAndroid Build Coastguard Worker // 32-bit Temporary Registers 89*9880d681SAndroid Build Coastguard Worker def KC0_#Index#_#Chan : R600RegWithChan <"KC0["#!add(Index,-128)#"]."#Chan, Index, Chan>; 90*9880d681SAndroid Build Coastguard Worker } 91*9880d681SAndroid Build Coastguard Worker // 128-bit Temporary Registers 92*9880d681SAndroid Build Coastguard Worker def KC0_#Index#_XYZW : R600Reg_128 <"KC0["#!add(Index, -128)#"].XYZW", 93*9880d681SAndroid Build Coastguard Worker [!cast<Register>("KC0_"#Index#"_X"), 94*9880d681SAndroid Build Coastguard Worker !cast<Register>("KC0_"#Index#"_Y"), 95*9880d681SAndroid Build Coastguard Worker !cast<Register>("KC0_"#Index#"_Z"), 96*9880d681SAndroid Build Coastguard Worker !cast<Register>("KC0_"#Index#"_W")], 97*9880d681SAndroid Build Coastguard Worker Index>; 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker// KCACHE_BANK1 101*9880d681SAndroid Build Coastguard Workerforeach Index = 191-160 in { 102*9880d681SAndroid Build Coastguard Worker foreach Chan = [ "X", "Y", "Z", "W" ] in { 103*9880d681SAndroid Build Coastguard Worker // 32-bit Temporary Registers 104*9880d681SAndroid Build Coastguard Worker def KC1_#Index#_#Chan : R600RegWithChan <"KC1["#!add(Index,-160)#"]."#Chan, Index, Chan>; 105*9880d681SAndroid Build Coastguard Worker } 106*9880d681SAndroid Build Coastguard Worker // 128-bit Temporary Registers 107*9880d681SAndroid Build Coastguard Worker def KC1_#Index#_XYZW : R600Reg_128 <"KC1["#!add(Index, -160)#"].XYZW", 108*9880d681SAndroid Build Coastguard Worker [!cast<Register>("KC1_"#Index#"_X"), 109*9880d681SAndroid Build Coastguard Worker !cast<Register>("KC1_"#Index#"_Y"), 110*9880d681SAndroid Build Coastguard Worker !cast<Register>("KC1_"#Index#"_Z"), 111*9880d681SAndroid Build Coastguard Worker !cast<Register>("KC1_"#Index#"_W")], 112*9880d681SAndroid Build Coastguard Worker Index>; 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker// Array Base Register holding input in FS 117*9880d681SAndroid Build Coastguard Workerforeach Index = 448-480 in { 118*9880d681SAndroid Build Coastguard Worker def ArrayBase#Index : R600Reg<"ARRAY_BASE", Index>; 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker// Special Registers 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdef OQA : R600Reg<"OQA", 219>; 125*9880d681SAndroid Build Coastguard Workerdef OQB : R600Reg<"OQB", 220>; 126*9880d681SAndroid Build Coastguard Workerdef OQAP : R600Reg<"OQAP", 221>; 127*9880d681SAndroid Build Coastguard Workerdef OQBP : R600Reg<"OQAP", 222>; 128*9880d681SAndroid Build Coastguard Workerdef LDS_DIRECT_A : R600Reg<"LDS_DIRECT_A", 223>; 129*9880d681SAndroid Build Coastguard Workerdef LDS_DIRECT_B : R600Reg<"LDS_DIRECT_B", 224>; 130*9880d681SAndroid Build Coastguard Workerdef ZERO : R600Reg<"0.0", 248>; 131*9880d681SAndroid Build Coastguard Workerdef ONE : R600Reg<"1.0", 249>; 132*9880d681SAndroid Build Coastguard Workerdef NEG_ONE : R600Reg<"-1.0", 249>; 133*9880d681SAndroid Build Coastguard Workerdef ONE_INT : R600Reg<"1", 250>; 134*9880d681SAndroid Build Coastguard Workerdef HALF : R600Reg<"0.5", 252>; 135*9880d681SAndroid Build Coastguard Workerdef NEG_HALF : R600Reg<"-0.5", 252>; 136*9880d681SAndroid Build Coastguard Workerdef ALU_LITERAL_X : R600RegWithChan<"literal.x", 253, "X">; 137*9880d681SAndroid Build Coastguard Workerdef ALU_LITERAL_Y : R600RegWithChan<"literal.y", 253, "Y">; 138*9880d681SAndroid Build Coastguard Workerdef ALU_LITERAL_Z : R600RegWithChan<"literal.z", 253, "Z">; 139*9880d681SAndroid Build Coastguard Workerdef ALU_LITERAL_W : R600RegWithChan<"literal.w", 253, "W">; 140*9880d681SAndroid Build Coastguard Workerdef PV_X : R600RegWithChan<"PV.X", 254, "X">; 141*9880d681SAndroid Build Coastguard Workerdef PV_Y : R600RegWithChan<"PV.Y", 254, "Y">; 142*9880d681SAndroid Build Coastguard Workerdef PV_Z : R600RegWithChan<"PV.Z", 254, "Z">; 143*9880d681SAndroid Build Coastguard Workerdef PV_W : R600RegWithChan<"PV.W", 254, "W">; 144*9880d681SAndroid Build Coastguard Workerdef PS: R600Reg<"PS", 255>; 145*9880d681SAndroid Build Coastguard Workerdef PREDICATE_BIT : R600Reg<"PredicateBit", 0>; 146*9880d681SAndroid Build Coastguard Workerdef PRED_SEL_OFF: R600Reg<"Pred_sel_off", 0>; 147*9880d681SAndroid Build Coastguard Workerdef PRED_SEL_ZERO : R600Reg<"Pred_sel_zero", 2>; 148*9880d681SAndroid Build Coastguard Workerdef PRED_SEL_ONE : R600Reg<"Pred_sel_one", 3>; 149*9880d681SAndroid Build Coastguard Workerdef AR_X : R600Reg<"AR.x", 0>; 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdef R600_ArrayBase : RegisterClass <"AMDGPU", [f32, i32], 32, 152*9880d681SAndroid Build Coastguard Worker (add (sequence "ArrayBase%u", 448, 480))>; 153*9880d681SAndroid Build Coastguard Worker// special registers for ALU src operands 154*9880d681SAndroid Build Coastguard Worker// const buffer reference, SRCx_SEL contains index 155*9880d681SAndroid Build Coastguard Workerdef ALU_CONST : R600Reg<"CBuf", 0>; 156*9880d681SAndroid Build Coastguard Worker// interpolation param reference, SRCx_SEL contains index 157*9880d681SAndroid Build Coastguard Workerdef ALU_PARAM : R600Reg<"Param", 0>; 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerlet isAllocatable = 0 in { 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdef R600_Addr : RegisterClass <"AMDGPU", [i32], 32, (add (sequence "Addr%u_X", 0, 127))>; 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker// We only use Addr_[YZW] for vertical vectors. 164*9880d681SAndroid Build Coastguard Worker// FIXME if we add more vertical vector registers we will need to ad more 165*9880d681SAndroid Build Coastguard Worker// registers to these classes. 166*9880d681SAndroid Build Coastguard Workerdef R600_Addr_Y : RegisterClass <"AMDGPU", [i32], 32, (add Addr0_Y)>; 167*9880d681SAndroid Build Coastguard Workerdef R600_Addr_Z : RegisterClass <"AMDGPU", [i32], 32, (add Addr0_Z)>; 168*9880d681SAndroid Build Coastguard Workerdef R600_Addr_W : RegisterClass <"AMDGPU", [i32], 32, (add Addr0_W)>; 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdef R600_LDS_SRC_REG : RegisterClass<"AMDGPU", [i32], 32, 171*9880d681SAndroid Build Coastguard Worker (add OQA, OQB, OQAP, OQBP, LDS_DIRECT_A, LDS_DIRECT_B)>; 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdef R600_KC0_X : RegisterClass <"AMDGPU", [f32, i32], 32, 174*9880d681SAndroid Build Coastguard Worker (add (sequence "KC0_%u_X", 128, 159))>; 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerdef R600_KC0_Y : RegisterClass <"AMDGPU", [f32, i32], 32, 177*9880d681SAndroid Build Coastguard Worker (add (sequence "KC0_%u_Y", 128, 159))>; 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerdef R600_KC0_Z : RegisterClass <"AMDGPU", [f32, i32], 32, 180*9880d681SAndroid Build Coastguard Worker (add (sequence "KC0_%u_Z", 128, 159))>; 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Workerdef R600_KC0_W : RegisterClass <"AMDGPU", [f32, i32], 32, 183*9880d681SAndroid Build Coastguard Worker (add (sequence "KC0_%u_W", 128, 159))>; 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdef R600_KC0 : RegisterClass <"AMDGPU", [f32, i32], 32, 186*9880d681SAndroid Build Coastguard Worker (interleave R600_KC0_X, R600_KC0_Y, 187*9880d681SAndroid Build Coastguard Worker R600_KC0_Z, R600_KC0_W)>; 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Workerdef R600_KC1_X : RegisterClass <"AMDGPU", [f32, i32], 32, 190*9880d681SAndroid Build Coastguard Worker (add (sequence "KC1_%u_X", 160, 191))>; 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdef R600_KC1_Y : RegisterClass <"AMDGPU", [f32, i32], 32, 193*9880d681SAndroid Build Coastguard Worker (add (sequence "KC1_%u_Y", 160, 191))>; 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdef R600_KC1_Z : RegisterClass <"AMDGPU", [f32, i32], 32, 196*9880d681SAndroid Build Coastguard Worker (add (sequence "KC1_%u_Z", 160, 191))>; 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdef R600_KC1_W : RegisterClass <"AMDGPU", [f32, i32], 32, 199*9880d681SAndroid Build Coastguard Worker (add (sequence "KC1_%u_W", 160, 191))>; 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerdef R600_KC1 : RegisterClass <"AMDGPU", [f32, i32], 32, 202*9880d681SAndroid Build Coastguard Worker (interleave R600_KC1_X, R600_KC1_Y, 203*9880d681SAndroid Build Coastguard Worker R600_KC1_Z, R600_KC1_W)>; 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker} // End isAllocatable = 0 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdef R600_TReg32_X : RegisterClass <"AMDGPU", [f32, i32], 32, 208*9880d681SAndroid Build Coastguard Worker (add (sequence "T%u_X", 0, 127), AR_X)>; 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Workerdef R600_TReg32_Y : RegisterClass <"AMDGPU", [f32, i32], 32, 211*9880d681SAndroid Build Coastguard Worker (add (sequence "T%u_Y", 0, 127))>; 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdef R600_TReg32_Z : RegisterClass <"AMDGPU", [f32, i32], 32, 214*9880d681SAndroid Build Coastguard Worker (add (sequence "T%u_Z", 0, 127))>; 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdef R600_TReg32_W : RegisterClass <"AMDGPU", [f32, i32], 32, 217*9880d681SAndroid Build Coastguard Worker (add (sequence "T%u_W", 0, 127))>; 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerdef R600_TReg32 : RegisterClass <"AMDGPU", [f32, i32], 32, 220*9880d681SAndroid Build Coastguard Worker (interleave R600_TReg32_X, R600_TReg32_Y, 221*9880d681SAndroid Build Coastguard Worker R600_TReg32_Z, R600_TReg32_W)>; 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdef R600_Reg32 : RegisterClass <"AMDGPU", [f32, i32], 32, (add 224*9880d681SAndroid Build Coastguard Worker R600_TReg32, 225*9880d681SAndroid Build Coastguard Worker R600_ArrayBase, 226*9880d681SAndroid Build Coastguard Worker R600_Addr, 227*9880d681SAndroid Build Coastguard Worker R600_KC0, R600_KC1, 228*9880d681SAndroid Build Coastguard Worker ZERO, HALF, ONE, ONE_INT, PV_X, ALU_LITERAL_X, NEG_ONE, NEG_HALF, 229*9880d681SAndroid Build Coastguard Worker ALU_CONST, ALU_PARAM, OQAP 230*9880d681SAndroid Build Coastguard Worker )>; 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerdef R600_Predicate : RegisterClass <"AMDGPU", [i32], 32, (add 233*9880d681SAndroid Build Coastguard Worker PRED_SEL_OFF, PRED_SEL_ZERO, PRED_SEL_ONE)>; 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Workerdef R600_Predicate_Bit: RegisterClass <"AMDGPU", [i32], 32, (add 236*9880d681SAndroid Build Coastguard Worker PREDICATE_BIT)>; 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerdef R600_Reg128 : RegisterClass<"AMDGPU", [v4f32, v4i32], 128, 239*9880d681SAndroid Build Coastguard Worker (add (sequence "T%u_XYZW", 0, 127))> { 240*9880d681SAndroid Build Coastguard Worker let CopyCost = -1; 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdef R600_Reg128Vertical : RegisterClass<"AMDGPU", [v4f32, v4i32], 128, 244*9880d681SAndroid Build Coastguard Worker (add V0123_W, V0123_Z, V0123_Y, V0123_X) 245*9880d681SAndroid Build Coastguard Worker>; 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdef R600_Reg64 : RegisterClass<"AMDGPU", [v2f32, v2i32], 64, 248*9880d681SAndroid Build Coastguard Worker (add (sequence "T%u_XY", 0, 63))>; 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerdef R600_Reg64Vertical : RegisterClass<"AMDGPU", [v2f32, v2i32], 64, 251*9880d681SAndroid Build Coastguard Worker (add V01_X, V01_Y, V01_Z, V01_W, 252*9880d681SAndroid Build Coastguard Worker V23_X, V23_Y, V23_Z, V23_W)>; 253