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

Side by Side Diff: src/arm/macro-assembler-arm.h

Issue 19560003: [v8-dev] ARM: Make double registers low/high safe (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « src/arm/lithium-codegen-arm.cc ('k') | src/arm/macro-assembler-arm.cc » ('j') | 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 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 const Condition cond = al); 477 const Condition cond = al);
478 void VFPCompareAndLoadFlags(const DwVfpRegister src1, 478 void VFPCompareAndLoadFlags(const DwVfpRegister src1,
479 const double src2, 479 const double src2,
480 const Register fpscr_flags, 480 const Register fpscr_flags,
481 const Condition cond = al); 481 const Condition cond = al);
482 482
483 void Vmov(const DwVfpRegister dst, 483 void Vmov(const DwVfpRegister dst,
484 const double imm, 484 const double imm,
485 const Register scratch = no_reg); 485 const Register scratch = no_reg);
486 486
487 void VmovHigh(Register dst, DwVfpRegister src);
488 void VmovHigh(DwVfpRegister dst, Register src);
489 void VmovLow(Register dst, DwVfpRegister src);
490 void VmovLow(DwVfpRegister dst, Register src);
491
487 // Converts the smi or heap number in object to an int32 using the rules 492 // Converts the smi or heap number in object to an int32 using the rules
488 // for ToInt32 as described in ECMAScript 9.5.: the value is truncated 493 // for ToInt32 as described in ECMAScript 9.5.: the value is truncated
489 // and brought into the range -2^31 .. +2^31 - 1. 494 // and brought into the range -2^31 .. +2^31 - 1.
490 void ConvertNumberToInt32(Register object, 495 void ConvertNumberToInt32(Register object,
491 Register dst, 496 Register dst,
492 Register heap_number_map, 497 Register heap_number_map,
493 Register scratch1, 498 Register scratch1,
494 Register scratch2, 499 Register scratch2,
495 Register scratch3, 500 Register scratch3,
496 DwVfpRegister double_scratch1, 501 DwVfpRegister double_scratch1,
497 DwVfpRegister double_scratch2, 502 LowDwVfpRegister double_scratch2,
498 Label* not_int32); 503 Label* not_int32);
499 504
500 // Loads the number from object into dst register. 505 // Loads the number from object into dst register.
501 // If |object| is neither smi nor heap number, |not_number| is jumped to 506 // If |object| is neither smi nor heap number, |not_number| is jumped to
502 // with |object| still intact. 507 // with |object| still intact.
503 void LoadNumber(Register object, 508 void LoadNumber(Register object,
504 DwVfpRegister dst, 509 LowDwVfpRegister dst,
505 Register heap_number_map, 510 Register heap_number_map,
506 Register scratch, 511 Register scratch,
507 Label* not_number); 512 Label* not_number);
508 513
509 // Loads the number from object into double_dst in the double format. 514 // Loads the number from object into double_dst in the double format.
510 // Control will jump to not_int32 if the value cannot be exactly represented 515 // Control will jump to not_int32 if the value cannot be exactly represented
511 // by a 32-bit integer. 516 // by a 32-bit integer.
512 // Floating point value in the 32-bit integer range that are not exact integer 517 // Floating point value in the 32-bit integer range that are not exact integer
513 // won't be loaded. 518 // won't be loaded.
514 void LoadNumberAsInt32Double(Register object, 519 void LoadNumberAsInt32Double(Register object,
515 DwVfpRegister double_dst, 520 DwVfpRegister double_dst,
516 Register heap_number_map, 521 Register heap_number_map,
517 Register scratch, 522 Register scratch,
518 DwVfpRegister double_scratch, 523 LowDwVfpRegister double_scratch,
519 Label* not_int32); 524 Label* not_int32);
520 525
521 // Loads the number from object into dst as a 32-bit integer. 526 // Loads the number from object into dst as a 32-bit integer.
522 // Control will jump to not_int32 if the object cannot be exactly represented 527 // Control will jump to not_int32 if the object cannot be exactly represented
523 // by a 32-bit integer. 528 // by a 32-bit integer.
524 // Floating point value in the 32-bit integer range that are not exact integer 529 // Floating point value in the 32-bit integer range that are not exact integer
525 // won't be converted. 530 // won't be converted.
526 void LoadNumberAsInt32(Register object, 531 void LoadNumberAsInt32(Register object,
527 Register dst, 532 Register dst,
528 Register heap_number_map, 533 Register heap_number_map,
529 Register scratch, 534 Register scratch,
530 DwVfpRegister double_scratch0, 535 DwVfpRegister double_scratch0,
531 DwVfpRegister double_scratch1, 536 LowDwVfpRegister double_scratch1,
532 Label* not_int32); 537 Label* not_int32);
533 538
534 539
535 // Enter exit frame. 540 // Enter exit frame.
536 // stack_space - extra stack space, used for alignment before call to C. 541 // stack_space - extra stack space, used for alignment before call to C.
537 void EnterExitFrame(bool save_doubles, int stack_space = 0); 542 void EnterExitFrame(bool save_doubles, int stack_space = 0);
538 543
539 // Leave the current exit frame. Expects the return value in r0. 544 // Leave the current exit frame. Expects the return value in r0.
540 // Expect the number of values, pushed prior to the exit frame, to 545 // Expect the number of values, pushed prior to the exit frame, to
541 // remove in a register (or no_reg, if there is nothing to remove). 546 // remove in a register (or no_reg, if there is nothing to remove).
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 void AllocateHeapNumberWithValue(Register result, 794 void AllocateHeapNumberWithValue(Register result,
790 DwVfpRegister value, 795 DwVfpRegister value,
791 Register scratch1, 796 Register scratch1,
792 Register scratch2, 797 Register scratch2,
793 Register heap_number_map, 798 Register heap_number_map,
794 Label* gc_required); 799 Label* gc_required);
795 800
796 // Copies a fixed number of fields of heap objects from src to dst. 801 // Copies a fixed number of fields of heap objects from src to dst.
797 void CopyFields(Register dst, 802 void CopyFields(Register dst,
798 Register src, 803 Register src,
799 DwVfpRegister double_scratch, 804 LowDwVfpRegister double_scratch,
800 SwVfpRegister single_scratch,
801 int field_count); 805 int field_count);
802 806
803 // Copies a number of bytes from src to dst. All registers are clobbered. On 807 // Copies a number of bytes from src to dst. All registers are clobbered. On
804 // exit src and dst will point to the place just after where the last byte was 808 // exit src and dst will point to the place just after where the last byte was
805 // read or written and length will be zero. 809 // read or written and length will be zero.
806 void CopyBytes(Register src, 810 void CopyBytes(Register src,
807 Register dst, 811 Register dst,
808 Register length, 812 Register length,
809 Register scratch); 813 Register scratch);
810 814
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 Register scratch, 871 Register scratch,
868 Label* fail); 872 Label* fail);
869 873
870 // Check to see if maybe_number can be stored as a double in 874 // Check to see if maybe_number can be stored as a double in
871 // FastDoubleElements. If it can, store it at the index specified by key in 875 // FastDoubleElements. If it can, store it at the index specified by key in
872 // the FastDoubleElements array elements. Otherwise jump to fail. 876 // the FastDoubleElements array elements. Otherwise jump to fail.
873 void StoreNumberToDoubleElements(Register value_reg, 877 void StoreNumberToDoubleElements(Register value_reg,
874 Register key_reg, 878 Register key_reg,
875 Register elements_reg, 879 Register elements_reg,
876 Register scratch1, 880 Register scratch1,
881 LowDwVfpRegister double_scratch0,
ulan 2013/07/25 11:49:54 double_scratch would be more consistent with the r
877 Label* fail, 882 Label* fail,
878 int elements_offset = 0); 883 int elements_offset = 0);
879 884
880 // Compare an object's map with the specified map and its transitioned 885 // Compare an object's map with the specified map and its transitioned
881 // elements maps if mode is ALLOW_ELEMENT_TRANSITION_MAPS. Condition flags are 886 // elements maps if mode is ALLOW_ELEMENT_TRANSITION_MAPS. Condition flags are
882 // set with result of map compare. If multiple map compares are required, the 887 // set with result of map compare. If multiple map compares are required, the
883 // compare sequences branches to early_success. 888 // compare sequences branches to early_success.
884 void CompareMap(Register obj, 889 void CompareMap(Register obj,
885 Register scratch, 890 Register scratch,
886 Handle<Map> map, 891 Handle<Map> map,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 // hash - holds the index's hash. Clobbered. 955 // hash - holds the index's hash. Clobbered.
951 // index - holds the overwritten index on exit. 956 // index - holds the overwritten index on exit.
952 void IndexFromHash(Register hash, Register index); 957 void IndexFromHash(Register hash, Register index);
953 958
954 // Get the number of least significant bits from a register 959 // Get the number of least significant bits from a register
955 void GetLeastBitsFromSmi(Register dst, Register src, int num_least_bits); 960 void GetLeastBitsFromSmi(Register dst, Register src, int num_least_bits);
956 void GetLeastBitsFromInt32(Register dst, Register src, int mun_least_bits); 961 void GetLeastBitsFromInt32(Register dst, Register src, int mun_least_bits);
957 962
958 // Load the value of a smi object into a double register. 963 // Load the value of a smi object into a double register.
959 // The register value must be between d0 and d15. 964 // The register value must be between d0 and d15.
960 void SmiToDouble(DwVfpRegister value, Register smi); 965 void SmiToDouble(LowDwVfpRegister value, Register smi);
961 966
962 // Check if a double can be exactly represented as a signed 32-bit integer. 967 // Check if a double can be exactly represented as a signed 32-bit integer.
963 // Z flag set to one if true. 968 // Z flag set to one if true.
964 void TestDoubleIsInt32(DwVfpRegister double_input, 969 void TestDoubleIsInt32(DwVfpRegister double_input,
965 DwVfpRegister double_scratch); 970 LowDwVfpRegister double_scratch);
966 971
967 // Try to convert a double to a signed 32-bit integer. 972 // Try to convert a double to a signed 32-bit integer.
968 // Z flag set to one and result assigned if the conversion is exact. 973 // Z flag set to one and result assigned if the conversion is exact.
969 void TryDoubleToInt32Exact(Register result, 974 void TryDoubleToInt32Exact(Register result,
970 DwVfpRegister double_input, 975 DwVfpRegister double_input,
971 DwVfpRegister double_scratch); 976 LowDwVfpRegister double_scratch);
972 977
973 // Floor a double and writes the value to the result register. 978 // Floor a double and writes the value to the result register.
974 // Go to exact if the conversion is exact (to be able to test -0), 979 // Go to exact if the conversion is exact (to be able to test -0),
975 // fall through calling code if an overflow occurred, else go to done. 980 // fall through calling code if an overflow occurred, else go to done.
981 // In return, input_high is loaded with high bits of input.
976 void TryInt32Floor(Register result, 982 void TryInt32Floor(Register result,
977 DwVfpRegister double_input, 983 DwVfpRegister double_input,
978 Register input_high, 984 Register input_high,
979 DwVfpRegister double_scratch, 985 LowDwVfpRegister double_scratch,
980 Label* done, 986 Label* done,
981 Label* exact); 987 Label* exact);
982 988
983 // Performs a truncating conversion of a floating point number as used by 989 // Performs a truncating conversion of a floating point number as used by
984 // the JS bitwise operations. See ECMA-262 9.5: ToInt32. 990 // the JS bitwise operations. See ECMA-262 9.5: ToInt32.
985 // Double_scratch must be between d0 and d15. 991 // Double_scratch must be between d0 and d15.
986 // Exits with 'result' holding the answer and all other registers clobbered. 992 // Exits with 'result' holding the answer and all other registers clobbered.
987 void ECMAToInt32(Register result, 993 void ECMAToInt32(Register result,
988 DwVfpRegister double_input, 994 DwVfpRegister double_input,
989 Register scratch, 995 Register scratch,
990 Register scratch_high, 996 Register scratch_high,
991 Register scratch_low, 997 Register scratch_low,
992 DwVfpRegister double_scratch); 998 LowDwVfpRegister double_scratch);
993 999
994 // Check whether d16-d31 are available on the CPU. The result is given by the 1000 // Check whether d16-d31 are available on the CPU. The result is given by the
995 // Z condition flag: Z==0 if d16-d31 available, Z==1 otherwise. 1001 // Z condition flag: Z==0 if d16-d31 available, Z==1 otherwise.
996 void CheckFor32DRegs(Register scratch); 1002 void CheckFor32DRegs(Register scratch);
997 1003
998 // Does a runtime check for 16/32 FP registers. Either way, pushes 32 double 1004 // Does a runtime check for 16/32 FP registers. Either way, pushes 32 double
999 // values to location, saving [d0..(d15|d31)]. 1005 // values to location, saving [d0..(d15|d31)].
1000 void SaveFPRegs(Register location, Register scratch); 1006 void SaveFPRegs(Register location, Register scratch);
1001 1007
1002 // Does a runtime check for 16/32 FP registers. Either way, pops 32 double 1008 // Does a runtime check for 16/32 FP registers. Either way, pops 32 double
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
1304 // Get the location of a relocated constant (its address in the constant pool) 1310 // Get the location of a relocated constant (its address in the constant pool)
1305 // from its load site. 1311 // from its load site.
1306 void GetRelocatedValueLocation(Register ldr_location, 1312 void GetRelocatedValueLocation(Register ldr_location,
1307 Register result); 1313 Register result);
1308 1314
1309 1315
1310 void ClampUint8(Register output_reg, Register input_reg); 1316 void ClampUint8(Register output_reg, Register input_reg);
1311 1317
1312 void ClampDoubleToUint8(Register result_reg, 1318 void ClampDoubleToUint8(Register result_reg,
1313 DwVfpRegister input_reg, 1319 DwVfpRegister input_reg,
1314 DwVfpRegister temp_double_reg); 1320 LowDwVfpRegister temp_double_reg);
ulan 2013/07/25 11:49:54 double_scratch would be more consistent with the r
1315 1321
1316 1322
1317 void LoadInstanceDescriptors(Register map, Register descriptors); 1323 void LoadInstanceDescriptors(Register map, Register descriptors);
1318 void EnumLength(Register dst, Register map); 1324 void EnumLength(Register dst, Register map);
1319 void NumberOfOwnDescriptors(Register dst, Register map); 1325 void NumberOfOwnDescriptors(Register dst, Register map);
1320 1326
1321 template<typename Field> 1327 template<typename Field>
1322 void DecodeField(Register reg) { 1328 void DecodeField(Register reg) {
1323 static const int shift = Field::kShift; 1329 static const int shift = Field::kShift;
1324 static const int mask = (Field::kMask >> shift) << kSmiTagSize; 1330 static const int mask = (Field::kMask >> shift) << kSmiTagSize;
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1450 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) 1456 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1451 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> 1457 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm->
1452 #else 1458 #else
1453 #define ACCESS_MASM(masm) masm-> 1459 #define ACCESS_MASM(masm) masm->
1454 #endif 1460 #endif
1455 1461
1456 1462
1457 } } // namespace v8::internal 1463 } } // namespace v8::internal
1458 1464
1459 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ 1465 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_
OLDNEW
« no previous file with comments | « src/arm/lithium-codegen-arm.cc ('k') | src/arm/macro-assembler-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698