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

Side by Side Diff: src/arm/assembler-arm.cc

Issue 573027: ARMv7 ubfx support... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 10 years, 10 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/assembler-arm.h ('k') | src/arm/codegen-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 (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 44
45 // Safe default is no features. 45 // Safe default is no features.
46 unsigned CpuFeatures::supported_ = 0; 46 unsigned CpuFeatures::supported_ = 0;
47 unsigned CpuFeatures::enabled_ = 0; 47 unsigned CpuFeatures::enabled_ = 0;
48 unsigned CpuFeatures::found_by_runtime_probing_ = 0; 48 unsigned CpuFeatures::found_by_runtime_probing_ = 0;
49 49
50 void CpuFeatures::Probe() { 50 void CpuFeatures::Probe() {
51 // If the compiler is allowed to use vfp then we can use vfp too in our 51 // If the compiler is allowed to use vfp then we can use vfp too in our
52 // code generation. 52 // code generation.
53 #if !defined(__arm__) 53 #if !defined(__arm__)
54 // For the simulator=arm build, always use VFP since the arm simulator has 54 // For the simulator=arm build, use VFP when FLAG_enable_vfp3 is enabled.
55 // VFP support. 55 if (FLAG_enable_vfp3) {
56 supported_ |= 1u << VFP3; 56 supported_ |= 1u << VFP3;
57 }
58 // For the simulator=arm build, use ARMv7 when FLAG_enable_armv7 is enabled
59 if (FLAG_enable_armv7) {
60 supported_ |= 1u << ARMv7;
61 }
57 #else 62 #else
58 if (Serializer::enabled()) { 63 if (Serializer::enabled()) {
59 supported_ |= OS::CpuFeaturesImpliedByPlatform(); 64 supported_ |= OS::CpuFeaturesImpliedByPlatform();
60 return; // No features if we might serialize. 65 return; // No features if we might serialize.
61 } 66 }
62 67
63 if (OS::ArmCpuHasFeature(VFP3)) { 68 if (OS::ArmCpuHasFeature(VFP3)) {
64 // This implementation also sets the VFP flags if 69 // This implementation also sets the VFP flags if
65 // runtime detection of VFP returns true. 70 // runtime detection of VFP returns true.
66 supported_ |= 1u << VFP3; 71 supported_ |= 1u << VFP3;
67 found_by_runtime_probing_ |= 1u << VFP3; 72 found_by_runtime_probing_ |= 1u << VFP3;
68 } 73 }
74
75 if (OS::ArmCpuHasFeature(ARMv7)) {
76 supported_ |= 1u << ARMv7;
77 found_by_runtime_probing_ |= 1u << ARMv7;
78 }
69 #endif 79 #endif
70 } 80 }
71 81
72 82
73 // ----------------------------------------------------------------------------- 83 // -----------------------------------------------------------------------------
74 // Implementation of Register and CRegister 84 // Implementation of Register and CRegister
75 85
76 Register no_reg = { -1 }; 86 Register no_reg = { -1 };
77 87
78 Register r0 = { 0 }; 88 Register r0 = { 0 };
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 853
844 854
845 void Assembler::bx(Register target, Condition cond) { // v5 and above, plus v4t 855 void Assembler::bx(Register target, Condition cond) { // v5 and above, plus v4t
846 WriteRecordedPositions(); 856 WriteRecordedPositions();
847 ASSERT(!target.is(pc)); // use of pc is actually allowed, but discouraged 857 ASSERT(!target.is(pc)); // use of pc is actually allowed, but discouraged
848 emit(cond | B24 | B21 | 15*B16 | 15*B12 | 15*B8 | B4 | target.code()); 858 emit(cond | B24 | B21 | 15*B16 | 15*B12 | 15*B8 | B4 | target.code());
849 } 859 }
850 860
851 861
852 // Data-processing instructions 862 // Data-processing instructions
863
864 // UBFX <Rd>,<Rn>,#<lsb>,#<width - 1>
865 // Instruction details available in ARM DDI 0406A, A8-464.
866 // cond(31-28) | 01111(27-23)| 1(22) | 1(21) | widthm1(20-16) |
867 // Rd(15-12) | lsb(11-7) | 101(6-4) | Rn(3-0)
868 void Assembler::ubfx(Register dst, Register src1, const Operand& src2,
869 const Operand& src3, Condition cond) {
870 ASSERT(!src2.rm_.is_valid() && !src3.rm_.is_valid());
871 ASSERT(static_cast<uint32_t>(src2.imm32_) <= 0x1f);
872 ASSERT(static_cast<uint32_t>(src3.imm32_) <= 0x1f);
873 emit(cond | 0x3F*B21 | src3.imm32_*B16 |
874 dst.code()*B12 | src2.imm32_*B7 | 0x5*B4 | src1.code());
875 }
876
877
853 void Assembler::and_(Register dst, Register src1, const Operand& src2, 878 void Assembler::and_(Register dst, Register src1, const Operand& src2,
854 SBit s, Condition cond) { 879 SBit s, Condition cond) {
855 addrmod1(cond | 0*B21 | s, src1, dst, src2); 880 addrmod1(cond | 0*B21 | s, src1, dst, src2);
856 } 881 }
857 882
858 883
859 void Assembler::eor(Register dst, Register src1, const Operand& src2, 884 void Assembler::eor(Register dst, Register src1, const Operand& src2,
860 SBit s, Condition cond) { 885 SBit s, Condition cond) {
861 addrmod1(cond | 1*B21 | s, src1, dst, src2); 886 addrmod1(cond | 1*B21 | s, src1, dst, src2);
862 } 887 }
(...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after
1842 bind(&after_pool); 1867 bind(&after_pool);
1843 } 1868 }
1844 1869
1845 // Since a constant pool was just emitted, move the check offset forward by 1870 // Since a constant pool was just emitted, move the check offset forward by
1846 // the standard interval. 1871 // the standard interval.
1847 next_buffer_check_ = pc_offset() + kCheckConstInterval; 1872 next_buffer_check_ = pc_offset() + kCheckConstInterval;
1848 } 1873 }
1849 1874
1850 1875
1851 } } // namespace v8::internal 1876 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/assembler-arm.h ('k') | src/arm/codegen-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698