@@ -925,11 +925,11 @@ bool FlowGraphBuilder::IsRecognizedMethodForFlowGraph(
925
925
case MethodRecognizer::kRecord_numFields :
926
926
case MethodRecognizer::kSuspendState_clone :
927
927
case MethodRecognizer::kSuspendState_resume :
928
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy1 :
929
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy2 :
930
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy4 :
931
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy8 :
932
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy16 :
928
+ case MethodRecognizer::kTypedData_memMove1 :
929
+ case MethodRecognizer::kTypedData_memMove2 :
930
+ case MethodRecognizer::kTypedData_memMove4 :
931
+ case MethodRecognizer::kTypedData_memMove8 :
932
+ case MethodRecognizer::kTypedData_memMove16 :
933
933
case MethodRecognizer::kTypedData_ByteDataView_factory :
934
934
case MethodRecognizer::kTypedData_Int8ArrayView_factory :
935
935
case MethodRecognizer::kTypedData_Uint8ArrayView_factory :
@@ -1138,26 +1138,21 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
1138
1138
body += TailCall (resume_stub);
1139
1139
break ;
1140
1140
}
1141
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy1 :
1141
+ case MethodRecognizer::kTypedData_memMove1 :
1142
1142
// Pick an appropriate typed data cid based on the element size.
1143
- body +=
1144
- BuildTypedDataCheckBoundsAndMemcpy (function, kTypedDataUint8ArrayCid );
1143
+ body += BuildTypedDataMemMove (function, kTypedDataUint8ArrayCid );
1145
1144
break ;
1146
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy2 :
1147
- body += BuildTypedDataCheckBoundsAndMemcpy (function,
1148
- kTypedDataUint16ArrayCid );
1145
+ case MethodRecognizer::kTypedData_memMove2 :
1146
+ body += BuildTypedDataMemMove (function, kTypedDataUint16ArrayCid );
1149
1147
break ;
1150
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy4 :
1151
- body += BuildTypedDataCheckBoundsAndMemcpy (function,
1152
- kTypedDataUint32ArrayCid );
1148
+ case MethodRecognizer::kTypedData_memMove4 :
1149
+ body += BuildTypedDataMemMove (function, kTypedDataUint32ArrayCid );
1153
1150
break ;
1154
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy8 :
1155
- body += BuildTypedDataCheckBoundsAndMemcpy (function,
1156
- kTypedDataUint64ArrayCid );
1151
+ case MethodRecognizer::kTypedData_memMove8 :
1152
+ body += BuildTypedDataMemMove (function, kTypedDataUint64ArrayCid );
1157
1153
break ;
1158
- case MethodRecognizer::kTypedData_checkBoundsAndMemcpy16 :
1159
- body += BuildTypedDataCheckBoundsAndMemcpy (function,
1160
- kTypedDataInt32x4ArrayCid );
1154
+ case MethodRecognizer::kTypedData_memMove16 :
1155
+ body += BuildTypedDataMemMove (function, kTypedDataInt32x4ArrayCid );
1161
1156
break ;
1162
1157
#define CASE (name ) \
1163
1158
case MethodRecognizer::kTypedData_ ##name##_factory: \
@@ -1758,33 +1753,16 @@ Fragment FlowGraphBuilder::BuildTypedDataViewFactoryConstructor(
1758
1753
return body;
1759
1754
}
1760
1755
1761
- Fragment FlowGraphBuilder::BuildTypedDataCheckBoundsAndMemcpy (
1762
- const Function& function,
1763
- intptr_t cid) {
1756
+ Fragment FlowGraphBuilder::BuildTypedDataMemMove (const Function& function,
1757
+ intptr_t cid) {
1764
1758
ASSERT_EQUAL (parsed_function_->function ().NumParameters (), 5 );
1765
1759
LocalVariable* arg_to = parsed_function_->RawParameterVariable (0 );
1766
1760
LocalVariable* arg_to_start = parsed_function_->RawParameterVariable (1 );
1767
- LocalVariable* arg_to_end = parsed_function_->RawParameterVariable (2 );
1761
+ LocalVariable* arg_count = parsed_function_->RawParameterVariable (2 );
1768
1762
LocalVariable* arg_from = parsed_function_->RawParameterVariable (3 );
1769
1763
LocalVariable* arg_from_start = parsed_function_->RawParameterVariable (4 );
1770
1764
1771
- const Library& lib = Library::Handle (Z, Library::TypedDataLibrary ());
1772
- ASSERT (!lib.IsNull ());
1773
- const Function& check_set_range_args = Function::ZoneHandle (
1774
- Z, lib.LookupFunctionAllowPrivate (Symbols::_checkSetRangeArguments ()));
1775
- ASSERT (!check_set_range_args.IsNull ());
1776
-
1777
1765
Fragment body;
1778
- body += LoadLocal (arg_to);
1779
- body += LoadLocal (arg_to_start);
1780
- body += LoadLocal (arg_to_end);
1781
- body += LoadLocal (arg_from);
1782
- body += LoadLocal (arg_from_start);
1783
- body += StaticCall (TokenPosition::kNoSource , check_set_range_args, 5 ,
1784
- ICData::kStatic );
1785
- // The length is guaranteed to be a Smi if bounds checking is successful.
1786
- LocalVariable* length_to_copy = MakeTemporary (" length" );
1787
-
1788
1766
// If we're copying at least this many elements, calling _nativeSetRange,
1789
1767
// which calls memmove via a native call, is faster than using the code
1790
1768
// currently emitted by the MemoryCopy instruction.
@@ -1806,7 +1784,7 @@ Fragment FlowGraphBuilder::BuildTypedDataCheckBoundsAndMemcpy(
1806
1784
1807
1785
JoinEntryInstr* done = BuildJoinEntry ();
1808
1786
TargetEntryInstr *is_small_enough, *is_too_large;
1809
- body += LoadLocal (length_to_copy );
1787
+ body += LoadLocal (arg_count );
1810
1788
body += IntConstant (kCopyLengthForNativeCall );
1811
1789
body += SmiRelationalOp (Token::kLT );
1812
1790
body += BranchIfTrue (&is_small_enough, &is_too_large);
@@ -1816,13 +1794,15 @@ Fragment FlowGraphBuilder::BuildTypedDataCheckBoundsAndMemcpy(
1816
1794
use_instruction += LoadLocal (arg_to);
1817
1795
use_instruction += LoadLocal (arg_from_start);
1818
1796
use_instruction += LoadLocal (arg_to_start);
1819
- use_instruction += LoadLocal (length_to_copy );
1797
+ use_instruction += LoadLocal (arg_count );
1820
1798
use_instruction += MemoryCopy (cid, cid,
1821
1799
/* unboxed_inputs=*/ false , /* can_overlap=*/ true );
1822
1800
use_instruction += Goto (done);
1823
1801
1824
1802
// TODO(dartbug.com/42072): Instead of doing a static call to a native
1825
1803
// method, make a leaf runtime entry for memmove and use CCall.
1804
+ const Library& lib = Library::Handle (Z, Library::TypedDataLibrary ());
1805
+ ASSERT (!lib.IsNull ());
1826
1806
const Class& typed_list_base =
1827
1807
Class::Handle (Z, lib.LookupClassAllowPrivate (Symbols::_TypedListBase ()));
1828
1808
ASSERT (!typed_list_base.IsNull ());
@@ -1836,7 +1816,7 @@ Fragment FlowGraphBuilder::BuildTypedDataCheckBoundsAndMemcpy(
1836
1816
Fragment call_native (is_too_large);
1837
1817
call_native += LoadLocal (arg_to);
1838
1818
call_native += LoadLocal (arg_to_start);
1839
- call_native += LoadLocal (arg_to_end );
1819
+ call_native += LoadLocal (arg_count );
1840
1820
call_native += LoadLocal (arg_from);
1841
1821
call_native += LoadLocal (arg_from_start);
1842
1822
call_native += StaticCall (TokenPosition::kNoSource , native_set_range, 5 ,
@@ -1845,7 +1825,6 @@ Fragment FlowGraphBuilder::BuildTypedDataCheckBoundsAndMemcpy(
1845
1825
call_native += Goto (done);
1846
1826
1847
1827
body.current = done;
1848
- body += DropTemporary (&length_to_copy);
1849
1828
body += NullConstant ();
1850
1829
1851
1830
return body;
0 commit comments