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

`