void IRTranslator::translateCheckTypeCOp(const NormalizedInstruction& ni) { auto const op = static_cast<IsTypeOp>(ni.imm[0].u_OA); if (op == IsTypeOp::Scalar) { HHIR_EMIT(IsScalarC); } else { DataType t = typeOpToDataType(op); HHIR_EMIT(IsTypeC, t); } }
void emitIsTypeC(IRGS& env, IsTypeOp subop) { if (subop == IsTypeOp::Scalar) return implIsScalarC(env); auto const t = typeOpToDataType(subop); auto const src = popC(env, DataTypeSpecific); if (t == KindOfObject) { push(env, optimizedCallIsObject(env, src)); } else { push(env, gen(env, IsType, Type(t), src)); } decRef(env, src); }
void emitIsTypeL(IRGS& env, int32_t id, IsTypeOp subop) { if (subop == IsTypeOp::Scalar) return implIsScalarL(env, id); auto const t = typeOpToDataType(subop); auto const ldrefExit = makeExit(env); auto const ldPMExit = makePseudoMainExit(env); auto const val = ldLocInnerWarn(env, id, ldrefExit, ldPMExit, DataTypeSpecific); if (t == KindOfObject) { push(env, optimizedCallIsObject(env, val)); } else { push(env, gen(env, IsType, Type(t), val)); } }