| OLD | NEW |
| 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// | 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// |
| 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 | 9 |
| 10 #include "llvm/ADT/STLExtras.h" | 10 #include "llvm/ADT/STLExtras.h" |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 "%p0, align 1;\n", | 100 "%p0, align 1;\n", |
| 101 DumpMunger.getLinesWithSubstring("62:4")); | 101 DumpMunger.getLinesWithSubstring("62:4")); |
| 102 | 102 |
| 103 // Show that we can handle alignment of 1. | 103 // Show that we can handle alignment of 1. |
| 104 IceTest::SubzeroBitcodeMunger Munger( | 104 IceTest::SubzeroBitcodeMunger Munger( |
| 105 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 105 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 106 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); | 106 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); |
| 107 | 107 |
| 108 // Show what happens when changing alignment to 0. | 108 // Show what happens when changing alignment to 0. |
| 109 const uint64_t Align0[] = { | 109 const uint64_t Align0[] = { |
| 110 ReplaceIndex, NaClBitcodeMunger::Replace, | 110 ReplaceIndex, NaClMungedBitcode::Replace, |
| 111 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, | 111 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, |
| 112 }; | 112 }; |
| 113 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, | 113 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, |
| 114 array_lengthof(Align0))); | 114 array_lengthof(Align0))); |
| 115 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, | 115 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, |
| 116 array_lengthof(Align0))); | 116 array_lengthof(Align0))); |
| 117 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 117 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 118 DumpMunger.getLinesWithSubstring("alloca")); | 118 DumpMunger.getLinesWithSubstring("alloca")); |
| 119 | 119 |
| 120 // Show what happens when changing alignment to 2**30. | 120 // Show what happens when changing alignment to 2**30. |
| 121 const uint64_t Align30[] = { | 121 const uint64_t Align30[] = { |
| 122 ReplaceIndex, NaClBitcodeMunger::Replace, | 122 ReplaceIndex, NaClMungedBitcode::Replace, |
| 123 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 123 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
| 124 }; | 124 }; |
| 125 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, | 125 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, |
| 126 array_lengthof(Align30))); | 126 array_lengthof(Align30))); |
| 127 EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", | 127 EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", |
| 128 Munger.getTestResults()); | 128 Munger.getTestResults()); |
| 129 | 129 |
| 130 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, | 130 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, |
| 131 array_lengthof(Align30))); | 131 array_lengthof(Align30))); |
| 132 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 132 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 133 DumpMunger.getLinesWithSubstring("alloca")); | 133 DumpMunger.getLinesWithSubstring("alloca")); |
| 134 EXPECT_EQ( | 134 EXPECT_EQ( |
| 135 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 135 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
| 136 DumpMunger.getLinesWithSubstring("Error")); | 136 DumpMunger.getLinesWithSubstring("Error")); |
| 137 | 137 |
| 138 // Show what happens when changing alignment to 2**29. | 138 // Show what happens when changing alignment to 2**29. |
| 139 const uint64_t Align29[] = { | 139 const uint64_t Align29[] = { |
| 140 ReplaceIndex, NaClBitcodeMunger::Replace, | 140 ReplaceIndex, NaClMungedBitcode::Replace, |
| 141 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, | 141 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, |
| 142 }; | 142 }; |
| 143 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, | 143 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, |
| 144 array_lengthof(Align29))); | 144 array_lengthof(Align29))); |
| 145 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, | 145 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, |
| 146 array_lengthof(Align29))); | 146 array_lengthof(Align29))); |
| 147 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", | 147 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", |
| 148 DumpMunger.getLinesWithSubstring("alloca")); | 148 DumpMunger.getLinesWithSubstring("alloca")); |
| 149 } | 149 } |
| 150 | 150 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 173 EXPECT_TRUE(DumpMunger.runTest("Good load i32 alignment 1")); | 173 EXPECT_TRUE(DumpMunger.runTest("Good load i32 alignment 1")); |
| 174 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " | 174 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " |
| 175 "align 1;\n", | 175 "align 1;\n", |
| 176 DumpMunger.getLinesWithSubstring("58:4")); | 176 DumpMunger.getLinesWithSubstring("58:4")); |
| 177 IceTest::SubzeroBitcodeMunger Munger( | 177 IceTest::SubzeroBitcodeMunger Munger( |
| 178 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 178 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 179 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); | 179 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); |
| 180 | 180 |
| 181 // Show what happens when changing alignment to 0. | 181 // Show what happens when changing alignment to 0. |
| 182 const uint64_t Align0[] = { | 182 const uint64_t Align0[] = { |
| 183 ReplaceIndex, NaClBitcodeMunger::Replace, | 183 ReplaceIndex, NaClMungedBitcode::Replace, |
| 184 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 184 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 185 }; | 185 }; |
| 186 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, | 186 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, |
| 187 array_lengthof(Align0))); | 187 array_lengthof(Align0))); |
| 188 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", | 188 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
| 189 Munger.getTestResults()); | 189 Munger.getTestResults()); |
| 190 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, | 190 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, |
| 191 array_lengthof(Align0))); | 191 array_lengthof(Align0))); |
| 192 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 192 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 193 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 193 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 194 DumpMunger.getLinesWithSubstring("load")); | 194 DumpMunger.getLinesWithSubstring("load")); |
| 195 | 195 |
| 196 // Show what happens when changing alignment to 4. | 196 // Show what happens when changing alignment to 4. |
| 197 const uint64_t Align4[] = { | 197 const uint64_t Align4[] = { |
| 198 ReplaceIndex, NaClBitcodeMunger::Replace, | 198 ReplaceIndex, NaClMungedBitcode::Replace, |
| 199 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 199 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 200 }; | 200 }; |
| 201 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, | 201 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, |
| 202 array_lengthof(Align4))); | 202 array_lengthof(Align4))); |
| 203 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", | 203 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", |
| 204 Munger.getTestResults()); | 204 Munger.getTestResults()); |
| 205 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, | 205 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, |
| 206 array_lengthof(Align4))); | 206 array_lengthof(Align4))); |
| 207 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" | 207 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" |
| 208 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 208 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 209 DumpMunger.getLinesWithSubstring("load")); | 209 DumpMunger.getLinesWithSubstring("load")); |
| 210 | 210 |
| 211 // Show what happens when changing alignment to 2**29. | 211 // Show what happens when changing alignment to 2**29. |
| 212 const uint64_t Align29[] = { | 212 const uint64_t Align29[] = { |
| 213 ReplaceIndex, NaClBitcodeMunger::Replace, | 213 ReplaceIndex, NaClMungedBitcode::Replace, |
| 214 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 214 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 215 }; | 215 }; |
| 216 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, | 216 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, |
| 217 array_lengthof(Align29))); | 217 array_lengthof(Align29))); |
| 218 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", | 218 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
| 219 Munger.getTestResults()); | 219 Munger.getTestResults()); |
| 220 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", | 220 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", |
| 221 Align29, array_lengthof(Align29))); | 221 Align29, array_lengthof(Align29))); |
| 222 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" | 222 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" |
| 223 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 223 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 224 DumpMunger.getLinesWithSubstring("load")); | 224 DumpMunger.getLinesWithSubstring("load")); |
| 225 | 225 |
| 226 // Show what happens when changing alignment to 2**30. | 226 // Show what happens when changing alignment to 2**30. |
| 227 const uint64_t Align30[] = { | 227 const uint64_t Align30[] = { |
| 228 ReplaceIndex, NaClBitcodeMunger::Replace, | 228 ReplaceIndex, NaClMungedBitcode::Replace, |
| 229 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 229 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 230 }; | 230 }; |
| 231 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, | 231 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, |
| 232 array_lengthof(Align30))); | 232 array_lengthof(Align30))); |
| 233 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", | 233 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
| 234 Munger.getTestResults()); | 234 Munger.getTestResults()); |
| 235 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", | 235 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", |
| 236 Align30, array_lengthof(Align30))); | 236 Align30, array_lengthof(Align30))); |
| 237 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 237 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 238 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 238 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| (...skipping 26 matching lines...) Expand all Loading... |
| 265 EXPECT_TRUE(DumpMunger.runTest("Good load float alignment 1")); | 265 EXPECT_TRUE(DumpMunger.runTest("Good load float alignment 1")); |
| 266 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load float* " | 266 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load float* " |
| 267 "%p0, align 1;\n", | 267 "%p0, align 1;\n", |
| 268 DumpMunger.getLinesWithSubstring("58:4")); | 268 DumpMunger.getLinesWithSubstring("58:4")); |
| 269 IceTest::SubzeroBitcodeMunger Munger( | 269 IceTest::SubzeroBitcodeMunger Munger( |
| 270 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 270 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 271 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); | 271 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); |
| 272 | 272 |
| 273 // Show what happens when changing alignment to 0. | 273 // Show what happens when changing alignment to 0. |
| 274 const uint64_t Align0[] = { | 274 const uint64_t Align0[] = { |
| 275 ReplaceIndex, NaClBitcodeMunger::Replace, | 275 ReplaceIndex, NaClMungedBitcode::Replace, |
| 276 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 276 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 277 }; | 277 }; |
| 278 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, | 278 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, |
| 279 array_lengthof(Align0))); | 279 array_lengthof(Align0))); |
| 280 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", | 280 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
| 281 Munger.getTestResults()); | 281 Munger.getTestResults()); |
| 282 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", | 282 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", |
| 283 Align0, array_lengthof(Align0))); | 283 Align0, array_lengthof(Align0))); |
| 284 EXPECT_EQ( | 284 EXPECT_EQ( |
| 285 " %v0 = load float* %p0, align 0;\n" | 285 " %v0 = load float* %p0, align 0;\n" |
| 286 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 286 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 287 DumpMunger.getLinesWithSubstring("load")); | 287 DumpMunger.getLinesWithSubstring("load")); |
| 288 | 288 |
| 289 // Show what happens when changing alignment to 4. | 289 // Show what happens when changing alignment to 4. |
| 290 const uint64_t Align4[] = { | 290 const uint64_t Align4[] = { |
| 291 ReplaceIndex, NaClBitcodeMunger::Replace, | 291 ReplaceIndex, NaClMungedBitcode::Replace, |
| 292 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 292 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 293 }; | 293 }; |
| 294 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, | 294 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, |
| 295 array_lengthof(Align4))); | 295 array_lengthof(Align4))); |
| 296 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", | 296 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", |
| 297 Align4, array_lengthof(Align4))); | 297 Align4, array_lengthof(Align4))); |
| 298 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | 298 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
| 299 DumpMunger.getLinesWithSubstring("load")); | 299 DumpMunger.getLinesWithSubstring("load")); |
| 300 | 300 |
| 301 const uint64_t Align29[] = { | 301 const uint64_t Align29[] = { |
| 302 ReplaceIndex, NaClBitcodeMunger::Replace, | 302 ReplaceIndex, NaClMungedBitcode::Replace, |
| 303 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 303 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 304 }; | 304 }; |
| 305 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, | 305 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, |
| 306 array_lengthof(Align29))); | 306 array_lengthof(Align29))); |
| 307 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", | 307 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
| 308 Munger.getTestResults()); | 308 Munger.getTestResults()); |
| 309 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", | 309 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", |
| 310 Align29, array_lengthof(Align29))); | 310 Align29, array_lengthof(Align29))); |
| 311 EXPECT_EQ( | 311 EXPECT_EQ( |
| 312 " %v0 = load float* %p0, align 536870912;\n" | 312 " %v0 = load float* %p0, align 536870912;\n" |
| 313 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 313 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 314 DumpMunger.getLinesWithSubstring("load")); | 314 DumpMunger.getLinesWithSubstring("load")); |
| 315 | 315 |
| 316 // Show what happens when changing alignment to 2**30. | 316 // Show what happens when changing alignment to 2**30. |
| 317 const uint64_t Align30[] = { | 317 const uint64_t Align30[] = { |
| 318 ReplaceIndex, NaClBitcodeMunger::Replace, | 318 ReplaceIndex, NaClMungedBitcode::Replace, |
| 319 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 319 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 320 }; | 320 }; |
| 321 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, | 321 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, |
| 322 array_lengthof(Align30))); | 322 array_lengthof(Align30))); |
| 323 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", | 323 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
| 324 Munger.getTestResults()); | 324 Munger.getTestResults()); |
| 325 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", | 325 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", |
| 326 Align30, array_lengthof(Align30))); | 326 Align30, array_lengthof(Align30))); |
| 327 EXPECT_EQ( | 327 EXPECT_EQ( |
| 328 " %v0 = load float* %p0, align 0;\n" | 328 " %v0 = load float* %p0, align 0;\n" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 356 EXPECT_TRUE(DumpMunger.runTest("Good Store Alignment 1")); | 356 EXPECT_TRUE(DumpMunger.runTest("Good Store Alignment 1")); |
| 357 EXPECT_EQ(" 62:4| 3: <24, 2, 1, 1> | store float %p1, " | 357 EXPECT_EQ(" 62:4| 3: <24, 2, 1, 1> | store float %p1, " |
| 358 "float* %p0, \n", | 358 "float* %p0, \n", |
| 359 DumpMunger.getLinesWithSubstring("62:4")); | 359 DumpMunger.getLinesWithSubstring("62:4")); |
| 360 IceTest::SubzeroBitcodeMunger Munger( | 360 IceTest::SubzeroBitcodeMunger Munger( |
| 361 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 361 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 362 EXPECT_TRUE(Munger.runTest("Good store alignment")); | 362 EXPECT_TRUE(Munger.runTest("Good store alignment")); |
| 363 | 363 |
| 364 // Show what happens when changing alignment to 0. | 364 // Show what happens when changing alignment to 0. |
| 365 const uint64_t Align0[] = { | 365 const uint64_t Align0[] = { |
| 366 ReplaceIndex, NaClBitcodeMunger::Replace, | 366 ReplaceIndex, NaClMungedBitcode::Replace, |
| 367 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 367 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
| 368 }; | 368 }; |
| 369 EXPECT_FALSE( | 369 EXPECT_FALSE( |
| 370 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); | 370 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); |
| 371 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", | 371 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", |
| 372 Munger.getTestResults()); | 372 Munger.getTestResults()); |
| 373 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, | 373 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, |
| 374 array_lengthof(Align0))); | 374 array_lengthof(Align0))); |
| 375 EXPECT_EQ( | 375 EXPECT_EQ( |
| 376 " store float %p1, float* %p0, align 0;\n" | 376 " store float %p1, float* %p0, align 0;\n" |
| 377 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 377 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 378 DumpMunger.getLinesWithSubstring("store")); | 378 DumpMunger.getLinesWithSubstring("store")); |
| 379 | 379 |
| 380 // Show what happens when changing alignment to 4. | 380 // Show what happens when changing alignment to 4. |
| 381 const uint64_t Align4[] = { | 381 const uint64_t Align4[] = { |
| 382 ReplaceIndex, NaClBitcodeMunger::Replace, | 382 ReplaceIndex, NaClMungedBitcode::Replace, |
| 383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, | 383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, |
| 384 }; | 384 }; |
| 385 EXPECT_TRUE( | 385 EXPECT_TRUE( |
| 386 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); | 386 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); |
| 387 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, | 387 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, |
| 388 array_lengthof(Align4))); | 388 array_lengthof(Align4))); |
| 389 | 389 |
| 390 // Show what happens when changing alignment to 8. | 390 // Show what happens when changing alignment to 8. |
| 391 const uint64_t Align8[] = { | 391 const uint64_t Align8[] = { |
| 392 ReplaceIndex, NaClBitcodeMunger::Replace, | 392 ReplaceIndex, NaClMungedBitcode::Replace, |
| 393 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, | 393 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, |
| 394 }; | 394 }; |
| 395 EXPECT_FALSE( | 395 EXPECT_FALSE( |
| 396 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); | 396 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); |
| 397 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", | 397 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", |
| 398 Munger.getTestResults()); | 398 Munger.getTestResults()); |
| 399 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, | 399 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, |
| 400 array_lengthof(Align8))); | 400 array_lengthof(Align8))); |
| 401 EXPECT_EQ( | 401 EXPECT_EQ( |
| 402 " store float %p1, float* %p0, align 8;\n" | 402 " store float %p1, float* %p0, align 8;\n" |
| 403 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 403 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 404 DumpMunger.getLinesWithSubstring("store")); | 404 DumpMunger.getLinesWithSubstring("store")); |
| 405 | 405 |
| 406 // Show what happens when changing alignment to 2**29. | 406 // Show what happens when changing alignment to 2**29. |
| 407 const uint64_t Align29[] = { | 407 const uint64_t Align29[] = { |
| 408 ReplaceIndex, NaClBitcodeMunger::Replace, | 408 ReplaceIndex, NaClMungedBitcode::Replace, |
| 409 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, | 409 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, |
| 410 }; | 410 }; |
| 411 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, | 411 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, |
| 412 array_lengthof(Align29))); | 412 array_lengthof(Align29))); |
| 413 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", | 413 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", |
| 414 Munger.getTestResults()); | 414 Munger.getTestResults()); |
| 415 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, | 415 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, |
| 416 array_lengthof(Align29))); | 416 array_lengthof(Align29))); |
| 417 EXPECT_EQ( | 417 EXPECT_EQ( |
| 418 " store float %p1, float* %p0, align 536870912;\n" | 418 " store float %p1, float* %p0, align 536870912;\n" |
| 419 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 419 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 420 DumpMunger.getLinesWithSubstring("store")); | 420 DumpMunger.getLinesWithSubstring("store")); |
| 421 | 421 |
| 422 const uint64_t Align30[] = { | 422 const uint64_t Align30[] = { |
| 423 ReplaceIndex, NaClBitcodeMunger::Replace, | 423 ReplaceIndex, NaClMungedBitcode::Replace, |
| 424 // Note: alignment stored as 0 or log2(Alignment)+1. | 424 // Note: alignment stored as 0 or log2(Alignment)+1. |
| 425 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 425 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
| 426 }; | 426 }; |
| 427 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, | 427 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, |
| 428 array_lengthof(Align30))); | 428 array_lengthof(Align30))); |
| 429 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", | 429 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", |
| 430 Munger.getTestResults()); | 430 Munger.getTestResults()); |
| 431 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, | 431 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, |
| 432 array_lengthof(Align30))); | 432 array_lengthof(Align30))); |
| 433 EXPECT_EQ( | 433 EXPECT_EQ( |
| 434 " store float %p1, float* %p0, align 0;\n" | 434 " store float %p1, float* %p0, align 0;\n" |
| 435 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 435 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 436 DumpMunger.getLinesWithSubstring("store")); | 436 DumpMunger.getLinesWithSubstring("store")); |
| 437 } | 437 } |
| 438 | 438 |
| 439 } // end of anonymous namespace | 439 } // end of anonymous namespace |
| OLD | NEW |