Open koba-e964 opened 2 years ago
#[repr(C)]
#[repr(align(4096))]
struct Foo {
x: u16,
y: u8,
z: u16,
}
#[repr(align(16))]
#[derive(Copy)]
pub union Bitboard {
v: [u64; 2],
#[cfg(target_feature = "sse2")]
m: std::arch::x86_64::__m128i,
}
https://github.com/yaneurao/YaneuraOu/blob/master/source/bitboard.h#L28-L53
struct alignas(16) Bitboard
{
#if defined (USE_SSE2)
union
{
// 64bitずつとして扱うとき用
// SSE4.1以上なら、このメンバを用いずに 変数m の方を用いて、一貫して128bitレジスタとして扱ったほうが良いと思う。
u64 p[2];
// SSEで取り扱い時用
// bit0がSQ_11,bit1がSQ_12,…,bit81がSQ_99を表現する。(縦型Bitboard)
// このbit位置がSquare型と対応する。
//
// ただしbit63は未使用。これは、ここを余らせることで香の利きや歩の打てる場所を求めやすくする。
// Aperyを始めとするmagic bitboard派によって考案された。
// ここから上位/下位64bitを取り出すのは、メンバのextract()を使うべし。
__m128i m;
};
u64 p[2];
## Issues/PullRequests in cbindgen
- https://github.com/eqrion/cbindgen/issues/432
- https://github.com/eqrion/cbindgen/issues/433
Advantages and disadvanges
Advantages:
Disadvantages:
API
The only possible candidate is:
This doesn't work with cbindgen well (emits an opaque type for
Bitboard
).Unresolved Questions
(Thank you for bringing this to my attention, @mizar!)