Skip to content

Missing FMA instrinsics #1422

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Aaron1011 opened this issue Nov 9, 2023 · 10 comments
Closed

Missing FMA instrinsics #1422

Aaron1011 opened this issue Nov 9, 2023 · 10 comments
Labels
A-core-arch Area: Necessary for full core::arch support C-bug Category: This is a bug.

Comments

@Aaron1011
Copy link
Member

Current Ruffle master (ruffle-rs/ruffle@fa05c66) 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
@Aaron1011 Aaron1011 added the A-core-arch Area: Necessary for full core::arch support label Nov 9, 2023
@bjorn3
Copy link
Member

bjorn3 commented Nov 12, 2023

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.

@bjorn3 bjorn3 added the C-bug Category: This is a bug. label Nov 12, 2023
@Aaron1011
Copy link
Member Author

I've tracked down the 'corrupt deflate stream' error to a miscompilation of simd-adler32: #1426

@bjorn3
Copy link
Member

bjorn3 commented Nov 12, 2023

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

@bjorn3
Copy link
Member

bjorn3 commented Nov 24, 2023

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

@bjorn3
Copy link
Member

bjorn3 commented Nov 24, 2023

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
Copy link
Member

bjorn3 commented Nov 25, 2023

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
Copy link
Member Author

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

@bjorn3
Copy link
Member

bjorn3 commented Nov 25, 2023

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
Copy link
Member

bjorn3 commented Nov 25, 2023

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

thread '<unnamed>' 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: <ruffle_core::display_object::movie_clip::MovieClip as ruffle_core::display_object::TDisplayObject>::enter_frame
             at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:2599:17
  15: <ruffle_core::display_object::DisplayObject as ruffle_core::display_object::TDisplayObject>::enter_frame
             at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object.rs:1050:1
  16: <ruffle_core::display_object::stage::Stage as ruffle_core::display_object::TDisplayObject>::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<R>::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: <ruffle_core::avm2::object::function_object::FunctionObject as ruffle_core::avm2::object::TObject>::call
             at /home/bjorn/Projects/cg_clif2/ruffle/core/src/avm2/object/function_object.rs:191:9
  10: <ruffle_core::avm2::object::Object as ruffle_core::avm2::object::TObject>::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: <ruffle_core::avm2::object::Object as ruffle_core::avm2::object::TObject>::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: <ruffle_core::display_object::movie_clip::MovieClip as ruffle_core::display_object::TDisplayObject>::enter_frame
             at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object/movie_clip.rs:2599:17
  25: <ruffle_core::display_object::DisplayObject as ruffle_core::display_object::TDisplayObject>::enter_frame
             at /home/bjorn/Projects/cg_clif2/ruffle/core/src/display_object.rs:1050:1
  26: <ruffle_core::display_object::stage::Stage as ruffle_core::display_object::TDisplayObject>::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<R>::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
Copy link
Member

bjorn3 commented Nov 26, 2023

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

@bjorn3 bjorn3 closed this as completed Nov 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-core-arch Area: Necessary for full core::arch support C-bug Category: This is a bug.
Projects
None yet
Development

No branches or pull requests

2 participants