Changeset 90426 in webkit


Ignore:
Timestamp:
Jul 5, 2011 6:30:53 PM (13 years ago)
Author:
oliver@apple.com
Message:

2011-07-05 Oliver Hunt <oliver@apple.com>

Force inlining of simple functions that show up as not being inlined
https://bugs.webkit.org/show_bug.cgi?id=63964

Reviewed by Gavin Barraclough.

Looking at profile data indicates the gcc is failing to inline a
number of trivial functions. This patch hits the ones that show
up in profiles with the ALWAYS_INLINE hammer.

We also replace the memcpy() call in linking with a manual loop.
Apparently memcpy() is almost never faster than an inlined loop.

  • assembler/ARMv7Assembler.h: (JSC::ARMv7Assembler::add): (JSC::ARMv7Assembler::add_S): (JSC::ARMv7Assembler::ARM_and): (JSC::ARMv7Assembler::asr): (JSC::ARMv7Assembler::b): (JSC::ARMv7Assembler::blx): (JSC::ARMv7Assembler::bx): (JSC::ARMv7Assembler::clz): (JSC::ARMv7Assembler::cmn): (JSC::ARMv7Assembler::cmp): (JSC::ARMv7Assembler::eor): (JSC::ARMv7Assembler::it): (JSC::ARMv7Assembler::ldr): (JSC::ARMv7Assembler::ldrCompact): (JSC::ARMv7Assembler::ldrh): (JSC::ARMv7Assembler::ldrb): (JSC::ARMv7Assembler::lsl): (JSC::ARMv7Assembler::lsr): (JSC::ARMv7Assembler::movT3): (JSC::ARMv7Assembler::mov): (JSC::ARMv7Assembler::movt): (JSC::ARMv7Assembler::mvn): (JSC::ARMv7Assembler::neg): (JSC::ARMv7Assembler::orr): (JSC::ARMv7Assembler::orr_S): (JSC::ARMv7Assembler::ror): (JSC::ARMv7Assembler::smull): (JSC::ARMv7Assembler::str): (JSC::ARMv7Assembler::sub): (JSC::ARMv7Assembler::sub_S): (JSC::ARMv7Assembler::tst): (JSC::ARMv7Assembler::linkRecordSourceComparator): (JSC::ARMv7Assembler::link): (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp5Reg3Imm8): (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp5Imm5Reg3Reg3): (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp7Reg3Reg3Reg3): (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp8Imm8): (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp8RegReg143): (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp9Imm7): (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp10Reg3Reg3): (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp12Reg4FourFours): (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp16FourFours): (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp16Op16): (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp5i6Imm4Reg4EncodedImm): (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp12Reg4Reg4Imm12): (JSC::ARMv7Assembler::ARMInstructionFormatter::vfpOp): (JSC::ARMv7Assembler::ARMInstructionFormatter::vfpMemOp):
  • assembler/LinkBuffer.h: (JSC::LinkBuffer::linkCode):
  • assembler/MacroAssemblerARMv7.h: (JSC::MacroAssemblerARMv7::nearCall): (JSC::MacroAssemblerARMv7::call): (JSC::MacroAssemblerARMv7::ret): (JSC::MacroAssemblerARMv7::moveWithPatch): (JSC::MacroAssemblerARMv7::branchPtrWithPatch): (JSC::MacroAssemblerARMv7::storePtrWithPatch): (JSC::MacroAssemblerARMv7::tailRecursiveCall): (JSC::MacroAssemblerARMv7::makeTailRecursiveCall): (JSC::MacroAssemblerARMv7::jump): (JSC::MacroAssemblerARMv7::makeBranch):
Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r90425 r90426  
     12011-07-05  Oliver Hunt  <oliver@apple.com>
     2
     3        Force inlining of simple functions that show up as not being inlined
     4        https://bugs.webkit.org/show_bug.cgi?id=63964
     5
     6        Reviewed by Gavin Barraclough.
     7
     8        Looking at profile data indicates the gcc is failing to inline a
     9        number of trivial functions.  This patch hits the ones that show
     10        up in profiles with the ALWAYS_INLINE hammer.
     11
     12        We also replace the memcpy() call in linking with a manual loop.
     13        Apparently memcpy() is almost never faster than an inlined loop.
     14
     15        * assembler/ARMv7Assembler.h:
     16        (JSC::ARMv7Assembler::add):
     17        (JSC::ARMv7Assembler::add_S):
     18        (JSC::ARMv7Assembler::ARM_and):
     19        (JSC::ARMv7Assembler::asr):
     20        (JSC::ARMv7Assembler::b):
     21        (JSC::ARMv7Assembler::blx):
     22        (JSC::ARMv7Assembler::bx):
     23        (JSC::ARMv7Assembler::clz):
     24        (JSC::ARMv7Assembler::cmn):
     25        (JSC::ARMv7Assembler::cmp):
     26        (JSC::ARMv7Assembler::eor):
     27        (JSC::ARMv7Assembler::it):
     28        (JSC::ARMv7Assembler::ldr):
     29        (JSC::ARMv7Assembler::ldrCompact):
     30        (JSC::ARMv7Assembler::ldrh):
     31        (JSC::ARMv7Assembler::ldrb):
     32        (JSC::ARMv7Assembler::lsl):
     33        (JSC::ARMv7Assembler::lsr):
     34        (JSC::ARMv7Assembler::movT3):
     35        (JSC::ARMv7Assembler::mov):
     36        (JSC::ARMv7Assembler::movt):
     37        (JSC::ARMv7Assembler::mvn):
     38        (JSC::ARMv7Assembler::neg):
     39        (JSC::ARMv7Assembler::orr):
     40        (JSC::ARMv7Assembler::orr_S):
     41        (JSC::ARMv7Assembler::ror):
     42        (JSC::ARMv7Assembler::smull):
     43        (JSC::ARMv7Assembler::str):
     44        (JSC::ARMv7Assembler::sub):
     45        (JSC::ARMv7Assembler::sub_S):
     46        (JSC::ARMv7Assembler::tst):
     47        (JSC::ARMv7Assembler::linkRecordSourceComparator):
     48        (JSC::ARMv7Assembler::link):
     49        (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp5Reg3Imm8):
     50        (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp5Imm5Reg3Reg3):
     51        (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp7Reg3Reg3Reg3):
     52        (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp8Imm8):
     53        (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp8RegReg143):
     54        (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp9Imm7):
     55        (JSC::ARMv7Assembler::ARMInstructionFormatter::oneWordOp10Reg3Reg3):
     56        (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp12Reg4FourFours):
     57        (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp16FourFours):
     58        (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp16Op16):
     59        (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp5i6Imm4Reg4EncodedImm):
     60        (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp12Reg4Reg4Imm12):
     61        (JSC::ARMv7Assembler::ARMInstructionFormatter::vfpOp):
     62        (JSC::ARMv7Assembler::ARMInstructionFormatter::vfpMemOp):
     63        * assembler/LinkBuffer.h:
     64        (JSC::LinkBuffer::linkCode):
     65        * assembler/MacroAssemblerARMv7.h:
     66        (JSC::MacroAssemblerARMv7::nearCall):
     67        (JSC::MacroAssemblerARMv7::call):
     68        (JSC::MacroAssemblerARMv7::ret):
     69        (JSC::MacroAssemblerARMv7::moveWithPatch):
     70        (JSC::MacroAssemblerARMv7::branchPtrWithPatch):
     71        (JSC::MacroAssemblerARMv7::storePtrWithPatch):
     72        (JSC::MacroAssemblerARMv7::tailRecursiveCall):
     73        (JSC::MacroAssemblerARMv7::makeTailRecursiveCall):
     74        (JSC::MacroAssemblerARMv7::jump):
     75        (JSC::MacroAssemblerARMv7::makeBranch):
     76
    1772011-07-05  Zoltan Herczeg  <zherczeg@inf.u-szeged.hu>
    278
  • trunk/Source/JavaScriptCore/assembler/ARMv7Assembler.h

    r89729 r90426  
    720720    }
    721721
    722     void add(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     722    ALWAYS_INLINE void add(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    723723    {
    724724        ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp));
     
    730730
    731731    // NOTE: In an IT block, add doesn't modify the flags register.
    732     void add(RegisterID rd, RegisterID rn, RegisterID rm)
     732    ALWAYS_INLINE void add(RegisterID rd, RegisterID rn, RegisterID rm)
    733733    {
    734734        if (rd == rn)
     
    743743
    744744    // Not allowed in an IT (if then) block.
    745     void add_S(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
     745    ALWAYS_INLINE void add_S(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
    746746    {
    747747        // Rd can only be SP if Rn is also SP.
     
    765765
    766766    // Not allowed in an IT (if then) block?
    767     void add_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     767    ALWAYS_INLINE void add_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    768768    {
    769769        ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp));
     
    775775
    776776    // Not allowed in an IT (if then) block.
    777     void add_S(RegisterID rd, RegisterID rn, RegisterID rm)
     777    ALWAYS_INLINE void add_S(RegisterID rd, RegisterID rn, RegisterID rm)
    778778    {
    779779        if (!((rd | rn | rm) & 8))
     
    783783    }
    784784
    785     void ARM_and(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
     785    ALWAYS_INLINE void ARM_and(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
    786786    {
    787787        ASSERT(!BadReg(rd));
     
    791791    }
    792792
    793     void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     793    ALWAYS_INLINE void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    794794    {
    795795        ASSERT(!BadReg(rd));
     
    799799    }
    800800
    801     void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm)
     801    ALWAYS_INLINE void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm)
    802802    {
    803803        if ((rd == rn) && !((rd | rm) & 8))
     
    809809    }
    810810
    811     void asr(RegisterID rd, RegisterID rm, int32_t shiftAmount)
     811    ALWAYS_INLINE void asr(RegisterID rd, RegisterID rm, int32_t shiftAmount)
    812812    {
    813813        ASSERT(!BadReg(rd));
     
    817817    }
    818818
    819     void asr(RegisterID rd, RegisterID rn, RegisterID rm)
     819    ALWAYS_INLINE void asr(RegisterID rd, RegisterID rn, RegisterID rm)
    820820    {
    821821        ASSERT(!BadReg(rd));
     
    826826   
    827827    // Only allowed in IT (if then) block if last instruction.
    828     AssemblerLabel b()
     828    ALWAYS_INLINE AssemblerLabel b()
    829829    {
    830830        m_formatter.twoWordOp16Op16(OP_B_T4a, OP_B_T4b);
     
    833833   
    834834    // Only allowed in IT (if then) block if last instruction.
    835     AssemblerLabel blx(RegisterID rm)
     835    ALWAYS_INLINE AssemblerLabel blx(RegisterID rm)
    836836    {
    837837        ASSERT(rm != ARMRegisters::pc);
     
    841841
    842842    // Only allowed in IT (if then) block if last instruction.
    843     AssemblerLabel bx(RegisterID rm)
     843    ALWAYS_INLINE AssemblerLabel bx(RegisterID rm)
    844844    {
    845845        m_formatter.oneWordOp8RegReg143(OP_BX, rm, (RegisterID)0);
     
    852852    }
    853853
    854     void clz(RegisterID rd, RegisterID rm)
     854    ALWAYS_INLINE void clz(RegisterID rd, RegisterID rm)
    855855    {
    856856        ASSERT(!BadReg(rd));
     
    859859    }
    860860
    861     void cmn(RegisterID rn, ARMThumbImmediate imm)
     861    ALWAYS_INLINE void cmn(RegisterID rn, ARMThumbImmediate imm)
    862862    {
    863863        ASSERT(rn != ARMRegisters::pc);
     
    867867    }
    868868
    869     void cmp(RegisterID rn, ARMThumbImmediate imm)
     869    ALWAYS_INLINE void cmp(RegisterID rn, ARMThumbImmediate imm)
    870870    {
    871871        ASSERT(rn != ARMRegisters::pc);
     
    878878    }
    879879
    880     void cmp(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     880    ALWAYS_INLINE void cmp(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    881881    {
    882882        ASSERT(rn != ARMRegisters::pc);
     
    885885    }
    886886
    887     void cmp(RegisterID rn, RegisterID rm)
     887    ALWAYS_INLINE void cmp(RegisterID rn, RegisterID rm)
    888888    {
    889889        if ((rn | rm) & 8)
     
    894894
    895895    // xor is not spelled with an 'e'. :-(
    896     void eor(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
     896    ALWAYS_INLINE void eor(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
    897897    {
    898898        ASSERT(!BadReg(rd));
     
    903903
    904904    // xor is not spelled with an 'e'. :-(
    905     void eor(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     905    ALWAYS_INLINE void eor(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    906906    {
    907907        ASSERT(!BadReg(rd));
     
    922922    }
    923923
    924     void it(Condition cond)
     924    ALWAYS_INLINE void it(Condition cond)
    925925    {
    926926        m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond));
    927927    }
    928928
    929     void it(Condition cond, bool inst2if)
     929    ALWAYS_INLINE void it(Condition cond, bool inst2if)
    930930    {
    931931        m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if));
    932932    }
    933933
    934     void it(Condition cond, bool inst2if, bool inst3if)
     934    ALWAYS_INLINE void it(Condition cond, bool inst2if, bool inst3if)
    935935    {
    936936        m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if, inst3if));
    937937    }
    938938
    939     void it(Condition cond, bool inst2if, bool inst3if, bool inst4if)
     939    ALWAYS_INLINE void it(Condition cond, bool inst2if, bool inst3if, bool inst4if)
    940940    {
    941941        m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if, inst3if, inst4if));
     
    943943
    944944    // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block.
    945     void ldr(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
     945    ALWAYS_INLINE void ldr(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
    946946    {
    947947        ASSERT(rn != ARMRegisters::pc); // LDR (literal)
     
    956956    }
    957957
    958     void ldrCompact(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
     958    ALWAYS_INLINE void ldrCompact(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
    959959    {
    960960        ASSERT(rn != ARMRegisters::pc); // LDR (literal)
     
    975975    // MEM[index ? _tmp : _reg] = REG[rt]
    976976    // if (wback) REG[rn] = _tmp
    977     void ldr(RegisterID rt, RegisterID rn, int offset, bool index, bool wback)
     977    ALWAYS_INLINE void ldr(RegisterID rt, RegisterID rn, int offset, bool index, bool wback)
    978978    {
    979979        ASSERT(rt != ARMRegisters::pc);
     
    998998
    999999    // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block.
    1000     void ldr(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0)
     1000    ALWAYS_INLINE void ldr(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0)
    10011001    {
    10021002        ASSERT(rn != ARMRegisters::pc); // LDR (literal)
     
    10111011
    10121012    // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block.
    1013     void ldrh(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
     1013    ALWAYS_INLINE void ldrh(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
    10141014    {
    10151015        ASSERT(rn != ARMRegisters::pc); // LDR (literal)
     
    10331033    // MEM[index ? _tmp : _reg] = REG[rt]
    10341034    // if (wback) REG[rn] = _tmp
    1035     void ldrh(RegisterID rt, RegisterID rn, int offset, bool index, bool wback)
     1035    ALWAYS_INLINE void ldrh(RegisterID rt, RegisterID rn, int offset, bool index, bool wback)
    10361036    {
    10371037        ASSERT(rt != ARMRegisters::pc);
     
    10551055    }
    10561056
    1057     void ldrh(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0)
     1057    ALWAYS_INLINE void ldrh(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0)
    10581058    {
    10591059        ASSERT(!BadReg(rt));   // Memory hint
     
    11021102    }
    11031103
    1104     void ldrb(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0)
     1104    ALWAYS_INLINE void ldrb(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0)
    11051105    {
    11061106        ASSERT(rn != ARMRegisters::pc); // LDR (literal)
     
    11221122    }
    11231123
    1124     void lsl(RegisterID rd, RegisterID rn, RegisterID rm)
     1124    ALWAYS_INLINE void lsl(RegisterID rd, RegisterID rn, RegisterID rm)
    11251125    {
    11261126        ASSERT(!BadReg(rd));
     
    11301130    }
    11311131
    1132     void lsr(RegisterID rd, RegisterID rm, int32_t shiftAmount)
     1132    ALWAYS_INLINE void lsr(RegisterID rd, RegisterID rm, int32_t shiftAmount)
    11331133    {
    11341134        ASSERT(!BadReg(rd));
     
    11381138    }
    11391139
    1140     void lsr(RegisterID rd, RegisterID rn, RegisterID rm)
     1140    ALWAYS_INLINE void lsr(RegisterID rd, RegisterID rn, RegisterID rm)
    11411141    {
    11421142        ASSERT(!BadReg(rd));
     
    11461146    }
    11471147
    1148     void movT3(RegisterID rd, ARMThumbImmediate imm)
     1148    ALWAYS_INLINE void movT3(RegisterID rd, ARMThumbImmediate imm)
    11491149    {
    11501150        ASSERT(imm.isValid());
     
    11551155    }
    11561156
    1157     void mov(RegisterID rd, ARMThumbImmediate imm)
     1157    ALWAYS_INLINE void mov(RegisterID rd, ARMThumbImmediate imm)
    11581158    {
    11591159        ASSERT(imm.isValid());
     
    11681168    }
    11691169
    1170    void mov(RegisterID rd, RegisterID rm)
     1170    ALWAYS_INLINE void mov(RegisterID rd, RegisterID rm)
    11711171    {
    11721172        m_formatter.oneWordOp8RegReg143(OP_MOV_reg_T1, rm, rd);
    11731173    }
    11741174
    1175     void movt(RegisterID rd, ARMThumbImmediate imm)
     1175    ALWAYS_INLINE void movt(RegisterID rd, ARMThumbImmediate imm)
    11761176    {
    11771177        ASSERT(imm.isUInt16());
     
    11801180    }
    11811181
    1182     void mvn(RegisterID rd, ARMThumbImmediate imm)
     1182    ALWAYS_INLINE void mvn(RegisterID rd, ARMThumbImmediate imm)
    11831183    {
    11841184        ASSERT(imm.isEncodedImm());
     
    11881188    }
    11891189
    1190     void mvn(RegisterID rd, RegisterID rm, ShiftTypeAndAmount shift)
     1190    ALWAYS_INLINE void mvn(RegisterID rd, RegisterID rm, ShiftTypeAndAmount shift)
    11911191    {
    11921192        ASSERT(!BadReg(rd));
     
    11951195    }
    11961196
    1197     void mvn(RegisterID rd, RegisterID rm)
     1197    ALWAYS_INLINE void mvn(RegisterID rd, RegisterID rm)
    11981198    {
    11991199        if (!((rd | rm) & 8))
     
    12031203    }
    12041204
    1205     void neg(RegisterID rd, RegisterID rm)
     1205    ALWAYS_INLINE void neg(RegisterID rd, RegisterID rm)
    12061206    {
    12071207        ARMThumbImmediate zero = ARMThumbImmediate::makeUInt12(0);
     
    12091209    }
    12101210
    1211     void orr(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
     1211    ALWAYS_INLINE void orr(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
    12121212    {
    12131213        ASSERT(!BadReg(rd));
     
    12171217    }
    12181218
    1219     void orr(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     1219    ALWAYS_INLINE void orr(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    12201220    {
    12211221        ASSERT(!BadReg(rd));
     
    12351235    }
    12361236
    1237     void orr_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     1237    ALWAYS_INLINE void orr_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    12381238    {
    12391239        ASSERT(!BadReg(rd));
     
    12531253    }
    12541254
    1255     void ror(RegisterID rd, RegisterID rm, int32_t shiftAmount)
     1255    ALWAYS_INLINE void ror(RegisterID rd, RegisterID rm, int32_t shiftAmount)
    12561256    {
    12571257        ASSERT(!BadReg(rd));
     
    12611261    }
    12621262
    1263     void ror(RegisterID rd, RegisterID rn, RegisterID rm)
     1263    ALWAYS_INLINE void ror(RegisterID rd, RegisterID rn, RegisterID rm)
    12641264    {
    12651265        ASSERT(!BadReg(rd));
     
    12691269    }
    12701270
    1271     void smull(RegisterID rdLo, RegisterID rdHi, RegisterID rn, RegisterID rm)
     1271    ALWAYS_INLINE void smull(RegisterID rdLo, RegisterID rdHi, RegisterID rn, RegisterID rm)
    12721272    {
    12731273        ASSERT(!BadReg(rdLo));
     
    12801280
    12811281    // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block.
    1282     void str(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
     1282    ALWAYS_INLINE void str(RegisterID rt, RegisterID rn, ARMThumbImmediate imm)
    12831283    {
    12841284        ASSERT(rt != ARMRegisters::pc);
     
    13051305    // MEM[index ? _tmp : _reg] = REG[rt]
    13061306    // if (wback) REG[rn] = _tmp
    1307     void str(RegisterID rt, RegisterID rn, int offset, bool index, bool wback)
     1307    ALWAYS_INLINE void str(RegisterID rt, RegisterID rn, int offset, bool index, bool wback)
    13081308    {
    13091309        ASSERT(rt != ARMRegisters::pc);
     
    13281328
    13291329    // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block.
    1330     void str(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0)
     1330    ALWAYS_INLINE void str(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0)
    13311331    {
    13321332        ASSERT(rn != ARMRegisters::pc);
     
    13401340    }
    13411341
    1342     void sub(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
     1342    ALWAYS_INLINE void sub(RegisterID rd, RegisterID rn, ARMThumbImmediate imm)
    13431343    {
    13441344        // Rd can only be SP if Rn is also SP.
     
    13691369    }
    13701370
    1371     void sub(RegisterID rd, ARMThumbImmediate imm, RegisterID rn)
     1371    ALWAYS_INLINE void sub(RegisterID rd, ARMThumbImmediate imm, RegisterID rn)
    13721372    {
    13731373        ASSERT(rd != ARMRegisters::pc);
     
    13821382    }
    13831383
    1384     void sub(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     1384    ALWAYS_INLINE void sub(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    13851385    {
    13861386        ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp));
     
    13921392
    13931393    // NOTE: In an IT block, add doesn't modify the flags register.
    1394     void sub(RegisterID rd, RegisterID rn, RegisterID rm)
     1394    ALWAYS_INLINE void sub(RegisterID rd, RegisterID rn, RegisterID rm)
    13951395    {
    13961396        if (!((rd | rn | rm) & 8))
     
    14261426
    14271427    // Not allowed in an IT (if then) block?
    1428     void sub_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     1428    ALWAYS_INLINE void sub_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    14291429    {
    14301430        ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp));
     
    14361436
    14371437    // Not allowed in an IT (if then) block.
    1438     void sub_S(RegisterID rd, RegisterID rn, RegisterID rm)
     1438    ALWAYS_INLINE void sub_S(RegisterID rd, RegisterID rn, RegisterID rm)
    14391439    {
    14401440        if (!((rd | rn | rm) & 8))
     
    14441444    }
    14451445
    1446     void tst(RegisterID rn, ARMThumbImmediate imm)
     1446    ALWAYS_INLINE void tst(RegisterID rn, ARMThumbImmediate imm)
    14471447    {
    14481448        ASSERT(!BadReg(rn));
     
    14521452    }
    14531453
    1454     void tst(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
     1454    ALWAYS_INLINE void tst(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift)
    14551455    {
    14561456        ASSERT(!BadReg(rn));
     
    14591459    }
    14601460
    1461     void tst(RegisterID rn, RegisterID rm)
     1461    ALWAYS_INLINE void tst(RegisterID rn, RegisterID rm)
    14621462    {
    14631463        if ((rn | rm) & 8)
     
    15771577    // Assembler admin methods:
    15781578
    1579     static bool linkRecordSourceComparator(const LinkRecord& a, const LinkRecord& b)
     1579    static ALWAYS_INLINE bool linkRecordSourceComparator(const LinkRecord& a, const LinkRecord& b)
    15801580    {
    15811581        return a.from() < b.from();
     
    16641664    }
    16651665
    1666     void link(LinkRecord& record, uint8_t* from, uint8_t* to)
     1666    void ALWAYS_INLINE link(LinkRecord& record, uint8_t* from, uint8_t* to)
    16671667    {
    16681668        switch (record.linkType()) {
     
    21662166    class ARMInstructionFormatter {
    21672167    public:
    2168         void oneWordOp5Reg3Imm8(OpcodeID op, RegisterID rd, uint8_t imm)
     2168        ALWAYS_INLINE void oneWordOp5Reg3Imm8(OpcodeID op, RegisterID rd, uint8_t imm)
    21692169        {
    21702170            m_buffer.putShort(op | (rd << 8) | imm);
    21712171        }
    21722172       
    2173         void oneWordOp5Imm5Reg3Reg3(OpcodeID op, uint8_t imm, RegisterID reg1, RegisterID reg2)
     2173        ALWAYS_INLINE void oneWordOp5Imm5Reg3Reg3(OpcodeID op, uint8_t imm, RegisterID reg1, RegisterID reg2)
    21742174        {
    21752175            m_buffer.putShort(op | (imm << 6) | (reg1 << 3) | reg2);
    21762176        }
    21772177
    2178         void oneWordOp7Reg3Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2, RegisterID reg3)
     2178        ALWAYS_INLINE void oneWordOp7Reg3Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2, RegisterID reg3)
    21792179        {
    21802180            m_buffer.putShort(op | (reg1 << 6) | (reg2 << 3) | reg3);
    21812181        }
    21822182
    2183         void oneWordOp8Imm8(OpcodeID op, uint8_t imm)
     2183        ALWAYS_INLINE void oneWordOp8Imm8(OpcodeID op, uint8_t imm)
    21842184        {
    21852185            m_buffer.putShort(op | imm);
    21862186        }
    21872187
    2188         void oneWordOp8RegReg143(OpcodeID op, RegisterID reg1, RegisterID reg2)
     2188        ALWAYS_INLINE void oneWordOp8RegReg143(OpcodeID op, RegisterID reg1, RegisterID reg2)
    21892189        {
    21902190            m_buffer.putShort(op | ((reg2 & 8) << 4) | (reg1 << 3) | (reg2 & 7));
    21912191        }
    2192         void oneWordOp9Imm7(OpcodeID op, uint8_t imm)
     2192
     2193        ALWAYS_INLINE void oneWordOp9Imm7(OpcodeID op, uint8_t imm)
    21932194        {
    21942195            m_buffer.putShort(op | imm);
    21952196        }
    21962197
    2197         void oneWordOp10Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2)
     2198        ALWAYS_INLINE void oneWordOp10Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2)
    21982199        {
    21992200            m_buffer.putShort(op | (reg1 << 3) | reg2);
    22002201        }
    22012202
    2202         void twoWordOp12Reg4FourFours(OpcodeID1 op, RegisterID reg, FourFours ff)
     2203        ALWAYS_INLINE void twoWordOp12Reg4FourFours(OpcodeID1 op, RegisterID reg, FourFours ff)
    22032204        {
    22042205            m_buffer.putShort(op | reg);
     
    22062207        }
    22072208       
    2208         void twoWordOp16FourFours(OpcodeID1 op, FourFours ff)
     2209        ALWAYS_INLINE void twoWordOp16FourFours(OpcodeID1 op, FourFours ff)
    22092210        {
    22102211            m_buffer.putShort(op);
     
    22122213        }
    22132214       
    2214         void twoWordOp16Op16(OpcodeID1 op1, OpcodeID2 op2)
     2215        ALWAYS_INLINE void twoWordOp16Op16(OpcodeID1 op1, OpcodeID2 op2)
    22152216        {
    22162217            m_buffer.putShort(op1);
     
    22182219        }
    22192220
    2220         void twoWordOp5i6Imm4Reg4EncodedImm(OpcodeID1 op, int imm4, RegisterID rd, ARMThumbImmediate imm)
     2221        ALWAYS_INLINE void twoWordOp5i6Imm4Reg4EncodedImm(OpcodeID1 op, int imm4, RegisterID rd, ARMThumbImmediate imm)
    22212222        {
    22222223            ARMThumbImmediate newImm = imm;
     
    22272228        }
    22282229
    2229         void twoWordOp12Reg4Reg4Imm12(OpcodeID1 op, RegisterID reg1, RegisterID reg2, uint16_t imm)
     2230        ALWAYS_INLINE void twoWordOp12Reg4Reg4Imm12(OpcodeID1 op, RegisterID reg1, RegisterID reg2, uint16_t imm)
    22302231        {
    22312232            m_buffer.putShort(op | reg1);
     
    22372238        // Where 1s in the pattern come from op1, 2s in the pattern come from op2, S is the provided size bit.
    22382239        // Operands provide 5 bit values of the form Aaaaa, Bbbbb, Ccccc.
    2239         void vfpOp(OpcodeID1 op1, OpcodeID2 op2, bool size, VFPOperand a, VFPOperand b, VFPOperand c)
     2240        ALWAYS_INLINE void vfpOp(OpcodeID1 op1, OpcodeID2 op2, bool size, VFPOperand a, VFPOperand b, VFPOperand c)
    22402241        {
    22412242            ASSERT(!(op1 & 0x004f));
     
    22472248        // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2.
    22482249        // (i.e. +/-(0..255) 32-bit words)
    2249         void vfpMemOp(OpcodeID1 op1, OpcodeID2 op2, bool size, RegisterID rn, VFPOperand rd, int32_t imm)
     2250        ALWAYS_INLINE void vfpMemOp(OpcodeID1 op1, OpcodeID2 op2, bool size, RegisterID rn, VFPOperand rd, int32_t imm)
    22502251        {
    22512252            bool up = true;
  • trunk/Source/JavaScriptCore/assembler/LinkBuffer.h

    r87612 r90426  
    249249            // Copy the instructions from the last jump to the current one.
    250250            size_t regionSize = jumpsToLink[i].from() - readPtr;
    251             memcpy(outData + writePtr, inData + readPtr, regionSize);
     251            uint16_t* copySource = reinterpret_cast<uint16_t*>(inData + readPtr);
     252            uint16_t* copyEnd = reinterpret_cast<uint16_t*>(inData + readPtr + regionSize);
     253            uint16_t* copyDst = reinterpret_cast<uint16_t*>(outData + writePtr);
     254            ASSERT(!(regionSize % 2));
     255            ASSERT(!(readPtr % 2));
     256            ASSERT(!(writePtr % 2));
     257            while (copySource != copyEnd)
     258                *copyDst++ = *copySource++;
    252259            m_assembler->recordLinkOffsets(readPtr, jumpsToLink[i].from(), offset);
    253260            readPtr += regionSize;
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h

    r90237 r90426  
    11271127    }
    11281128
    1129     Call nearCall()
     1129    ALWAYS_INLINE Call nearCall()
    11301130    {
    11311131        moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister);
     
    11331133    }
    11341134
    1135     Call call()
     1135    ALWAYS_INLINE Call call()
    11361136    {
    11371137        moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister);
     
    11391139    }
    11401140
    1141     Call call(RegisterID target)
     1141    ALWAYS_INLINE Call call(RegisterID target)
    11421142    {
    11431143        return Call(m_assembler.blx(target), Call::None);
    11441144    }
    11451145
    1146     Call call(Address address)
     1146    ALWAYS_INLINE Call call(Address address)
    11471147    {
    11481148        load32(address, dataTempRegister);
     
    11501150    }
    11511151
    1152     void ret()
     1152    ALWAYS_INLINE void ret()
    11531153    {
    11541154        m_assembler.bx(linkRegister);
     
    11991199    }
    12001200
    1201     DataLabel32 moveWithPatch(TrustedImm32 imm, RegisterID dst)
     1201    ALWAYS_INLINE DataLabel32 moveWithPatch(TrustedImm32 imm, RegisterID dst)
    12021202    {
    12031203        moveFixedWidthEncoding(imm, dst);
     
    12051205    }
    12061206
    1207     DataLabelPtr moveWithPatch(TrustedImmPtr imm, RegisterID dst)
     1207    ALWAYS_INLINE DataLabelPtr moveWithPatch(TrustedImmPtr imm, RegisterID dst)
    12081208    {
    12091209        moveFixedWidthEncoding(TrustedImm32(imm), dst);
     
    12111211    }
    12121212
    1213     Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
     1213    ALWAYS_INLINE Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
    12141214    {
    12151215        dataLabel = moveWithPatch(initialRightValue, dataTempRegister);
     
    12171217    }
    12181218
    1219     Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
     1219    ALWAYS_INLINE Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
    12201220    {
    12211221        load32(left, addressTempRegister);
     
    12241224    }
    12251225
    1226     DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address)
     1226    ALWAYS_INLINE DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address)
    12271227    {
    12281228        DataLabelPtr label = moveWithPatch(initialValue, dataTempRegister);
     
    12301230        return label;
    12311231    }
    1232     DataLabelPtr storePtrWithPatch(ImplicitAddress address) { return storePtrWithPatch(TrustedImmPtr(0), address); }
    1233 
    1234 
    1235     Call tailRecursiveCall()
     1232    ALWAYS_INLINE DataLabelPtr storePtrWithPatch(ImplicitAddress address) { return storePtrWithPatch(TrustedImmPtr(0), address); }
     1233
     1234
     1235    ALWAYS_INLINE Call tailRecursiveCall()
    12361236    {
    12371237        // Like a normal call, but don't link.
     
    12401240    }
    12411241
    1242     Call makeTailRecursiveCall(Jump oldJump)
     1242    ALWAYS_INLINE Call makeTailRecursiveCall(Jump oldJump)
    12431243    {
    12441244        oldJump.link(this);
     
    12581258    }
    12591259
    1260     Jump jump()
     1260    ALWAYS_INLINE Jump jump()
    12611261    {
    12621262        moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister);
     
    12641264    }
    12651265
    1266     Jump makeBranch(ARMv7Assembler::Condition cond)
     1266    ALWAYS_INLINE Jump makeBranch(ARMv7Assembler::Condition cond)
    12671267    {
    12681268        m_assembler.it(cond, true, true);
     
    12701270        return Jump(m_assembler.bx(dataTempRegister), inUninterruptedSequence() ? ARMv7Assembler::JumpConditionFixedSize : ARMv7Assembler::JumpCondition, cond);
    12711271    }
    1272     Jump makeBranch(RelationalCondition cond) { return makeBranch(armV7Condition(cond)); }
    1273     Jump makeBranch(ResultCondition cond) { return makeBranch(armV7Condition(cond)); }
    1274     Jump makeBranch(DoubleCondition cond) { return makeBranch(armV7Condition(cond)); }
     1272    ALWAYS_INLINE Jump makeBranch(RelationalCondition cond) { return makeBranch(armV7Condition(cond)); }
     1273    ALWAYS_INLINE Jump makeBranch(ResultCondition cond) { return makeBranch(armV7Condition(cond)); }
     1274    ALWAYS_INLINE Jump makeBranch(DoubleCondition cond) { return makeBranch(armV7Condition(cond)); }
    12751275
    12761276    ArmAddress setupArmAddress(BaseIndex address)
Note: See TracChangeset for help on using the changeset viewer.