1 ; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s 2 3 ; Splat patterns below 4 5 6 define <4 x i32> @shl4(<4 x i32> %A) nounwind { 7 entry: 8 ; CHECK: shl4 9 ; CHECK: pslld 10 ; CHECK-NEXT: pslld 11 %B = shl <4 x i32> %A, < i32 2, i32 2, i32 2, i32 2> 12 %C = shl <4 x i32> %A, < i32 1, i32 1, i32 1, i32 1> 13 %K = xor <4 x i32> %B, %C 14 ret <4 x i32> %K 15 } 16 17 define <4 x i32> @shr4(<4 x i32> %A) nounwind { 18 entry: 19 ; CHECK: shr4 20 ; CHECK: psrld 21 ; CHECK-NEXT: psrld 22 %B = lshr <4 x i32> %A, < i32 2, i32 2, i32 2, i32 2> 23 %C = lshr <4 x i32> %A, < i32 1, i32 1, i32 1, i32 1> 24 %K = xor <4 x i32> %B, %C 25 ret <4 x i32> %K 26 } 27 28 define <4 x i32> @sra4(<4 x i32> %A) nounwind { 29 entry: 30 ; CHECK: sra4 31 ; CHECK: psrad 32 ; CHECK-NEXT: psrad 33 %B = ashr <4 x i32> %A, < i32 2, i32 2, i32 2, i32 2> 34 %C = ashr <4 x i32> %A, < i32 1, i32 1, i32 1, i32 1> 35 %K = xor <4 x i32> %B, %C 36 ret <4 x i32> %K 37 } 38 39 define <2 x i64> @shl2(<2 x i64> %A) nounwind { 40 entry: 41 ; CHECK: shl2 42 ; CHECK: psllq 43 ; CHECK-NEXT: psllq 44 %B = shl <2 x i64> %A, < i64 2, i64 2> 45 %C = shl <2 x i64> %A, < i64 9, i64 9> 46 %K = xor <2 x i64> %B, %C 47 ret <2 x i64> %K 48 } 49 50 define <2 x i64> @shr2(<2 x i64> %A) nounwind { 51 entry: 52 ; CHECK: shr2 53 ; CHECK: psrlq 54 ; CHECK-NEXT: psrlq 55 %B = lshr <2 x i64> %A, < i64 8, i64 8> 56 %C = lshr <2 x i64> %A, < i64 1, i64 1> 57 %K = xor <2 x i64> %B, %C 58 ret <2 x i64> %K 59 } 60 61 62 define <8 x i16> @shl8(<8 x i16> %A) nounwind { 63 entry: 64 ; CHECK: shl8 65 ; CHECK: psllw 66 ; CHECK-NEXT: psllw 67 %B = shl <8 x i16> %A, < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 68 %C = shl <8 x i16> %A, < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 69 %K = xor <8 x i16> %B, %C 70 ret <8 x i16> %K 71 } 72 73 define <8 x i16> @shr8(<8 x i16> %A) nounwind { 74 entry: 75 ; CHECK: shr8 76 ; CHECK: psrlw 77 ; CHECK-NEXT: psrlw 78 %B = lshr <8 x i16> %A, < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 79 %C = lshr <8 x i16> %A, < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 80 %K = xor <8 x i16> %B, %C 81 ret <8 x i16> %K 82 } 83 84 define <8 x i16> @sra8(<8 x i16> %A) nounwind { 85 entry: 86 ; CHECK: sra8 87 ; CHECK: psraw 88 ; CHECK-NEXT: psraw 89 %B = ashr <8 x i16> %A, < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 90 %C = ashr <8 x i16> %A, < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 91 %K = xor <8 x i16> %B, %C 92 ret <8 x i16> %K 93 } 94 95 ; non splat test 96 97 98 define <8 x i16> @sll8_nosplat(<8 x i16> %A) nounwind { 99 entry: 100 ; CHECK: sll8_nosplat 101 ; CHECK-NOT: psll 102 ; CHECK-NOT: psll 103 %B = shl <8 x i16> %A, < i16 1, i16 2, i16 3, i16 6, i16 2, i16 2, i16 2, i16 2> 104 %C = shl <8 x i16> %A, < i16 9, i16 7, i16 5, i16 1, i16 4, i16 1, i16 1, i16 1> 105 %K = xor <8 x i16> %B, %C 106 ret <8 x i16> %K 107 } 108 109 110 define <2 x i64> @shr2_nosplat(<2 x i64> %A) nounwind { 111 entry: 112 ; CHECK: shr2_nosplat 113 ; CHECK-NOT: psrlq 114 ; CHECK-NOT: psrlq 115 %B = lshr <2 x i64> %A, < i64 8, i64 1> 116 %C = lshr <2 x i64> %A, < i64 1, i64 0> 117 %K = xor <2 x i64> %B, %C 118 ret <2 x i64> %K 119 } 120 121 122 ; Other shifts 123 124 define <2 x i32> @shl2_other(<2 x i32> %A) nounwind { 125 entry: 126 ; CHECK: shl2_other 127 ; CHECK-not: psllq 128 %B = shl <2 x i32> %A, < i32 2, i32 2> 129 %C = shl <2 x i32> %A, < i32 9, i32 9> 130 %K = xor <2 x i32> %B, %C 131 ret <2 x i32> %K 132 } 133 134 define <2 x i32> @shr2_other(<2 x i32> %A) nounwind { 135 entry: 136 ; CHECK: shr2_other 137 ; CHECK-NOT: psrlq 138 %B = lshr <2 x i32> %A, < i32 8, i32 8> 139 %C = lshr <2 x i32> %A, < i32 1, i32 1> 140 %K = xor <2 x i32> %B, %C 141 ret <2 x i32> %K 142 } 143