Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Analysis
Assembly
C
Carbon
C++ (Circle)
CIRCT
Clean
CMake
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Erlang
Fortran
F#
Go
Haskell
HLSL
Hook
ispc
Java
Julia
Kotlin
LLVM IR
Nim
Objective-C
Objective-C++
OCaml
OpenCL C
Pascal
Pony
Python
Racket
Ruby
Rust
Scala
Solidity
Swift
Toit
TypeScript Native
Visual Basic
Zig
rust source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Compiler
BPF gcc (trunk)
mrustc (master)
rustc 1.0.0
rustc 1.1.0
rustc 1.10.0
rustc 1.11.0
rustc 1.12.0
rustc 1.13.0
rustc 1.14.0
rustc 1.15.1
rustc 1.16.0
rustc 1.17.0
rustc 1.18.0
rustc 1.19.0
rustc 1.2.0
rustc 1.20.0
rustc 1.21.0
rustc 1.22.0
rustc 1.23.0
rustc 1.24.0
rustc 1.25.0
rustc 1.26.0
rustc 1.27.0
rustc 1.27.1
rustc 1.28.0
rustc 1.29.0
rustc 1.3.0
rustc 1.30.0
rustc 1.31.0
rustc 1.32.0
rustc 1.33.0
rustc 1.34.0
rustc 1.35.0
rustc 1.36.0
rustc 1.37.0
rustc 1.38.0
rustc 1.39.0
rustc 1.4.0
rustc 1.40.0
rustc 1.41.0
rustc 1.42.0
rustc 1.43.0
rustc 1.44.0
rustc 1.45.0
rustc 1.45.2
rustc 1.46.0
rustc 1.47.0
rustc 1.48.0
rustc 1.49.0
rustc 1.5.0
rustc 1.50.0
rustc 1.51.0
rustc 1.52.0
rustc 1.53.0
rustc 1.54.0
rustc 1.55.0
rustc 1.56.0
rustc 1.57.0
rustc 1.58.0
rustc 1.59.0
rustc 1.6.0
rustc 1.60.0
rustc 1.61.0
rustc 1.62.0
rustc 1.63.0
rustc 1.64.0
rustc 1.65.0
rustc 1.66.0
rustc 1.67.0
rustc 1.7.0
rustc 1.8.0
rustc 1.9.0
rustc beta
rustc nightly
rustc-cg-gcc (master)
x86-64 GCCRS (GCC master)
x86-64 GCCRS (GCCRS master)
Options
Source code
#![feature(slice_as_chunks)] #![feature(portable_simd)] pub fn convert_via_overwriting(bgra: &[u8; 16]) -> [u8; 12] { let bgra = bgra.as_chunks::<4>().0; let mut padded_rgb = [0; 13]; for i in (0..4).rev() { let pixel = u32::from_be_bytes(bgra[i]); padded_rgb[i*3..][..4].copy_from_slice(&pixel.to_le_bytes()); } let mut rgb = [0; 12]; rgb.copy_from_slice(&padded_rgb[1..]); rgb } pub fn convert_via_shifting(bgra: &[u8; 16]) -> [u8; 12] { let bgra = bgra.as_chunks().0; let mut buffer = 0_u128; for bgra in bgra.iter().cloned().rev() { buffer <<= 24; buffer |= u128::from(u32::from_be_bytes(bgra) >> 8); } buffer.to_le_bytes().as_chunks().0[0] } pub fn convert_via_std_simd_swizzle(bgra: &[u8; 16]) -> [u8; 12] { use std::simd::{Simd, simd_swizzle}; let bgra = Simd::from_array(*bgra); const IDXS: [usize; 16] = [ 2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, 3, 7, 11, 15, ]; let rgb = simd_swizzle!(bgra, IDXS); rgb.to_array().as_chunks().0[0] } pub fn convert_via_std_simd_scatter(bgra: &[u8; 16]) -> [u8; 12] { use std::simd::Simd;//u8x16; let vector = Simd::from_array(*bgra); let mut rgb = [0; 12]; let idxs = [ 2, 1, 0, !0, 5, 4, 3, !0, 8, 7, 6, !0, 11, 10, 9, !0, ]; vector.scatter(&mut rgb, Simd::from_array(idxs)); rgb } pub fn convert_raw(bgra: &[u8; 16]) -> [u8; 12] { let [ b0, g0, r0, _a0, b1, g1, r1, _a1, b2, g2, r2, _a2, b3, g3, r3, _a3, ] = *bgra; [ r0, g0, b0, r1, g1, b1, r2, g2, b2, r3, g3, b3, ] } pub fn convert_quinedot(bgr_arr: &[u8; 16]) -> [u8; 12] { let mut rgb: [u8; 12] = [0; 12]; for (src, dst) in bgr_arr.chunks_exact(4).zip(rgb.chunks_exact_mut(3)) { dst[0] = src[2]; dst[1] = src[1]; dst[2] = src[0]; } rgb }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
About the author
Changelog
Version tree