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

Side by Side Diff: src/compiler/arm64/code-generator-arm64.cc

Issue 1310323006: [turbofan] support for Int64 in CheckedLoad/CheckedStore on 64-bit platforms. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 6
7 #include "src/arm64/frames-arm64.h" 7 #include "src/arm64/frames-arm64.h"
8 #include "src/arm64/macro-assembler-arm64.h" 8 #include "src/arm64/macro-assembler-arm64.h"
9 #include "src/compiler/code-generator-impl.h" 9 #include "src/compiler/code-generator-impl.h"
10 #include "src/compiler/gap-resolver.h" 10 #include "src/compiler/gap-resolver.h"
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 auto offset = i.InputRegister32(1); \ 295 auto offset = i.InputRegister32(1); \
296 auto length = i.InputOperand32(2); \ 296 auto length = i.InputOperand32(2); \
297 __ Cmp(offset, length); \ 297 __ Cmp(offset, length); \
298 auto ool = new (zone()) OutOfLineLoadZero(this, result); \ 298 auto ool = new (zone()) OutOfLineLoadZero(this, result); \
299 __ B(hs, ool->entry()); \ 299 __ B(hs, ool->entry()); \
300 __ asm_instr(result, MemOperand(buffer, offset, UXTW)); \ 300 __ asm_instr(result, MemOperand(buffer, offset, UXTW)); \
301 __ Bind(ool->exit()); \ 301 __ Bind(ool->exit()); \
302 } while (0) 302 } while (0)
303 303
304 304
305 #define ASSEMBLE_CHECKED_LOAD_INTEGER_64(asm_instr) \
306 do { \
307 auto result = i.OutputRegister(); \
308 auto buffer = i.InputRegister(0); \
309 auto offset = i.InputRegister32(1); \
310 auto length = i.InputOperand32(2); \
311 __ Cmp(offset, length); \
312 auto ool = new (zone()) OutOfLineLoadZero(this, result); \
313 __ B(hs, ool->entry()); \
314 __ asm_instr(result, MemOperand(buffer, offset, UXTW)); \
315 __ Bind(ool->exit()); \
316 } while (0)
317
318
305 #define ASSEMBLE_CHECKED_STORE_FLOAT(width) \ 319 #define ASSEMBLE_CHECKED_STORE_FLOAT(width) \
306 do { \ 320 do { \
307 auto buffer = i.InputRegister(0); \ 321 auto buffer = i.InputRegister(0); \
308 auto offset = i.InputRegister32(1); \ 322 auto offset = i.InputRegister32(1); \
309 auto length = i.InputOperand32(2); \ 323 auto length = i.InputOperand32(2); \
310 auto value = i.InputFloat##width##Register(3); \ 324 auto value = i.InputFloat##width##Register(3); \
311 __ Cmp(offset, length); \ 325 __ Cmp(offset, length); \
312 Label done; \ 326 Label done; \
313 __ B(hs, &done); \ 327 __ B(hs, &done); \
314 __ Str(value, MemOperand(buffer, offset, UXTW)); \ 328 __ Str(value, MemOperand(buffer, offset, UXTW)); \
315 __ Bind(&done); \ 329 __ Bind(&done); \
316 } while (0) 330 } while (0)
317 331
318 332
319 #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr) \ 333 #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr) \
320 do { \ 334 do { \
321 auto buffer = i.InputRegister(0); \ 335 auto buffer = i.InputRegister(0); \
322 auto offset = i.InputRegister32(1); \ 336 auto offset = i.InputRegister32(1); \
323 auto length = i.InputOperand32(2); \ 337 auto length = i.InputOperand32(2); \
324 auto value = i.InputRegister32(3); \ 338 auto value = i.InputRegister32(3); \
325 __ Cmp(offset, length); \ 339 __ Cmp(offset, length); \
326 Label done; \ 340 Label done; \
327 __ B(hs, &done); \ 341 __ B(hs, &done); \
328 __ asm_instr(value, MemOperand(buffer, offset, UXTW)); \ 342 __ asm_instr(value, MemOperand(buffer, offset, UXTW)); \
329 __ Bind(&done); \ 343 __ Bind(&done); \
330 } while (0) 344 } while (0)
331 345
332 346
347 #define ASSEMBLE_CHECKED_STORE_INTEGER_64(asm_instr) \
348 do { \
349 auto buffer = i.InputRegister(0); \
350 auto offset = i.InputRegister32(1); \
351 auto length = i.InputOperand32(2); \
352 auto value = i.InputRegister(3); \
353 __ Cmp(offset, length); \
354 Label done; \
355 __ B(hs, &done); \
356 __ asm_instr(value, MemOperand(buffer, offset, UXTW)); \
357 __ Bind(&done); \
358 } while (0)
359
360
333 #define ASSEMBLE_SHIFT(asm_instr, width) \ 361 #define ASSEMBLE_SHIFT(asm_instr, width) \
334 do { \ 362 do { \
335 if (instr->InputAt(1)->IsRegister()) { \ 363 if (instr->InputAt(1)->IsRegister()) { \
336 __ asm_instr(i.OutputRegister##width(), i.InputRegister##width(0), \ 364 __ asm_instr(i.OutputRegister##width(), i.InputRegister##width(0), \
337 i.InputRegister##width(1)); \ 365 i.InputRegister##width(1)); \
338 } else { \ 366 } else { \
339 uint32_t imm = \ 367 uint32_t imm = \
340 static_cast<uint32_t>(i.InputOperand##width(1).ImmediateValue()); \ 368 static_cast<uint32_t>(i.InputOperand##width(1).ImmediateValue()); \
341 __ asm_instr(i.OutputRegister##width(), i.InputRegister##width(0), \ 369 __ asm_instr(i.OutputRegister##width(), i.InputRegister##width(0), \
342 imm % (width)); \ 370 imm % (width)); \
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 break; 963 break;
936 case kCheckedLoadInt16: 964 case kCheckedLoadInt16:
937 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsh); 965 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsh);
938 break; 966 break;
939 case kCheckedLoadUint16: 967 case kCheckedLoadUint16:
940 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrh); 968 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrh);
941 break; 969 break;
942 case kCheckedLoadWord32: 970 case kCheckedLoadWord32:
943 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldr); 971 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldr);
944 break; 972 break;
973 case kCheckedLoadWord64:
974 ASSEMBLE_CHECKED_LOAD_INTEGER_64(Ldr);
975 break;
945 case kCheckedLoadFloat32: 976 case kCheckedLoadFloat32:
946 ASSEMBLE_CHECKED_LOAD_FLOAT(32); 977 ASSEMBLE_CHECKED_LOAD_FLOAT(32);
947 break; 978 break;
948 case kCheckedLoadFloat64: 979 case kCheckedLoadFloat64:
949 ASSEMBLE_CHECKED_LOAD_FLOAT(64); 980 ASSEMBLE_CHECKED_LOAD_FLOAT(64);
950 break; 981 break;
951 case kCheckedStoreWord8: 982 case kCheckedStoreWord8:
952 ASSEMBLE_CHECKED_STORE_INTEGER(Strb); 983 ASSEMBLE_CHECKED_STORE_INTEGER(Strb);
953 break; 984 break;
954 case kCheckedStoreWord16: 985 case kCheckedStoreWord16:
955 ASSEMBLE_CHECKED_STORE_INTEGER(Strh); 986 ASSEMBLE_CHECKED_STORE_INTEGER(Strh);
956 break; 987 break;
957 case kCheckedStoreWord32: 988 case kCheckedStoreWord32:
958 ASSEMBLE_CHECKED_STORE_INTEGER(Str); 989 ASSEMBLE_CHECKED_STORE_INTEGER(Str);
959 break; 990 break;
991 case kCheckedStoreWord64:
992 ASSEMBLE_CHECKED_STORE_INTEGER_64(Str);
993 break;
960 case kCheckedStoreFloat32: 994 case kCheckedStoreFloat32:
961 ASSEMBLE_CHECKED_STORE_FLOAT(32); 995 ASSEMBLE_CHECKED_STORE_FLOAT(32);
962 break; 996 break;
963 case kCheckedStoreFloat64: 997 case kCheckedStoreFloat64:
964 ASSEMBLE_CHECKED_STORE_FLOAT(64); 998 ASSEMBLE_CHECKED_STORE_FLOAT(64);
965 break; 999 break;
966 } 1000 }
967 } // NOLINT(readability/fn_size) 1001 } // NOLINT(readability/fn_size)
968 1002
969 1003
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
1366 padding_size -= kInstructionSize; 1400 padding_size -= kInstructionSize;
1367 } 1401 }
1368 } 1402 }
1369 } 1403 }
1370 1404
1371 #undef __ 1405 #undef __
1372 1406
1373 } // namespace compiler 1407 } // namespace compiler
1374 } // namespace internal 1408 } // namespace internal
1375 } // namespace v8 1409 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/arm/code-generator-arm.cc ('k') | src/compiler/arm64/instruction-selector-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698