use std::arch::x86_64::{
_mm_loadu_si128, _mm_storeu_si128, _mm_min_epi32, _mm_max_epi32, _mm_shuffle_epi32
};
use std::fmt::Debug;
const N: usize = 5;
#[target_feature(enable = "sse2")]
unsafe fn simd_sort5(arr: &mut [i32; N]) {
// SIMDレジスタに4つの値をロード
let mut v = _mm_loadu_si128(arr.as_ptr() as *const _);
// ステップ1: 各ペアでmin/maxを取得
for _ in 0..4 {
let v1 = _mm_shuffle_epi32(v, 0b10110001); // 比較 (0,1), (2,3)
let v2 = _mm_shuffle_epi32(v, 0b11011000); // 比較 (0,2), (1,3)
let v3 = _mm_shuffle_epi32(v, 0b11101110); // 比較 (0,3)
let min1 = _mm_min_epi32(v, v1);
let max1 = _mm_max_epi32(v, v1);
let min2 = _mm_min_epi32(min1, v2);
let max2 = _mm_max_epi32(max1, v2);
let min3 = _mm_min_epi32(min2, v3);
let max3 = _mm_max_epi32(max2, v3);
v = _mm_shuffle_epi32(min3, 0b01000100);
}
_mm_storeu_si128(arr.as_mut_ptr() as *mut _, v);
// SIMD処理後の配列の状態を確認 (デバッグ用)
println!("{:?}", arr);
// 最後の要素を適切な位置に挿入
let last = arr[4];
let mut i = 3;
while i >= 0 && arr[i] > last {
arr[i + 1] = arr[i];
i -= 1;
}
arr[i + 1] = last;
// 最終的なソート結果を出力
println!("{:?}", arr);
}
fn main() {
let mut arr: [i32; 5] = [5, 2, 4, 1, 3];
unsafe {
simd_sort5(&mut arr);
}
}
dXNlIHN0ZDo6YXJjaDo6eDg2XzY0Ojp7CiAgICBfbW1fbG9hZHVfc2kxMjgsIF9tbV9zdG9yZXVfc2kxMjgsIF9tbV9taW5fZXBpMzIsIF9tbV9tYXhfZXBpMzIsIF9tbV9zaHVmZmxlX2VwaTMyCn07CnVzZSBzdGQ6OmZtdDo6RGVidWc7Cgpjb25zdCBOOiB1c2l6ZSA9IDU7CgojW3RhcmdldF9mZWF0dXJlKGVuYWJsZSA9ICJzc2UyIildCnVuc2FmZSBmbiBzaW1kX3NvcnQ1KGFycjogJm11dCBbaTMyOyBOXSkgewogICAgLy8gU0lNROODrOOCuOOCueOCv+OBqzTjgaTjga7lgKTjgpLjg63jg7zjg4kKICAgIGxldCBtdXQgdiA9IF9tbV9sb2FkdV9zaTEyOChhcnIuYXNfcHRyKCkgYXMgKmNvbnN0IF8pOwoKICAgIC8vIOOCueODhuODg+ODlzE6IOWQhOODmuOCouOBp21pbi9tYXjjgpLlj5blvpcKICAgIGZvciBfIGluIDAuLjQgewogICAgICAgIGxldCB2MSA9IF9tbV9zaHVmZmxlX2VwaTMyKHYsIDBiMTAxMTAwMDEpOyAvLyDmr5TovIMgKDAsMSksICgyLDMpCiAgICAgICAgbGV0IHYyID0gX21tX3NodWZmbGVfZXBpMzIodiwgMGIxMTAxMTAwMCk7IC8vIOavlOi8gyAoMCwyKSwgKDEsMykKICAgICAgICBsZXQgdjMgPSBfbW1fc2h1ZmZsZV9lcGkzMih2LCAwYjExMTAxMTEwKTsgLy8g5q+U6LyDICgwLDMpCgogICAgICAgIGxldCBtaW4xID0gX21tX21pbl9lcGkzMih2LCB2MSk7CiAgICAgICAgbGV0IG1heDEgPSBfbW1fbWF4X2VwaTMyKHYsIHYxKTsKCiAgICAgICAgbGV0IG1pbjIgPSBfbW1fbWluX2VwaTMyKG1pbjEsIHYyKTsKICAgICAgICBsZXQgbWF4MiA9IF9tbV9tYXhfZXBpMzIobWF4MSwgdjIpOwoKICAgICAgICBsZXQgbWluMyA9IF9tbV9taW5fZXBpMzIobWluMiwgdjMpOwogICAgICAgIGxldCBtYXgzID0gX21tX21heF9lcGkzMihtYXgyLCB2Myk7CgogICAgICAgIHYgPSBfbW1fc2h1ZmZsZV9lcGkzMihtaW4zLCAwYjAxMDAwMTAwKTsKICAgIH0KCiAgICBfbW1fc3RvcmV1X3NpMTI4KGFyci5hc19tdXRfcHRyKCkgYXMgKm11dCBfLCB2KTsKICAgIAogICAvLyBTSU1E5Yem55CG5b6M44Gu6YWN5YiX44Gu54q25oWL44KS56K66KqNICjjg4fjg5Djg4PjgrDnlKgpCiAgICBwcmludGxuISgiezo/fSIsIGFycik7CgogICAgLy8g5pyA5b6M44Gu6KaB57Sg44KS6YGp5YiH44Gq5L2N572u44Gr5oy/5YWlCiAgICBsZXQgbGFzdCA9IGFycls0XTsKICAgIGxldCBtdXQgaSA9IDM7CiAgICB3aGlsZSBpID49IDAgJiYgYXJyW2ldID4gbGFzdCB7CiAgICAgICAgYXJyW2kgKyAxXSA9IGFycltpXTsKICAgICAgICBpIC09IDE7CiAgICB9CiAgICBhcnJbaSArIDFdID0gbGFzdDsKCiAgICAvLyDmnIDntYLnmoTjgarjgr3jg7zjg4jntZDmnpzjgpLlh7rlipsKICAgIHByaW50bG4hKCJ7Oj99IiwgYXJyKTsKfQoKZm4gbWFpbigpIHsKICAgIGxldCBtdXQgYXJyOiBbaTMyOyA1XSA9IFs1LCAyLCA0LCAxLCAzXTsKICAgIHVuc2FmZSB7CiAgICAgICAgc2ltZF9zb3J0NSgmbXV0IGFycik7CiAgICB9Cn0KICAgIA==