1; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s 2 3; Splat patterns below 4 5 6define <4 x i32> @shl4(<4 x i32> %A) nounwind { 7entry: 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 17define <4 x i32> @shr4(<4 x i32> %A) nounwind { 18entry: 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 28define <4 x i32> @sra4(<4 x i32> %A) nounwind { 29entry: 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 39define <2 x i64> @shl2(<2 x i64> %A) nounwind { 40entry: 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 50define <2 x i64> @shr2(<2 x i64> %A) nounwind { 51entry: 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 62define <8 x i16> @shl8(<8 x i16> %A) nounwind { 63entry: 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 73define <8 x i16> @shr8(<8 x i16> %A) nounwind { 74entry: 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 84define <8 x i16> @sra8(<8 x i16> %A) nounwind { 85entry: 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 98define <8 x i16> @sll8_nosplat(<8 x i16> %A) nounwind { 99entry: 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 110define <2 x i64> @shr2_nosplat(<2 x i64> %A) nounwind { 111entry: 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 124define <2 x i32> @shl2_other(<2 x i32> %A) nounwind { 125entry: 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 134define <2 x i32> @shr2_other(<2 x i32> %A) nounwind { 135entry: 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