15 const Instruction*
instr)
const {
16 switch (
instr->arch_opcode()) {
17 case kRiscvEnableDebugTrace:
18 case kRiscvDisableDebugTrace:
19#if V8_TARGET_ARCH_RISCV64
23 case kRiscvByteSwap64:
29 case kRiscvMulHighU64:
35 case kRiscvZeroExtendWord:
36 case kRiscvSignExtendWord:
47 case kRiscvFloat64RoundDown:
48 case kRiscvFloat64RoundTiesEven:
49 case kRiscvFloat64RoundTruncate:
50 case kRiscvFloat64RoundUp:
58#elif V8_TARGET_ARCH_RISCV32
76#if V8_TARGET_ARCH_RISCV64
89#if V8_TARGET_ARCH_RISCV64
116 case kRiscvAssertEqual:
117 case kRiscvBitcastInt32ToFloat32:
118 case kRiscvBitcastFloat32ToInt32:
119 case kRiscvByteSwap32:
133 case kRiscvMulHighU32:
139 case kRiscvF64x2Sqrt:
140 case kRiscvF64x2Pmin:
141 case kRiscvF64x2Pmax:
142 case kRiscvF64x2ConvertLowI32x4S:
143 case kRiscvF64x2ConvertLowI32x4U:
144 case kRiscvF64x2PromoteLowF32x4:
145 case kRiscvF64x2Ceil:
146 case kRiscvF64x2Floor:
147 case kRiscvF64x2Trunc:
148 case kRiscvF64x2NearestInt:
149 case kRiscvI64x2SplatI32Pair:
150 case kRiscvI64x2ExtractLane:
151 case kRiscvI64x2ReplaceLane:
152 case kRiscvI64x2ReplaceLaneI32Pair:
154 case kRiscvI64x2ShrS:
155 case kRiscvI64x2ShrU:
157 case kRiscvF32x4ExtractLane:
158 case kRiscvF32x4Sqrt:
159 case kRiscvF64x2Qfma:
160 case kRiscvF64x2Qfms:
161 case kRiscvF32x4Qfma:
162 case kRiscvF32x4Qfms:
163 case kRiscvF32x4ReplaceLane:
164 case kRiscvF32x4SConvertI32x4:
165 case kRiscvF32x4UConvertI32x4:
166 case kRiscvF32x4Pmin:
167 case kRiscvF32x4Pmax:
168 case kRiscvF32x4DemoteF64x2Zero:
169 case kRiscvF32x4Ceil:
170 case kRiscvF32x4Floor:
171 case kRiscvF32x4Trunc:
172 case kRiscvF32x4NearestInt:
173 case kRiscvF64x2ExtractLane:
174 case kRiscvF64x2ReplaceLane:
175 case kRiscvFloat32Max:
176 case kRiscvFloat32Min:
177 case kRiscvFloat32RoundDown:
178 case kRiscvFloat32RoundTiesEven:
179 case kRiscvFloat32RoundTruncate:
180 case kRiscvFloat32RoundUp:
181 case kRiscvFloat64ExtractLowWord32:
182 case kRiscvFloat64ExtractHighWord32:
183 case kRiscvFloat64InsertLowWord32:
184 case kRiscvFloat64InsertHighWord32:
185 case kRiscvFloat64Max:
186 case kRiscvFloat64Min:
187 case kRiscvFloat64SilenceNaN:
190 case kRiscvI64x2SConvertI32x4Low:
191 case kRiscvI64x2SConvertI32x4High:
192 case kRiscvI64x2UConvertI32x4Low:
193 case kRiscvI64x2UConvertI32x4High:
194 case kRiscvI16x8ExtractLaneU:
195 case kRiscvI16x8ExtractLaneS:
196 case kRiscvI16x8ReplaceLane:
198 case kRiscvI16x8ShrS:
199 case kRiscvI16x8ShrU:
200 case kRiscvI32x4TruncSatF64x2SZero:
201 case kRiscvI32x4TruncSatF64x2UZero:
202 case kRiscvI32x4ExtractLane:
203 case kRiscvI32x4ReplaceLane:
204 case kRiscvI32x4SConvertF32x4:
206 case kRiscvI32x4ShrS:
207 case kRiscvI32x4ShrU:
208 case kRiscvI32x4UConvertF32x4:
209 case kRiscvI8x16ExtractLaneU:
210 case kRiscvI8x16ExtractLaneS:
211 case kRiscvI8x16ReplaceLane:
213 case kRiscvI8x16ShrS:
214 case kRiscvI8x16ShrU:
215 case kRiscvI8x16RoundingAverageU:
216 case kRiscvI8x16Popcnt:
226 case kRiscvMulHigh32:
237 case kRiscvS128Select:
238 case kRiscvS128Const:
240 case kRiscvS128Load32Zero:
241 case kRiscvS128Load64Zero:
242 case kRiscvS128AllOnes:
243 case kRiscvV128AnyTrue:
244 case kRiscvI8x16Shuffle:
255 case kRiscvVcompress:
278 case kRiscvVaddSatUVv:
279 case kRiscvVaddSatSVv:
280 case kRiscvVsubSatUVv:
281 case kRiscvVsubSatSVv:
283 case kRiscvVslidedown:
284 case kRiscvVredminuVs:
303 case kRiscvSignExtendByte:
304 case kRiscvSignExtendShort:
319#if V8_TARGET_ARCH_RISCV64
324 case kRiscvWord64AtomicLoadUint64:
325 case kRiscvLoadDecompressTaggedSigned:
326 case kRiscvLoadDecompressTagged:
327 case kRiscvLoadDecodeSandboxedPointer:
328 case kRiscvAtomicLoadDecompressTaggedSigned:
329 case kRiscvAtomicLoadDecompressTagged:
330 case kRiscvAtomicStoreCompressTagged:
331 case kRiscvLoadDecompressProtected:
332#elif V8_TARGET_ARCH_RISCV32
333 case kRiscvWord32AtomicPairLoad:
337 case kRiscvLoadDouble:
341 case kRiscvLoadFloat:
345 case kRiscvULoadDouble:
349 case kRiscvULoadFloat:
350 case kRiscvS128LoadSplat:
351 case kRiscvS128Load64ExtendU:
352 case kRiscvS128Load64ExtendS:
353 case kRiscvS128LoadLane:
356#if V8_TARGET_ARCH_RISCV64
359 case kRiscvWord64AtomicStoreWord64:
360 case kRiscvWord64AtomicAddUint64:
361 case kRiscvWord64AtomicSubUint64:
362 case kRiscvWord64AtomicAndUint64:
363 case kRiscvWord64AtomicOrUint64:
364 case kRiscvWord64AtomicXorUint64:
365 case kRiscvWord64AtomicExchangeUint64:
366 case kRiscvWord64AtomicCompareExchangeUint64:
367 case kRiscvStoreCompressTagged:
368 case kRiscvStoreEncodeSandboxedPointer:
369 case kRiscvStoreIndirectPointer:
370#elif V8_TARGET_ARCH_RISCV32
371 case kRiscvWord32AtomicPairStore:
372 case kRiscvWord32AtomicPairAdd:
373 case kRiscvWord32AtomicPairSub:
374 case kRiscvWord32AtomicPairAnd:
375 case kRiscvWord32AtomicPairOr:
376 case kRiscvWord32AtomicPairXor:
377 case kRiscvWord32AtomicPairExchange:
378 case kRiscvWord32AtomicPairCompareExchange:
385 case kRiscvStoreDouble:
387 case kRiscvStackClaim:
388 case kRiscvStoreToStackSlot:
390 case kRiscvStoreFloat:
391 case kRiscvUStoreDouble:
394 case kRiscvUStoreFloat:
396 case kRiscvS128StoreLane:
399#define CASE(Name) case k##Name:
547 int latency = Latency::ADD;
548 if (!is_operand_register) {
561int AndLatency(
bool is_operand_register =
true) {
565int OrLatency(
bool is_operand_register =
true) {
569int NorLatency(
bool is_operand_register =
true) {
570 if (is_operand_register) {
577int XorLatency(
bool is_operand_register =
true) {
582 if (is_operand_register) {
583 return Latency::MULW;
585 return Latency::MULW + 1;
590 int latency = Latency::MUL;
591 if (!is_operand_register) {
599 if (!is_operand_register) {
607 if (!is_operand_register) {
616 int latency = Latency::MULH;
617 if (!is_operand_register) {
624 if (is_operand_register) {
625 return Latency::DIVW;
627 return Latency::DIVW + 1;
632 if (is_operand_register) {
633 return Latency::DIVUW;
640 int latency = Latency::DIV;
641 if (!is_operand_register) {
648 int latency = Latency::DIVU;
649 if (!is_operand_register) {
656 int latency = Latency::DIVW;
657 if (!is_operand_register) {
664 int latency = Latency::DIVUW;
665 if (!is_operand_register) {
672 int latency = Latency::DIV;
673 if (!is_operand_register) {
680 int latency = Latency::DIV;
681 if (!is_operand_register) {
706 Latency::BRANCH + 2 *
Sub64Latency(
false) + 2 + Latency::BRANCH + 1;
843 return Latency::BRANCH;
868 return 2 + Latency::TRUNC_W_D + Latency::MOVF_FREG + 2 +
AndLatency(
false) +
887 if (is_operand_register) {
947 Latency::MOVF_FREG + 1 +
XorLatency() + Latency::MOVT_FREG;
953 Latency::MOVF_HIGH_DREG + 1 +
XorLatency() + Latency::MOVT_DREG;
956#if V8_TARGET_ARCH_RISCV64
959 return Latency::MOVF_HIGH_DREG + 1 + Latency::BRANCH + Latency::MOV_D + 4 +
960 Latency::MOVF_HIGH_DREG + Latency::BRANCH + Latency::CVT_D_L + 2 +
961 Latency::MOVT_HIGH_FREG;
966 return Latency::MOVF_FREG + 1 + Latency::BRANCH + Latency::MOV_S + 4 +
967 Latency::MOVF_FREG + Latency::BRANCH + Latency::CVT_S_W + 2 +
975 Latency::MOVF_FREG + 1 + Latency::MOV_S;
982 Latency::MOVF_HIGH_DREG + Latency::MOV_D;
989 Latency::MOVF_FREG + 1 + Latency::MOV_S;
996 Latency::MOVF_HIGH_DREG + Latency::MOV_D;
1000 int latency = Latency::TRUNC_L_S + Latency::MOVF_HIGH_DREG;
1008 int latency = Latency::TRUNC_L_D + Latency::MOVF_HIGH_DREG;
1018 4 * Latency::BRANCH + Latency::SUB_S + 2 * Latency::TRUNC_L_S +
1019 3 * Latency::MOVF_HIGH_DREG +
OrLatency() + Latency::MOVT_FREG +
1026 4 * Latency::BRANCH + Latency::SUB_D + 2 * Latency::TRUNC_L_D +
1027 3 * Latency::MOVF_HIGH_DREG +
OrLatency() + Latency::MOVT_DREG +
1036 bool is_one_instruction = is_int12(
offset);
1037 if (is_one_instruction) {
1079 switch (
instr->arch_opcode()) {
1080 case kArchCallCodeObject:
1081 case kArchCallWasmFunction:
1083 case kArchTailCallCodeObject:
1084 case kArchTailCallWasm:
1085 case kArchTailCallAddress:
1087 case kArchCallJSFunction: {
1094 case kArchPrepareCallCFunction:
1096 case kArchSaveCallerRegisters: {
1101 case kArchRestoreCallerRegisters: {
1106 case kArchPrepareTailCall:
1108 case kArchCallCFunction:
1112 case kArchTableSwitch:
1114 case kArchAbortCSADcheck:
1116 case kArchDebugBreak:
1120 case kArchThrowTerminator:
1121 case kArchDeoptimize:
1125 case kArchFramePointer:
1127 case kArchParentFramePointer:
1130 case kArchTruncateDoubleToI:
1132 case kArchStoreWithWriteBarrier:
1134 case kArchStackSlot:
1139 case kIeee754Float64Acos:
1140 case kIeee754Float64Acosh:
1141 case kIeee754Float64Asin:
1142 case kIeee754Float64Asinh:
1143 case kIeee754Float64Atan:
1144 case kIeee754Float64Atanh:
1145 case kIeee754Float64Atan2:
1146 case kIeee754Float64Cos:
1147 case kIeee754Float64Cosh:
1148 case kIeee754Float64Cbrt:
1149 case kIeee754Float64Exp:
1150 case kIeee754Float64Expm1:
1151 case kIeee754Float64Log:
1152 case kIeee754Float64Log1p:
1153 case kIeee754Float64Log10:
1154 case kIeee754Float64Log2:
1155 case kIeee754Float64Pow:
1156 case kIeee754Float64Sin:
1157 case kIeee754Float64Sinh:
1158 case kIeee754Float64Tan:
1159 case kIeee754Float64Tanh:
1162#if V8_TARGET_ARCH_RISCV64
1166 case kRiscvAddOvf64:
1171 case kRiscvSubOvf64:
1173 case kRiscvMulHigh64:
1177 case kRiscvMulOvf64:
1183 case kRiscvDivU64: {
1191#elif V8_TARGET_ARCH_RISCV32
1203 case kRiscvMulOvf32:
1205 case kRiscvMulHigh32:
1207 case kRiscvMulHighU32:
1213 case kRiscvDivU32: {
1224 bool is_operand_register =
instr->InputAt(1)->IsRegister();
1225 int latency =
AndLatency(is_operand_register);
1226 if (is_operand_register) {
1235 bool is_operand_register =
instr->InputAt(1)->IsRegister();
1236 int latency =
OrLatency(is_operand_register);
1237 if (is_operand_register) {
1246 bool is_operand_register =
instr->InputAt(1)->IsRegister();
1247 int latency =
XorLatency(is_operand_register);
1248 if (is_operand_register) {
1255#if V8_TARGET_ARCH_RISCV64
1263#if V8_TARGET_ARCH_RISCV64
1264 case kRiscvZeroExtendWord:
1267#if V8_TARGET_ARCH_RISCV64
1268 case kRiscvSignExtendWord:
1284 return Latency::ADD_S;
1286 return Latency::SUB_S;
1288 return Latency::MUL_S;
1290 return Latency::DIV_S;
1295 return Latency::ABS_S;
1299 return Latency::SQRT_S;
1301 return Latency::MAX_S;
1303 return Latency::MIN_S;
1307 return Latency::ADD_D;
1309 return Latency::SUB_D;
1311 return Latency::MUL_D;
1313 return Latency::DIV_D;
1318 return Latency::ABS_D;
1322 return Latency::SQRT_D;
1324 return Latency::MAX_D;
1326 return Latency::MIN_D;
1327#if V8_TARGET_ARCH_RISCV64
1328 case kRiscvFloat64RoundDown:
1329 case kRiscvFloat64RoundTruncate:
1330 case kRiscvFloat64RoundUp:
1331 case kRiscvFloat64RoundTiesEven:
1334 case kRiscvFloat32RoundDown:
1335 case kRiscvFloat32RoundTruncate:
1336 case kRiscvFloat32RoundUp:
1337 case kRiscvFloat32RoundTiesEven:
1339 case kRiscvFloat32Max:
1341 case kRiscvFloat64Max:
1343 case kRiscvFloat32Min:
1345 case kRiscvFloat64Min:
1347 case kRiscvFloat64SilenceNaN:
1348 return Latency::SUB_D;
1350 return Latency::CVT_S_D;
1352 return Latency::CVT_D_S;
1354 return Latency::MOVT_FREG + Latency::CVT_D_W;
1356 return Latency::MOVT_FREG + Latency::CVT_S_W;
1358 return 1 + Latency::MOVT_DREG + Latency::CVT_S_L;
1359#if V8_TARGET_ARCH_RISCV64
1361 return Latency::MOVT_DREG + Latency::CVT_S_L;
1363 return Latency::MOVT_DREG + Latency::CVT_D_L;
1365 return 2 * Latency::BRANCH + 3 + 2 * Latency::MOVT_DREG +
1366 2 * Latency::CVT_D_L + Latency::ADD_D;
1368 return 2 * Latency::BRANCH + 3 + 2 * Latency::MOVT_DREG +
1369 2 * Latency::CVT_S_L + Latency::ADD_S;
1372 return 1 + Latency::MOVT_DREG + Latency::CVT_D_L;
1374 return Latency::FLOOR_W_D + Latency::MOVF_FREG;
1376 return Latency::CEIL_W_D + Latency::MOVF_FREG;
1378 return Latency::ROUND_W_D + Latency::MOVF_FREG;
1380 return Latency::TRUNC_W_D + Latency::MOVF_FREG;
1382 return Latency::FLOOR_W_S + Latency::MOVF_FREG;
1384 return Latency::CEIL_W_S + Latency::MOVF_FREG;
1386 return Latency::ROUND_W_S + Latency::MOVF_FREG;
1388 return Latency::TRUNC_W_S + Latency::MOVF_FREG + 2 +
MovnLatency();
1389#if V8_TARGET_ARCH_RISCV64
1394 case kRiscvTruncUlS:
1396 case kRiscvTruncUlD:
1398 case kRiscvBitcastDL:
1399 return Latency::MOVF_HIGH_DREG;
1400 case kRiscvBitcastLD:
1401 return Latency::MOVT_DREG;
1403 case kRiscvTruncUwD:
1406 2 * Latency::TRUNC_W_D + Latency::SUB_D +
OrLatency() +
1407 Latency::MOVT_FREG + Latency::MOVF_FREG + Latency::MOVT_HIGH_FREG +
1409 case kRiscvTruncUwS:
1412 2 * Latency::TRUNC_W_S + Latency::SUB_S +
OrLatency() +
1413 Latency::MOVT_FREG + 2 * Latency::MOVF_FREG + 2 +
MovzLatency();
1414 case kRiscvFloat64ExtractLowWord32:
1415 return Latency::MOVF_FREG;
1416 case kRiscvFloat64InsertLowWord32:
1417 return Latency::MOVF_HIGH_FREG + Latency::MOVT_FREG +
1418 Latency::MOVT_HIGH_FREG;
1419 case kRiscvFloat64ExtractHighWord32:
1420 return Latency::MOVF_HIGH_FREG;
1421 case kRiscvFloat64InsertHighWord32:
1422 return Latency::MOVT_HIGH_FREG;
1423 case kRiscvSignExtendByte:
1424 case kRiscvSignExtendShort:
1431#if V8_TARGET_ARCH_RISCV64
1440 case kRiscvLoadFloat:
1442 case kRiscvLoadDouble:
1444 case kRiscvStoreFloat:
1446 case kRiscvStoreDouble:
1451#if V8_TARGET_ARCH_RISCV64
1461 case kRiscvULoadFloat:
1463 case kRiscvULoadDouble:
1469 case kRiscvUStoreFloat:
1471 case kRiscvUStoreDouble:
1475 if (
instr->InputAt(0)->IsFPRegister()) {
1484 if (
instr->OutputAt(0)->IsFPRegister()) {
1486 switch (op->representation()) {
1491 latency = Latency::LOAD_FLOAT;
1501 case kRiscvStackClaim:
1503 case kRiscvStoreToStackSlot: {
1505 if (
instr->InputAt(0)->IsFPRegister()) {
1506 if (
instr->InputAt(0)->IsSimd128Register()) {
1516 case kAtomicLoadInt8:
1517 case kAtomicLoadUint8:
1518 case kAtomicLoadInt16:
1519 case kAtomicLoadUint16:
1520 case kAtomicLoadWord32:
1522 case kAtomicStoreWord8:
1523 case kAtomicStoreWord16:
1524 case kAtomicStoreWord32:
1526 case kAtomicExchangeInt8:
1528 case kAtomicExchangeUint8:
1530 case kAtomicExchangeInt16:
1532 case kAtomicExchangeUint16:
1534 case kAtomicExchangeWord32:
1536 case kAtomicCompareExchangeInt8:
1538 case kAtomicCompareExchangeUint8:
1540 case kAtomicCompareExchangeInt16:
1542 case kAtomicCompareExchangeUint16:
1544 case kAtomicCompareExchangeWord32:
1547 case kRiscvAssertEqual:
1549#ifdef V8_TARGET_ARCH_RISCV64
1550 case kRiscvLoadDecompressProtected:
static constexpr T decode(U value)
static int ActivationFrameAlignment()
static bool IsSupported(CpuFeature f)
static int ActivationFrameAlignment()
static bool SchedulerSupported()
int GetTargetInstructionFlags(const Instruction *instr) const
static int GetInstructionLatency(const Instruction *instr)
static LocationOperand * cast(InstructionOperand *op)
#define COMMON_ARCH_OPCODE_LIST(V)
int AlignedMemoryLatency()
int NorLatency(bool is_operand_register=true)
int MultiPushFPULatency()
int Modu32Latency(bool is_operand_register=true)
int LoadConstantLatency()
int SubOverflow64Latency()
int TruncateDoubleToIDelayedLatency()
int Divu64Latency(bool is_operand_register=true)
int Float32RoundLatency()
int CompareIsNanF32Latency()
int Word32AtomicExchangeLatency(bool sign_extend, int size)
int AdjustBaseAndOffsetLatency()
int PrepareCallCFunctionLatency()
int ExtractBitsLatency(bool sign_extend, int size)
int CallCFunctionLatency()
int LlLatency(int offset)
int MulOverflow64Latency()
int Div32Latency(bool is_operand_register=true)
int TryInlineTruncateDoubleToILatency()
int Mul64Latency(bool is_operand_register=true)
int TruncLDLatency(bool load_status)
int Div64Latency(bool is_operand_register=true)
int AssembleArchTableSwitchLatency()
int ByteSwapSignedLatency()
int CompareIsNanF64Latency()
int AssemblePopArgumentsAdoptFrameLatency()
int ScLatency(int offset)
int OrLatency(bool is_operand_register=true)
int MulOverflow32Latency()
int MovFromFloatResultLatency()
int AddOverflow64Latency()
int AssemblerReturnLatency()
int Float64RoundLatency()
int PopCallerSavedLatency(SaveFPRegsMode fp_mode)
int Add64Latency(bool is_operand_register=true)
int XorLatency(bool is_operand_register=true)
int CheckPageFlagLatency()
int UStoreDoubleLatency()
int Mulhu32Latency(bool is_operand_register=true)
int Mulh64Latency(bool is_operand_register=true)
int Sub64Latency(bool is_operand_register=true)
int MovToFloatParametersLatency()
int Modu64Latency(bool is_operand_register=true)
int AssembleArchJumpLatency()
int Mod64Latency(bool is_operand_register=true)
int Mod32Latency(bool is_operand_register=true)
int CompareIsNanFLatency()
int AndLatency(bool is_operand_register=true)
int ShiftLatency(bool is_operand_register=true)
int Divu32Latency(bool is_operand_register=true)
int BranchShortHelperLatency()
int PushCallerSavedLatency(SaveFPRegsMode fp_mode)
int Word32AtomicCompareExchangeLatency(bool sign_extend, int size)
int TruncLSLatency(bool load_status)
int SltuLatency(bool is_operand_register=true)
int CallCFunctionHelperLatency()
int PrepareForTailCallLatency()
int Mulh32Latency(bool is_operand_register=true)
int GenerateSwitchTableLatency()
int CallStubDelayedLatency()
int Mul32Latency(bool is_operand_register=true)
constexpr int kSystemPointerSize
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr int kNumRegisters