Skip to content

Commit 748ae7c

Browse files
backesV8 LUCI CQ
authored andcommitted
[wasm][arm64] Fix zero-extention of i32.load8_s
InstructionSelector::ZeroExtendsWord32ToWord64 assumes that a Load[kRepWord8|kTypeInt32] generates a zero-extended value. This assumption makes sense, but was not fulfilled by the instruction selector which emitted an "ldrsb" instruction which sign-extended to the full 64-bit register. This CL fixes that by introducing a separate "LdrsbW" instruction which is selected if we are sign-extending an 8-bit value to 32-bit. [email protected], [email protected] [email protected] Bug: chromium:1239116 Change-Id: I2da1ad6062805acf5558f3e66b8db9a50e830302 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3094011 Commit-Queue: Clemens Backes <[email protected]> Reviewed-by: Maya Lekova <[email protected]> Reviewed-by: Andreas Haas <[email protected]> Cr-Commit-Position: refs/heads/master@{#76283}
1 parent 55e6a51 commit 748ae7c

File tree

5 files changed

+13
-3
lines changed

5 files changed

+13
-3
lines changed

src/compiler/backend/arm64/code-generator-arm64.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class Arm64OperandConverter final : public InstructionOperandConverter {
104104

105105
Register OutputRegister64() { return OutputRegister(); }
106106

107-
Register OutputRegister32() { return ToRegister(instr_->Output()).W(); }
107+
Register OutputRegister32() { return OutputRegister().W(); }
108108

109109
Register TempRegister32(size_t index) {
110110
return ToRegister(instr_->TempAt(index)).W();
@@ -1763,6 +1763,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
17631763
EmitOOLTrapIfNeeded(zone(), this, opcode, instr, __ pc_offset());
17641764
__ Ldrsb(i.OutputRegister(), i.MemoryOperand());
17651765
break;
1766+
case kArm64LdrsbW:
1767+
EmitOOLTrapIfNeeded(zone(), this, opcode, instr, __ pc_offset());
1768+
__ Ldrsb(i.OutputRegister32(), i.MemoryOperand());
1769+
break;
17661770
case kArm64Strb:
17671771
EmitOOLTrapIfNeeded(zone(), this, opcode, instr, __ pc_offset());
17681772
__ Strb(i.InputOrZeroRegister64(0), i.MemoryOperand(1));

src/compiler/backend/arm64/instruction-codes-arm64.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ namespace compiler {
164164
V(Arm64StrQ) \
165165
V(Arm64Ldrb) \
166166
V(Arm64Ldrsb) \
167+
V(Arm64LdrsbW) \
167168
V(Arm64Strb) \
168169
V(Arm64Ldrh) \
169170
V(Arm64Ldrsh) \

src/compiler/backend/arm64/instruction-scheduler-arm64.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ int InstructionScheduler::GetTargetInstructionFlags(
365365
case kArm64LdrQ:
366366
case kArm64Ldrb:
367367
case kArm64Ldrsb:
368+
case kArm64LdrsbW:
368369
case kArm64Ldrh:
369370
case kArm64Ldrsh:
370371
case kArm64Ldrsw:

src/compiler/backend/arm64/instruction-selector-arm64.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,11 @@ void InstructionSelector::VisitLoad(Node* node) {
787787
break;
788788
case MachineRepresentation::kBit: // Fall through.
789789
case MachineRepresentation::kWord8:
790-
opcode = load_rep.IsSigned() ? kArm64Ldrsb : kArm64Ldrb;
790+
opcode = load_rep.IsUnsigned()
791+
? kArm64Ldrb
792+
: load_rep.semantic() == MachineSemantic::kInt32
793+
? kArm64LdrsbW
794+
: kArm64Ldrsb;
791795
immediate_mode = kLoadStoreImm8;
792796
break;
793797
case MachineRepresentation::kWord16:

test/unittests/compiler/arm64/instruction-selector-arm64-unittest.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3005,7 +3005,7 @@ std::ostream& operator<<(std::ostream& os, const MemoryAccess& memacc) {
30053005

30063006
static const MemoryAccess kMemoryAccesses[] = {
30073007
{MachineType::Int8(),
3008-
kArm64Ldrsb,
3008+
kArm64LdrsbW,
30093009
kArm64Strb,
30103010
{-256, -255, -3, -2, -1, 0, 1, 2, 3, 255,
30113011
256, 257, 258, 1000, 1001, 2121, 2442, 4093, 4094, 4095}},

0 commit comments

Comments
 (0)