rust-lang / rustc_codegen_cranelift

Cranelift based backend for rustc
Apache License 2.0
1.52k stars 94 forks source link

Missing FMA instrinsics #1422

Closed Aaron1011 closed 7 months ago

Aaron1011 commented 7 months ago

Current Ruffle master (https://github.com/ruffle-rs/ruffle/commit/fa05c66e2a7d08c695628705c5beb550030efbc8) shows the following with cargo-clif test -p tests:

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfnmadd.pd; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfnmadd.ps; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfmaddsub.pd; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfmaddsub.ps; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfmsubadd.pd; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfmsubadd.ps; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfnmadd.pd.256; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfnmadd.ps.256; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfmaddsub.pd.256; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfmaddsub.ps.256; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfmsubadd.pd.256; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.fma.vfmsubadd.ps.256; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.avx2.gather.d.pd; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.avx2.gather.q.pd; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.avx2.gather.d.pd.256; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.avx2.gather.q.pd.256; replacing with trap

warning: unsupported x86 llvm intrinsic llvm.x86.avx.vzeroupper; replacing with trap
bjorn3 commented 7 months ago

It throws a lot of

[ERROR swf::read] Error decompressing SWF: corrupt deflate stream
[WARN  swf::read] SWF length doesn't match header, may be corrupt

but doesn't actually crash at any point on an unimplemented intrinsic on my laptop despite it having AVX2 and FMA support.

Aaron1011 commented 7 months ago

I've tracked down the 'corrupt deflate stream' error to a miscompilation of simd-adler32: https://github.com/rust-lang/rustc_codegen_cranelift/issues/1426

bjorn3 commented 7 months ago

Thanks for tracking this down! I will fix it once I have time.

bjorn3 commented 7 months ago

The miscompilation has been fixed. It now crashes on _mm256_fmaddsub_ps in rustfft.

bjorn3 commented 7 months ago

rustfft now works on the even_more_simd_intrinsics branch. Next issue:

thread '<unnamed>' panicked at tests/framework/src/options.rs:101:38:
assert_relative_eq!(actual, expected, epsilon = epsilon)

    left  = 286.65
    right = 358.25
bjorn3 commented 7 months ago

The failing test is avm2/edittext_tab_stops. I found several miscompilations in the stdarch test suite. Hopefully one of them is the cause of this test failure.

Edit: Fixed the stdarch test suite failures. The ruffle test failure remains.

Aaron1011 commented 7 months ago

@bjorn3 The avm2/edittext_tab_stops panic is legitimate (it occurs under LLVM). However, the ruffle test suite normally catches that panic.

bjorn3 commented 7 months ago

I see. cg_clif currently only supports panic=abort, so test failures can't be caught. For regular libtest tests, -Zpanic-abort-tests is enabled by default which puts every test in a separate process to make panics abort just a single test process rather than the test runner, but ruffle uses libtest-mimic which doesn't support this feature.

bjorn3 commented 7 months ago

Is from_avmplus/as3/Types/Int/wraparound also expected to fail?

``` thread '' panicked at core/src/avm2/activation.rs:2297:25: attempt to add with overflow stack backtrace: 0: rust_begin_unwind at /rustc/6b771f6b5a6c8b03b6322a9c77ac77cb346148f0/library/std/src/panicking.rs:645:5 1: core::panicking::panic_fmt at /rustc/6b771f6b5a6c8b03b6322a9c77ac77cb346148f0/library/core/src/panicking.rs:72:14 2: core::panicking::panic at /rustc/6b771f6b5a6c8b03b6322a9c77ac77cb346148f0/library/core/src/panicking.rs:127:5 3: ruffle_core::avm2::activation::Activation::op_increment_i at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:2297:25 4: ruffle_core::avm2::activation::Activation::do_next_opcode at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:1043:35 5: ruffle_core::avm2::activation::Activation::run_actions at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:861:26 6: ruffle_core::avm2::Avm2::run_script_initializer at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2.rs:297:25 7: ruffle_core::avm2::script::Script::globals at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/script.rs:569:13 8: ruffle_core::avm2::domain::Domain::get_defined_value at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/domain.rs:229:23 9: ruffle_core::display_object::movie_clip::MovieClip::symbol_class at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:877:32 10: ruffle_core::display_object::movie_clip::MovieClip::handle_bytecode_tag at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:4210:41 11: ruffle_core::display_object::movie_clip::MovieClip::run_frame_internal::{{closure}} at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:1559:21 12: ruffle_core::tag_utils::decode_tags at /home/bjorn/Projects/cg_clif2/ruffle/core/src/tag_utils.rs:464:26 13: ruffle_core::display_object::movie_clip::MovieClip::run_frame_internal at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:1567:17 14: ::enter_frame at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:2599:17 15: ::enter_frame at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object.rs:1050:1 16: ::enter_frame at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/stage.rs:836:13 17: ruffle_core::frame_lifecycle::run_all_phases_avm2 at /home/bjorn/Projects/cg_clif2/ruffle/core/src/frame_lifecycle.rs:79:5 18: ruffle_core::player::Player::run_frame::{{closure}} at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:1661:17 19: ruffle_core::player::Player::update::{{closure}} at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:2022:24 20: ruffle_core::player::Player::mutate_with_update_context::{{closure}} at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:1966:23 21: gc_arena::arena::Arena::mutate at /home/bjorn/.cargo/git/checkouts/gc-arena-f613d25074b8ab45/efd89fc/src/gc-arena/src/arena.rs:155:13 22: ruffle_core::player::Player::mutate_with_update_context at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:1882:9 23: ruffle_core::player::Player::update at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:2021:20 24: ruffle_core::player::Player::run_frame at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:1659:9 25: ruffle_core::player::Player::tick at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:525:17 26: ruffle_test_framework::runner::run_swf at ./framework/src/runner.rs:127:13 27: ruffle_test_framework::test::Test::run at ./framework/src/test.rs:61:26 ```

And from_avmplus/ecma3/TypeConversion/e9_3_1_3_rt?

``` thread 'main' panicked at core/src/avm2/value.rs:394:17: attempt to multiply with overflow stack backtrace: 0: rust_begin_unwind at /rustc/6b771f6b5a6c8b03b6322a9c77ac77cb346148f0/library/std/src/panicking.rs:645:5 1: core::panicking::panic_fmt at /rustc/6b771f6b5a6c8b03b6322a9c77ac77cb346148f0/library/core/src/panicking.rs:72:14 2: core::panicking::panic at /rustc/6b771f6b5a6c8b03b6322a9c77ac77cb346148f0/library/core/src/panicking.rs:127:5 3: ruffle_core::avm2::value::string_to_f64 at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/value.rs:394:17 4: ruffle_core::avm2::value::Value::coerce_to_number at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/value.rs:742:17 5: ruffle_core::avm2::activation::Activation::op_negate at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:2339:22 6: ruffle_core::avm2::activation::Activation::do_next_opcode at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:1048:31 7: ruffle_core::avm2::activation::Activation::run_actions at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:861:26 8: ruffle_core::avm2::function::Executable::exec at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/function.rs:194:17 9: ::call at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/object/function_object.rs:191:9 10: ::call at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/object.rs:149:1 11: ruffle_core::avm2::object::TObject::call_property at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/object.rs:486:17 12: ::call_property at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/object.rs:149:1 13: ruffle_core::avm2::activation::Activation::op_call_property at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:1326:21 14: ruffle_core::avm2::activation::Activation::do_next_opcode at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:967:21 15: ruffle_core::avm2::activation::Activation::run_actions at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/activation.rs:861:26 16: ruffle_core::avm2::Avm2::run_script_initializer at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2.rs:297:25 17: ruffle_core::avm2::script::Script::globals at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/script.rs:569:13 18: ruffle_core::avm2::domain::Domain::get_defined_value at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/domain.rs:229:23 19: ruffle_core::display_object::movie_clip::MovieClip::symbol_class at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:877:32 20: ruffle_core::display_object::movie_clip::MovieClip::handle_bytecode_tag at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:4210:41 21: ruffle_core::display_object::movie_clip::MovieClip::run_frame_internal::{{closure}} at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:1559:21 22: ruffle_core::tag_utils::decode_tags at /home/bjorn/Projects/cg_clif2/ruffle/core/src/tag_utils.rs:464:26 23: ruffle_core::display_object::movie_clip::MovieClip::run_frame_internal at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:1567:17 24: ::enter_frame at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:2599:17 25: ::enter_frame at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object.rs:1050:1 26: ::enter_frame at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/stage.rs:836:13 27: ruffle_core::frame_lifecycle::run_all_phases_avm2 at /home/bjorn/Projects/cg_clif2/ruffle/core/src/frame_lifecycle.rs:79:5 28: ruffle_core::player::Player::run_frame::{{closure}} at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:1661:17 29: ruffle_core::player::Player::update::{{closure}} at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:2022:24 30: ruffle_core::player::Player::mutate_with_update_context::{{closure}} at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:1966:23 31: gc_arena::arena::Arena::mutate at /home/bjorn/.cargo/git/checkouts/gc-arena-f613d25074b8ab45/efd89fc/src/gc-arena/src/arena.rs:155:13 32: ruffle_core::player::Player::mutate_with_update_context at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:1882:9 33: ruffle_core::player::Player::update at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:2021:20 34: ruffle_core::player::Player::run_frame at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:1659:9 35: ruffle_core::player::Player::tick at /home/bjorn/Projects/cg_clif2/ruffle/core/src/player.rs:525:17 36: ruffle_test_framework::runner::run_swf at ./framework/src/runner.rs:127:13 37: ruffle_test_framework::test::Test::run at ./framework/src/test.rs:61:26 ```
bjorn3 commented 7 months ago

Looks like it. Seems like ruffle fully works as expected then.