|
| 1 | +// RUN: not llvm-tblgen -gen-register-info -register-info-debug -I %p/../../include %s -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK |
| 2 | +include "llvm/Target/Target.td" |
| 3 | + |
| 4 | +// CHECK: error: No SubRegIndex for S0_S1 in D0_D1_D2 |
| 5 | +// CHECK-NEXT: def DTuples3 : RegisterTuples<[dsub0, dsub1, dsub2], |
| 6 | + |
| 7 | +class MyReg<string n, list<Register> subregs = []> |
| 8 | + : Register<n> { |
| 9 | + let Namespace = "Test"; |
| 10 | + let SubRegs = subregs; |
| 11 | +} |
| 12 | + |
| 13 | +class MyClass<int size, list<ValueType> types, dag registers> |
| 14 | + : RegisterClass<"Test", types, size, registers> { |
| 15 | + let Size = size; |
| 16 | +} |
| 17 | + |
| 18 | +def ssub : SubRegIndex< 32, 0>; |
| 19 | +def ssub_hi : SubRegIndex< 32, 32>; |
| 20 | +def dsub : SubRegIndex< 64, 0>; |
| 21 | +def dsub_hi : SubRegIndex< 64, 64>; |
| 22 | +def qsub : SubRegIndex<128, 0>; |
| 23 | +def qsub_hi : SubRegIndex<128, 128>; |
| 24 | + |
| 25 | +def S0 : MyReg<"s0">; |
| 26 | +def S1 : MyReg<"s1">; |
| 27 | +def S2 : MyReg<"s2">; |
| 28 | + |
| 29 | +let isArtificial = 1 in { |
| 30 | +def S0_HI : MyReg<"s0_hi">; |
| 31 | +def S1_HI : MyReg<"s1_hi">; |
| 32 | +def S2_HI : MyReg<"s2_hi">; |
| 33 | + |
| 34 | +def D0_HI : MyReg<"D0_hi">; |
| 35 | +def D1_HI : MyReg<"D1_hi">; |
| 36 | +def D2_HI : MyReg<"D2_hi">; |
| 37 | +} |
| 38 | + |
| 39 | +let SubRegIndices = [ssub, ssub_hi], CoveredBySubRegs = 1 in { |
| 40 | +def D0 : MyReg<"d0", [S0, S0_HI]>; |
| 41 | +def D1 : MyReg<"d1", [S1, S1_HI]>; |
| 42 | +def D2 : MyReg<"d2", [S2, S2_HI]>; |
| 43 | +} |
| 44 | + |
| 45 | +let SubRegIndices = [dsub, dsub_hi], CoveredBySubRegs = 1 in { |
| 46 | +def Q0 : MyReg<"q0", [D0, D0_HI]>; |
| 47 | +def Q1 : MyReg<"q1", [D1, D1_HI]>; |
| 48 | +def Q2 : MyReg<"q2", [D2, D2_HI]>; |
| 49 | +} |
| 50 | + |
| 51 | +def SRegs : MyClass<32, [i32], (sequence "S%u", 0, 2)>; |
| 52 | +def DRegs : MyClass<64, [i64], (sequence "D%u", 0, 2)>; |
| 53 | +def QRegs : MyClass<128, [i128], (sequence "Q%u", 0, 2)>; |
| 54 | + |
| 55 | +def dsub0 : SubRegIndex<64>; |
| 56 | +def dsub1 : SubRegIndex<64>; |
| 57 | +def dsub2 : SubRegIndex<64>; |
| 58 | + |
| 59 | +def ssub0 : SubRegIndex<32>; |
| 60 | +def ssub1 : ComposedSubRegIndex<dsub1, ssub>; |
| 61 | +def ssub2 : ComposedSubRegIndex<dsub2, ssub>; |
| 62 | + |
| 63 | +def STuples2 : RegisterTuples<[ssub0, ssub1], |
| 64 | + [(shl SRegs, 0), (shl SRegs, 1)]>; |
| 65 | +def STuplesRC2 : MyClass<64, [untyped], (add STuples2)>; |
| 66 | + |
| 67 | +def DTuples2 : RegisterTuples<[dsub0, dsub1], |
| 68 | + [(shl DRegs, 0), (shl DRegs, 1)]>; |
| 69 | +def DTuplesRC2 : MyClass<128, [untyped], (add DTuples2)>; |
| 70 | + |
| 71 | +def STuples3 : RegisterTuples<[ssub0, ssub1, ssub2], |
| 72 | + [(shl SRegs, 0), (shl SRegs, 1), (shl SRegs, 2)]>; |
| 73 | +def STuplesRC3 : MyClass<96, [untyped], (add STuples3)>; |
| 74 | + |
| 75 | +def DTuples3 : RegisterTuples<[dsub0, dsub1, dsub2], |
| 76 | + [(shl DRegs, 0), (shl DRegs, 1), (shl DRegs, 2)]>; |
| 77 | +def DTuplesRC3 : MyClass<192, [untyped], (add DTuples3)>; |
| 78 | + |
| 79 | +def TestTarget : Target; |
0 commit comments