During DAG combine, promote the operands to v8i16 by concanting with an undef vector and then use extmul_low to perform the mul at i16. Finally, shuffle the low bytes out of the i16 elements into the result vector.
34 lines
1.2 KiB
LLVM
34 lines
1.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: llc < %s -mtriple=wasm32 -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s
|
|
|
|
define <8 x i8> @mul_v8i8(<8 x i8> %a, <8 x i8> %b) {
|
|
; CHECK-LABEL: mul_v8i8:
|
|
; CHECK: .functype mul_v8i8 (v128, v128) -> (v128)
|
|
; CHECK-NEXT: # %bb.0:
|
|
; CHECK-NEXT: i16x8.extmul_low_i8x16_u $push0=, $0, $1
|
|
; CHECK-NEXT: i8x16.shuffle $push1=, $pop0, $1, 0, 2, 4, 6, 8, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0
|
|
; CHECK-NEXT: return $pop1
|
|
%mul = mul <8 x i8> %a, %b
|
|
ret <8 x i8> %mul
|
|
}
|
|
|
|
define <4 x i16> @mul_v4i16(<4 x i16> %a, <4 x i16> %b) {
|
|
; CHECK-LABEL: mul_v4i16:
|
|
; CHECK: .functype mul_v4i16 (v128, v128) -> (v128)
|
|
; CHECK-NEXT: # %bb.0:
|
|
; CHECK-NEXT: i16x8.mul $push0=, $0, $1
|
|
; CHECK-NEXT: return $pop0
|
|
%mul = mul <4 x i16> %a, %b
|
|
ret <4 x i16> %mul
|
|
}
|
|
|
|
define <2 x i32> @mul_v2i32(<2 x i32> %a, <2 x i32> %b) {
|
|
; CHECK-LABEL: mul_v2i32:
|
|
; CHECK: .functype mul_v2i32 (v128, v128) -> (v128)
|
|
; CHECK-NEXT: # %bb.0:
|
|
; CHECK-NEXT: i32x4.mul $push0=, $0, $1
|
|
; CHECK-NEXT: return $pop0
|
|
%mul = mul <2 x i32> %a, %b
|
|
ret <2 x i32> %mul
|
|
}
|