@@ -94,6 +94,69 @@ TEST_P(RISCVInstrInfoTest, IsAddImmediate) {
94
94
}
95
95
}
96
96
97
+ TEST_P (RISCVInstrInfoTest, IsCopyInstrImpl) {
98
+ const RISCVInstrInfo *TII = ST->getInstrInfo ();
99
+ DebugLoc DL;
100
+
101
+ // ADDI.
102
+
103
+ MachineInstr *MI1 = BuildMI (*MF, DL, TII->get (RISCV::ADDI), RISCV::X1)
104
+ .addReg (RISCV::X2)
105
+ .addImm (-128 )
106
+ .getInstr ();
107
+ auto MI1Res = TII->isCopyInstrImpl (*MI1);
108
+ EXPECT_FALSE (MI1Res.has_value ());
109
+
110
+ MachineInstr *MI2 = BuildMI (*MF, DL, TII->get (RISCV::ADDI), RISCV::X1)
111
+ .addReg (RISCV::X2)
112
+ .addImm (0 )
113
+ .getInstr ();
114
+ auto MI2Res = TII->isCopyInstrImpl (*MI2);
115
+ ASSERT_TRUE (MI2Res.has_value ());
116
+ EXPECT_EQ (MI2Res->Destination ->getReg (), RISCV::X1);
117
+ EXPECT_EQ (MI2Res->Source ->getReg (), RISCV::X2);
118
+
119
+ // Partial coverage of FSGNJ_* instructions.
120
+
121
+ MachineInstr *MI3 = BuildMI (*MF, DL, TII->get (RISCV::FSGNJ_D), RISCV::F1_D)
122
+ .addReg (RISCV::F2_D)
123
+ .addReg (RISCV::F1_D)
124
+ .getInstr ();
125
+ auto MI3Res = TII->isCopyInstrImpl (*MI3);
126
+ EXPECT_FALSE (MI3Res.has_value ());
127
+
128
+ MachineInstr *MI4 = BuildMI (*MF, DL, TII->get (RISCV::FSGNJ_D), RISCV::F1_D)
129
+ .addReg (RISCV::F2_D)
130
+ .addReg (RISCV::F2_D)
131
+ .getInstr ();
132
+ auto MI4Res = TII->isCopyInstrImpl (*MI4);
133
+ ASSERT_TRUE (MI4Res.has_value ());
134
+ EXPECT_EQ (MI4Res->Destination ->getReg (), RISCV::F1_D);
135
+ EXPECT_EQ (MI4Res->Source ->getReg (), RISCV::F2_D);
136
+
137
+ // ADD. TODO: Should return true for add reg, x0 and add x0, reg.
138
+ MachineInstr *MI5 = BuildMI (*MF, DL, TII->get (RISCV::ADD), RISCV::X1)
139
+ .addReg (RISCV::X2)
140
+ .addReg (RISCV::X3)
141
+ .getInstr ();
142
+ auto MI5Res = TII->isCopyInstrImpl (*MI5);
143
+ EXPECT_FALSE (MI5Res.has_value ());
144
+
145
+ MachineInstr *MI6 = BuildMI (*MF, DL, TII->get (RISCV::ADD), RISCV::X1)
146
+ .addReg (RISCV::X0)
147
+ .addReg (RISCV::X2)
148
+ .getInstr ();
149
+ auto MI6Res = TII->isCopyInstrImpl (*MI6);
150
+ EXPECT_FALSE (MI6Res.has_value ());
151
+
152
+ MachineInstr *MI7 = BuildMI (*MF, DL, TII->get (RISCV::ADD), RISCV::X1)
153
+ .addReg (RISCV::X2)
154
+ .addReg (RISCV::X0)
155
+ .getInstr ();
156
+ auto MI7Res = TII->isCopyInstrImpl (*MI7);
157
+ EXPECT_FALSE (MI7Res.has_value ());
158
+ }
159
+
97
160
TEST_P (RISCVInstrInfoTest, GetMemOperandsWithOffsetWidth) {
98
161
const RISCVInstrInfo *TII = ST->getInstrInfo ();
99
162
const TargetRegisterInfo *TRI = ST->getRegisterInfo ();
0 commit comments