Skip to content

Commit a033654

Browse files
committed
cranelift: Add bmask to interpreter
1 parent a90c8a3 commit a033654

File tree

5 files changed

+291
-1
lines changed

5 files changed

+291
-1
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
test interpret
2+
3+
function %bmask_b64_i64(b64) -> i64 {
4+
block0(v0: b64):
5+
v1 = bmask.i64 v0
6+
return v1
7+
}
8+
; run: %bmask_b64_i64(true) == -1
9+
; run: %bmask_b64_i64(false) == 0
10+
11+
function %bmask_b64_i32(b64) -> i32 {
12+
block0(v0: b64):
13+
v1 = bmask.i32 v0
14+
return v1
15+
}
16+
; run: %bmask_b64_i32(true) == -1
17+
; run: %bmask_b64_i32(false) == 0
18+
19+
function %bmask_b64_i16(b64) -> i16 {
20+
block0(v0: b64):
21+
v1 = bmask.i16 v0
22+
return v1
23+
}
24+
; run: %bmask_b64_i16(true) == -1
25+
; run: %bmask_b64_i16(false) == 0
26+
27+
function %bmask_b64_i8(b64) -> i8 {
28+
block0(v0: b64):
29+
v1 = bmask.i8 v0
30+
return v1
31+
}
32+
; run: %bmask_b64_i8(true) == -1
33+
; run: %bmask_b64_i8(false) == 0
34+
35+
function %bmask_b32_i64(b32) -> i64 {
36+
block0(v0: b32):
37+
v1 = bmask.i64 v0
38+
return v1
39+
}
40+
; run: %bmask_b32_i64(true) == -1
41+
; run: %bmask_b32_i64(false) == 0
42+
43+
function %bmask_b32_i32(b32) -> i32 {
44+
block0(v0: b32):
45+
v1 = bmask.i32 v0
46+
return v1
47+
}
48+
; run: %bmask_b32_i32(true) == -1
49+
; run: %bmask_b32_i32(false) == 0
50+
51+
function %bmask_b32_i16(b32) -> i16 {
52+
block0(v0: b32):
53+
v1 = bmask.i16 v0
54+
return v1
55+
}
56+
; run: %bmask_b32_i16(true) == -1
57+
; run: %bmask_b32_i16(false) == 0
58+
59+
function %bmask_b32_i8(b32) -> i8 {
60+
block0(v0: b32):
61+
v1 = bmask.i8 v0
62+
return v1
63+
}
64+
; run: %bmask_b32_i8(true) == -1
65+
; run: %bmask_b32_i8(false) == 0
66+
67+
function %bmask_b16_i64(b16) -> i64 {
68+
block0(v0: b16):
69+
v1 = bmask.i64 v0
70+
return v1
71+
}
72+
; run: %bmask_b16_i64(true) == -1
73+
; run: %bmask_b16_i64(false) == 0
74+
75+
function %bmask_b16_i32(b16) -> i32 {
76+
block0(v0: b16):
77+
v1 = bmask.i32 v0
78+
return v1
79+
}
80+
; run: %bmask_b16_i32(true) == -1
81+
; run: %bmask_b16_i32(false) == 0
82+
83+
function %bmask_b16_i16(b16) -> i16 {
84+
block0(v0: b16):
85+
v1 = bmask.i16 v0
86+
return v1
87+
}
88+
; run: %bmask_b16_i16(true) == -1
89+
; run: %bmask_b16_i16(false) == 0
90+
91+
function %bmask_b16_i8(b16) -> i8 {
92+
block0(v0: b16):
93+
v1 = bmask.i8 v0
94+
return v1
95+
}
96+
; run: %bmask_b16_i8(true) == -1
97+
; run: %bmask_b16_i8(false) == 0
98+
99+
function %bmask_b8_i64(b8) -> i64 {
100+
block0(v0: b8):
101+
v1 = bmask.i64 v0
102+
return v1
103+
}
104+
; run: %bmask_b8_i64(true) == -1
105+
; run: %bmask_b8_i64(false) == 0
106+
107+
function %bmask_b8_i32(b8) -> i32 {
108+
block0(v0: b8):
109+
v1 = bmask.i32 v0
110+
return v1
111+
}
112+
; run: %bmask_b8_i32(true) == -1
113+
; run: %bmask_b8_i32(false) == 0
114+
115+
function %bmask_b8_i16(b8) -> i16 {
116+
block0(v0: b8):
117+
v1 = bmask.i16 v0
118+
return v1
119+
}
120+
; run: %bmask_b8_i16(true) == -1
121+
; run: %bmask_b8_i16(false) == 0
122+
123+
function %bmask_b8_i8(b8) -> i8 {
124+
block0(v0: b8):
125+
v1 = bmask.i8 v0
126+
return v1
127+
}
128+
; run: %bmask_b8_i8(true) == -1
129+
; run: %bmask_b8_i8(false) == 0
130+
131+
function %bmask_b1_i64(b1) -> i64 {
132+
block0(v0: b1):
133+
v1 = bmask.i64 v0
134+
return v1
135+
}
136+
; run: %bmask_b1_i64(true) == -1
137+
; run: %bmask_b1_i64(false) == 0
138+
139+
function %bmask_b1_i32(b1) -> i32 {
140+
block0(v0: b1):
141+
v1 = bmask.i32 v0
142+
return v1
143+
}
144+
; run: %bmask_b1_i32(true) == -1
145+
; run: %bmask_b1_i32(false) == 0
146+
147+
function %bmask_b1_i16(b1) -> i16 {
148+
block0(v0: b1):
149+
v1 = bmask.i16 v0
150+
return v1
151+
}
152+
; run: %bmask_b1_i16(true) == -1
153+
; run: %bmask_b1_i16(false) == 0
154+
155+
function %bmask_b1_i8(b1) -> i8 {
156+
block0(v0: b1):
157+
v1 = bmask.i8 v0
158+
return v1
159+
}
160+
; run: %bmask_b1_i8(true) == -1
161+
; run: %bmask_b1_i8(false) == 0
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
test interpret
2+
3+
function %bmask_b128_i128(b128) -> i128 {
4+
block0(v0: b128):
5+
v1 = bmask.i128 v0
6+
return v1
7+
}
8+
; run: %bmask_b128_i128(true) == -1
9+
; run: %bmask_b128_i128(false) == 0
10+
11+
function %bmask_b128_i64(b128) -> i64 {
12+
block0(v0: b128):
13+
v1 = bmask.i64 v0
14+
return v1
15+
}
16+
; run: %bmask_b128_i64(true) == -1
17+
; run: %bmask_b128_i64(false) == 0
18+
19+
function %bmask_b128_i32(b128) -> i32 {
20+
block0(v0: b128):
21+
v1 = bmask.i32 v0
22+
return v1
23+
}
24+
; run: %bmask_b128_i32(true) == -1
25+
; run: %bmask_b128_i32(false) == 0
26+
27+
function %bmask_b128_i16(b128) -> i16 {
28+
block0(v0: b128):
29+
v1 = bmask.i16 v0
30+
return v1
31+
}
32+
; run: %bmask_b128_i16(true) == -1
33+
; run: %bmask_b128_i16(false) == 0
34+
35+
function %bmask_b128_i8(b128) -> i8 {
36+
block0(v0: b128):
37+
v1 = bmask.i8 v0
38+
return v1
39+
}
40+
; run: %bmask_b128_i8(true) == -1
41+
; run: %bmask_b128_i8(false) == 0
42+
43+
44+
function %bmask_b64_i128(b64) -> i128 {
45+
block0(v0: b64):
46+
v1 = bmask.i128 v0
47+
return v1
48+
}
49+
; run: %bmask_b64_i128(true) == -1
50+
; run: %bmask_b64_i128(false) == 0
51+
52+
function %bmask_b32_i128(b32) -> i128 {
53+
block0(v0: b32):
54+
v1 = bmask.i128 v0
55+
return v1
56+
}
57+
; run: %bmask_b32_i128(true) == -1
58+
; run: %bmask_b32_i128(false) == 0
59+
60+
function %bmask_b16_i128(b16) -> i128 {
61+
block0(v0: b16):
62+
v1 = bmask.i128 v0
63+
return v1
64+
}
65+
; run: %bmask_b16_i128(true) == -1
66+
; run: %bmask_b16_i128(false) == 0
67+
68+
function %bmask_b8_i128(b8) -> i128 {
69+
block0(v0: b8):
70+
v1 = bmask.i128 v0
71+
return v1
72+
}
73+
; run: %bmask_b8_i128(true) == -1
74+
; run: %bmask_b8_i128(false) == 0
75+
76+
function %bmask_b1_i128(b1) -> i128 {
77+
block0(v0: b1):
78+
v1 = bmask.i128 v0
79+
return v1
80+
}
81+
; run: %bmask_b1_i128(true) == -1
82+
; run: %bmask_b1_i128(false) == 0
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
test interpret
2+
3+
4+
function %bmask_i8x16(b8x16) -> i8x16 {
5+
block0(v0: b8x16):
6+
v1 = bmask.i8x16 v0
7+
return v1
8+
}
9+
; run: %bmask_i8x16([true false true false true false true false true false true false true false true false]) == [-1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0 -1 0]
10+
11+
function %bmask_i16x8(b16x8) -> i16x8 {
12+
block0(v0: b16x8):
13+
v1 = bmask.i16x8 v0
14+
return v1
15+
}
16+
; run: %bmask_i16x8([true false true false true false true false]) == [-1 0 -1 0 -1 0 -1 0]
17+
18+
function %bmask_i32x4(b32x4) -> i32x4 {
19+
block0(v0: b32x4):
20+
v1 = bmask.i32x4 v0
21+
return v1
22+
}
23+
; run: %bmask_i32x4([true false true false]) == [-1 0 -1 0]
24+
25+
function %bmask_i64x2(b64x2) -> i64x2 {
26+
block0(v0: b64x2):
27+
v1 = bmask.i64x2 v0
28+
return v1
29+
}
30+
; run: %bmask_i64x2([true false]) == [-1 0]

