Ignore:
Timestamp:
Dec 23, 2011, 1:08:12 PM (13 years ago)
Author:
[email protected]
Message:

DFG loads from signed 8-bit and 16-bit typed arrays are broken
https://bugs.webkit.org/show_bug.cgi?id=75163

Source/JavaScriptCore:

Reviewed by Geoffrey Garen.

Added 8-bit and 16-bit signed loads. Because doing so on ARM is less trivial, I'm
currently disabling Int8Array and Int16Array optimizations on ARM.

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86Common::load8Signed):
(JSC::MacroAssemblerX86Common::load16Signed):

  • assembler/X86Assembler.h:

(JSC::X86Assembler::movswl_mr):
(JSC::X86Assembler::movsbl_mr):

  • bytecode/PredictedType.h:

(JSC::isActionableMutableArrayPrediction):

  • dfg/DFGNode.h:

(JSC::DFG::Node::shouldSpeculateInt8Array):
(JSC::DFG::Node::shouldSpeculateInt16Array):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray):

LayoutTests:

Reviewed by Geoffrey Garen.

Fixed some minor goofs in the previously comitted typed array tests, and added
new ones to cover this bug.

  • fast/js/dfg-int16array-expected.txt: Added.
  • fast/js/dfg-int16array.html: Added.
  • fast/js/dfg-int8array-expected.txt: Added.
  • fast/js/dfg-int8array.html: Added.
  • fast/js/script-tests/dfg-float32array.js:

(getters.getter1.a):
(.a):
(setters.setter1.a):
(safeGetter):

  • fast/js/script-tests/dfg-int16array.js: Added.

(getter1):
(setter1):
(getter2):
(setter2):
(getter3):
(setter3):
(getter4):
(setter4):
(getters.getter1.a):
(.a):
(setters.setter1.a):
(safeGetter):
(safeSetter):

  • fast/js/script-tests/dfg-int32array.js:

(getters.getter1.a):
(.a):
(setters.setter1.a):
(safeGetter):

  • fast/js/script-tests/dfg-int8array.js: Added.

(getter1):
(setter1):
(getter2):
(setter2):
(getter3):
(setter3):
(getter4):
(setter4):
(getters.getter1.a):
(.a):
(setters.setter1.a):
(safeGetter):
(safeSetter):

Location:
trunk/Source/JavaScriptCore/assembler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h

    r103636 r103637  
    487487    }
    488488   
     489    void load8Signed(BaseIndex address, RegisterID dest)
     490    {
     491        m_assembler.movsbl_mr(address.offset, address.base, address.index, address.scale, dest);
     492    }
     493
     494    void load8Signed(ImplicitAddress address, RegisterID dest)
     495    {
     496        m_assembler.movsbl_mr(address.offset, address.base, dest);
     497    }
     498   
    489499    void load16(BaseIndex address, RegisterID dest)
    490500    {
     
    495505    {
    496506        m_assembler.movzwl_mr(address.offset, address.base, dest);
     507    }
     508
     509    void load16Signed(BaseIndex address, RegisterID dest)
     510    {
     511        m_assembler.movswl_mr(address.offset, address.base, address.index, address.scale, dest);
     512    }
     513   
     514    void load16Signed(Address address, RegisterID dest)
     515    {
     516        m_assembler.movswl_mr(address.offset, address.base, dest);
    497517    }
    498518
  • trunk/Source/JavaScriptCore/assembler/X86Assembler.h

    r101886 r103637  
    187187        OP2_IMUL_GvEv       = 0xAF,
    188188        OP2_MOVZX_GvEb      = 0xB6,
     189        OP2_MOVSX_GvEb      = 0xBE,
    189190        OP2_MOVZX_GvEw      = 0xB7,
     191        OP2_MOVSX_GvEw      = 0xBF,
    190192        OP2_PEXTRW_GdUdIb   = 0xC5,
    191193        OP2_PSLLQ_UdqIb     = 0x73,
     
    12251227    }
    12261228
     1229    void movswl_mr(int offset, RegisterID base, RegisterID dst)
     1230    {
     1231        m_formatter.twoByteOp(OP2_MOVSX_GvEw, dst, base, offset);
     1232    }
     1233
     1234    void movswl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
     1235    {
     1236        m_formatter.twoByteOp(OP2_MOVSX_GvEw, dst, base, index, scale, offset);
     1237    }
     1238
    12271239    void movzbl_mr(int offset, RegisterID base, RegisterID dst)
    12281240    {
     
    12331245    {
    12341246        m_formatter.twoByteOp(OP2_MOVZX_GvEb, dst, base, index, scale, offset);
     1247    }
     1248
     1249    void movsbl_mr(int offset, RegisterID base, RegisterID dst)
     1250    {
     1251        m_formatter.twoByteOp(OP2_MOVSX_GvEb, dst, base, offset);
     1252    }
     1253   
     1254    void movsbl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
     1255    {
     1256        m_formatter.twoByteOp(OP2_MOVSX_GvEb, dst, base, index, scale, offset);
    12351257    }
    12361258
Note: See TracChangeset for help on using the changeset viewer.