| // RUN: llvm-tblgen -gen-register-info -I %p/../../include %s | FileCheck %s |
| |
| include "llvm/Target/Target.td" |
| |
| def TestInstrInfo : InstrInfo; |
| def TestTarget : Target { |
| let InstructionSet = TestInstrInfo; |
| let RegistersAreIntervals = 1; |
| } |
| |
| def sub_lo : SubRegIndex<32>; |
| def sub_hi : SubRegIndex<32, 32>; |
| |
| let Namespace = "Test" in { |
| // Simple 32-bit registers (each gets 1 regunit) |
| def R0 : Register<"r0">; |
| def R1 : Register<"r1">; |
| def R2 : Register<"r2">; |
| def R3 : Register<"r3">; |
| |
| // 64-bit register composed of R0:R1 (gets 2 regunits) |
| def R0_R1 : Register<"r0_r1"> { |
| let SubRegs = [R0, R1]; |
| let SubRegIndices = [sub_lo, sub_hi]; |
| } |
| |
| // 64-bit register composed of R2:R3 (gets 2 regunits) |
| def R2_R3 : Register<"r2_r3"> { |
| let SubRegs = [R2, R3]; |
| let SubRegIndices = [sub_lo, sub_hi]; |
| } |
| } |
| |
| // CHECK: extern const unsigned TestTargetRegUnitIntervals[][2] = { |
| // Sentinel |
| // CHECK-NEXT: { 0, 0 }, |
| // Real values |
| // CHECK-NEXT: { 0, 1 }, |
| // CHECK-NEXT: { 1, 2 }, |
| // CHECK-NEXT: { 2, 3 }, |
| // CHECK-NEXT: { 3, 4 }, |
| |
| let Namespace = "Test" in { |
| def R4 : Register<"r4">; // Gets unit 4 |
| def R5 : Register<"r5">; // Gets unit 5 |
| def R6 : Register<"r6">; // Gets unit 6 |
| def R7 : Register<"r7">; // Gets unit 7 |
| |
| // This register skips R5, creating non-contiguous units {4, 6} |
| def R4_R6 : Register<"r4_r6"> { |
| let SubRegs = [R4, R6]; |
| let SubRegIndices = [sub_lo, sub_hi]; |
| } |
| |
| // This register skips R6, creating non-contiguous units {5, 7} |
| def R5_R7 : Register<"r4_r6"> { |
| let SubRegs = [R5, R7]; |
| let SubRegIndices = [sub_lo, sub_hi]; |
| } |
| } |
| |
| |
| def GPR32 : RegisterClass<"Test", [i32], 32, (add R0, R1, R2, R3)>; |
| def GPR64 : RegisterClass<"Test", [i64], 64, (add R0_R1, R2_R3)>; |
| |
| // Note R5 is assigned 6,7 so that R6 gets 5,6 |
| // CHECK-NEXT: { 4, 5 }, |
| // CHECK-NEXT: { 6, 7 }, |
| // CHECK-NEXT: { 5, 6 }, |
| // CHECK-NEXT: { 7, 8 }, |
| // All contiguous |
| // CHECK-NEXT: { 0, 2 }, |
| // CHECK-NEXT: { 2, 4 }, |
| // CHECK-NEXT: { 4, 6 }, |
| // CHECK-NEXT: { 6, 8 }, |
| // CHECK-NEXT: }; |