Simplify ireduce of modular operators, when it lowers the total instr… · bytecodealliance/wasmtime@d12e423 (original) (raw)
`@@ -250,3 +250,108 @@ block0(v1: f32, v2: f32):
`
250
250
``
251
251
`; check: v6 = fmul v1, v2
`
252
252
`; check: return v6
`
``
253
+
``
254
`+
function %manual_smulhi_32(i32, i32) -> i32 {
`
``
255
`+
block0(v0: i32, v1: i32):
`
``
256
`+
v2 = sextend.i64 v0
`
``
257
`+
v3 = sextend.i64 v1
`
``
258
`+
v4 = imul v2, v3
`
``
259
`+
v5 = iconst.i32 32
`
``
260
`+
v6 = sshr v4, v5
`
``
261
`+
v7 = ireduce.i32 v6
`
``
262
`+
return v7
`
``
263
`+
}
`
``
264
+
``
265
`+
; check: v8 = smulhi v0, v1
`
``
266
`+
; check: return v8
`
``
267
+
``
268
`+
function %manual_smulhi_64(i64, i64) -> i64 {
`
``
269
`+
block0(v0: i64, v1: i64):
`
``
270
`+
v2 = sextend.i128 v0
`
``
271
`+
v3 = sextend.i128 v1
`
``
272
`+
v4 = imul v2, v3
`
``
273
`+
v5 = iconst.i32 64
`
``
274
`+
v6 = sshr v4, v5
`
``
275
`+
v7 = ireduce.i64 v6
`
``
276
`+
return v7
`
``
277
`+
}
`
``
278
+
``
279
`+
; check: v8 = smulhi v0, v1
`
``
280
`+
; check: return v8
`
``
281
+
``
282
`+
function %manual_umulhi_32(i32, i32) -> i32 {
`
``
283
`+
block0(v0: i32, v1: i32):
`
``
284
`+
v2 = uextend.i64 v0
`
``
285
`+
v3 = uextend.i64 v1
`
``
286
`+
v4 = imul v2, v3
`
``
287
`+
v5 = iconst.i32 32
`
``
288
`+
v6 = ushr v4, v5
`
``
289
`+
v7 = ireduce.i32 v6
`
``
290
`+
return v7
`
``
291
`+
}
`
``
292
+
``
293
`+
; check: v8 = umulhi v0, v1
`
``
294
`+
; check: return v8
`
``
295
+
``
296
`+
function %manual_umulhi_64(i64, i64) -> i64 {
`
``
297
`+
block0(v0: i64, v1: i64):
`
``
298
`+
v2 = uextend.i128 v0
`
``
299
`+
v3 = uextend.i128 v1
`
``
300
`+
v4 = imul v2, v3
`
``
301
`+
v5 = iconst.i32 64
`
``
302
`+
v6 = ushr v4, v5
`
``
303
`+
v7 = ireduce.i64 v6
`
``
304
`+
return v7
`
``
305
`+
}
`
``
306
+
``
307
`+
; check: v8 = umulhi v0, v1
`
``
308
`+
; check: return v8
`
``
309
+
``
310
`+
function %u64_widening_mul(i64, i64, i64) {
`
``
311
`+
block0(v0: i64, v1: i64, v2: i64):
`
``
312
`+
v3 = uextend.i128 v1
`
``
313
`+
v4 = uextend.i128 v2
`
``
314
`+
v5 = imul v3, v4
`
``
315
`+
v6 = iconst.i32 64
`
``
316
`+
v7 = ushr v5, v6
`
``
317
`+
v8 = ireduce.i64 v7
`
``
318
`+
v9 = ireduce.i64 v5
`
``
319
`+
store.i64 v9, v0
`
``
320
`+
store.i64 v8, v0+8
`
``
321
`+
return
`
``
322
`+
}
`
``
323
+
``
324
`+
; check: v18 = imul v1, v2
`
``
325
`+
; check: store v18, v0
`
``
326
`+
; check: v10 = umulhi v1, v2
`
``
327
`+
; check: store v10, v0+8
`
``
328
+
``
329
`+
function %char_plus_one(i8) -> i8 {
`
``
330
`+
block0(v0: i8):
`
``
331
`+
v1 = sextend.i32 v0
`
``
332
`+
v2 = iconst.i32 257
`
``
333
`+
v3 = iadd v1, v2
`
``
334
`+
v4 = ireduce.i8 v3
`
``
335
`+
return v4
`
``
336
`+
}
`
``
337
+
``
338
`+
; check: v8 = iconst.i8 1
`
``
339
`+
; check: v9 = iadd v0, v8 ; v8 = 1
`
``
340
`+
; check: return v9
`
``
341
+
``
342
`` +
;; Adding three shorts together and storing them in a short,
``
``
343
`` +
;; which in C involves extending them to ints in the middle.
``
``
344
`+
function %extend_iadd_iadd_reduce(i16, i16, i16) -> i16 {
`
``
345
`+
block0(v0: i16, v1: i16, v2: i16):
`
``
346
`+
v3 = sextend.i32 v0
`
``
347
`+
v4 = sextend.i32 v1
`
``
348
`+
v5 = sextend.i32 v2
`
``
349
`+
v6 = iadd v3, v4
`
``
350
`+
v7 = iadd v6, v5
`
``
351
`+
v8 = ireduce.i16 v7
`
``
352
`+
return v8
`
``
353
`+
}
`
``
354
+
``
355
`+
; check: v14 = iadd v0, v1
`
``
356
`+
; check: v18 = iadd v14, v2
`
``
357
`+
; check: return v18
`