diff --git a/pkg/pkg.status b/pkg/pkg.status index 1410828f49c..c3012b23a6c 100644 --- a/pkg/pkg.status +++ b/pkg/pkg.status @@ -35,11 +35,6 @@ third_party/html5lib/test/tokenizer_test: SkipSlow # Times out [ $runtime == vm && $system == windows] analysis_server/test/analysis/get_errors_test: Skip # runtime error, Issue 22180 -[ $runtime == vm && ( $arch == simarm || $arch == simmips ) ] -docgen/test/*: SkipSlow -third_party/html5lib/test/tokenizer_test: Pass, Slow -analysis_server/*: SkipSlow # Timeout in some tests. - [ $compiler == dart2js ] collection/test/equality_test/01: Fail # Issue 1533 collection/test/equality_test/02: Fail # Issue 1533 @@ -163,7 +158,7 @@ third_party/html5lib/test/parser_test: SkipByDesign # Uses dart:io. third_party/html5lib/test/selectors/*: SkipByDesign # Uses dart:io. third_party/html5lib/test/tokenizer_test: SkipByDesign # Uses dart:io. -[ $arch == simarm64 || $arch == armv5te ] +[ $runtime == vm && ($arch == simarm64 || $arch == simarm || $arch == simarmv5te || $arch == simmips || $arch == armv5te) ] # Timeout. These are not unit tests. They do not run efficiently on our # simulator or low-end devices. *: Skip diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status index 56cddd40b81..b3cd4f859ad 100644 --- a/runtime/tests/vm/vm.status +++ b/runtime/tests/vm/vm.status @@ -40,7 +40,7 @@ cc/ThreadInterrupterHigh: Skip cc/ThreadInterrupterMedium: Skip cc/ThreadInterrupterLow: Skip -[ $arch == simarm || $arch == simmips ] +[ $arch == simarm || $arch == simarmv5te || $arch == simarm64 || $arch == simmips ] cc/ThreadInterrupterHigh: Skip cc/ThreadInterrupterMedium: Skip cc/ThreadInterrupterLow: Skip diff --git a/runtime/vm/assembler_arm_test.cc b/runtime/vm/assembler_arm_test.cc index dc1b56d6a51..a5292148754 100644 --- a/runtime/vm/assembler_arm_test.cc +++ b/runtime/vm/assembler_arm_test.cc @@ -1807,12 +1807,14 @@ ASSEMBLER_TEST_RUN(IntDiv_supported, test) { ASSEMBLER_TEST_GENERATE(IntDiv_unsupported, assembler) { #if defined(USING_SIMULATOR) - bool orig = TargetCPUFeatures::integer_division_supported(); - HostCPUFeatures::set_integer_division_supported(false); - __ mov(R0, Operand(27)); - __ mov(R1, Operand(9)); - __ IntegerDivide(R0, R0, R1, D0, D1); - HostCPUFeatures::set_integer_division_supported(orig); + if (TargetCPUFeatures::can_divide()) { + bool orig = TargetCPUFeatures::integer_division_supported(); + HostCPUFeatures::set_integer_division_supported(false); + __ mov(R0, Operand(27)); + __ mov(R1, Operand(9)); + __ IntegerDivide(R0, R0, R1, D0, D1); + HostCPUFeatures::set_integer_division_supported(orig); + } __ bx(LR); #else if (TargetCPUFeatures::can_divide()) { diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc index 49af1e60694..da5f3e8b115 100644 --- a/runtime/vm/cpu_arm.cc +++ b/runtime/vm/cpu_arm.cc @@ -20,13 +20,25 @@ namespace dart { +// TODO(zra): Add a target for ARMv6. +#if defined(TARGET_ARCH_ARM_5TE) +DEFINE_FLAG(bool, use_vfp, false, "Use vfp instructions if supported"); +DEFINE_FLAG(bool, use_neon, false, "Use neon instructions if supported"); +DEFINE_FLAG(bool, use_integer_division, false, + "Use integer division instruction if supported"); +#else DEFINE_FLAG(bool, use_vfp, true, "Use vfp instructions if supported"); DEFINE_FLAG(bool, use_neon, true, "Use neon instructions if supported"); +DEFINE_FLAG(bool, use_integer_division, true, + "Use integer division instruction if supported"); +#endif + #if !defined(HOST_ARCH_ARM) -DEFINE_FLAG(bool, sim_use_armv7, true, "Use all ARMv7 instructions"); -DEFINE_FLAG(bool, sim_use_armv5te, false, "Restrict to ARMv5TE instructions"); -DEFINE_FLAG(bool, sim_use_armv6, false, "Restrict to ARMv6 instructions"); +#if defined(TARGET_ARCH_ARM_5TE) DEFINE_FLAG(bool, sim_use_hardfp, false, "Use the softfp ABI."); +#else +DEFINE_FLAG(bool, sim_use_hardfp, true, "Use the softfp ABI."); +#endif #endif void CPU::FlushICache(uword start, uword size) { @@ -121,10 +133,11 @@ void HostCPUFeatures::InitOnce() { bool is_krait = CpuInfo::FieldContains(kCpuInfoHardware, "QCT APQ8064"); if (is_krait) { // Special case for Qualcomm Krait CPUs in Nexus 4 and 7. - integer_division_supported_ = true; + integer_division_supported_ = FLAG_use_integer_division; } else { integer_division_supported_ = - CpuInfo::FieldContains(kCpuInfoFeatures, "idiva") || is_arm64; + (CpuInfo::FieldContains(kCpuInfoFeatures, "idiva") || is_arm64) && + FLAG_use_integer_division; } neon_supported_ = (CpuInfo::FieldContains(kCpuInfoFeatures, "neon") || is_arm64) && @@ -160,19 +173,17 @@ void HostCPUFeatures::Cleanup() { void HostCPUFeatures::InitOnce() { CpuInfo::InitOnce(); hardware_ = CpuInfo::GetCpuModel(); + +#if defined(TARGET_ARCH_ARM_5TE) + arm_version_ = ARMv5TE; +#else + arm_version_ = ARMv7; +#endif + + integer_division_supported_ = FLAG_use_integer_division; vfp_supported_ = FLAG_use_vfp; neon_supported_ = FLAG_use_vfp && FLAG_use_neon; hardfp_supported_ = FLAG_sim_use_hardfp; - if (FLAG_sim_use_armv5te) { - arm_version_ = ARMv5TE; - integer_division_supported_ = false; - } else if (FLAG_sim_use_armv6) { - arm_version_ = ARMv6; - integer_division_supported_ = true; - } else if (FLAG_sim_use_armv7) { - arm_version_ = ARMv7; - integer_division_supported_ = true; - } #if defined(DEBUG) initialized_ = true; #endif diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc index 30e70f89613..2c6496261d3 100644 --- a/runtime/vm/simulator_arm.cc +++ b/runtime/vm/simulator_arm.cc @@ -1728,10 +1728,6 @@ void Simulator::DecodeType01(Instr* instr) { case 3: { // Registers rd, rn, rm, ra are encoded as rn, rm, rs, rd. // Format(instr, "mls'cond's 'rn, 'rm, 'rs, 'rd"); - if (TargetCPUFeatures::arm_version() != ARMv7) { - UnimplementedInstruction(instr); - break; - } rd_val = get_register(rd); // fall through } @@ -1740,6 +1736,10 @@ void Simulator::DecodeType01(Instr* instr) { // Format(instr, "mul'cond's 'rn, 'rm, 'rs"); int32_t alu_out = rm_val * rs_val; if (instr->Bits(21, 3) == 3) { // mls + if (TargetCPUFeatures::arm_version() != ARMv7) { + UnimplementedInstruction(instr); + break; + } alu_out = -alu_out; } alu_out += rd_val; diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc index 01a07c738a1..ec92becd640 100644 --- a/runtime/vm/stub_code_arm.cc +++ b/runtime/vm/stub_code_arm.cc @@ -984,7 +984,9 @@ void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) { // R2: Header word. if (TargetCPUFeatures::arm_version() == ARMv5TE) { // TODO(21263): Implement 'swp' and use it below. +#if !defined(USING_SIMULATOR) ASSERT(OS::NumberOfAvailableProcessors() <= 1); +#endif __ orr(R2, R2, Operand(1 << RawObject::kRememberedBit)); __ str(R2, FieldAddress(R0, Object::tags_offset())); } else { diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status index 7f50f90e4ee..b7d8699a55f 100644 --- a/tests/co19/co19-runtime.status +++ b/tests/co19/co19-runtime.status @@ -70,7 +70,7 @@ LibTest/collection/ListBase/ListBase_class_A01_t02: Skip # co19 issue 673 LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # Issue 17440 LibTest/isolate/Isolate/spawn_A01_t04: Crash, Pass # Issue 17440 -[ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simmips || $arch == simarm64) ] +[ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simarmv5te || $arch == simmips || $arch == simarm64) ] LibTest/core/Uri/Uri_A06_t03: Skip # Timeout LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # Timeout LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # Timeout diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status index 74f2a7482fa..b6632161a6d 100644 --- a/tests/corelib/corelib.status +++ b/tests/corelib/corelib.status @@ -233,6 +233,10 @@ regexp/global_test: Skip # Timeout. Issue 21709 and 21708 [ $mode == debug ] regexp/pcre_test: Pass, Slow # Timeout. Issue 22008 +[ $runtime == vm && $arch == simarmv5te ] +int_parse_radix_test/*: Pass, Slow +big_integer_parsed_mul_div_vm_test: Pass, Slow + [ $compiler == dart2js && $cps_ir ] apply2_test: Crash # Instance of 'TypeOperator': unimplemented in CodeGenerator apply3_test: Crash # Instance of 'TypeOperator': unimplemented in CodeGenerator diff --git a/tests/language/language.status b/tests/language/language.status index e53d0f5c35a..c47b7af2f3e 100644 --- a/tests/language/language.status +++ b/tests/language/language.status @@ -118,6 +118,5 @@ large_class_declaration_test: SkipSlow # Times out. Issue 20352 [ $compiler == none && $runtime == ContentShellOnAndroid ] gc_test: SkipSlow # Times out flakily. Issue 20956 -[ $compiler == none && $runtime == vm && ( $arch == simarm || $arch == arm || $arch == armv5te || $arch == simarm64 || $arch == arm64 || $arch == simmips || $arch == mips) ] +[ $compiler == none && $runtime == vm && ( $arch == simarm || $arch == arm || $arch == simarmv5te || $arch == armv5te || $arch == simarm64 || $arch == arm64 || $arch == simmips || $arch == mips) ] vm/load_to_load_unaligned_forwarding_vm_test: Pass, Crash # Unaligned offset. Issue 22151 - diff --git a/tests/lib/lib.status b/tests/lib/lib.status index 5adaf0eb2cc..d3835828ee2 100644 --- a/tests/lib/lib.status +++ b/tests/lib/lib.status @@ -315,10 +315,13 @@ mirrors/*deferred*: Skip # Issue 17458 [ $compiler == dart2js && $mode == debug ] mirrors/native_class_test: Pass, Slow -[ $arch == simarm ] +[ $arch == simarm || $arch == simarmv5te ] convert/chunked_conversion_utf88_test: Skip # Pass, Slow Issue 12644. convert/utf85_test: Skip # Pass, Slow Issue 12644. +[ $arch == simarmv5te ] +mirrors/mirrors_reader_test: Pass, Slow + [ $compiler == dart2js ] profiler/metrics_num_test: Skip # Because of a int / double type test. @@ -328,7 +331,7 @@ convert/utf85_test: Skip # Pass, Slow Issue 20111. [ $mode == debug && $arch == ia32 && $system == windows ] convert/streamed_conversion_json_utf8_decode_test: Skip # Verification OOM. -[ $mode == debug && $arch != ia32 && $arch != x64 && $arch != simarm ] +[ $mode == debug && $arch != ia32 && $arch != x64 && $arch != simarm && $arch != simarmv5te ] convert/streamed_conversion_json_utf8_decode_test: Skip # Verification not yet implemented. [ $runtime == vm && $mode == debug && $builder_tag == asan ] diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status index b993e5223f3..6599b5581a1 100644 --- a/tests/standalone/standalone.status +++ b/tests/standalone/standalone.status @@ -111,7 +111,7 @@ oom_error_stacktrace_test: Pass # The test only fails at runtime. # Skip until we stabilize language tests. *: Skip -[ $arch == simarm || $arch == simmips] +[ $arch == simarm || $arch == simarmv5te || $arch == simmips] out_of_memory_test: Skip # passes on Mac, crashes on Linux oom_error_stacktrace_test: Skip # Fails on Linux @@ -159,7 +159,7 @@ package/package_test: CompileTimeError [ $system == windows ] io/skipping_dart2js_compilations_test: Fail # Issue 19551. -[ $arch != ia32 && $arch != x64 && $arch != simarm && $mode == debug ] +[ $arch != ia32 && $arch != x64 && $arch != simarm && $arch != simarmv5te && $mode == debug ] verified_mem_test: Skip # Not yet implemented. [ $runtime == vm && $mode == debug && $builder_tag == asan ] diff --git a/tools/build.py b/tools/build.py index 42825895a61..fc2e1cfa149 100755 --- a/tools/build.py +++ b/tools/build.py @@ -55,7 +55,8 @@ def BuildOptions(): default=False, action="store_true") result.add_option("-a", "--arch", help='Target architectures (comma-separated).', - metavar='[all,ia32,x64,simarm,arm,armv5te,simmips,mips,simarm64,arm64,]', + metavar='[all,ia32,x64,simarm,arm,simarmv5te,armv5te,simmips,mips' + ',simarm64,arm64,]', default=utils.GuessArchitecture()) result.add_option("--os", help='Target OSs (comma-separated).', @@ -105,8 +106,8 @@ def ProcessOptions(options, args): print "Unknown mode %s" % mode return False for arch in options.arch: - archs = ['ia32', 'x64', 'simarm', 'arm', 'armv5te', 'simmips', 'mips', - 'simarm64', 'arm64',] + archs = ['ia32', 'x64', 'simarm', 'arm', 'simarmv5te', 'armv5te', 'simmips', + 'mips', 'simarm64', 'arm64',] if not arch in archs: print "Unknown arch %s" % arch return False diff --git a/tools/gyp/configurations.gypi b/tools/gyp/configurations.gypi index e6e19efe25f..5b55362b119 100644 --- a/tools/gyp/configurations.gypi +++ b/tools/gyp/configurations.gypi @@ -20,6 +20,7 @@ ['"<(target_arch)"=="armv5te"', { 'dart_target_arch': 'ARMV5TE', }], ['"<(target_arch)"=="arm64"', { 'dart_target_arch': 'ARM64', }], ['"<(target_arch)"=="simarm"', { 'dart_target_arch': 'SIMARM', }], + ['"<(target_arch)"=="simarmv5te"', { 'dart_target_arch': 'SIMARMV5TE', }], ['"<(target_arch)"=="simarm64"', { 'dart_target_arch': 'SIMARM64', }], ['"<(target_arch)"=="mips"', { 'dart_target_arch': 'MIPS', }], ['"<(target_arch)"=="simmips"', { 'dart_target_arch': 'SIMMIPS', }], @@ -62,6 +63,14 @@ ] }, + 'Dart_simarmv5te_Base': { + 'abstract': 1, + 'defines': [ + 'TARGET_ARCH_ARM', + 'TARGET_ARCH_ARM_5TE', + ] + }, + 'Dart_arm_Base': { 'abstract': 1, 'defines': [ @@ -73,6 +82,7 @@ 'abstract': 1, 'defines': [ 'TARGET_ARCH_ARM', + 'TARGET_ARCH_ARM_5TE', ], }, @@ -174,6 +184,27 @@ ], }, + 'DebugSIMARMV5TE': { + 'inherit_from': [ + 'Dart_Base', 'Dart_simarmv5te_Base', 'Dart_Debug', + 'Dart_<(dart_target_os)_Base', + 'Dart_<(dart_target_os)_simarmv5te_Base', + 'Dart_<(dart_target_os)_Debug', + ], + 'defines': [ + 'DEBUG', + ], + }, + + 'ReleaseSIMARMV5TE': { + 'inherit_from': [ + 'Dart_Base', 'Dart_simarmv5te_Base', 'Dart_Release', + 'Dart_<(dart_target_os)_Base', + 'Dart_<(dart_target_os)_simarmv5te_Base', + 'Dart_<(dart_target_os)_Release', + ], + }, + 'DebugSIMARM64': { 'inherit_from': [ 'Dart_Base', 'Dart_simarm64_Base', 'Dart_Debug', diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi index 2e776567edd..29fab0bdac6 100644 --- a/tools/gyp/configurations_make.gypi +++ b/tools/gyp/configurations_make.gypi @@ -46,6 +46,12 @@ 'ldflags': [ '-m32', ], }, + 'Dart_Linux_simarmv5te_Base': { + 'abstract': 1, + 'cflags': [ '-O3', '-m32', '-msse2' ], + 'ldflags': [ '-m32', ], + }, + 'Dart_Linux_simarm64_Base': { 'abstract': 1, 'cflags': [ '-O3', '-m64', '-msse2' ], diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi index 64176f7ad87..46604eb1ca6 100644 --- a/tools/gyp/configurations_msvs.gypi +++ b/tools/gyp/configurations_msvs.gypi @@ -24,6 +24,9 @@ 'Dart_Win_simarm_Base': { 'abstract': 1, }, + 'Dart_Win_simarmv5te_Base': { + 'abstract': 1, + }, 'Dart_Win_simarm64_Base': { 'abstract': 1, }, diff --git a/tools/gyp/configurations_xcode.gypi b/tools/gyp/configurations_xcode.gypi index d3055a8a062..6bd04527e34 100644 --- a/tools/gyp/configurations_xcode.gypi +++ b/tools/gyp/configurations_xcode.gypi @@ -77,6 +77,9 @@ 'Dart_Macos_simarm_Base': { 'abstract': 1, }, + 'Dart_Macos_simarmv5te_Base': { + 'abstract': 1, + }, 'Dart_Macos_simarm64_Base': { 'abstract': 1, }, diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart index 487c9e55eb9..1fbf54dc409 100644 --- a/tools/testing/dart/runtime_configuration.dart +++ b/tools/testing/dart/runtime_configuration.dart @@ -169,6 +169,7 @@ class DartVmRuntimeConfiguration extends RuntimeConfiguration { switch (arch) { case 'simarm': case 'arm': + case' simarmv5te': case 'armv5te': case 'simmips': case 'mips': diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart index ecd7c8dfcca..9bd9aaa2378 100644 --- a/tools/testing/dart/test_options.dart +++ b/tools/testing/dart/test_options.dart @@ -110,7 +110,7 @@ class TestOptionsParser { 'The architecture to run tests for', ['-a', '--arch'], ['all', 'ia32', 'x64', 'arm', 'armv5te', 'arm64', 'mips', - 'simarm', 'simarm64', 'simmips'], + 'simarm', 'simarmv5te', 'simarm64', 'simmips'], 'ia32'), new _TestOptionSpecification( 'system', diff --git a/tools/utils.py b/tools/utils.py index 7da961cd2dd..db7582eca4c 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -226,6 +226,7 @@ ARCH_FAMILY = { 'arm64': 'arm', 'mips': 'mips', 'simarm': 'ia32', + 'simarmv5te': 'ia32', 'simmips': 'ia32', 'simarm64': 'ia32', }