Changeset 194969 in webkit


Ignore:
Timestamp:
Jan 13, 2016 11:33:02 AM (8 years ago)
Author:
commit-queue@webkit.org
Message:

[JSC] Legalize Memory Offsets for ARM64 before lowering to Air
https://bugs.webkit.org/show_bug.cgi?id=153065

Patch by Benjamin Poulain <bpoulain@apple.com> on 2016-01-13
Reviewed by Mark Lam.
Reviewed by Filip Pizlo.

On ARM64, we cannot use signed 32bits offset for memory addressing.
There are two available addressing: signed 9bits and unsigned scaled 12bits.
Air already knows about it.

In this patch, the offsets are changed to something valid for ARM64
prior to lowering. When an offset is invalid, it is just computed
before the instruction and used as the base for addressing.

(JSC::B3::generateToAir):

  • b3/B3LegalizeMemoryOffsets.cpp: Added.

(JSC::B3::legalizeMemoryOffsets):

  • b3/B3LegalizeMemoryOffsets.h: Added.
  • b3/B3LowerToAir.cpp:

(JSC::B3::Air::LowerToAir::effectiveAddr): Deleted.

  • b3/testb3.cpp:

(JSC::B3::testLoadWithOffsetImpl):
(JSC::B3::testLoadOffsetImm9Max):
(JSC::B3::testLoadOffsetImm9MaxPlusOne):
(JSC::B3::testLoadOffsetImm9MaxPlusTwo):
(JSC::B3::testLoadOffsetImm9Min):
(JSC::B3::testLoadOffsetImm9MinMinusOne):
(JSC::B3::testLoadOffsetScaledUnsignedImm12Max):
(JSC::B3::testLoadOffsetScaledUnsignedOverImm12Max):
(JSC::B3::run):

