Changeset 194969 in webkit
- Timestamp:
- Jan 13, 2016 11:33:02 AM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r194922 r194969 1 2016-01-13 Benjamin Poulain <bpoulain@apple.com> 2 3 [JSC] Legalize Memory Offsets for ARM64 before lowering to Air 4 https://bugs.webkit.org/show_bug.cgi?id=153065 5 6 Reviewed by Mark Lam. 7 Reviewed by Filip Pizlo. 8 9 On ARM64, we cannot use signed 32bits offset for memory addressing. 10 There are two available addressing: signed 9bits and unsigned scaled 12bits. 11 Air already knows about it. 12 13 In this patch, the offsets are changed to something valid for ARM64 14 prior to lowering. When an offset is invalid, it is just computed 15 before the instruction and used as the base for addressing. 16 17 * JavaScriptCore.xcodeproj/project.pbxproj: 18 * b3/B3Generate.cpp: 19 (JSC::B3::generateToAir): 20 * b3/B3LegalizeMemoryOffsets.cpp: Added. 21 (JSC::B3::legalizeMemoryOffsets): 22 * b3/B3LegalizeMemoryOffsets.h: Added. 23 * b3/B3LowerToAir.cpp: 24 (JSC::B3::Air::LowerToAir::effectiveAddr): Deleted. 25 * b3/testb3.cpp: 26 (JSC::B3::testLoadWithOffsetImpl): 27 (JSC::B3::testLoadOffsetImm9Max): 28 (JSC::B3::testLoadOffsetImm9MaxPlusOne): 29 (JSC::B3::testLoadOffsetImm9MaxPlusTwo): 30 (JSC::B3::testLoadOffsetImm9Min): 31 (JSC::B3::testLoadOffsetImm9MinMinusOne): 32 (JSC::B3::testLoadOffsetScaledUnsignedImm12Max): 33 (JSC::B3::testLoadOffsetScaledUnsignedOverImm12Max): 34 (JSC::B3::run): 35 1 36 2016-01-12 Per Arne Vollan <peavo@outlook.com> 2 37 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r194884 r194969 1153 1153 43422A661C16267500E2EB98 /* B3ReduceDoubleToFloat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43422A641C16221E00E2EB98 /* B3ReduceDoubleToFloat.cpp */; }; 1154 1154 43422A671C16267800E2EB98 /* B3ReduceDoubleToFloat.h in Headers */ = {isa = PBXBuildFile; fileRef = 43422A651C16221E00E2EB98 /* B3ReduceDoubleToFloat.h */; }; 1155 436E54531C468E7400B5AF73 /* B3LegalizeMemoryOffsets.h in Headers */ = {isa = PBXBuildFile; fileRef = 436E54521C468E5F00B5AF73 /* B3LegalizeMemoryOffsets.h */; }; 1156 436E54541C468E7700B5AF73 /* B3LegalizeMemoryOffsets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 436E54511C468E5F00B5AF73 /* B3LegalizeMemoryOffsets.cpp */; }; 1155 1157 43AB26C61C1A535900D82AE6 /* B3MathExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AB26C51C1A52F700D82AE6 /* B3MathExtras.h */; }; 1156 1158 43AB26C71C1A535C00D82AE6 /* B3MathExtras.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43AB26C41C1A52F700D82AE6 /* B3MathExtras.cpp */; }; … … 3261 3263 43422A641C16221E00E2EB98 /* B3ReduceDoubleToFloat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3ReduceDoubleToFloat.cpp; path = b3/B3ReduceDoubleToFloat.cpp; sourceTree = "<group>"; }; 3262 3264 43422A651C16221E00E2EB98 /* B3ReduceDoubleToFloat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3ReduceDoubleToFloat.h; path = b3/B3ReduceDoubleToFloat.h; sourceTree = "<group>"; }; 3265 436E54511C468E5F00B5AF73 /* B3LegalizeMemoryOffsets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3LegalizeMemoryOffsets.cpp; path = b3/B3LegalizeMemoryOffsets.cpp; sourceTree = "<group>"; }; 3266 436E54521C468E5F00B5AF73 /* B3LegalizeMemoryOffsets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3LegalizeMemoryOffsets.h; path = b3/B3LegalizeMemoryOffsets.h; sourceTree = "<group>"; }; 3263 3267 43AB26C41C1A52F700D82AE6 /* B3MathExtras.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3MathExtras.cpp; path = b3/B3MathExtras.cpp; sourceTree = "<group>"; }; 3264 3268 43AB26C51C1A52F700D82AE6 /* B3MathExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3MathExtras.h; path = b3/B3MathExtras.h; sourceTree = "<group>"; }; … … 3373 3377 7035587C1C418419004BD7BF /* MapPrototype.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = MapPrototype.js; sourceTree = "<group>"; }; 3374 3378 7035587D1C418419004BD7BF /* SetPrototype.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = SetPrototype.js; sourceTree = "<group>"; }; 3375 7035587E1C418458004BD7BF /* MapPrototype.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MapPrototype.lut.h;path = MapPrototype.lut.h; sourceTree = "<group>"; };3376 7035587F1C418458004BD7BF /* SetPrototype.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SetPrototype.lut.h;path = SetPrototype.lut.h; sourceTree = "<group>"; };3379 7035587E1C418458004BD7BF /* MapPrototype.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MapPrototype.lut.h; sourceTree = "<group>"; }; 3380 7035587F1C418458004BD7BF /* SetPrototype.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SetPrototype.lut.h; sourceTree = "<group>"; }; 3377 3381 704FD35305697E6D003DBED9 /* BooleanObject.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = BooleanObject.h; sourceTree = "<group>"; tabWidth = 8; }; 3378 3382 705B41A31A6E501E00716757 /* Symbol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Symbol.cpp; sourceTree = "<group>"; }; … … 4711 4715 0FEC85B51BE1462F0080FF74 /* B3InsertionSet.h */, 4712 4716 0FEC85B61BE1462F0080FF74 /* B3InsertionSetInlines.h */, 4717 436E54511C468E5F00B5AF73 /* B3LegalizeMemoryOffsets.cpp */, 4718 436E54521C468E5F00B5AF73 /* B3LegalizeMemoryOffsets.h */, 4713 4719 0F338E191BF286EA0013C88F /* B3LowerMacros.cpp */, 4714 4720 0F338E1A1BF286EA0013C88F /* B3LowerMacros.h */, … … 7938 7944 7E4EE7090EBB7963005934AA /* StructureChain.h in Headers */, 7939 7945 2AAAA31218BD49D100394CC8 /* StructureIDBlob.h in Headers */, 7946 436E54531C468E7400B5AF73 /* B3LegalizeMemoryOffsets.h in Headers */, 7940 7947 2AF7382D18BBBF92008A5A37 /* StructureIDTable.h in Headers */, 7941 7948 0FD2C92416D01EE900C7803F /* StructureInlines.h in Headers */, … … 8615 8622 0FEC850B1BDACDAC0080FF74 /* B3Commutativity.cpp in Sources */, 8616 8623 0FEC850D1BDACDAC0080FF74 /* B3Const32Value.cpp in Sources */, 8624 436E54541C468E7700B5AF73 /* B3LegalizeMemoryOffsets.cpp in Sources */, 8617 8625 0FEC850F1BDACDAC0080FF74 /* B3Const64Value.cpp in Sources */, 8618 8626 0FEC85111BDACDAC0080FF74 /* B3ConstDoubleValue.cpp in Sources */, -
trunk/Source/JavaScriptCore/b3/B3Generate.cpp
r194003 r194969 33 33 #include "AirInstInlines.h" 34 34 #include "B3Common.h" 35 #include "B3LegalizeMemoryOffsets.h" 35 36 #include "B3LowerMacros.h" 36 37 #include "B3LowerMacrosAfterOptimizations.h" … … 86 87 lowerMacrosAfterOptimizations(procedure); 87 88 89 legalizeMemoryOffsets(procedure); 90 88 91 moveConstants(procedure); 89 92 -
trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp
r194873 r194969 358 358 Arg effectiveAddr(Value* address, int32_t offset, Arg::Width width) 359 359 { 360 // B3 allows any memory operation to have a 32-bit offset. That's not how some architectures361 // work. We solve this by requiring a just-before-lowering phase that legalizes offsets.362 // FIXME: Implement such a legalization phase.363 // https://bugs.webkit.org/show_bug.cgi?id=152530364 360 ASSERT(Arg::isValidAddrForm(offset, width)); 365 361 -
trunk/Source/JavaScriptCore/b3/testb3.cpp
r194915 r194969 137 137 } 138 138 139 void testLoadWithOffsetImpl(int32_t offset64, int32_t offset32) 140 { 141 { 142 Procedure proc; 143 BasicBlock* root = proc.addBlock(); 144 int64_t x = -42; 145 Value* base = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0); 146 root->appendNew<ControlValue>( 147 proc, Return, Origin(), 148 root->appendNew<MemoryValue>( 149 proc, Load, Int64, Origin(), 150 base, 151 offset64)); 152 153 char* address = reinterpret_cast<char*>(&x) - offset64; 154 CHECK(compileAndRun<int64_t>(proc, address) == -42); 155 } 156 { 157 Procedure proc; 158 BasicBlock* root = proc.addBlock(); 159 int32_t x = -42; 160 Value* base = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0); 161 root->appendNew<ControlValue>( 162 proc, Return, Origin(), 163 root->appendNew<MemoryValue>( 164 proc, Load, Int32, Origin(), 165 base, 166 offset32)); 167 168 char* address = reinterpret_cast<char*>(&x) - offset32; 169 CHECK(compileAndRun<int32_t>(proc, address) == -42); 170 } 171 } 172 173 void testLoadOffsetImm9Max() 174 { 175 testLoadWithOffsetImpl(255, 255); 176 } 177 178 void testLoadOffsetImm9MaxPlusOne() 179 { 180 testLoadWithOffsetImpl(256, 256); 181 } 182 183 void testLoadOffsetImm9MaxPlusTwo() 184 { 185 testLoadWithOffsetImpl(257, 257); 186 } 187 188 void testLoadOffsetImm9Min() 189 { 190 testLoadWithOffsetImpl(-256, -256); 191 } 192 193 void testLoadOffsetImm9MinMinusOne() 194 { 195 testLoadWithOffsetImpl(-257, -257); 196 } 197 198 void testLoadOffsetScaledUnsignedImm12Max() 199 { 200 testLoadWithOffsetImpl(32760, 16380); 201 } 202 203 void testLoadOffsetScaledUnsignedOverImm12Max() 204 { 205 testLoadWithOffsetImpl(32760, 32760); 206 testLoadWithOffsetImpl(32761, 16381); 207 testLoadWithOffsetImpl(32768, 16384); 208 } 209 139 210 void testArg(int argument) 140 211 { … … 9289 9360 RUN(test42()); 9290 9361 RUN(testLoad42()); 9362 RUN(testLoadOffsetImm9Max()); 9363 RUN(testLoadOffsetImm9MaxPlusOne()); 9364 RUN(testLoadOffsetImm9MaxPlusTwo()); 9365 RUN(testLoadOffsetImm9Min()); 9366 RUN(testLoadOffsetImm9MinMinusOne()); 9367 RUN(testLoadOffsetScaledUnsignedImm12Max()); 9368 RUN(testLoadOffsetScaledUnsignedOverImm12Max()); 9291 9369 RUN(testArg(43)); 9292 9370 RUN(testReturnConst64(5));
Note: See TracChangeset
for help on using the changeset viewer.