ARM64: initial backend import
[oota-llvm.git] / test / CodeGen / ARM64 / vshuffle.ll
1 ; RUN: llc < %s -mtriple=arm64-apple-ios7.0 | FileCheck %s
2
3
4 ; The mask:
5 ; CHECK: lCPI0_0:
6 ; CHECK:  .byte   2                       ; 0x2
7 ; CHECK:  .byte   255                     ; 0xff
8 ; CHECK:  .byte   6                       ; 0x6
9 ; CHECK:  .byte   255                     ; 0xff
10 ; The second vector is legalized to undef and the elements of the first vector
11 ; are used instead.
12 ; CHECK:  .byte   2                       ; 0x2
13 ; CHECK:  .byte   4                       ; 0x4
14 ; CHECK:  .byte   6                       ; 0x6
15 ; CHECK:  .byte   0                       ; 0x0
16 ; CHECK: test1
17 ; CHECK: ldr d[[REG0:[0-9]+]], [{{.*}}, lCPI0_0
18 ; CHECK: movi.8h v[[REG1:[0-9]+]], #1, lsl #8
19 ; CHECK: tbl.8b  v{{[0-9]+}}, { v[[REG1]] }, v[[REG0]]
20 define <8 x i1> @test1() {
21 entry:
22   %Shuff = shufflevector <8 x i1> <i1 0, i1 1, i1 2, i1 3, i1 4, i1 5, i1 6,
23                                    i1 7>,
24                          <8 x i1> <i1 0, i1 1, i1 2, i1 3, i1 4, i1 5, i1 6,
25                                    i1 7>,
26                          <8 x i32> <i32 2, i32 undef, i32 6, i32 undef, i32 10,
27                                     i32 12, i32 14, i32 0>
28   ret <8 x i1> %Shuff
29 }
30
31 ; CHECK: lCPI1_0:
32 ; CHECK:          .byte   2                       ; 0x2
33 ; CHECK:          .byte   255                     ; 0xff
34 ; CHECK:          .byte   6                       ; 0x6
35 ; CHECK:          .byte   255                     ; 0xff
36 ; CHECK:          .byte   10                      ; 0xa
37 ; CHECK:          .byte   12                      ; 0xc
38 ; CHECK:          .byte   14                      ; 0xe
39 ; CHECK:          .byte   0                       ; 0x0
40 ; CHECK: test2
41 ; CHECK: ldr     d[[REG0:[0-9]+]], [{{.*}}, lCPI1_0@PAGEOFF]
42 ; CHECK: adrp    x[[REG2:[0-9]+]], lCPI1_1@PAGE
43 ; CHECK: ldr     q[[REG1:[0-9]+]], [x[[REG2]], lCPI1_1@PAGEOFF]
44 ; CHECK: tbl.8b  v{{[0-9]+}}, { v[[REG1]] }, v[[REG0]]
45 define <8 x i1>@test2() {
46 bb:
47   %Shuff = shufflevector <8 x i1> zeroinitializer,
48      <8 x i1> <i1 0, i1 1, i1 1, i1 0, i1 0, i1 1, i1 0, i1 0>,
49      <8 x i32> <i32 2, i32 undef, i32 6, i32 undef, i32 10, i32 12, i32 14,
50                 i32 0>
51   ret <8 x i1> %Shuff
52 }
53
54 ; CHECK: lCPI2_0:
55 ; CHECK:         .byte   2                       ; 0x2
56 ; CHECK:         .byte   255                     ; 0xff
57 ; CHECK:         .byte   6                       ; 0x6
58 ; CHECK:         .byte   255                     ; 0xff
59 ; CHECK:         .byte   10                      ; 0xa
60 ; CHECK:         .byte   12                      ; 0xc
61 ; CHECK:         .byte   14                      ; 0xe
62 ; CHECK:         .byte   0                       ; 0x0
63 ; CHECK:         .byte   2                       ; 0x2
64 ; CHECK:         .byte   255                     ; 0xff
65 ; CHECK:         .byte   6                       ; 0x6
66 ; CHECK:         .byte   255                     ; 0xff
67 ; CHECK:         .byte   10                      ; 0xa
68 ; CHECK:         .byte   12                      ; 0xc
69 ; CHECK:         .byte   14                      ; 0xe
70 ; CHECK:         .byte   0                       ; 0x0
71 ; CHECK: test3
72 ; CHECK: adrp    x[[REG3:[0-9]+]], lCPI2_0@PAGE
73 ; CHECK: ldr     q[[REG0:[0-9]+]], [x[[REG3]], lCPI2_0@PAGEOFF]
74 ; CHECK: movi.2d v[[REG1:[0-9]+]], #0000000000000000
75 ; CHECK: tbl.16b v{{[0-9]+}}, { v[[REG1]] }, v[[REG0]]
76 define <16 x i1> @test3(i1* %ptr, i32 %v) {
77 bb:
78   %Shuff = shufflevector <16 x i1> zeroinitializer, <16 x i1> undef,
79      <16 x i32> <i32 2, i32 undef, i32 6, i32 undef, i32 10, i32 12, i32 14,
80                  i32 0, i32 2, i32 undef, i32 6, i32 undef, i32 10, i32 12,
81                  i32 14, i32 0>
82   ret <16 x i1> %Shuff
83 }
84 ; CHECK: lCPI3_1:
85 ; CHECK:         .byte   2                       ; 0x2
86 ; CHECK:         .byte   1                       ; 0x1
87 ; CHECK:         .byte   6                       ; 0x6
88 ; CHECK:         .byte   18                      ; 0x12
89 ; CHECK:         .byte   10                      ; 0xa
90 ; CHECK:         .byte   12                      ; 0xc
91 ; CHECK:         .byte   14                      ; 0xe
92 ; CHECK:         .byte   0                       ; 0x0
93 ; CHECK:         .byte   2                       ; 0x2
94 ; CHECK:         .byte   31                      ; 0x1f
95 ; CHECK:         .byte   6                       ; 0x6
96 ; CHECK:         .byte   30                      ; 0x1e
97 ; CHECK:         .byte   10                      ; 0xa
98 ; CHECK:         .byte   12                      ; 0xc
99 ; CHECK:         .byte   14                      ; 0xe
100 ; CHECK:         .byte   0                       ; 0x0
101 ; CHECK: _test4:
102 ; CHECK:         ldr     q[[REG1:[0-9]+]]
103 ; CHECK:         movi.2d v[[REG0:[0-9]+]], #0000000000000000
104 ; CHECK:         adrp    x[[REG3:[0-9]+]], lCPI3_1@PAGE
105 ; CHECK:         ldr     q[[REG2:[0-9]+]], [x[[REG3]], lCPI3_1@PAGEOFF]
106 ; CHECK:         tbl.16b v{{[0-9]+}}, { v[[REG0]], v[[REG1]] }, v[[REG2]]
107 define <16 x i1> @test4(i1* %ptr, i32 %v) {
108 bb:
109   %Shuff = shufflevector <16 x i1> zeroinitializer,
110      <16 x i1> <i1 0, i1 1, i1 1, i1 0, i1 0, i1 1, i1 0, i1 0, i1 0, i1 1,
111                 i1 1, i1 0, i1 0, i1 1, i1 0, i1 0>,
112      <16 x i32> <i32 2, i32 1, i32 6, i32 18, i32 10, i32 12, i32 14, i32 0,
113                  i32 2, i32 31, i32 6, i32 30, i32 10, i32 12, i32 14, i32 0>
114   ret <16 x i1> %Shuff
115 }