|
Lines 259-265
B3IRGenerator::B3IRGenerator(VM& vm, const ModuleInformation& info, Procedure& p
a/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp_sec1
|
| 259 |
for (const PinnedSizeRegisterInfo& regInfo : pinnedRegs.sizeRegisters) |
259 |
for (const PinnedSizeRegisterInfo& regInfo : pinnedRegs.sizeRegisters) |
| 260 |
m_proc.pinRegister(regInfo.sizeRegister); |
260 |
m_proc.pinRegister(regInfo.sizeRegister); |
| 261 |
|
261 |
|
| 262 |
if (info.hasMemory()) { |
262 |
if (info.memory) { |
| 263 |
m_proc.setWasmBoundsCheckGenerator([=] (CCallHelpers& jit, GPRReg pinnedGPR, unsigned) { |
263 |
m_proc.setWasmBoundsCheckGenerator([=] (CCallHelpers& jit, GPRReg pinnedGPR, unsigned) { |
| 264 |
AllowMacroScratchRegisterUsage allowScratch(jit); |
264 |
AllowMacroScratchRegisterUsage allowScratch(jit); |
| 265 |
ASSERT_UNUSED(pinnedGPR, m_memorySizeGPR == pinnedGPR); |
265 |
ASSERT_UNUSED(pinnedGPR, m_memorySizeGPR == pinnedGPR); |
|
Lines 454-462
auto B3IRGenerator::setGlobal(uint32_t index, ExpressionType value) -> PartialRe
a/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp_sec2
|
| 454 |
|
454 |
|
| 455 |
inline Value* B3IRGenerator::emitCheckAndPreparePointer(ExpressionType pointer, uint32_t offset, uint32_t sizeOfOperation) |
455 |
inline Value* B3IRGenerator::emitCheckAndPreparePointer(ExpressionType pointer, uint32_t offset, uint32_t sizeOfOperation) |
| 456 |
{ |
456 |
{ |
| 457 |
ASSERT(m_memoryBaseGPR && m_memorySizeGPR); |
457 |
ASSERT(m_memoryBaseGPR); |
| 458 |
ASSERT(sizeOfOperation + offset > offset); |
458 |
if (m_info.memory.mode() == Memory::Mode::BoundsChecking) { |
| 459 |
m_currentBlock->appendNew<WasmBoundsCheckValue>(m_proc, Origin(), pointer, m_memorySizeGPR, sizeOfOperation + offset - 1); |
459 |
ASSERT(m_memorySizeGPR); |
|
|
460 |
ASSERT(sizeOfOperation + offset > offset); |
| 461 |
m_currentBlock->appendNew<WasmBoundsCheckValue>(m_proc, Origin(), pointer, m_memorySizeGPR, sizeOfOperation + offset - 1); |
| 462 |
} |
| 460 |
pointer = m_currentBlock->appendNew<Value>(m_proc, ZExt32, Origin(), pointer); |
463 |
pointer = m_currentBlock->appendNew<Value>(m_proc, ZExt32, Origin(), pointer); |
| 461 |
return m_currentBlock->appendNew<WasmAddressValue>(m_proc, Origin(), pointer, m_memoryBaseGPR); |
464 |
return m_currentBlock->appendNew<WasmAddressValue>(m_proc, Origin(), pointer, m_memoryBaseGPR); |
| 462 |
} |
465 |
} |
|
Lines 488-555
inline uint32_t sizeOfLoadOp(LoadOpType op)
a/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp_sec3
|
| 488 |
|
491 |
|
| 489 |
inline Value* B3IRGenerator::emitLoadOp(LoadOpType op, Origin origin, ExpressionType pointer, uint32_t offset) |
492 |
inline Value* B3IRGenerator::emitLoadOp(LoadOpType op, Origin origin, ExpressionType pointer, uint32_t offset) |
| 490 |
{ |
493 |
{ |
|
|
494 |
auto makeKind = [&] (B3::Opcode opcode) -> B3::Kind { |
| 495 |
if (m_info.memory.mode() == Memory::Signaling) |
| 496 |
return trapping(opcode); |
| 497 |
return opcode; |
| 498 |
}; |
| 491 |
switch (op) { |
499 |
switch (op) { |
| 492 |
case LoadOpType::I32Load8S: { |
500 |
case LoadOpType::I32Load8S: { |
| 493 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, Load8S, origin, pointer, offset); |
501 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load8S), origin, pointer, offset); |
| 494 |
} |
502 |
} |
| 495 |
|
503 |
|
| 496 |
case LoadOpType::I64Load8S: { |
504 |
case LoadOpType::I64Load8S: { |
| 497 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, Load8S, origin, pointer, offset); |
505 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load8S), origin, pointer, offset); |
| 498 |
return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value); |
506 |
return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value); |
| 499 |
} |
507 |
} |
| 500 |
|
508 |
|
| 501 |
case LoadOpType::I32Load8U: { |
509 |
case LoadOpType::I32Load8U: { |
| 502 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, Load8Z, origin, pointer, offset); |
510 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load8Z), origin, pointer, offset); |
| 503 |
} |
511 |
} |
| 504 |
|
512 |
|
| 505 |
case LoadOpType::I64Load8U: { |
513 |
case LoadOpType::I64Load8U: { |
| 506 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, Load8Z, origin, pointer, offset); |
514 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load8Z), origin, pointer, offset); |
| 507 |
return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin, value); |
515 |
return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin, value); |
| 508 |
} |
516 |
} |
| 509 |
|
517 |
|
| 510 |
case LoadOpType::I32Load16S: { |
518 |
case LoadOpType::I32Load16S: { |
| 511 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, Load16S, origin, pointer, offset); |
519 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load16S), origin, pointer, offset); |
| 512 |
} |
520 |
} |
| 513 |
case LoadOpType::I64Load16S: { |
521 |
case LoadOpType::I64Load16S: { |
| 514 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, Load16S, origin, pointer, offset); |
522 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load16S), origin, pointer, offset); |
| 515 |
return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value); |
523 |
return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value); |
| 516 |
} |
524 |
} |
| 517 |
|
525 |
|
| 518 |
case LoadOpType::I32Load: { |
526 |
case LoadOpType::I32Load: { |
| 519 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int32, origin, pointer, offset); |
527 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load), Int32, origin, pointer, offset); |
| 520 |
} |
528 |
} |
| 521 |
|
529 |
|
| 522 |
case LoadOpType::I64Load32U: { |
530 |
case LoadOpType::I64Load32U: { |
| 523 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int32, origin, pointer, offset); |
531 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load), Int32, origin, pointer, offset); |
| 524 |
return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin, value); |
532 |
return m_currentBlock->appendNew<Value>(m_proc, ZExt32, origin, value); |
| 525 |
} |
533 |
} |
| 526 |
|
534 |
|
| 527 |
case LoadOpType::I64Load32S: { |
535 |
case LoadOpType::I64Load32S: { |
| 528 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int32, origin, pointer, offset); |
536 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load), Int32, origin, pointer, offset); |
| 529 |
return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value); |
537 |
return m_currentBlock->appendNew<Value>(m_proc, SExt32, origin, value); |
| 530 |
} |
538 |
} |
| 531 |
|
539 |
|
| 532 |
case LoadOpType::I64Load: { |
540 |
case LoadOpType::I64Load: { |
| 533 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Int64, origin, pointer, offset); |
541 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load), Int64, origin, pointer, offset); |
| 534 |
} |
542 |
} |
| 535 |
|
543 |
|
| 536 |
case LoadOpType::F32Load: { |
544 |
case LoadOpType::F32Load: { |
| 537 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Float, origin, pointer, offset); |
545 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load), Float, origin, pointer, offset); |
| 538 |
} |
546 |
} |
| 539 |
|
547 |
|
| 540 |
case LoadOpType::F64Load: { |
548 |
case LoadOpType::F64Load: { |
| 541 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, Load, Double, origin, pointer, offset); |
549 |
return m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load), Double, origin, pointer, offset); |
| 542 |
} |
550 |
} |
| 543 |
|
551 |
|
| 544 |
// FIXME: B3 doesn't support Load16Z yet. We should lower to that value when |
552 |
// FIXME: B3 doesn't support Load16Z yet. We should lower to that value when |
| 545 |
// it's added. https://bugs.webkit.org/show_bug.cgi?id=165884 |
553 |
// it's added. https://bugs.webkit.org/show_bug.cgi?id=165884 |
| 546 |
case LoadOpType::I32Load16U: { |
554 |
case LoadOpType::I32Load16U: { |
| 547 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, Load16S, origin, pointer, offset); |
555 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load16S), origin, pointer, offset); |
| 548 |
return m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(), value, |
556 |
return m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(), value, |
| 549 |
m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), 0x0000ffff)); |
557 |
m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), 0x0000ffff)); |
| 550 |
} |
558 |
} |
| 551 |
case LoadOpType::I64Load16U: { |
559 |
case LoadOpType::I64Load16U: { |
| 552 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, Load16S, origin, pointer, offset); |
560 |
Value* value = m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Load16S), origin, pointer, offset); |
| 553 |
Value* partialResult = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(), value, |
561 |
Value* partialResult = m_currentBlock->appendNew<Value>(m_proc, BitAnd, Origin(), value, |
| 554 |
m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), 0x0000ffff)); |
562 |
m_currentBlock->appendNew<Const32Value>(m_proc, Origin(), 0x0000ffff)); |
| 555 |
|
563 |
|
|
Lines 625-637
inline uint32_t sizeOfStoreOp(StoreOpType op)
a/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp_sec4
|
| 625 |
|
633 |
|
| 626 |
inline void B3IRGenerator::emitStoreOp(StoreOpType op, Origin origin, ExpressionType pointer, ExpressionType value, uint32_t offset) |
634 |
inline void B3IRGenerator::emitStoreOp(StoreOpType op, Origin origin, ExpressionType pointer, ExpressionType value, uint32_t offset) |
| 627 |
{ |
635 |
{ |
|
|
636 |
auto makeKind = [&] (B3::Opcode opcode) -> B3::Kind { |
| 637 |
if (m_info.memory.mode() == Memory::Signaling) |
| 638 |
return trapping(opcode); |
| 639 |
return opcode; |
| 640 |
}; |
| 628 |
switch (op) { |
641 |
switch (op) { |
| 629 |
case StoreOpType::I64Store8: |
642 |
case StoreOpType::I64Store8: |
| 630 |
value = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin, value); |
643 |
value = m_currentBlock->appendNew<Value>(m_proc, Trunc, origin, value); |
| 631 |
FALLTHROUGH; |
644 |
FALLTHROUGH; |
| 632 |
|
645 |
|
| 633 |
case StoreOpType::I32Store8: |
646 |
case StoreOpType::I32Store8: |
| 634 |
m_currentBlock->appendNew<MemoryValue>(m_proc, Store8, origin, value, pointer, offset); |
647 |
m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Store8), origin, value, pointer, offset); |
| 635 |
return; |
648 |
return; |
| 636 |
|
649 |
|
| 637 |
case StoreOpType::I64Store16: |
650 |
case StoreOpType::I64Store16: |
|
Lines 639-645
inline void B3IRGenerator::emitStoreOp(StoreOpType op, Origin origin, Expression
a/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp_sec5
|
| 639 |
FALLTHROUGH; |
652 |
FALLTHROUGH; |
| 640 |
|
653 |
|
| 641 |
case StoreOpType::I32Store16: |
654 |
case StoreOpType::I32Store16: |
| 642 |
m_currentBlock->appendNew<MemoryValue>(m_proc, Store16, origin, value, pointer, offset); |
655 |
m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Store16), origin, value, pointer, offset); |
| 643 |
return; |
656 |
return; |
| 644 |
|
657 |
|
| 645 |
case StoreOpType::I64Store32: |
658 |
case StoreOpType::I64Store32: |
|
Lines 650-656
inline void B3IRGenerator::emitStoreOp(StoreOpType op, Origin origin, Expression
a/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp_sec6
|
| 650 |
case StoreOpType::I32Store: |
663 |
case StoreOpType::I32Store: |
| 651 |
case StoreOpType::F32Store: |
664 |
case StoreOpType::F32Store: |
| 652 |
case StoreOpType::F64Store: |
665 |
case StoreOpType::F64Store: |
| 653 |
m_currentBlock->appendNew<MemoryValue>(m_proc, Store, origin, value, pointer, offset); |
666 |
m_currentBlock->appendNew<MemoryValue>(m_proc, makeKind(Store), origin, value, pointer, offset); |
| 654 |
return; |
667 |
return; |
| 655 |
} |
668 |
} |
| 656 |
RELEASE_ASSERT_NOT_REACHED(); |
669 |
RELEASE_ASSERT_NOT_REACHED(); |