diff --git a/js/src/jit/CacheIROps.yaml b/js/src/jit/CacheIROps.yaml index e65c7b926f29..ecca61e17ddc 100644 --- a/js/src/jit/CacheIROps.yaml +++ b/js/src/jit/CacheIROps.yaml @@ -158,7 +158,7 @@ - name: GuardType shared: true - transpile: false + transpile: true args: input: ValId type: ValueTypeImm diff --git a/js/src/jit/WarpCacheIRTranspiler.cpp b/js/src/jit/WarpCacheIRTranspiler.cpp index c8f0405979cb..307ce6ee21b8 100644 --- a/js/src/jit/WarpCacheIRTranspiler.cpp +++ b/js/src/jit/WarpCacheIRTranspiler.cpp @@ -205,6 +205,36 @@ bool WarpCacheIRTranspiler::emitGuardSpecificAtom(StringOperandId strId, return true; } +bool WarpCacheIRTranspiler::emitGuardType(ValOperandId inputId, + ValueType type) { + switch (type) { + case ValueType::String: + case ValueType::Symbol: + case ValueType::BigInt: + case ValueType::Int32: + case ValueType::Double: + case ValueType::Boolean: + return emitGuardTo(inputId, MIRTypeFromValueType(JSValueType(type))); + case ValueType::Undefined: { + auto* ins = + MGuardValue::New(alloc(), getOperand(inputId), UndefinedValue()); + add(ins); + return true; + } + case ValueType::Null: { + auto* ins = MGuardValue::New(alloc(), getOperand(inputId), NullValue()); + add(ins); + return true; + } + case ValueType::Magic: + case ValueType::PrivateGCThing: + case ValueType::Object: + break; + } + + MOZ_CRASH("unexpected type"); +} + bool WarpCacheIRTranspiler::emitGuardTo(ValOperandId inputId, MIRType type) { MDefinition* def = getOperand(inputId); if (def->type() == type) {