1 ; RUN: llc < %s -mtriple=arm64-apple-ios7.0 -mcpu=cyclone | 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]+]], #0x1, 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: ldr q[[REG1:[0-9]+]], [x[[REG3]], lCPI2_1@PAGEOFF] 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> <i1 0, i1 1, i1 1, i1 0, i1 0, i1 1, i1 0, i1 0, i1 0, i1 1, i1 1, i1 0, i1 0, i1 1, i1 0, i1 0>, <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 } 116