Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: test/cctest/test-assembler-mips64.cc

Issue 2909913002: MIPS64: Add optimizations to li and Dsubu macro. (Closed)
Patch Set: Rebase to master Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/mips64/macro-assembler-mips64.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 5053 matching lines...) Expand 10 before | Expand all | Expand 10 after
5064 if (num_instr > 0) { 5064 if (num_instr > 0) {
5065 CHECK_EQ(assm.InstructionsGeneratedSince(&code_start), num_instr); 5065 CHECK_EQ(assm.InstructionsGeneratedSince(&code_start), num_instr);
5066 } 5066 }
5067 __ jr(ra); 5067 __ jr(ra);
5068 __ nop(); 5068 __ nop();
5069 5069
5070 CodeDesc desc; 5070 CodeDesc desc;
5071 assm.GetCode(isolate, &desc); 5071 assm.GetCode(isolate, &desc);
5072 Handle<Code> code = isolate->factory()->NewCode( 5072 Handle<Code> code = isolate->factory()->NewCode(
5073 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 5073 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
5074 #ifdef OBJECT_PRINT
5075 code->Print(std::cout);
5076 #endif
5074 F2 f = FUNCTION_CAST<F2>(code->entry()); 5077 F2 f = FUNCTION_CAST<F2>(code->entry());
5075 5078
5076 uint64_t res = reinterpret_cast<uint64_t>( 5079 uint64_t res = reinterpret_cast<uint64_t>(
5077 CALL_GENERATED_CODE(isolate, f, 0, 0, 0, 0, 0)); 5080 CALL_GENERATED_CODE(isolate, f, 0, 0, 0, 0, 0));
5078 5081
5079 return res; 5082 return res;
5080 } 5083 }
5081 5084
5082 5085
5083 TEST(li_macro) { 5086 TEST(li_macro) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
5116 // r2 - daddiu + dsrl32 5119 // r2 - daddiu + dsrl32
5117 // r6 - daddiu + dahi 5120 // r6 - daddiu + dahi
5118 {0x00000000fffffffe, 3, 2}, // max_uint32 - 1 5121 {0x00000000fffffffe, 3, 2}, // max_uint32 - 1
5119 // r2 - lui + ori + dsll 5122 // r2 - lui + ori + dsll
5120 // r6 - daddiu + dahi 5123 // r6 - daddiu + dahi
5121 {0x00ffff000000fffe, 3, 3}, 5124 {0x00ffff000000fffe, 3, 3},
5122 // ori + dsll32 + ori 5125 // ori + dsll32 + ori
5123 {0x00000001fffffffe, 4, 2}, // max_uint32 << 1 5126 {0x00000001fffffffe, 4, 2}, // max_uint32 << 1
5124 // r2 - lui + ori + dsll + ori 5127 // r2 - lui + ori + dsll + ori
5125 // r6 - daddiu + dahi 5128 // r6 - daddiu + dahi
5126 {0x0000fffffffffffe, 5, 2}, // max_uint48 - 1 5129 {0x0000fffffffffffe, 4, 2}, // max_uint48 - 1
5127 // r2 - ori + dsll + ori + dsll + ori 5130 // r2 - daddiu + dsll32 + ori + dsubu
5131 // Loading imm directly would require ori + dsll + ori + dsll + ori.
5132 // Optimized by loading -imm and using dsubu to get imm.
5128 // r6 - daddiu + dati 5133 // r6 - daddiu + dati
5129 {0xffffffff00000000, 2, 2}, // max_uint32 << 32 5134 {0xffffffff00000000, 2, 2}, // max_uint32 << 32
5130 // r2 - daddiu + dsll32 5135 // r2 - daddiu + dsll32
5131 // r6 - ori + dahi 5136 // r6 - ori + dahi
5132 // We need ori to clear register before loading value using dahi. 5137 // We need ori to clear register before loading value using dahi.
5133 {0xffffffff80000000, 1, 1}, // min_int32 5138 {0xffffffff80000000, 1, 1}, // min_int32
5134 // The test case above generates lui instruction. 5139 // The test case above generates lui instruction.
5135 {0x0000000080000000, 2, 2}, // max_int32 + 1 5140 {0x0000000080000000, 2, 2}, // max_int32 + 1
5136 // r2 - ori + dsll 5141 // r2 - ori + dsll
5137 // r6 - lui + dahi 5142 // r6 - lui + dahi
5138 {0x0000800000000000, 2, 2}, 5143 {0x0000800000000000, 2, 2},
5139 // ori + dsll32 5144 // ori + dsll32
5140 {0xffff800000000000, 2, 2}, 5145 {0xffff800000000000, 2, 2},
5141 // r2 - daddiu + dsll32 5146 // r2 - daddiu + dsll32
5142 // r6 - ori + dahi 5147 // r6 - ori + dahi
5143 {0xffff80000000ffff, 3, 2}, 5148 {0xffff80000000ffff, 3, 2},
5144 // r2 - daddiu + dsll32 + ori 5149 // r2 - daddiu + dsll32 + ori
5145 // r6 - ori + dahi 5150 // r6 - ori + dahi
5146 {0xffffff123000ffff, 3, 3}, 5151 {0xffffff123000ffff, 3, 3},
5147 // daddiu + dsll + ori 5152 // daddiu + dsll + ori
5148 {0xffff00000000ffff, 3, 2}, 5153 {0xffff00000000ffff, 3, 2},
5149 // r2 - daddiu + dsll32 + ori 5154 // r2 - daddiu + dsll32 + ori
5150 // r6 - ori + dati 5155 // r6 - ori + dati
5151 {0xffff8000ffff0000, 3, 2}, 5156 {0xffff8000ffff0000, 3, 2},
5152 // r2 - lui + ori + dsll 5157 // r2 - lui + ori + dsll
5153 // r6 - lui + dahi 5158 // r6 - lui + dahi
5159 {0x0000ffffffff0000, 4, 2},
5160 // r2 - ori + dsll + ori + dsll
5161 // r6 - lui + dati
5154 {0x1234ffff80000000, 3, 2}, 5162 {0x1234ffff80000000, 3, 2},
5155 // r2 - lui + ori + dsll 5163 // r2 - lui + ori + dsll
5156 // r6 - lui + dati 5164 // r6 - lui + dati
5157 {0x1234ffff80010000, 5, 2}, 5165 {0x1234ffff80010000, 5, 2},
5158 // r2 - lui + ori + dsll + ori + dsll 5166 // r2 - lui + ori + dsll + ori + dsll
5159 // r6 - lui + dati 5167 // r6 - lui + dati
5160 {0xffff8000ffff8000, 2, 2}, 5168 {0xffff8000ffff8000, 2, 2},
5161 // r2 - daddiu + dinsu 5169 // r2 - daddiu + dinsu
5162 // r6 - daddiu + dahi 5170 // r6 - daddiu + dahi
5163 {0xffff0000ffff8000, 5, 3}, 5171 {0xffff0000ffff8000, 4, 3},
5164 // r2 - lui + dsll + ori + dsll + ori 5172 // r2 - ori + dsll32 + ori + dsubu
5173 // Loading imm directly would require lui + dsll + ori + dsll + ori.
5174 // Optimized by loading -imm and using dsubu to get imm.
5165 // r6 - daddiu + dahi + dati 5175 // r6 - daddiu + dahi + dati
5166 {0x8000000080000000, 2, 2}, 5176 {0x8000000080000000, 2, 2},
5167 // lui + dinsu 5177 // lui + dinsu
5168 {0xabcd0000abcd0000, 2, 2}, 5178 {0xabcd0000abcd0000, 2, 2},
5169 // lui + dinsu 5179 // lui + dinsu
5170 {0x8000800080008000, 3, 3}, 5180 {0x8000800080008000, 3, 3},
5171 // lui + ori + dinsu 5181 // lui + ori + dinsu
5172 {0xabcd1234abcd1234, 3, 3}, 5182 {0xabcd1234abcd1234, 3, 3},
5173 // The test case above generates lui + ori + dinsu instruction sequence. 5183 // The test case above generates lui + ori + dinsu instruction sequence.
5174 {0xffff800080008000, 4, 3}, 5184 {0xffff800080008000, 4, 3},
5175 // r2 - lui + ori + dsll + ori 5185 // r2 - lui + ori + dsll + ori
5176 // r6 - lui + ori + dahi 5186 // r6 - lui + ori + dahi
5177 {0xffffabcd, 3, 2}, 5187 {0xffffabcd, 3, 2},
5178 // r2 - ori + dsll + ori 5188 // r2 - ori + dsll + ori
5179 // r6 - daddiu + dahi 5189 // r6 - daddiu + dahi
5180 {0x1ffffabcd, 4, 2}, 5190 {0x1ffffabcd, 4, 2},
5181 // r2 - lui + ori + dsll + ori 5191 // r2 - lui + ori + dsll + ori
5182 // r6 - daddiu + dahi 5192 // r6 - daddiu + dahi
5183 {0xffffffffabcd, 5, 2}, 5193 {0xffffffffabcd, 4, 2},
5184 // r2 - ori + dsll + ori + dsll + ori 5194 // r2 - daddiu + dsll32 + ori + dsubu
5195 // Loading imm directly would require ori + dsll + ori + dsll + ori.
5196 // Optimized by loading -imm and using dsubu to get imm.
5185 // r6 - daddiu + dati 5197 // r6 - daddiu + dati
5186 {0x1ffffffffabcd, 6, 2}, 5198 {0x1ffffffffabcd, 4, 2},
5187 // r2 - lui + ori + dsll + ori + dsll + ori 5199 // r2 - daddiu + dsll32 + ori + dsubu
5200 // Loading imm directly would require lui + ori + dsll + ori + dsll + ori.
5201 // Optimized by loading -imm and using dsubu to get imm.
5188 // r6 - daddiu + dati 5202 // r6 - daddiu + dati
5189 {0xffff7fff80010000, 5, 2}, 5203 {0xffff7fff80010000, 5, 2},
5190 // r2 - lui + ori + dsll + ori + dsll 5204 // r2 - lui + ori + dsll + ori + dsll
5191 // r6 - lui + dahi 5205 // r6 - lui + dahi
5192 // Here lui sets high 32 bits to 1 so dahi can be used to get target 5206 // Here lui sets high 32 bits to 1 so dahi can be used to get target
5193 // value. 5207 // value.
5194 {0x00007fff7fff0000, 3, 2}, 5208 {0x00007fff7fff0000, 3, 2},
5195 // r2 - lui + ori + dsll 5209 // r2 - lui + ori + dsll
5196 // r6 - lui + dahi 5210 // r6 - lui + dahi
5197 // High 32 bits are not set so dahi can be used to get target value. 5211 // High 32 bits are not set so dahi can be used to get target value.
5198 {0xffff7fff7fff0000, 5, 3}, 5212 {0xffff7fff7fff0000, 5, 3},
5199 // r2 - lui + ori + dsll + ori + dsll 5213 // r2 - lui + ori + dsll + ori + dsll
5200 // r6 - lui + dahi + dati 5214 // r6 - lui + dahi + dati
5201 // High 32 bits are not set so just dahi can't be used to get target 5215 // High 32 bits are not set so just dahi can't be used to get target
5202 // value. 5216 // value.
5203 {0x00007fff80010000, 3, 3}, 5217 {0x00007fff80010000, 3, 3},
5204 // r2 - lui + ori + dsll 5218 // r2 - lui + ori + dsll
5205 // r6 - lui + ori + dsll 5219 // r6 - lui + ori + dsll
5206 // High 32 bits are set so can't just use lui + dahi to get target value. 5220 // High 32 bits are set so can't just use lui + dahi to get target value.
5207 {0x1234abcd87654321, 6, 4}, 5221 {0x1234abcd87654321, 6, 4},
5208 // The test case above generates: 5222 // The test case above generates:
5209 // r2 - lui + ori + dsll + ori + dsll + ori instruction sequence, 5223 // r2 - lui + ori + dsll + ori + dsll + ori instruction sequence,
5210 // r6 - lui + ori + dahi + dati. 5224 // r6 - lui + ori + dahi + dati.
5211 // Load using full instruction sequence. 5225 // Load using full instruction sequence.
5226 {0xffff0000ffffffff, 3, 3},
5227 // r2 - ori + dsll32 + nor
5228 // Loading imm directly would require lui + dsll + ori + dsll + ori.
5229 // Optimized by loading ~imm and using nor to get imm. Loading -imm would
5230 // require one instruction more.
5231 // r6 - daddiu + dahi + dati
5212 }; 5232 };
5213 5233
5214 size_t nr_test_cases = sizeof(tc) / sizeof(TestCase_li); 5234 size_t nr_test_cases = sizeof(tc) / sizeof(TestCase_li);
5215 for (size_t i = 0; i < nr_test_cases; ++i) { 5235 for (size_t i = 0; i < nr_test_cases; ++i) {
5216 if (kArchVariant == kMips64r2) { 5236 if (kArchVariant == kMips64r2) {
5217 CHECK_EQ(tc[i].imm, 5237 CHECK_EQ(tc[i].imm,
5218 run_li_macro(tc[i].imm, OPTIMIZE_SIZE, tc[i].r2_num_instr)); 5238 run_li_macro(tc[i].imm, OPTIMIZE_SIZE, tc[i].r2_num_instr));
5219 } else { 5239 } else {
5220 CHECK_EQ(tc[i].imm, 5240 CHECK_EQ(tc[i].imm,
5221 run_li_macro(tc[i].imm, OPTIMIZE_SIZE, tc[i].r6_num_instr)); 5241 run_li_macro(tc[i].imm, OPTIMIZE_SIZE, tc[i].r6_num_instr));
(...skipping 970 matching lines...) Expand 10 before | Expand all | Expand 10 after
6192 __ bind(&code_start); 6212 __ bind(&code_start);
6193 __ Subu(v0, zero_reg, Operand(imm)); 6213 __ Subu(v0, zero_reg, Operand(imm));
6194 CHECK_EQ(assm.InstructionsGeneratedSince(&code_start), num_instr); 6214 CHECK_EQ(assm.InstructionsGeneratedSince(&code_start), num_instr);
6195 __ jr(ra); 6215 __ jr(ra);
6196 __ nop(); 6216 __ nop();
6197 6217
6198 CodeDesc desc; 6218 CodeDesc desc;
6199 assm.GetCode(isolate, &desc); 6219 assm.GetCode(isolate, &desc);
6200 Handle<Code> code = isolate->factory()->NewCode( 6220 Handle<Code> code = isolate->factory()->NewCode(
6201 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 6221 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
6222 #ifdef OBJECT_PRINT
6223 code->Print(std::cout);
6224 #endif
6202 F2 f = FUNCTION_CAST<F2>(code->entry()); 6225 F2 f = FUNCTION_CAST<F2>(code->entry());
6203 6226
6204 uint64_t res = reinterpret_cast<uint64_t>( 6227 uint64_t res = reinterpret_cast<uint64_t>(
6205 CALL_GENERATED_CODE(isolate, f, 0, 0, 0, 0, 0)); 6228 CALL_GENERATED_CODE(isolate, f, 0, 0, 0, 0, 0));
6206 6229
6207 return res; 6230 return res;
6208 } 6231 }
6209 6232
6210 TEST(Subu) { 6233 TEST(Subu) {
6211 CcTest::InitializeVM(); 6234 CcTest::InitializeVM();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
6271 __ bind(&code_start); 6294 __ bind(&code_start);
6272 __ Dsubu(v0, zero_reg, Operand(imm)); 6295 __ Dsubu(v0, zero_reg, Operand(imm));
6273 CHECK_EQ(assm.InstructionsGeneratedSince(&code_start), num_instr); 6296 CHECK_EQ(assm.InstructionsGeneratedSince(&code_start), num_instr);
6274 __ jr(ra); 6297 __ jr(ra);
6275 __ nop(); 6298 __ nop();
6276 6299
6277 CodeDesc desc; 6300 CodeDesc desc;
6278 assm.GetCode(isolate, &desc); 6301 assm.GetCode(isolate, &desc);
6279 Handle<Code> code = isolate->factory()->NewCode( 6302 Handle<Code> code = isolate->factory()->NewCode(
6280 desc, Code::ComputeFlags(Code::STUB), Handle<Code>()); 6303 desc, Code::ComputeFlags(Code::STUB), Handle<Code>());
6304 #ifdef OBJECT_PRINT
6305 code->Print(std::cout);
6306 #endif
6281 F2 f = FUNCTION_CAST<F2>(code->entry()); 6307 F2 f = FUNCTION_CAST<F2>(code->entry());
6282 6308
6283 uint64_t res = reinterpret_cast<uint64_t>( 6309 uint64_t res = reinterpret_cast<uint64_t>(
6284 CALL_GENERATED_CODE(isolate, f, 0, 0, 0, 0, 0)); 6310 CALL_GENERATED_CODE(isolate, f, 0, 0, 0, 0, 0));
6285 6311
6286 return res; 6312 return res;
6287 } 6313 }
6288 6314
6289 TEST(Dsubu) { 6315 TEST(Dsubu) {
6290 CcTest::InitializeVM(); 6316 CcTest::InitializeVM();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
6334 // bit register, Dsubu gives a different result here. 6360 // bit register, Dsubu gives a different result here.
6335 {0x7fffffffffffffff, 0x8000000000000001, 3}, // max_int64 6361 {0x7fffffffffffffff, 0x8000000000000001, 3}, // max_int64
6336 // r2 - Generates daddiu + dsrl + dsubu 6362 // r2 - Generates daddiu + dsrl + dsubu
6337 // r6 - Generates daddiu + dati + dsubu 6363 // r6 - Generates daddiu + dati + dsubu
6338 {0x8000000000000000, 0x8000000000000000, 3}, // min_int64 6364 {0x8000000000000000, 0x8000000000000000, 3}, // min_int64
6339 // The test case above generates: 6365 // The test case above generates:
6340 // r2 - daddiu + dsrl32 + dsubu instruction sequence, 6366 // r2 - daddiu + dsrl32 + dsubu instruction sequence,
6341 // r6 - ori + dati + dsubu. 6367 // r6 - ori + dati + dsubu.
6342 // The result of 0 - min_int64 eqauls max_int64 + 1, which wraps around to 6368 // The result of 0 - min_int64 eqauls max_int64 + 1, which wraps around to
6343 // min_int64 again. 6369 // min_int64 again.
6370 {0xffff0000ffffffff, 0x0000ffff00000001, 4},
6371 // The test case above generates:
6372 // r2 - ori + dsrl32 + ori + daddu instruction sequence,
6373 // r6 - daddiu + dahi + dati + dsubu.
6374 // For r2 loading imm would take more instructions than loading -imm so we
6375 // can load -imm and add with daddu.
6344 }; 6376 };
6345 6377
6346 size_t nr_test_cases = sizeof(tc) / sizeof(TestCaseDsubu); 6378 size_t nr_test_cases = sizeof(tc) / sizeof(TestCaseDsubu);
6347 for (size_t i = 0; i < nr_test_cases; ++i) { 6379 for (size_t i = 0; i < nr_test_cases; ++i) {
6348 CHECK_EQ(tc[i].expected_res, run_Dsubu(tc[i].imm, tc[i].num_instr)); 6380 CHECK_EQ(tc[i].expected_res, run_Dsubu(tc[i].imm, tc[i].num_instr));
6349 } 6381 }
6350 } 6382 }
6351 6383
6352 uint64_t run_Dins(uint64_t imm, uint64_t source, uint16_t pos, uint16_t size) { 6384 uint64_t run_Dins(uint64_t imm, uint64_t source, uint16_t pos, uint16_t size) {
6353 Isolate* isolate = CcTest::i_isolate(); 6385 Isolate* isolate = CcTest::i_isolate();
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after
6955 }; 6987 };
6956 6988
6957 for (size_t i = 0; i < sizeof(tc) / sizeof(TestCaseMsaI8); ++i) { 6989 for (size_t i = 0; i < sizeof(tc) / sizeof(TestCaseMsaI8); ++i) {
6958 run_msa_i8(SHF_B, tc[i].input_lo, tc[i].input_hi, tc[i].i8); 6990 run_msa_i8(SHF_B, tc[i].input_lo, tc[i].input_hi, tc[i].i8);
6959 run_msa_i8(SHF_H, tc[i].input_lo, tc[i].input_hi, tc[i].i8); 6991 run_msa_i8(SHF_H, tc[i].input_lo, tc[i].input_hi, tc[i].i8);
6960 run_msa_i8(SHF_W, tc[i].input_lo, tc[i].input_hi, tc[i].i8); 6992 run_msa_i8(SHF_W, tc[i].input_lo, tc[i].input_hi, tc[i].i8);
6961 } 6993 }
6962 } 6994 }
6963 6995
6964 #undef __ 6996 #undef __
OLDNEW
« no previous file with comments | « src/mips64/macro-assembler-mips64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698