Lines Matching refs:assm
51 inline void Load(LiftoffAssembler* assm, LiftoffRegister dst, Register base, in Load() argument
56 assm->mov(dst.gp(), src); in Load()
59 assm->mov(dst.low_gp(), src); in Load()
60 assm->mov(dst.high_gp(), Operand(base, offset + 4)); in Load()
63 assm->movss(dst.fp(), src); in Load()
66 assm->movsd(dst.fp(), src); in Load()
73 inline void Store(LiftoffAssembler* assm, Register base, int32_t offset, in Store() argument
78 assm->mov(dst, src.gp()); in Store()
81 assm->mov(dst, src.low_gp()); in Store()
82 assm->mov(Operand(base, offset + 4), src.high_gp()); in Store()
85 assm->movss(dst, src.fp()); in Store()
88 assm->movsd(dst, src.fp()); in Store()
95 inline void push(LiftoffAssembler* assm, LiftoffRegister reg, ValueType type) { in push() argument
98 assm->push(reg.gp()); in push()
101 assm->push(reg.high_gp()); in push()
102 assm->push(reg.low_gp()); in push()
105 assm->sub(esp, Immediate(sizeof(float))); in push()
106 assm->movss(Operand(esp, 0), reg.fp()); in push()
109 assm->sub(esp, Immediate(sizeof(double))); in push()
110 assm->movsd(Operand(esp, 0), reg.fp()); in push()
118 inline void SpillRegisters(LiftoffAssembler* assm, Regs... regs) { in SpillRegisters() argument
120 if (assm->cache_state()->is_used(r)) assm->SpillRegister(r); in SpillRegisters()
490 void EmitCommutativeBinOp(LiftoffAssembler* assm, Register dst, Register lhs, in EmitCommutativeBinOp() argument
493 (assm->*op)(dst, lhs); in EmitCommutativeBinOp()
495 if (dst != lhs) assm->mov(dst, lhs); in EmitCommutativeBinOp()
496 (assm->*op)(dst, rhs); in EmitCommutativeBinOp()
508 void EmitInt32DivOrRem(LiftoffAssembler* assm, Register dst, Register lhs, in EmitInt32DivOrRem() argument
522 liftoff::SpillRegisters(assm, eax, edx); in EmitInt32DivOrRem()
525 Register tmp = assm->GetUnusedRegister(kGpReg, unavailable).gp(); in EmitInt32DivOrRem()
526 assm->mov(tmp, rhs); in EmitInt32DivOrRem()
531 assm->test(rhs, rhs); in EmitInt32DivOrRem()
532 assm->j(zero, trap_div_by_zero); in EmitInt32DivOrRem()
538 assm->cmp(rhs, -1); in EmitInt32DivOrRem()
539 assm->j(not_equal, &do_div); in EmitInt32DivOrRem()
540 assm->cmp(lhs, kMinInt); in EmitInt32DivOrRem()
541 assm->j(equal, trap_div_unrepresentable); in EmitInt32DivOrRem()
542 assm->bind(&do_div); in EmitInt32DivOrRem()
547 assm->cmp(rhs, -1); in EmitInt32DivOrRem()
548 assm->j(not_equal, &do_rem); in EmitInt32DivOrRem()
549 assm->xor_(dst, dst); in EmitInt32DivOrRem()
550 assm->jmp(&done); in EmitInt32DivOrRem()
551 assm->bind(&do_rem); in EmitInt32DivOrRem()
556 if (lhs != eax) assm->mov(eax, lhs); in EmitInt32DivOrRem()
558 assm->cdq(); in EmitInt32DivOrRem()
559 assm->idiv(rhs); in EmitInt32DivOrRem()
561 assm->xor_(edx, edx); in EmitInt32DivOrRem()
562 assm->div(rhs); in EmitInt32DivOrRem()
567 if (dst != kResultReg) assm->mov(dst, kResultReg); in EmitInt32DivOrRem()
568 if (special_case_minus_1) assm->bind(&done); in EmitInt32DivOrRem()
610 inline void EmitShiftOperation(LiftoffAssembler* assm, Register dst, in EmitShiftOperation() argument
619 Register tmp = assm->GetUnusedRegister(kGpReg, pinned).gp(); in EmitShiftOperation()
620 assm->mov(tmp, src); in EmitShiftOperation()
621 if (amount != ecx) assm->mov(ecx, amount); in EmitShiftOperation()
622 (assm->*emit_shift)(tmp); in EmitShiftOperation()
623 assm->mov(ecx, tmp); in EmitShiftOperation()
631 if (assm->cache_state()->is_used(LiftoffRegister(ecx)) || in EmitShiftOperation()
633 tmp_reg = assm->GetUnusedRegister(kGpReg, pinned).gp(); in EmitShiftOperation()
634 assm->mov(tmp_reg, ecx); in EmitShiftOperation()
637 assm->mov(ecx, amount); in EmitShiftOperation()
641 if (dst != src) assm->mov(dst, src); in EmitShiftOperation()
642 (assm->*emit_shift)(dst); in EmitShiftOperation()
645 if (tmp_reg.is_valid()) assm->mov(ecx, tmp_reg); in EmitShiftOperation()
711 inline void OpWithCarry(LiftoffAssembler* assm, LiftoffRegister dst, in OpWithCarry() argument
718 ? assm->GetUnusedRegister(kGpReg, keep_alive).gp() in OpWithCarry()
721 if (dst_low != lhs.low_gp()) assm->mov(dst_low, lhs.low_gp()); in OpWithCarry()
722 (assm->*op)(dst_low, rhs.low_gp()); in OpWithCarry()
727 ? assm->GetUnusedRegister(kGpReg, keep_alive).gp() in OpWithCarry()
730 if (dst_high != lhs.high_gp()) assm->mov(dst_high, lhs.high_gp()); in OpWithCarry()
731 (assm->*op_with_carry)(dst_high, rhs.high_gp()); in OpWithCarry()
735 if (tmp_result != dst) assm->Move(dst, tmp_result, kWasmI64); in OpWithCarry()
831 LiftoffAssembler* assm, LiftoffRegister dst, LiftoffRegister src, in Emit64BitShiftOperation() argument
841 ecx_replace = pinned.set(assm->GetUnusedRegister(kGpReg, pinned)).gp(); in Emit64BitShiftOperation()
847 assm->cache_state()->is_used(LiftoffRegister(ecx))) { in Emit64BitShiftOperation()
848 ecx_replace = assm->GetUnusedRegister(kGpReg, pinned).gp(); in Emit64BitShiftOperation()
849 assm->mov(ecx_replace, ecx); in Emit64BitShiftOperation()
852 assm->ParallelRegisterMove( in Emit64BitShiftOperation()
857 (assm->*emit_shift)(dst.high_gp(), dst.low_gp()); in Emit64BitShiftOperation()
860 if (ecx_replace != no_reg) assm->mov(ecx, ecx_replace); in Emit64BitShiftOperation()
945 inline void EmitFloatMinOrMax(LiftoffAssembler* assm, DoubleRegister dst, in EmitFloatMinOrMax() argument
955 Register tmp = assm->GetUnusedRegister(kGpReg).gp(); in EmitFloatMinOrMax()
960 assm->name##s(__VA_ARGS__); \ in EmitFloatMinOrMax()
962 assm->name##d(__VA_ARGS__); \ in EmitFloatMinOrMax()
969 assm->j(parity_even, &is_nan, Label::kNear); // PF=1 in EmitFloatMinOrMax()
970 assm->j(below, &lhs_below_rhs, Label::kNear); // CF=1 in EmitFloatMinOrMax()
971 assm->j(above, &lhs_above_rhs, Label::kNear); // CF=0 && ZF=0 in EmitFloatMinOrMax()
980 assm->test(tmp, Immediate(1)); in EmitFloatMinOrMax()
981 assm->j(zero, &lhs_below_rhs, Label::kNear); in EmitFloatMinOrMax()
982 assm->jmp(&lhs_above_rhs, Label::kNear); in EmitFloatMinOrMax()
984 assm->bind(&is_nan); in EmitFloatMinOrMax()
988 assm->jmp(&done, Label::kNear); in EmitFloatMinOrMax()
990 assm->bind(&lhs_below_rhs); in EmitFloatMinOrMax()
993 assm->jmp(&done, Label::kNear); in EmitFloatMinOrMax()
995 assm->bind(&lhs_above_rhs); in EmitFloatMinOrMax()
999 assm->bind(&done); in EmitFloatMinOrMax()
1185 inline void ConvertFloatToIntAndBack(LiftoffAssembler* assm, Register dst, in ConvertFloatToIntAndBack() argument
1191 assm->cvttsd2si(dst, src); in ConvertFloatToIntAndBack()
1192 assm->Cvtsi2sd(converted_back, dst); in ConvertFloatToIntAndBack()
1194 assm->Cvttsd2ui(dst, src, liftoff::kScratchDoubleReg); in ConvertFloatToIntAndBack()
1195 assm->Cvtui2sd(converted_back, dst); in ConvertFloatToIntAndBack()
1199 assm->cvttss2si(dst, src); in ConvertFloatToIntAndBack()
1200 assm->Cvtsi2ss(converted_back, dst); in ConvertFloatToIntAndBack()
1202 assm->Cvttss2ui(dst, src, liftoff::kScratchDoubleReg); in ConvertFloatToIntAndBack()
1203 assm->Cvtui2ss(converted_back, dst, in ConvertFloatToIntAndBack()
1204 assm->GetUnusedRegister(kGpReg, pinned).gp()); in ConvertFloatToIntAndBack()
1210 inline bool EmitTruncateFloatToInt(LiftoffAssembler* assm, Register dst, in EmitTruncateFloatToInt() argument
1213 assm->bailout("no SSE4.1"); in EmitTruncateFloatToInt()
1216 CpuFeatureScope feature(assm, SSE4_1); in EmitTruncateFloatToInt()
1220 pinned.set(assm->GetUnusedRegister(kFpReg, pinned)).fp(); in EmitTruncateFloatToInt()
1222 pinned.set(assm->GetUnusedRegister(kFpReg, pinned)).fp(); in EmitTruncateFloatToInt()
1225 assm->roundsd(rounded, src, kRoundToZero); in EmitTruncateFloatToInt()
1227 assm->roundss(rounded, src, kRoundToZero); in EmitTruncateFloatToInt()
1229 ConvertFloatToIntAndBack<dst_type, src_type>(assm, dst, rounded, in EmitTruncateFloatToInt()
1232 assm->ucomisd(converted_back, rounded); in EmitTruncateFloatToInt()
1234 assm->ucomiss(converted_back, rounded); in EmitTruncateFloatToInt()
1239 assm->j(parity_even, trap); in EmitTruncateFloatToInt()
1240 assm->j(not_equal, trap); in EmitTruncateFloatToInt()
1348 inline Register GetTmpByteRegister(LiftoffAssembler* assm, Register candidate) { in GetTmpByteRegister() argument
1353 return assm->GetUnusedRegister(liftoff::kByteRegs, pinned).gp(); in GetTmpByteRegister()
1358 inline void setcc_32_no_spill(LiftoffAssembler* assm, Condition cond, in setcc_32_no_spill() argument
1360 assm->setcc(cond, tmp_byte_reg); in setcc_32_no_spill()
1361 assm->movzx_b(dst, tmp_byte_reg); in setcc_32_no_spill()
1365 inline void setcc_32(LiftoffAssembler* assm, Condition cond, Register dst) { in setcc_32() argument
1366 Register tmp_byte_reg = GetTmpByteRegister(assm, dst); in setcc_32()
1367 setcc_32_no_spill(assm, cond, dst, tmp_byte_reg); in setcc_32()
1443 void EmitFloatSetCond(LiftoffAssembler* assm, Condition cond, Register dst, in EmitFloatSetCond() argument
1450 Register tmp_byte_reg = GetTmpByteRegister(assm, dst); in EmitFloatSetCond()
1452 (assm->*cmp_op)(lhs, rhs); in EmitFloatSetCond()
1454 assm->j(parity_odd, ¬_nan, Label::kNear); in EmitFloatSetCond()
1457 assm->mov(dst, Immediate(1)); in EmitFloatSetCond()
1459 assm->xor_(dst, dst); in EmitFloatSetCond()
1461 assm->jmp(&cont, Label::kNear); in EmitFloatSetCond()
1462 assm->bind(¬_nan); in EmitFloatSetCond()
1464 setcc_32_no_spill(assm, cond, dst, tmp_byte_reg); in EmitFloatSetCond()
1465 assm->bind(&cont); in EmitFloatSetCond()