Changeset 205656 in webkit


Ignore:
Timestamp:
Sep 8, 2016 1:05:28 PM (8 years ago)
Author:
mark.lam@apple.com
Message:

Add support for a ternary sub32 emitter for ARM64 and 32-bit ARM.
https://bugs.webkit.org/show_bug.cgi?id=161724

Reviewed by Filip Pizlo.

ARM architectures support ternary sub instructions. We should make use of them
in emitAllocateWithNonNullAllocator().

  • assembler/MacroAssemblerARM.h:

(JSC::MacroAssemblerARM::sub32):

  • assembler/MacroAssemblerARM64.h:

(JSC::MacroAssemblerARM64::sub32):

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::sub32):

  • assembler/MacroAssemblerSH4.h:

(JSC::MacroAssemblerSH4::sub32):

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86Common::sub32):

  • b3/air/AirOpcode.opcodes:
  • b3/testb3.cpp:

(JSC::B3::testTernarySubInstructionSelection):
(JSC::B3::run):

  • jit/AssemblyHelpers.h:

(JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):

Location:
trunk/Source/JavaScriptCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r205654 r205656  
     12016-09-08  Mark Lam  <mark.lam@apple.com>
     2
     3        Add support for a ternary sub32 emitter for ARM64 and 32-bit ARM.
     4        https://bugs.webkit.org/show_bug.cgi?id=161724
     5
     6        Reviewed by Filip Pizlo.
     7
     8        ARM architectures support ternary sub instructions.  We should make use of them
     9        in emitAllocateWithNonNullAllocator().
     10
     11        * assembler/MacroAssemblerARM.h:
     12        (JSC::MacroAssemblerARM::sub32):
     13        * assembler/MacroAssemblerARM64.h:
     14        (JSC::MacroAssemblerARM64::sub32):
     15        * assembler/MacroAssemblerARMv7.h:
     16        (JSC::MacroAssemblerARMv7::sub32):
     17        * assembler/MacroAssemblerSH4.h:
     18        (JSC::MacroAssemblerSH4::sub32):
     19        * assembler/MacroAssemblerX86Common.h:
     20        (JSC::MacroAssemblerX86Common::sub32):
     21        * b3/air/AirOpcode.opcodes:
     22        * b3/testb3.cpp:
     23        (JSC::B3::testTernarySubInstructionSelection):
     24        (JSC::B3::run):
     25        * jit/AssemblyHelpers.h:
     26        (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
     27
    1282016-09-08  Filip Pizlo  <fpizlo@apple.com>
    229
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM.h

    r205285 r205656  
    11/*
    2  * Copyright (C) 2008, 2013-2015 Apple Inc.
     2 * Copyright (C) 2008, 2013-2016 Apple Inc.
    33 * Copyright (C) 2009, 2010 University of Szeged
    44 * All rights reserved.
     
    315315    }
    316316
     317    void sub32(RegisterID left, RegisterID right, RegisterID dest)
     318    {
     319        m_assembler.subs(dest, left, right);
     320    }
     321
    317322    void sub32(TrustedImm32 imm, RegisterID dest)
    318323    {
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h

    r205520 r205656  
    11/*
    2  * Copyright (C) 2012, 2014, 2015 Apple Inc. All rights reserved.
     2 * Copyright (C) 2012, 2014-2016 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    706706    }
    707707
     708    void sub32(RegisterID left, RegisterID right, RegisterID dest)
     709    {
     710        m_assembler.sub<32>(dest, left, right);
     711    }
     712
    708713    void sub32(TrustedImm32 imm, RegisterID dest)
    709714    {
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h

    r205283 r205656  
    11/*
    2  * Copyright (C) 2009-2010, 2014-2015 Apple Inc. All rights reserved.
     2 * Copyright (C) 2009-2010, 2014-2016 Apple Inc. All rights reserved.
    33 * Copyright (C) 2010 University of Szeged
    44 *
     
    463463    }
    464464
     465    void sub32(RegisterID left, RegisterID right, RegisterID dest)
     466    {
     467        m_assembler.sub(dest, left, right);
     468    }
     469
    465470    void sub32(TrustedImm32 imm, RegisterID dest)
    466471    {
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h

    r203331 r205656  
    22 * Copyright (C) 2013 Cisco Systems, Inc. All rights reserved.
    33 * Copyright (C) 2009-2011 STMicroelectronics. All rights reserved.
    4  * Copyright (C) 2008, 2014 Apple Inc. All rights reserved.
     4 * Copyright (C) 2008, 2014, 2016 Apple Inc. All rights reserved.
    55 *
    66 * Redistribution and use in source and binary forms, with or without
     
    420420    }
    421421
     422    void sub32(RegisterID left, RegisterID right, RegisterID dest)
     423    {
     424        if (dest == right) {
     425            neg32(dest);
     426            add32(left, dest);
     427            return;
     428        }
     429        move(left, dest);
     430        sub32(right, dest);
     431    }
     432
    422433    void sub32(TrustedImm32 imm, AbsoluteAddress address)
    423434    {
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h

    r205283 r205656  
    561561        m_assembler.subl_rr(src, dest);
    562562    }
    563    
     563
     564    void sub32(RegisterID left, RegisterID right, RegisterID dest)
     565    {
     566        if (dest == right) {
     567            neg32(dest);
     568            add32(left, dest);
     569            return;
     570        }
     571        move(left, dest);
     572        sub32(right, dest);
     573    }
     574
    564575    void sub32(TrustedImm32 imm, RegisterID dest)
    565576    {
  • trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes

    r204480 r205656  
    171171    x86: Tmp, Addr
    172172
     173arm64: Sub32 U:G:32, U:G:32, D:G:32
     174    Tmp, Tmp, Tmp
     175
    17317664: Sub64 U:G:64, UD:G:64
    174177    Tmp, Tmp
     
    177180    x86: Addr, Tmp
    178181    x86: Tmp, Addr
     182
     183arm64: Sub64 U:G:64, U:G:64, D:G:64
     184    Tmp, Tmp, Tmp
    179185
    180186SubDouble U:F:64, U:F:64, D:F:64
  • trunk/Source/JavaScriptCore/b3/testb3.cpp

    r205462 r205656  
    21692169    CHECK(isIdentical(compileAndRun<int32_t>(proc, bitwise_cast<int32_t>(a), bitwise_cast<int32_t>(b), &effect), bitwise_cast<int32_t>(a - b)));
    21702170    CHECK(isIdentical(effect, static_cast<double>(a) - static_cast<double>(b)));
     2171}
     2172
     2173void testTernarySubInstructionSelection(B3::Opcode valueModifier, Type valueType, Air::Opcode expectedOpcode)
     2174{
     2175    Procedure proc;
     2176    BasicBlock* root = proc.addBlock();
     2177
     2178    Value* left = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
     2179    Value* right = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1);
     2180
     2181    if (valueModifier == Trunc) {
     2182        left = root->appendNew<Value>(proc, valueModifier, valueType, Origin(), left);
     2183        right = root->appendNew<Value>(proc, valueModifier, valueType, Origin(), right);
     2184    }
     2185
     2186    root->appendNewControlValue(
     2187        proc, Return, Origin(),
     2188        root->appendNew<Value>(proc, Sub, Origin(), left, right));
     2189
     2190    lowerToAirForTesting(proc);
     2191
     2192    auto block = proc.code()[0];
     2193    unsigned numberOfSubInstructions = 0;
     2194    for (auto instruction : *block) {
     2195        if (instruction.opcode == expectedOpcode) {
     2196            CHECK_EQ(instruction.args.size(), 3ul);
     2197            CHECK_EQ(instruction.args[0].kind(), Air::Arg::Tmp);
     2198            CHECK_EQ(instruction.args[1].kind(), Air::Arg::Tmp);
     2199            CHECK_EQ(instruction.args[2].kind(), Air::Arg::Tmp);
     2200            numberOfSubInstructions++;
     2201        }
     2202    }
     2203    CHECK_EQ(numberOfSubInstructions, 1ul);
    21712204}
    21722205
     
    1442614459    }
    1442714460
     14461    if (isARM64()) {
     14462        RUN(testTernarySubInstructionSelection(Identity, Int64, Air::Sub64));
     14463        RUN(testTernarySubInstructionSelection(Trunc, Int32, Air::Sub32));
     14464    }
     14465
    1442814466    if (tasks.isEmpty())
    1442914467        usage();
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h

    r205566 r205656  
    14321432                sub32(Address(allocatorGPR, MarkedAllocator::offsetOfCellSize()), scratchGPR);
    14331433            } else {
    1434                 // FIXME: We need a 3-operand sub, and ARM totally has it!
    14351434                load32(Address(allocatorGPR, MarkedAllocator::offsetOfCellSize()), scratchGPR);
    1436                 neg32(scratchGPR);
    1437                 add32(resultGPR, scratchGPR);
     1435                sub32(resultGPR, scratchGPR, scratchGPR);
    14381436            }
    14391437        }
Note: See TracChangeset for help on using the changeset viewer.