Location:
trunk/Source/JavaScriptCore
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r194922 r194969  
     12016-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
    1362016-01-12  Per Arne Vollan  <peavo@outlook.com>
    237
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r194884 r194969  
    11531153                43422A661C16267500E2EB98 /* B3ReduceDoubleToFloat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43422A641C16221E00E2EB98 /* B3ReduceDoubleToFloat.cpp */; };
    11541154                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 */; };
    11551157                43AB26C61C1A535900D82AE6 /* B3MathExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = 43AB26C51C1A52F700D82AE6 /* B3MathExtras.h */; };
    11561158                43AB26C71C1A535C00D82AE6 /* B3MathExtras.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43AB26C41C1A52F700D82AE6 /* B3MathExtras.cpp */; };
     
    32613263                43422A641C16221E00E2EB98 /* B3ReduceDoubleToFloat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3ReduceDoubleToFloat.cpp; path = b3/B3ReduceDoubleToFloat.cpp; sourceTree = "<group>"; };
    32623264                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>"; };
    32633267                43AB26C41C1A52F700D82AE6 /* B3MathExtras.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3MathExtras.cpp; path = b3/B3MathExtras.cpp; sourceTree = "<group>"; };
    32643268                43AB26C51C1A52F700D82AE6 /* B3MathExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3MathExtras.h; path = b3/B3MathExtras.h; sourceTree = "<group>"; };
     
    33733377                7035587C1C418419004BD7BF /* MapPrototype.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = MapPrototype.js; sourceTree = "<group>"; };
    33743378                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>"; };
    33773381                704FD35305697E6D003DBED9 /* BooleanObject.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = BooleanObject.h; sourceTree = "<group>"; tabWidth = 8; };
    33783382                705B41A31A6E501E00716757 /* Symbol.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Symbol.cpp; sourceTree = "<group>"; };
     
    47114715                                0FEC85B51BE1462F0080FF74 /* B3InsertionSet.h */,
    47124716                                0FEC85B61BE1462F0080FF74 /* B3InsertionSetInlines.h */,
     4717                                436E54511C468E5F00B5AF73 /* B3LegalizeMemoryOffsets.cpp */,
     4718                                436E54521C468E5F00B5AF73 /* B3LegalizeMemoryOffsets.h */,
    47134719                                0F338E191BF286EA0013C88F /* B3LowerMacros.cpp */,
    47144720                                0F338E1A1BF286EA0013C88F /* B3LowerMacros.h */,
     
    79387944                                7E4EE7090EBB7963005934AA /* StructureChain.h in Headers */,
    79397945                                2AAAA31218BD49D100394CC8 /* StructureIDBlob.h in Headers */,
     7946                                436E54531C468E7400B5AF73 /* B3LegalizeMemoryOffsets.h in Headers */,
    79407947                                2AF7382D18BBBF92008A5A37 /* StructureIDTable.h in Headers */,
    79417948                                0FD2C92416D01EE900C7803F /* StructureInlines.h in Headers */,
     
    86158622                                0FEC850B1BDACDAC0080FF74 /* B3Commutativity.cpp in Sources */,
    86168623                                0FEC850D1BDACDAC0080FF74 /* B3Const32Value.cpp in Sources */,
     8624                                436E54541C468E7700B5AF73 /* B3LegalizeMemoryOffsets.cpp in Sources */,
    86178625                                0FEC850F1BDACDAC0080FF74 /* B3Const64Value.cpp in Sources */,
    86188626                                0FEC85111BDACDAC0080FF74 /* B3ConstDoubleValue.cpp in Sources */,
  • trunk/Source/JavaScriptCore/b3/B3Generate.cpp

    r194003 r194969  
    3333#include "AirInstInlines.h"
    3434#include "B3Common.h"
     35#include "B3LegalizeMemoryOffsets.h"
    3536#include "B3LowerMacros.h"
    3637#include "B3LowerMacrosAfterOptimizations.h"
     
    8687    lowerMacrosAfterOptimizations(procedure);
    8788
     89    legalizeMemoryOffsets(procedure);
     90
    8891    moveConstants(procedure);
    8992
  • trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp

    r194873 r194969  
    358358    Arg effectiveAddr(Value* address, int32_t offset, Arg::Width width)
    359359    {
    360         // B3 allows any memory operation to have a 32-bit offset. That's not how some architectures
    361         // 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=152530
    364360        ASSERT(Arg::isValidAddrForm(offset, width));
    365361
  • trunk/Source/JavaScriptCore/b3/testb3.cpp

    r194915 r194969  
    137137}
    138138
     139void 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
     173void testLoadOffsetImm9Max()
     174{
     175    testLoadWithOffsetImpl(255, 255);
     176}
     177
     178void testLoadOffsetImm9MaxPlusOne()
     179{
     180    testLoadWithOffsetImpl(256, 256);
     181}
     182
     183void testLoadOffsetImm9MaxPlusTwo()
     184{
     185    testLoadWithOffsetImpl(257, 257);
     186}
     187
     188void testLoadOffsetImm9Min()
     189{
     190    testLoadWithOffsetImpl(-256, -256);
     191}
     192
     193void testLoadOffsetImm9MinMinusOne()
     194{
     195    testLoadWithOffsetImpl(-257, -257);
     196}
     197
     198void testLoadOffsetScaledUnsignedImm12Max()
     199{
     200    testLoadWithOffsetImpl(32760, 16380);
     201}
     202
     203void testLoadOffsetScaledUnsignedOverImm12Max()
     204{
     205    testLoadWithOffsetImpl(32760, 32760);
     206    testLoadWithOffsetImpl(32761, 16381);
     207    testLoadWithOffsetImpl(32768, 16384);
     208}
     209
    139210void testArg(int argument)
    140211{
     
    92899360    RUN(test42());
    92909361    RUN(testLoad42());
     9362    RUN(testLoadOffsetImm9Max());
     9363    RUN(testLoadOffsetImm9MaxPlusOne());
     9364    RUN(testLoadOffsetImm9MaxPlusTwo());
     9365    RUN(testLoadOffsetImm9Min());
     9366    RUN(testLoadOffsetImm9MinMinusOne());
     9367    RUN(testLoadOffsetScaledUnsignedImm12Max());
     9368    RUN(testLoadOffsetScaledUnsignedOverImm12Max());
    92919369    RUN(testArg(43));
    92929370    RUN(testReturnConst64(5));
Note: See TracChangeset for help on using the changeset viewer.