• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s
2
3; Test that scalar_to_vector is lowered into a splat correctly.
4; This bugpoint-reduced code turns into the selection dag below.
5; TODO: find small test cases that produce scalar_to_vector dag nodes
6; to make this test more readable and comprehensive.
7
8;   t0: ch = EntryToken
9; t32: i32,ch = load<(load 4 from `<2 x i16>* undef`, align 1)> t0, undef:i32, undef:i32
10;   t33: v4i32 = scalar_to_vector t32
11; t34: v8i16 = bitcast t33
12;       t51: i32 = extract_vector_elt t34, Constant:i32<0>
13;   t52: ch = store<(store 2 into `<4 x i16>* undef`, align 1), trunc to i16> t32:1, t51, undef:i32, undef:i32
14;       t50: i32 = extract_vector_elt t34, Constant:i32<1>
15;     t53: ch = store<(store 2 into `<4 x i16>* undef` + 2, align 1), trunc to i16> t32:1, t50, undef:i32, undef:i32
16;       t49: i32 = extract_vector_elt t34, Constant:i32<2>
17;     t55: ch = store<(store 2 into `<4 x i16>* undef` + 4, align 1), trunc to i16> t32:1, t49, undef:i32, undef:i32
18;       t48: i32 = extract_vector_elt t34, Constant:i32<3>
19;     t57: ch = store<(store 2 into `<4 x i16>* undef` + 6, align 1), trunc to i16> t32:1, t48, undef:i32, undef:i32
20;   t58: ch = TokenFactor t52, t53, t55, t57
21; t24: ch = WebAssemblyISD::RETURN t58
22
23target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
24target triple = "wasm32-unknown-unknown"
25
26; CHECK-LABEL: foo:
27; CHECK: i64x2.splat
28define void @foo() {
29entry:
30  %a = load <2 x i16>, <2 x i16>* undef, align 1
31  %b = shufflevector <2 x i16> %a, <2 x i16> undef, <8 x i32> <i32 0, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
32  %0 = bitcast <8 x i16> %b to <16 x i8>
33  %shuffle.i214 = shufflevector <16 x i8> %0, <16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>
34  %1 = bitcast <16 x i8> %shuffle.i214 to <8 x i16>
35  %add82 = add <8 x i16> %1, zeroinitializer
36  %2 = select <8 x i1> undef, <8 x i16> undef, <8 x i16> %add82
37  %3 = bitcast <8 x i16> %2 to <16 x i8>
38  %shuffle.i204 = shufflevector <16 x i8> %3, <16 x i8> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
39  %4 = bitcast <16 x i8> %shuffle.i204 to <8 x i16>
40  %dst2.0.vec.extract = shufflevector <8 x i16> %4, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
41  store <4 x i16> %dst2.0.vec.extract, <4 x i16>* undef, align 1
42  ret void
43}
44