brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 8be717b Raw
72 lines · plain
1// RUN: llvm-tblgen -gen-register-info -I %p/../../include -I %p/Common %s | FileCheck %s2 3// Checks the cost values for the register tuple.4include "llvm/Target/Target.td"5 6class MyClass<int size, list<ValueType> types, dag registers>7  : RegisterClass<"MyTarget", types, size, registers> {8  let Size = size;9}10 11class Indexes<int N> {12  list<int> all = [0,  1,  2,  3];13  list<int> slice =14    !foldl([]<int>, all, acc, cur,15           !listconcat(acc, !if(!lt(cur, N), [cur], [])));16}17 18foreach Index = 0-3 in {19  def sub#Index : SubRegIndex<32, !shl(Index, 5)>;20}21 22foreach Size = {2,4} in {23  foreach Index = Indexes<!add(5, !mul(Size, -1))>.slice in {24    def !foldl("", Indexes<Size>.slice, acc, cur,25               !strconcat(acc#!if(!eq(acc,""),"","_"), "sub"#!add(cur, Index))) :26      SubRegIndex<!mul(Size, 32), !shl(Index, 5)> {27      let CoveringSubRegIndices =28        !foldl([]<SubRegIndex>, Indexes<Size>.slice, acc, cur,29               !listconcat(acc, [!cast<SubRegIndex>(sub#!add(cur, Index))]));30    }31  }32}33 34let Namespace = "MyTarget" in {35  foreach Index = 0-15 in {36    // Adding two cost values per register.37    let CostPerUse = [Index, !shl(Index, 1)] in {38      def S#Index : Register <"s"#Index>;39    }40  }41} // Namespace = "MyTarget"42 43def GPR32 : MyClass<32,  [i32], (sequence "S%u", 0, 15)>;44 45def GPR64 : RegisterTuples<[sub0, sub1],46                           [(decimate (shl GPR32, 0), 1),47                            (decimate (shl GPR32, 1), 1)48                           ]>;49 50def GPR128 : RegisterTuples<[sub0, sub1, sub2, sub3],51                            [52                             (decimate (shl GPR32, 0), 1),53                             (decimate (shl GPR32, 1), 1),54                             (decimate (shl GPR32, 2), 1),55                             (decimate (shl GPR32, 3), 1)56                            ]>;57 58 59def GPR_64 : MyClass<64, [v2i32], (add GPR64)>;60def GPR_128 : MyClass<128, [v4i32], (add GPR128)>;61 62 63def MyTarget : Target;64 65// CHECK: static const uint8_t CostPerUseTable[] = {66// CHECK-NEXT:  0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, };67 68// CHECK:  static const TargetRegisterInfoDesc MyTargetRegInfoDesc = { // Extra Descriptors69// CHECK-NEXT:  CostPerUseTable, 2, InAllocatableClassTable};70 71// CHECK:  TargetRegisterInfo(&MyTargetRegInfoDesc, RegisterClasses, RegisterClasses+3,72