LLVM: lib/Target/LoongArch/MCTargetDesc/LoongArchMatInt.cpp Source File (original) (raw)

16

17

18

19

20

21

22

23 const int64_t Highest12 = Val >> 52 & 0xFFF;

24 const int64_t Higher20 = Val >> 32 & 0xFFFFF;

25 const int64_t Hi20 = Val >> 12 & 0xFFFFF;

26 const int64_t Lo12 = Val & 0xFFF;

28

29

32 return Insts;

33 }

34

35

36 if (Hi20 == 0)

40 else {

42 if (Lo12 != 0)

44 }

45

46

47

50

51

54

55 size_t N = Insts.size();

56 if (N < 3)

57 return Insts;

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

76 switch (Insts[0].Opc) {

77 default:

79 break;

80 case LoongArch::LU12I_W:

81 if (Insts[1].Opc == LoongArch::ORI) {

82 TmpVal1 = Insts[1].Imm;

83 if (N == 3)

84 break;

85 TmpVal2 = static_cast<uint64_t>(Insts[3].Imm) << 52 | TmpVal1;

86 }

87 TmpVal1 |= static_cast<uint64_t>(Insts[0].Imm) << 12;

88 break;

89 case LoongArch::ORI:

90 case LoongArch::ADDI_W:

91 TmpVal1 = Insts[0].Imm;

92 break;

93 }

94

96 uint64_t HighMask = ~((1ULL << (Msb + 1)) - 1);

97 for (; Msb < 64; ++Msb, HighMask = HighMask << 1) {

98 for (uint64_t Lsb = Msb; Lsb > 0; --Lsb) {

99 uint64_t LowMask = (1ULL << Lsb) - 1;

100 uint64_t Mask = HighMask | LowMask;

101 uint64_t LsbToZero = TmpVal1 & ((1ULL << (Msb - Lsb + 1)) - 1);

102 uint64_t MsbToLsb = LsbToZero << Lsb;

103 if ((MsbToLsb | (TmpVal1 & Mask)) == (uint64_t)Val) {

104 if (Insts[1].Opc == LoongArch::ORI && N == 3)

105 Insts[0] = Insts[1];

107 Insts.push_back(Inst(LoongArch::BSTRINS_D, Msb << 32 | Lsb));

108 return Insts;

109 }

110 if (TmpVal2 != 0) {

111 LsbToZero = TmpVal2 & ((1ULL << (Msb - Lsb + 1)) - 1);

112 MsbToLsb = LsbToZero << Lsb;

113 if ((MsbToLsb | (TmpVal2 & Mask)) == (uint64_t)Val) {

114 Insts[0] = Insts[1];

115 Insts[1] = Insts[3];

117 Insts.push_back(Inst(LoongArch::BSTRINS_D, Msb << 32 | Lsb));

118 return Insts;

119 }

120 }

121 }

122 }

123

124 return Insts;

125}