| OLD | NEW |
| 1 //===- subzero/unittest/AssemblerX8632/LowLevel.cpp -----------------------===// | 1 //===- subzero/unittest/AssemblerX8632/LowLevel.cpp -----------------------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 #include "AssemblerX8632/TestUtil.h" | 9 #include "AssemblerX8632/TestUtil.h" |
| 10 | 10 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 << TestString; \ | 133 << TestString; \ |
| 134 reset(); \ | 134 reset(); \ |
| 135 } while (0) | 135 } while (0) |
| 136 | 136 |
| 137 #define TestRegAbsoluteAddr(Inst, Dst, Disp, OpType, ByteCountUntyped, ...) \ | 137 #define TestRegAbsoluteAddr(Inst, Dst, Disp, OpType, ByteCountUntyped, ...) \ |
| 138 do { \ | 138 do { \ |
| 139 static constexpr char TestString[] = \ | 139 static constexpr char TestString[] = \ |
| 140 "(" #Inst ", " #Dst ", " #Disp ", " #OpType ", " #ByteCountUntyped \ | 140 "(" #Inst ", " #Dst ", " #Disp ", " #OpType ", " #ByteCountUntyped \ |
| 141 ", " #__VA_ARGS__ ")"; \ | 141 ", " #__VA_ARGS__ ")"; \ |
| 142 static constexpr uint8_t ByteCount = ByteCountUntyped; \ | 142 static constexpr uint8_t ByteCount = ByteCountUntyped; \ |
| 143 static constexpr AssemblerFixup *Fixup = nullptr; \ |
| 143 __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \ | 144 __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \ |
| 144 Address(Address::ABSOLUTE, Disp)); \ | 145 Address(Disp, Fixup)); \ |
| 145 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ | 146 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ |
| 146 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ | 147 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ |
| 147 << TestString; \ | 148 << TestString; \ |
| 148 reset(); \ | 149 reset(); \ |
| 149 } while (0) | 150 } while (0) |
| 150 | 151 |
| 151 #define TestRegAddrBase(Inst, Dst, Base, Disp, OpType, ByteCountUntyped, ...) \ | 152 #define TestRegAddrBase(Inst, Dst, Base, Disp, OpType, ByteCountUntyped, ...) \ |
| 152 do { \ | 153 do { \ |
| 153 static constexpr char TestString[] = \ | 154 static constexpr char TestString[] = \ |
| 154 "(" #Inst ", " #Dst ", " #Base ", " #Disp ", " #OpType \ | 155 "(" #Inst ", " #Dst ", " #Base ", " #Disp ", " #OpType \ |
| 155 ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ | 156 ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ |
| 156 static constexpr uint8_t ByteCount = ByteCountUntyped; \ | 157 static constexpr uint8_t ByteCount = ByteCountUntyped; \ |
| 158 static constexpr AssemblerFixup *Fixup = nullptr; \ |
| 157 __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \ | 159 __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \ |
| 158 Address(GPRRegister::Encoded_Reg_##Base, Disp)); \ | 160 Address(GPRRegister::Encoded_Reg_##Base, Disp, Fixup)); \ |
| 159 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ | 161 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ |
| 160 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ | 162 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ |
| 161 << TestString; \ | 163 << TestString; \ |
| 162 reset(); \ | 164 reset(); \ |
| 163 } while (0) | 165 } while (0) |
| 164 | 166 |
| 165 #define TestRegAddrScaledIndex(Inst, Dst, Index, Scale, Disp, OpType, \ | 167 #define TestRegAddrScaledIndex(Inst, Dst, Index, Scale, Disp, OpType, \ |
| 166 ByteCountUntyped, ...) \ | 168 ByteCountUntyped, ...) \ |
| 167 do { \ | 169 do { \ |
| 168 static constexpr char TestString[] = \ | 170 static constexpr char TestString[] = \ |
| 169 "(" #Inst ", " #Dst ", " #Index ", " #Scale ", " #Disp ", " #OpType \ | 171 "(" #Inst ", " #Dst ", " #Index ", " #Scale ", " #Disp ", " #OpType \ |
| 170 ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ | 172 ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ |
| 171 static constexpr uint8_t ByteCount = ByteCountUntyped; \ | 173 static constexpr uint8_t ByteCount = ByteCountUntyped; \ |
| 174 static constexpr AssemblerFixup *Fixup = nullptr; \ |
| 172 __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \ | 175 __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \ |
| 173 Address(GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale, \ | 176 Address(GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale, \ |
| 174 Disp)); \ | 177 Disp, Fixup)); \ |
| 175 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ | 178 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ |
| 176 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ | 179 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ |
| 177 << TestString; \ | 180 << TestString; \ |
| 178 reset(); \ | 181 reset(); \ |
| 179 } while (0) | 182 } while (0) |
| 180 | 183 |
| 181 #define TestRegAddrBaseScaledIndex(Inst, Dst, Base, Index, Scale, Disp, \ | 184 #define TestRegAddrBaseScaledIndex(Inst, Dst, Base, Index, Scale, Disp, \ |
| 182 OpType, ByteCountUntyped, ...) \ | 185 OpType, ByteCountUntyped, ...) \ |
| 183 do { \ | 186 do { \ |
| 184 static constexpr char TestString[] = \ | 187 static constexpr char TestString[] = \ |
| 185 "(" #Inst ", " #Dst ", " #Base ", " #Index ", " #Scale ", " #Disp \ | 188 "(" #Inst ", " #Dst ", " #Base ", " #Index ", " #Scale ", " #Disp \ |
| 186 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ | 189 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ |
| 187 static constexpr uint8_t ByteCount = ByteCountUntyped; \ | 190 static constexpr uint8_t ByteCount = ByteCountUntyped; \ |
| 191 static constexpr AssemblerFixup *Fixup = nullptr; \ |
| 188 __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \ | 192 __ Inst(IceType_##OpType, GPRRegister::Encoded_Reg_##Dst, \ |
| 189 Address(GPRRegister::Encoded_Reg_##Base, \ | 193 Address(GPRRegister::Encoded_Reg_##Base, \ |
| 190 GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale, \ | 194 GPRRegister::Encoded_Reg_##Index, Traits::TIMES_##Scale, \ |
| 191 Disp)); \ | 195 Disp, Fixup)); \ |
| 192 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ | 196 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ |
| 193 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ | 197 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ |
| 194 << TestString; \ | 198 << TestString; \ |
| 195 reset(); \ | 199 reset(); \ |
| 196 } while (0) | 200 } while (0) |
| 197 | 201 |
| 198 #define TestAddrBaseScaledIndexImm(Inst, Base, Index, Scale, Disp, Imm, \ | 202 #define TestAddrBaseScaledIndexImm(Inst, Base, Index, Scale, Disp, Imm, \ |
| 199 OpType, ByteCountUntyped, ...) \ | 203 OpType, ByteCountUntyped, ...) \ |
| 200 do { \ | 204 do { \ |
| 201 static constexpr char TestString[] = \ | 205 static constexpr char TestString[] = \ |
| 202 "(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Imm \ | 206 "(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Imm \ |
| 203 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ | 207 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ |
| 204 static constexpr uint8_t ByteCount = ByteCountUntyped; \ | 208 static constexpr uint8_t ByteCount = ByteCountUntyped; \ |
| 209 static constexpr AssemblerFixup *Fixup = nullptr; \ |
| 205 __ Inst(IceType_##OpType, Address(GPRRegister::Encoded_Reg_##Base, \ | 210 __ Inst(IceType_##OpType, Address(GPRRegister::Encoded_Reg_##Base, \ |
| 206 GPRRegister::Encoded_Reg_##Index, \ | 211 GPRRegister::Encoded_Reg_##Index, \ |
| 207 Traits::TIMES_##Scale, Disp), \ | 212 Traits::TIMES_##Scale, Disp, Fixup), \ |
| 208 Immediate(Imm)); \ | 213 Immediate(Imm)); \ |
| 209 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ | 214 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ |
| 210 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ | 215 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ |
| 211 << TestString; \ | 216 << TestString; \ |
| 212 reset(); \ | 217 reset(); \ |
| 213 } while (0) | 218 } while (0) |
| 214 | 219 |
| 215 #define TestAddrBaseScaledIndexReg(Inst, Base, Index, Scale, Disp, Src, \ | 220 #define TestAddrBaseScaledIndexReg(Inst, Base, Index, Scale, Disp, Src, \ |
| 216 OpType, ByteCountUntyped, ...) \ | 221 OpType, ByteCountUntyped, ...) \ |
| 217 do { \ | 222 do { \ |
| 218 static constexpr char TestString[] = \ | 223 static constexpr char TestString[] = \ |
| 219 "(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Src \ | 224 "(" #Inst ", " #Base ", " #Index ", " #Scale ", " #Disp ", " #Src \ |
| 220 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ | 225 ", " #OpType ", " #ByteCountUntyped ", " #__VA_ARGS__ ")"; \ |
| 221 static constexpr uint8_t ByteCount = ByteCountUntyped; \ | 226 static constexpr uint8_t ByteCount = ByteCountUntyped; \ |
| 227 static constexpr AssemblerFixup *Fixup = nullptr; \ |
| 222 __ Inst(IceType_##OpType, Address(GPRRegister::Encoded_Reg_##Base, \ | 228 __ Inst(IceType_##OpType, Address(GPRRegister::Encoded_Reg_##Base, \ |
| 223 GPRRegister::Encoded_Reg_##Index, \ | 229 GPRRegister::Encoded_Reg_##Index, \ |
| 224 Traits::TIMES_##Scale, Disp), \ | 230 Traits::TIMES_##Scale, Disp, Fixup), \ |
| 225 GPRRegister::Encoded_Reg_##Src); \ | 231 GPRRegister::Encoded_Reg_##Src); \ |
| 226 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ | 232 ASSERT_EQ(ByteCount, codeBytesSize()) << TestString; \ |
| 227 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ | 233 ASSERT_TRUE(verifyBytes<ByteCount>(codeBytes(), __VA_ARGS__)) \ |
| 228 << TestString; \ | 234 << TestString; \ |
| 229 reset(); \ | 235 reset(); \ |
| 230 } while (0) | 236 } while (0) |
| 231 | 237 |
| 232 /* cmp GPR, GPR */ | 238 /* cmp GPR, GPR */ |
| 233 TestRegReg(cmp, eax, ecx, i32, 2, 0x3B, 0xC1); | 239 TestRegReg(cmp, eax, ecx, i32, 2, 0x3B, 0xC1); |
| 234 TestRegReg(cmp, ecx, edx, i32, 2, 0x3B, 0xCA); | 240 TestRegReg(cmp, ecx, edx, i32, 2, 0x3B, 0xCA); |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 EXPECT_FLOAT_EQ(1.0f, test.contentsOfDword<float>(S0)); | 707 EXPECT_FLOAT_EQ(1.0f, test.contentsOfDword<float>(S0)); |
| 702 EXPECT_FLOAT_EQ(2.0f, test.contentsOfDword<float>(S1)); | 708 EXPECT_FLOAT_EQ(2.0f, test.contentsOfDword<float>(S1)); |
| 703 EXPECT_FLOAT_EQ(3.0f, test.contentsOfDword<float>(S2)); | 709 EXPECT_FLOAT_EQ(3.0f, test.contentsOfDword<float>(S2)); |
| 704 EXPECT_FLOAT_EQ(4.0f, test.contentsOfDword<float>(S3)); | 710 EXPECT_FLOAT_EQ(4.0f, test.contentsOfDword<float>(S3)); |
| 705 } | 711 } |
| 706 | 712 |
| 707 } // end of anonymous namespace | 713 } // end of anonymous namespace |
| 708 } // end of namespace Test | 714 } // end of namespace Test |
| 709 } // end of namespace X8632 | 715 } // end of namespace X8632 |
| 710 } // end of namespace Ice | 716 } // end of namespace Ice |
| OLD | NEW |