Changeset 192857 in webkit


Ignore:
Timestamp:
Nov 30, 2015, 8:59:02 PM (10 years ago)
Author:
benjamin@webkit.org
Message:

[JSC] Add Sqrt to B3
https://bugs.webkit.org/show_bug.cgi?id=151692

Patch by Benjamin Poulain <bpoulain@apple.com> on 2015-11-30
Reviewed by Geoffrey Garen.

  • assembler/MacroAssemblerX86Common.h:

(JSC::MacroAssemblerX86Common::sqrtDouble):

  • assembler/X86Assembler.h:

(JSC::X86Assembler::sqrtsd_mr):

  • b3/B3LowerToAir.cpp:

(JSC::B3::Air::LowerToAir::lower):

  • b3/B3Opcode.cpp:

(WTF::printInternal):

  • b3/B3Opcode.h:
  • b3/B3Validate.cpp:
  • b3/B3Value.cpp:

(JSC::B3::Value::effects):
(JSC::B3::Value::key):
(JSC::B3::Value::typeFor):

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

(JSC::B3::testSqrtArg):
(JSC::B3::testSqrtImm):
(JSC::B3::testSqrtMem):
(JSC::B3::run):

  • ftl/FTLB3Output.h:

(JSC::FTL::Output::doubleSqrt):