cranelift/interpreter/src/step.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,11 +774,23 @@ where
774774
| Opcode::Breduce
775775
| Opcode::Bextend
776776
| Opcode::Bint
777-
| Opcode::Bmask
778777
| Opcode::Ireduce => assign(Value::convert(
779778
arg(0)?,
780779
ValueConversionKind::Exact(ctrl_ty),
781780
)?),
781+
Opcode::Bmask => assign({
782+
let bool = arg(0)?;
783+
let bool_ty = ctrl_ty.as_bool_pedantic();
784+
if ctrl_ty.is_vector() {
785+
let lanes = extractlanes(&bool, bool_ty.lane_type())?
786+
.into_iter()
787+
.map(|lane| lane.convert(ValueConversionKind::Exact(ctrl_ty.lane_type())))
788+
.collect::<ValueResult<SimdVec<V>>>()?;
789+
vectorizelanes(&lanes, ctrl_ty)?
790+
} else {
791+
bool.convert(ValueConversionKind::Exact(ctrl_ty))?
792+
}
793+
}),
782794
Opcode::Snarrow => assign(Value::convert(
783795
arg(0)?,
784796
ValueConversionKind::Truncate(ctrl_ty),

cranelift/interpreter/src/value.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,11 @@ impl Value for DataValue {
272272
(DataValue::I64(n), types::I32) => DataValue::I32(i32::try_from(n)?),
273273
(DataValue::I64(n), types::I64) => DataValue::I64(n),
274274
(DataValue::B(b), t) if t.is_bool() => DataValue::B(b),
275+
(DataValue::B(b), t) if t.is_int() => {
276+
// Implements the bmask behaviour of converting bools to all 1's
277+
let val = if b { (1i128 << t.bits()) - 1 } else { 0 };
278+
DataValue::int(val, t)?
279+
}
275280
(dv, _) => unimplemented!("conversion: {} -> {:?}", dv.ty(), kind),
276281
},
277282
ValueConversionKind::Truncate(ty) => {

0 commit comments

Comments
 (0)