Skip to content
This repository was archived by the owner on Dec 22, 2021. It is now read-only.
This repository was archived by the owner on Dec 22, 2021. It is now read-only.

Concerns about integer vs floating-point instructions on x86 #125

Description

@Maratyszcza

In SSE and AVX instruction sets on x86 many instructions have separate integer, single-precision, and double-precision forms, e.g. MOVDQU/MOVUPS/MOVUPD. On "big" Intel and AMD cores, there is an extra penalty if a register produced by an integer SIMD op is consumed by a floating-point SIMD op, and vice versa.

However, WebAssembly SIMD doesn't make distinction between e.g. integer & FP loads, and although this information can, in theory, be reconstructed from instruction stream, such reconstruction requires expensive analysis passes, which streaming WebAssembly engines can not afford.

There are only few classes of ops have separate integer / floating-point instructions on x86:

  1. Loads and stores
  2. Shuffles
  3. Broadcasts ("load-and-splat")
  4. Binary logic (AND, OR, XOR, ANDNOT)
  5. Blends

I think it is worth to consider splitting corresponding WebAssembly instructions into separate integer and floating-point variants in the SIMD spec. Initially both compilers and WAsm engines can treat both the integer and the floating-point variants the same, but at least it will allow to properly fix it in the future. Here is the list of instructions that would need two forms:

  • v128.const
  • v8x16.shuffle
  • v128.and
  • v128.or
  • v128.xor
  • v128.not
  • v128.andnot
  • v128.bitselect (decomposed into AND, ANDNOT, and OR on x86)
  • v128.load
  • v8x16.load_splat
  • v16x8.load_splat
  • v32x4.load_splat
  • v64x2.load_splat
  • v128.store

Note that the problem is specific to the distinction between integer and floating-point SIMD instructions on x86. ARM NEON doesn't distinguish between integer/floating-point variants at ISA level, and as far as I know no x86 CPUs distinguish between "double-precision" (e.g. ANDPD) and "single-precision" (e.g. ANDPS) instructions.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions