In order to implement SIMD's all_true (https://github.com/WebAssembly/simd/blob/master/proposals/simd/SIMD.md#all-lanes-true), we must legalize some instruction (I chose `vall_true`) to a comparison against 0 and a similar reduction as vany_true using `PTEST` and `SETNZ`. Since `icmp` only allows integers but `vall_true` could allow more vector types, `raw_bitcast` is used to convert the lane types into integers, e.g. b32x4 to i32x4. To do so without runtime type-checking, the `raw_bitcast` instruction (which emits no instruction) can now bitcast from any vector type to the same type, e.g. i32x4 to i32x4.
60 lines
1.0 KiB
Plaintext
60 lines
1.0 KiB
Plaintext
test run
|
|
set enable_simd
|
|
target x86_64 skylake
|
|
|
|
function %bnot() -> b32 {
|
|
ebb0:
|
|
v0 = vconst.b32x4 [true true true false]
|
|
v1 = bnot v0
|
|
v2 = extractlane v1, 3
|
|
return v2
|
|
}
|
|
; run
|
|
|
|
function %band_not() -> b1 {
|
|
ebb0:
|
|
v0 = vconst.i16x8 [1 0 0 0 0 0 0 0]
|
|
v1 = vconst.i16x8 [0 0 0 0 0 0 0 0]
|
|
v2 = band_not v0, v1
|
|
v3 = extractlane v2, 0
|
|
v4 = icmp_imm eq v3, 1
|
|
return v4
|
|
}
|
|
; run
|
|
|
|
function %vany_true_i16x8() -> b1 {
|
|
ebb0:
|
|
v0 = vconst.i16x8 [1 0 0 0 0 0 0 0]
|
|
v1 = vany_true v0
|
|
return v1
|
|
}
|
|
; run
|
|
|
|
function %vany_true_b32x4() -> b1 {
|
|
ebb0:
|
|
v0 = vconst.b32x4 [false false false false]
|
|
v1 = vany_true v0
|
|
v2 = bint.i32 v1
|
|
v3 = icmp_imm eq v2, 0
|
|
return v3
|
|
}
|
|
; run
|
|
|
|
function %vall_true_i16x8() -> b1 {
|
|
ebb0:
|
|
v0 = vconst.i16x8 [1 0 0 0 0 0 0 0]
|
|
v1 = vall_true v0
|
|
v2 = bint.i32 v1
|
|
v3 = icmp_imm eq v2, 0
|
|
return v3
|
|
}
|
|
; run
|
|
|
|
function %vall_true_b32x4() -> b1 {
|
|
ebb0:
|
|
v0 = vconst.b32x4 [true true true true]
|
|
v1 = vall_true v0
|
|
return v1
|
|
}
|
|
; run
|