Index: src/compiler/simplified-operator.cc |
diff --git a/src/compiler/simplified-operator.cc b/src/compiler/simplified-operator.cc |
index ee03ba07bc755cb3d8f8b7992cc4875743b3a4e2..216ce9f7264ca29fa1e6be68ad767bc5fdd8ebe2 100644 |
--- a/src/compiler/simplified-operator.cc |
+++ b/src/compiler/simplified-operator.cc |
@@ -337,6 +337,16 @@ PretenureFlag PretenureFlagOf(const Operator* op) { |
return OpParameter<PretenureFlag>(op); |
} |
+StringOperationHint StringOperationHintOf(const Operator* op) { |
+ DCHECK(op->opcode() == IrOpcode::kStringCharCodeAt); |
+ return OpParameter<StringOperationHint>(op); |
+} |
+ |
+UnicodeEncoding UnicodeEncodingOf(const Operator* op) { |
+ DCHECK(op->opcode() == IrOpcode::kStringFromCodePoint); |
+ return OpParameter<UnicodeEncoding>(op); |
+} |
+ |
#define PURE_OP_LIST(V) \ |
V(BooleanNot, Operator::kNoProperties, 1, 0) \ |
V(NumberEqual, Operator::kCommutative, 2, 0) \ |
@@ -390,7 +400,6 @@ PretenureFlag PretenureFlagOf(const Operator* op) { |
V(NumberToInt32, Operator::kNoProperties, 1, 0) \ |
V(NumberToUint32, Operator::kNoProperties, 1, 0) \ |
V(NumberSilenceNaN, Operator::kNoProperties, 1, 0) \ |
- V(StringCharCodeAt, Operator::kNoProperties, 2, 1) \ |
V(StringFromCharCode, Operator::kNoProperties, 1, 0) \ |
V(PlainPrimitiveToNumber, Operator::kNoProperties, 1, 0) \ |
V(PlainPrimitiveToWord32, Operator::kNoProperties, 1, 0) \ |
@@ -468,6 +477,28 @@ struct SimplifiedOperatorGlobalCache final { |
CHECKED_OP_LIST(CHECKED) |
#undef CHECKED |
+ template <StringOperationHint kHint> |
+ struct StringCharCodeAtOperator final : public Operator { |
+ StringCharCodeAtOperator() |
+ : Operator(IrOpcode::kStringCharCodeAt, Operator::kPure, |
+ "StringCharCodeAt", 2, 0, 1, 1, 0, 0) {} |
+ }; |
+ StringCharCodeAtOperator<StringOperationHint::kAny> |
+ kStringCharCodeAtOperatorAny; |
+ StringCharCodeAtOperator<StringOperationHint::kSeqStringOrExternalString> |
+ kStringCharCodeAtOperatorSeqStringOrExternalString; |
+ |
+ template <UnicodeEncoding kEncoding> |
+ struct StringFromCodePointOperator final : public Operator { |
+ StringFromCodePointOperator() |
+ : Operator(IrOpcode::kStringFromCodePoint, Operator::kPure, |
+ "StringFromCodePoint", 1, 0, 0, 1, 0, 0) {} |
+ }; |
+ StringFromCodePointOperator<UnicodeEncoding::UTF16> |
+ kStringFromCodePointOperatorUTF16; |
+ StringFromCodePointOperator<UnicodeEncoding::UTF32> |
+ kStringFromCodePointOperatorUTF32; |
+ |
struct ArrayBufferWasNeuteredOperator final : public Operator { |
ArrayBufferWasNeuteredOperator() |
: Operator(IrOpcode::kArrayBufferWasNeutered, Operator::kEliminatable, |
@@ -779,6 +810,30 @@ const Operator* SimplifiedOperatorBuilder::StoreBuffer(BufferAccess access) { |
return nullptr; |
} |
+const Operator* SimplifiedOperatorBuilder::StringCharCodeAt( |
+ StringOperationHint hint) { |
+ switch (hint) { |
+ case StringOperationHint::kAny: |
+ return &cache_.kStringCharCodeAtOperatorAny; |
+ case StringOperationHint::kSeqStringOrExternalString: |
+ return &cache_.kStringCharCodeAtOperatorSeqStringOrExternalString; |
+ } |
+ UNREACHABLE(); |
+ return nullptr; |
+} |
+ |
+const Operator* SimplifiedOperatorBuilder::StringFromCodePoint( |
+ UnicodeEncoding encoding) { |
+ switch (encoding) { |
+ case UnicodeEncoding::UTF16: |
+ return &cache_.kStringFromCodePointOperatorUTF16; |
+ case UnicodeEncoding::UTF32: |
+ return &cache_.kStringFromCodePointOperatorUTF32; |
+ } |
+ UNREACHABLE(); |
+ return nullptr; |
+} |
+ |
#define SPECULATIVE_NUMBER_BINOP(Name) \ |
const Operator* SimplifiedOperatorBuilder::Name(NumberOperationHint hint) { \ |
switch (hint) { \ |