2015-11-24 05:33:58 +08:00
|
|
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
2016-04-02 03:42:23 +08:00
|
|
|
; RUN: llc < %s -mtriple=i386-unknown -mattr=+sse2,+ssse3 | FileCheck %s --check-prefix=X32
|
|
|
|
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2,+ssse3 | FileCheck %s --check-prefix=X64
|
|
|
|
|
2010-10-01 07:57:10 +08:00
|
|
|
; There are no MMX operations in @t1
|
2008-05-29 16:22:04 +08:00
|
|
|
|
2010-10-01 07:57:10 +08:00
|
|
|
define void @t1(i32 %a, x86_mmx* %P) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t1:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
|
|
; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
|
|
; X32-NEXT: shll $12, %ecx
|
|
|
|
; X32-NEXT: movd %ecx, %xmm0
|
|
|
|
; X32-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
|
|
|
|
; X32-NEXT: movq %xmm0, (%eax)
|
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t1:
|
|
|
|
; X64: # BB#0:
|
2016-07-09 08:19:07 +08:00
|
|
|
; X64-NEXT: # kill: %EDI<def> %EDI<kill> %RDI<def>
|
2016-04-02 03:42:23 +08:00
|
|
|
; X64-NEXT: shll $12, %edi
|
2017-04-26 15:08:44 +08:00
|
|
|
; X64-NEXT: movq %rdi, %xmm0
|
2016-04-02 03:42:23 +08:00
|
|
|
; X64-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
|
|
|
|
; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
|
|
|
|
; X64-NEXT: movq %xmm0, (%rsi)
|
|
|
|
; X64-NEXT: retq
|
2014-10-03 09:50:08 +08:00
|
|
|
%tmp12 = shl i32 %a, 12
|
|
|
|
%tmp21 = insertelement <2 x i32> undef, i32 %tmp12, i32 1
|
|
|
|
%tmp22 = insertelement <2 x i32> %tmp21, i32 0, i32 0
|
|
|
|
%tmp23 = bitcast <2 x i32> %tmp22 to x86_mmx
|
|
|
|
store x86_mmx %tmp23, x86_mmx* %P
|
|
|
|
ret void
|
2008-05-29 16:22:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
define <4 x float> @t2(<4 x float>* %P) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t2:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
|
|
; X32-NEXT: movaps (%eax), %xmm1
|
|
|
|
; X32-NEXT: xorps %xmm0, %xmm0
|
|
|
|
; X32-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
|
|
|
|
; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
|
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t2:
|
|
|
|
; X64: # BB#0:
|
|
|
|
; X64-NEXT: movaps (%rdi), %xmm1
|
|
|
|
; X64-NEXT: xorps %xmm0, %xmm0
|
|
|
|
; X64-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
|
|
|
|
; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
|
|
|
|
; X64-NEXT: retq
|
2015-02-28 05:17:42 +08:00
|
|
|
%tmp1 = load <4 x float>, <4 x float>* %P
|
2014-10-03 09:50:08 +08:00
|
|
|
%tmp2 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 4, i32 4, i32 4, i32 0 >
|
|
|
|
ret <4 x float> %tmp2
|
2008-05-29 16:22:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
define <4 x float> @t3(<4 x float>* %P) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t3:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
2016-08-07 02:40:28 +08:00
|
|
|
; X32-NEXT: xorps %xmm0, %xmm0
|
|
|
|
; X32-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t3:
|
|
|
|
; X64: # BB#0:
|
2016-08-07 02:40:28 +08:00
|
|
|
; X64-NEXT: xorps %xmm0, %xmm0
|
|
|
|
; X64-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]
|
2016-04-02 03:42:23 +08:00
|
|
|
; X64-NEXT: retq
|
2015-02-28 05:17:42 +08:00
|
|
|
%tmp1 = load <4 x float>, <4 x float>* %P
|
2014-10-03 09:50:08 +08:00
|
|
|
%tmp2 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 2, i32 3, i32 4, i32 4 >
|
|
|
|
ret <4 x float> %tmp2
|
2008-05-29 16:22:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
define <4 x float> @t4(<4 x float>* %P) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t4:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
|
|
; X32-NEXT: movaps (%eax), %xmm0
|
|
|
|
; X32-NEXT: xorps %xmm1, %xmm1
|
|
|
|
; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[1,0]
|
|
|
|
; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
|
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t4:
|
|
|
|
; X64: # BB#0:
|
|
|
|
; X64-NEXT: movaps (%rdi), %xmm0
|
|
|
|
; X64-NEXT: xorps %xmm1, %xmm1
|
|
|
|
; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[1,0]
|
|
|
|
; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
|
|
|
|
; X64-NEXT: retq
|
2015-02-28 05:17:42 +08:00
|
|
|
%tmp1 = load <4 x float>, <4 x float>* %P
|
2014-10-03 09:50:08 +08:00
|
|
|
%tmp2 = shufflevector <4 x float> zeroinitializer, <4 x float> %tmp1, <4 x i32> < i32 7, i32 0, i32 0, i32 0 >
|
|
|
|
ret <4 x float> %tmp2
|
2008-05-29 16:22:04 +08:00
|
|
|
}
|
2013-05-17 22:48:34 +08:00
|
|
|
|
|
|
|
define <16 x i8> @t5(<16 x i8> %x) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t5:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: psrlw $8, %xmm0
|
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t5:
|
|
|
|
; X64: # BB#0:
|
|
|
|
; X64-NEXT: psrlw $8, %xmm0
|
|
|
|
; X64-NEXT: retq
|
2014-10-03 09:50:08 +08:00
|
|
|
%s = shufflevector <16 x i8> %x, <16 x i8> zeroinitializer, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 17>
|
|
|
|
ret <16 x i8> %s
|
2013-05-17 22:48:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
define <16 x i8> @t6(<16 x i8> %x) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t6:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: psrlw $8, %xmm0
|
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t6:
|
|
|
|
; X64: # BB#0:
|
|
|
|
; X64-NEXT: psrlw $8, %xmm0
|
|
|
|
; X64-NEXT: retq
|
2014-10-03 09:50:08 +08:00
|
|
|
%s = shufflevector <16 x i8> %x, <16 x i8> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
|
|
|
|
ret <16 x i8> %s
|
2013-05-17 22:48:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
define <16 x i8> @t7(<16 x i8> %x) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t7:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
|
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t7:
|
|
|
|
; X64: # BB#0:
|
|
|
|
; X64-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
|
|
|
|
; X64-NEXT: retq
|
2014-10-03 09:50:08 +08:00
|
|
|
%s = shufflevector <16 x i8> %x, <16 x i8> undef, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 2>
|
|
|
|
ret <16 x i8> %s
|
2013-05-17 22:48:34 +08:00
|
|
|
}
|
2015-02-04 05:58:29 +08:00
|
|
|
|
|
|
|
define <16 x i8> @t8(<16 x i8> %x) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t8:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
|
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t8:
|
|
|
|
; X64: # BB#0:
|
|
|
|
; X64-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
|
|
|
|
; X64-NEXT: retq
|
2015-02-04 05:58:29 +08:00
|
|
|
%s = shufflevector <16 x i8> %x, <16 x i8> zeroinitializer, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 8, i32 9, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 17>
|
|
|
|
ret <16 x i8> %s
|
|
|
|
}
|
|
|
|
|
|
|
|
define <16 x i8> @t9(<16 x i8> %x) nounwind {
|
2016-04-02 03:42:23 +08:00
|
|
|
; X32-LABEL: t9:
|
|
|
|
; X32: # BB#0:
|
|
|
|
; X32-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
|
|
|
|
; X32-NEXT: retl
|
|
|
|
;
|
|
|
|
; X64-LABEL: t9:
|
|
|
|
; X64: # BB#0:
|
|
|
|
; X64-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
|
|
|
|
; X64-NEXT: retq
|
2015-02-04 05:58:29 +08:00
|
|
|
%s = shufflevector <16 x i8> %x, <16 x i8> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 7, i32 8, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 14, i32 undef, i32 undef>
|
|
|
|
ret <16 x i8> %s
|
|
|
|
}
|