Location:
trunk/Source/JavaScriptCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r192856 r192857  
     12015-11-30  Benjamin Poulain  <bpoulain@apple.com>
     2
     3        [JSC] Add Sqrt to B3
     4        https://bugs.webkit.org/show_bug.cgi?id=151692
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        * assembler/MacroAssemblerX86Common.h:
     9        (JSC::MacroAssemblerX86Common::sqrtDouble):
     10        * assembler/X86Assembler.h:
     11        (JSC::X86Assembler::sqrtsd_mr):
     12        * b3/B3LowerToAir.cpp:
     13        (JSC::B3::Air::LowerToAir::lower):
     14        * b3/B3Opcode.cpp:
     15        (WTF::printInternal):
     16        * b3/B3Opcode.h:
     17        * b3/B3Validate.cpp:
     18        * b3/B3Value.cpp:
     19        (JSC::B3::Value::effects):
     20        (JSC::B3::Value::key):
     21        (JSC::B3::Value::typeFor):
     22        * b3/air/AirOpcode.opcodes:
     23        * b3/testb3.cpp:
     24        (JSC::B3::testSqrtArg):
     25        (JSC::B3::testSqrtImm):
     26        (JSC::B3::testSqrtMem):
     27        (JSC::B3::run):
     28        * ftl/FTLB3Output.h:
     29        (JSC::FTL::Output::doubleSqrt):
     30
    1312015-11-30  Filip Pizlo  <fpizlo@apple.com>
    232
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h

    r192812 r192857  
    506506    }
    507507
     508    void sqrtDouble(Address src, FPRegisterID dst)
     509    {
     510        m_assembler.sqrtsd_mr(src.offset, src.base, dst);
     511    }
     512
    508513    void absDouble(FPRegisterID src, FPRegisterID dst)
    509514    {
  • trunk/Source/JavaScriptCore/assembler/X86Assembler.h

    r192699 r192857  
    21382138        m_formatter.twoByteOp(OP2_SQRTSD_VsdWsd, (RegisterID)dst, (RegisterID)src);
    21392139    }
    2140    
     2140
     2141    void sqrtsd_mr(int offset, RegisterID base, XMMRegisterID dst)
     2142    {
     2143        m_formatter.prefix(PRE_SSE_F2);
     2144        m_formatter.twoByteOp(OP2_SQRTSD_VsdWsd, (RegisterID)dst, base, offset);
     2145    }
     2146
    21412147    // Misc instructions:
    21422148
  • trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp

    r192856 r192857  
    14641464        }
    14651465
     1466        case Sqrt: {
     1467            appendUnOp<Air::Oops, Air::Oops, SqrtDouble>(m_value->child(0));
     1468            return;
     1469        }
     1470
    14661471        case BitwiseCast: {
    14671472            appendUnOp<Air::Oops, Move64ToDouble, MoveDoubleTo64>(m_value->child(0));
  • trunk/Source/JavaScriptCore/b3/B3Opcode.cpp

    r192699 r192857  
    138138        out.print("ZShr");
    139139        return;
     140    case Sqrt:
     141        out.print("Sqrt");
     142        return;
    140143    case BitwiseCast:
    141144        out.print("BitwiseCast");
  • trunk/Source/JavaScriptCore/b3/B3Opcode.h

    r192699 r192857  
    8282    ZShr, // Logical Shift.
    8383
     84    // Double math.
     85    Sqrt,
     86
    8487    // Casts and such.
    8588    // Bitwise Cast of Double->Int64 or Int64->Double
  • trunk/Source/JavaScriptCore/b3/B3Validate.cpp

    r192699 r192857  
    198198                VALIDATE(value->type() == Int32, ("At ", *value));
    199199                break;
     200            case Sqrt:
    200201            case FRound:
    201202                VALIDATE(value->numChildren() == 1, ("At ", *value));
  • trunk/Source/JavaScriptCore/b3/B3Value.cpp

    r192699 r192857  
    326326    case SShr:
    327327    case ZShr:
     328    case Sqrt:
    328329    case BitwiseCast:
    329330    case SExt8:
     
    401402        return ValueKey(opcode(), type());
    402403    case Identity:
     404    case Sqrt:
    403405    case SExt8:
    404406    case SExt16:
     
    497499    case SShr:
    498500    case ZShr:
     501    case Sqrt:
    499502    case CheckAdd:
    500503    case CheckSub:
  • trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes

    r192699 r192857  
    204204    Addr
    205205
     206SqrtDouble U:F, UD:F
     207    Tmp, Tmp
     208    Addr, Tmp
     209
    206210ConvertInt32ToDouble U:G, D:F
    207211    Tmp, Tmp
  • trunk/Source/JavaScriptCore/b3/testb3.cpp

    r192841 r192857  
    18831883
    18841884    CHECK(compileAndRun<uint32_t>(proc, a) == (a >> b));
     1885}
     1886
     1887void testSqrtArg(double a)
     1888{
     1889    Procedure proc;
     1890    BasicBlock* root = proc.addBlock();
     1891    root->appendNew<ControlValue>(
     1892        proc, Return, Origin(),
     1893        root->appendNew<Value>(
     1894            proc, Sqrt, Origin(),
     1895                root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0)));
     1896
     1897    CHECK(isIdentical(compileAndRun<double>(proc, a), sqrt(a)));
     1898}
     1899
     1900void testSqrtImm(double a)
     1901{
     1902    Procedure proc;
     1903    BasicBlock* root = proc.addBlock();
     1904    Value* argument = root->appendNew<ConstDoubleValue>(proc, Origin(), a);
     1905    root->appendNew<ControlValue>(
     1906        proc, Return, Origin(),
     1907        root->appendNew<Value>(proc, Sqrt, Origin(), argument));
     1908
     1909    CHECK(isIdentical(compileAndRun<double>(proc), sqrt(a)));
     1910}
     1911
     1912void testSqrtMem(double a)
     1913{
     1914    Procedure proc;
     1915    BasicBlock* root = proc.addBlock();
     1916    Value* address = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
     1917    MemoryValue* loadDouble = root->appendNew<MemoryValue>(proc, Load, Double, Origin(), address);
     1918    root->appendNew<ControlValue>(
     1919        proc, Return, Origin(),
     1920        root->appendNew<Value>(proc, Sqrt, Origin(), loadDouble));
     1921
     1922    CHECK(isIdentical(compileAndRun<double>(proc, &a), sqrt(a)));
    18851923}
    18861924
     
    56835721    RUN(testZShrArgImm32(0xffffffff, 63));
    56845722
     5723    RUN_UNARY(testSqrtArg, doubleOperands());
     5724    RUN_UNARY(testSqrtImm, doubleOperands());
     5725    RUN_UNARY(testSqrtMem, doubleOperands());
     5726
    56855727    RUN_UNARY(testDoubleArgToInt64BitwiseCast, doubleOperands());
    56865728    RUN_UNARY(testDoubleImmToInt64BitwiseCast, doubleOperands());
  • trunk/Source/JavaScriptCore/ftl/FTLB3Output.h

    r192699 r192857  
    167167    LValue doublePowi(LValue xOperand, LValue yOperand) { CRASH(); }
    168168
    169     LValue doubleSqrt(LValue value) { CRASH(); }
     169    LValue doubleSqrt(LValue value) { return m_block->appendNew<B3::Value>(m_proc, B3::Sqrt, origin(), value); }
    170170
    171171    LValue doubleLog(LValue value) { CRASH(); }
Note: See TracChangeset for help on using the changeset viewer.