diff --git a/js/src/jit/arm/CodeGenerator-arm.cpp b/js/src/jit/arm/CodeGenerator-arm.cpp index f83ef021c259..e545f38707ae 100644 --- a/js/src/jit/arm/CodeGenerator-arm.cpp +++ b/js/src/jit/arm/CodeGenerator-arm.cpp @@ -3368,3 +3368,23 @@ CodeGeneratorARM::visitAsmJSPassStackArgI64(LAsmJSPassStackArgI64* ins) else masm.store64(ToRegister64(ins->arg()), dst); } + +void +CodeGeneratorARM::visitAsmSelectI64(LAsmSelectI64* lir) +{ + Register cond = ToRegister(lir->condExpr()); + const LInt64Allocation falseExpr = lir->falseExpr(); + + Register64 out = ToOutRegister64(lir); + MOZ_ASSERT(ToRegister64(lir->trueExpr()) == out, "true expr is reused for input"); + + masm.ma_cmp(cond, Imm32(0)); + if (falseExpr.low().isRegister()) { + masm.ma_mov(ToRegister(falseExpr.low()), out.low, LeaveCC, Assembler::Equal); + masm.ma_mov(ToRegister(falseExpr.high()), out.high, LeaveCC, Assembler::Equal); + } else { + masm.ma_ldr(ToAddress(falseExpr.low()), out.low, Offset, Assembler::Equal); + masm.ma_ldr(ToAddress(falseExpr.high()), out.high, Offset, Assembler::Equal); + } +} + diff --git a/js/src/jit/arm/CodeGenerator-arm.h b/js/src/jit/arm/CodeGenerator-arm.h index 9554cfd6a379..192569b354b5 100644 --- a/js/src/jit/arm/CodeGenerator-arm.h +++ b/js/src/jit/arm/CodeGenerator-arm.h @@ -170,6 +170,7 @@ class CodeGeneratorARM : public CodeGeneratorShared virtual void visitBitOpI64(LBitOpI64* lir); virtual void visitRotateI64(LRotateI64* lir); virtual void visitAsmJSPassStackArgI64(LAsmJSPassStackArgI64* lir); + virtual void visitAsmSelectI64(LAsmSelectI64* lir); // Out of line visitors. void visitOutOfLineBailout(OutOfLineBailout* ool); diff --git a/js/src/jit/arm/Lowering-arm.cpp b/js/src/jit/arm/Lowering-arm.cpp index e63fdfefdd2e..2f707d49f668 100644 --- a/js/src/jit/arm/Lowering-arm.cpp +++ b/js/src/jit/arm/Lowering-arm.cpp @@ -511,7 +511,15 @@ LIRGeneratorARM::lowerUrshD(MUrsh* mir) void LIRGeneratorARM::visitAsmSelect(MAsmSelect* ins) { - MOZ_ASSERT(ins->type() != MIRType::Int64); + if (ins->type() == MIRType::Int64) { + auto* lir = new(alloc()) LAsmSelectI64(useInt64RegisterAtStart(ins->trueExpr()), + useInt64(ins->falseExpr()), + useRegister(ins->condExpr()) + ); + + defineInt64ReuseInput(lir, ins, LAsmSelectI64::TrueExprIndex); + return; + } auto* lir = new(alloc()) LAsmSelect(useRegisterAtStart(ins->trueExpr()), useRegister(ins->falseExpr()),