1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
2
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s
3
3
4
- ; TODO: (zext(select c, load1, load2)) -> (select c, zextload1, zextload2)
4
+ ; (zext(select c, load1, load2)) -> (select c, zextload1, zextload2)
5
5
define i64 @zext_scalar (i8* %p , i1 zeroext %c ) {
6
6
; CHECK-LABEL: zext_scalar:
7
7
; CHECK: # %bb.0:
8
- ; CHECK-NEXT: movzbl (%rdi), %eax
9
- ; CHECK-NEXT: movzbl 1(%rdi), %ecx
8
+ ; CHECK-NEXT: movzbl (%rdi), %ecx
9
+ ; CHECK-NEXT: movzbl 1(%rdi), %eax
10
10
; CHECK-NEXT: testl %esi, %esi
11
- ; CHECK-NEXT: cmovel %eax, %ecx
12
- ; CHECK-NEXT: movzbl %cl, %eax
11
+ ; CHECK-NEXT: cmoveq %rcx, %rax
13
12
; CHECK-NEXT: retq
14
13
%ld1 = load volatile i8 , i8* %p
15
14
%arrayidx1 = getelementptr inbounds i8 , i8* %p , i64 1
@@ -22,13 +21,10 @@ define i64 @zext_scalar(i8* %p, i1 zeroext %c) {
22
21
define i64 @zext_scalar2 (i8* %p , i16* %q , i1 zeroext %c ) {
23
22
; CHECK-LABEL: zext_scalar2:
24
23
; CHECK: # %bb.0:
25
- ; CHECK-NEXT: movzbl (%rdi), %eax
26
- ; CHECK-NEXT: testl %edx, %edx
27
- ; CHECK-NEXT: je .LBB1_2
28
- ; CHECK-NEXT: # %bb.1:
24
+ ; CHECK-NEXT: movzbl (%rdi), %ecx
29
25
; CHECK-NEXT: movzwl (%rsi), %eax
30
- ; CHECK-NEXT: .LBB1_2:
31
- ; CHECK-NEXT: movzwl %ax , %eax
26
+ ; CHECK-NEXT: testl %edx, %edx
27
+ ; CHECK-NEXT: cmoveq %rcx , %rax
32
28
; CHECK-NEXT: retq
33
29
%ld1 = load volatile i8 , i8* %p
34
30
%ext_ld1 = zext i8 %ld1 to i16
@@ -58,15 +54,14 @@ define i64 @zext_scalar_neg(i8* %p, i16* %q, i1 zeroext %c) {
58
54
ret i64 %cond
59
55
}
60
56
61
- ; TODO: (sext(select c, load1, load2)) -> (select c, sextload1, sextload2)
57
+ ; (sext(select c, load1, load2)) -> (select c, sextload1, sextload2)
62
58
define i64 @sext_scalar (i8* %p , i1 zeroext %c ) {
63
59
; CHECK-LABEL: sext_scalar:
64
60
; CHECK: # %bb.0:
65
- ; CHECK-NEXT: movzbl (%rdi), %eax
66
- ; CHECK-NEXT: movzbl 1(%rdi), %ecx
61
+ ; CHECK-NEXT: movsbq (%rdi), %rcx
62
+ ; CHECK-NEXT: movsbq 1(%rdi), %rax
67
63
; CHECK-NEXT: testl %esi, %esi
68
- ; CHECK-NEXT: cmovel %eax, %ecx
69
- ; CHECK-NEXT: movsbq %cl, %rax
64
+ ; CHECK-NEXT: cmoveq %rcx, %rax
70
65
; CHECK-NEXT: retq
71
66
%ld1 = load volatile i8 , i8* %p
72
67
%arrayidx1 = getelementptr inbounds i8 , i8* %p , i64 1
@@ -80,14 +75,13 @@ define i64 @sext_scalar(i8* %p, i1 zeroext %c) {
80
75
define <2 x i64 > @zext_vector_i1 (<2 x i32 >* %p , i1 zeroext %c ) {
81
76
; CHECK-LABEL: zext_vector_i1:
82
77
; CHECK: # %bb.0:
83
- ; CHECK-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
84
- ; CHECK-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
78
+ ; CHECK-NEXT: pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1 ],zero
79
+ ; CHECK-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1 ],zero
85
80
; CHECK-NEXT: testl %esi, %esi
86
81
; CHECK-NEXT: jne .LBB4_2
87
82
; CHECK-NEXT: # %bb.1:
88
83
; CHECK-NEXT: movdqa %xmm1, %xmm0
89
84
; CHECK-NEXT: .LBB4_2:
90
- ; CHECK-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
91
85
; CHECK-NEXT: retq
92
86
%ld1 = load volatile <2 x i32 >, <2 x i32 >* %p
93
87
%arrayidx1 = getelementptr inbounds <2 x i32 >, <2 x i32 >* %p , i64 1
@@ -100,12 +94,11 @@ define <2 x i64> @zext_vector_i1(<2 x i32>* %p, i1 zeroext %c) {
100
94
define <2 x i64 > @zext_vector_v2i1 (<2 x i32 >* %p , <2 x i1 > %c ) {
101
95
; CHECK-LABEL: zext_vector_v2i1:
102
96
; CHECK: # %bb.0:
103
- ; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
104
- ; CHECK-NEXT: pslld $31, %xmm0
105
- ; CHECK-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
106
- ; CHECK-NEXT: movsd {{.*#+}} xmm2 = mem[0],zero
107
- ; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
108
- ; CHECK-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero
97
+ ; CHECK-NEXT: psllq $63, %xmm0
98
+ ; CHECK-NEXT: pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
99
+ ; CHECK-NEXT: pmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
100
+ ; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
101
+ ; CHECK-NEXT: movapd %xmm1, %xmm0
109
102
; CHECK-NEXT: retq
110
103
%ld1 = load volatile <2 x i32 >, <2 x i32 >* %p
111
104
%arrayidx1 = getelementptr inbounds <2 x i32 >, <2 x i32 >* %p , i64 1
@@ -119,14 +112,13 @@ define <2 x i64> @zext_vector_v2i1(<2 x i32>* %p, <2 x i1> %c) {
119
112
define <2 x i64 > @sext_vector_i1 (<2 x i32 >* %p , i1 zeroext %c ) {
120
113
; CHECK-LABEL: sext_vector_i1:
121
114
; CHECK: # %bb.0:
122
- ; CHECK-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
123
- ; CHECK-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
115
+ ; CHECK-NEXT: pmovsxdq (%rdi), % xmm1
116
+ ; CHECK-NEXT: pmovsxdq 8(%rdi), % xmm0
124
117
; CHECK-NEXT: testl %esi, %esi
125
118
; CHECK-NEXT: jne .LBB6_2
126
119
; CHECK-NEXT: # %bb.1:
127
120
; CHECK-NEXT: movdqa %xmm1, %xmm0
128
121
; CHECK-NEXT: .LBB6_2:
129
- ; CHECK-NEXT: pmovsxdq %xmm0, %xmm0
130
122
; CHECK-NEXT: retq
131
123
%ld1 = load volatile <2 x i32 >, <2 x i32 >* %p
132
124
%arrayidx1 = getelementptr inbounds <2 x i32 >, <2 x i32 >* %p , i64 1
@@ -139,12 +131,11 @@ define <2 x i64> @sext_vector_i1(<2 x i32>* %p, i1 zeroext %c) {
139
131
define <2 x i64 > @sext_vector_v2i1 (<2 x i32 >* %p , <2 x i1 > %c ) {
140
132
; CHECK-LABEL: sext_vector_v2i1:
141
133
; CHECK: # %bb.0:
142
- ; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
143
- ; CHECK-NEXT: pslld $31, %xmm0
144
- ; CHECK-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
145
- ; CHECK-NEXT: movsd {{.*#+}} xmm2 = mem[0],zero
146
- ; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
147
- ; CHECK-NEXT: pmovsxdq %xmm1, %xmm0
134
+ ; CHECK-NEXT: psllq $63, %xmm0
135
+ ; CHECK-NEXT: pmovsxdq (%rdi), %xmm1
136
+ ; CHECK-NEXT: pmovsxdq 8(%rdi), %xmm2
137
+ ; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
138
+ ; CHECK-NEXT: movapd %xmm1, %xmm0
148
139
; CHECK-NEXT: retq
149
140
%ld1 = load volatile <2 x i32 >, <2 x i32 >* %p
150
141
%arrayidx1 = getelementptr inbounds <2 x i32 >, <2 x i32 >* %p , i64 1
0 commit comments