@@ -7,12 +7,11 @@ declare i64 @llvm.fshr.i64(i64, i64, i64) nounwind readnone
7
7
define i64 @hoist_fshl_from_or (i64 %a , i64 %b , i64 %c , i64 %d , i64 %s ) nounwind {
8
8
; X64-LABEL: hoist_fshl_from_or:
9
9
; X64: # %bb.0:
10
- ; X64-NEXT: movq %rcx, %rax
10
+ ; X64-NEXT: movq %rdi, %rax
11
+ ; X64-NEXT: orq %rcx, %rsi
12
+ ; X64-NEXT: orq %rdx, %rax
11
13
; X64-NEXT: movl %r8d, %ecx
12
- ; X64-NEXT: shldq %cl, %rsi, %rdi
13
- ; X64-NEXT: shldq %cl, %rax, %rdx
14
- ; X64-NEXT: orq %rdi, %rdx
15
- ; X64-NEXT: movq %rdx, %rax
14
+ ; X64-NEXT: shldq %cl, %rsi, %rax
16
15
; X64-NEXT: retq
17
16
%fshl.0 = call i64 @llvm.fshl.i64 (i64 %a , i64 %b , i64 %s )
18
17
%fshl.1 = call i64 @llvm.fshl.i64 (i64 %c , i64 %d , i64 %s )
@@ -23,12 +22,11 @@ define i64 @hoist_fshl_from_or(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind
23
22
define i64 @hoist_fshl_from_and (i64 %a , i64 %b , i64 %c , i64 %d , i64 %s ) nounwind {
24
23
; X64-LABEL: hoist_fshl_from_and:
25
24
; X64: # %bb.0:
26
- ; X64-NEXT: movq %rcx, %rax
25
+ ; X64-NEXT: movq %rdi, %rax
26
+ ; X64-NEXT: andq %rcx, %rsi
27
+ ; X64-NEXT: andq %rdx, %rax
27
28
; X64-NEXT: movl %r8d, %ecx
28
- ; X64-NEXT: shldq %cl, %rsi, %rdi
29
- ; X64-NEXT: shldq %cl, %rax, %rdx
30
- ; X64-NEXT: andq %rdi, %rdx
31
- ; X64-NEXT: movq %rdx, %rax
29
+ ; X64-NEXT: shldq %cl, %rsi, %rax
32
30
; X64-NEXT: retq
33
31
%fshl.0 = call i64 @llvm.fshl.i64 (i64 %a , i64 %b , i64 %s )
34
32
%fshl.1 = call i64 @llvm.fshl.i64 (i64 %c , i64 %d , i64 %s )
@@ -39,12 +37,11 @@ define i64 @hoist_fshl_from_and(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind
39
37
define i64 @hoist_fshl_from_xor (i64 %a , i64 %b , i64 %c , i64 %d , i64 %s ) nounwind {
40
38
; X64-LABEL: hoist_fshl_from_xor:
41
39
; X64: # %bb.0:
42
- ; X64-NEXT: movq %rcx, %rax
40
+ ; X64-NEXT: movq %rdi, %rax
41
+ ; X64-NEXT: xorq %rcx, %rsi
42
+ ; X64-NEXT: xorq %rdx, %rax
43
43
; X64-NEXT: movl %r8d, %ecx
44
- ; X64-NEXT: shldq %cl, %rsi, %rdi
45
- ; X64-NEXT: shldq %cl, %rax, %rdx
46
- ; X64-NEXT: xorq %rdi, %rdx
47
- ; X64-NEXT: movq %rdx, %rax
44
+ ; X64-NEXT: shldq %cl, %rsi, %rax
48
45
; X64-NEXT: retq
49
46
%fshl.0 = call i64 @llvm.fshl.i64 (i64 %a , i64 %b , i64 %s )
50
47
%fshl.1 = call i64 @llvm.fshl.i64 (i64 %c , i64 %d , i64 %s )
@@ -69,10 +66,10 @@ define i64 @fshl_or_with_different_shift_value(i64 %a, i64 %b, i64 %c, i64 %d) n
69
66
define i64 @hoist_fshl_from_or_const_shift (i64 %a , i64 %b , i64 %c , i64 %d ) nounwind {
70
67
; X64-LABEL: hoist_fshl_from_or_const_shift:
71
68
; X64: # %bb.0:
72
- ; X64-NEXT: movq %rdx , %rax
73
- ; X64-NEXT: shldq $15, %rsi , %rdi
74
- ; X64-NEXT: shldq $15, %rcx , %rax
75
- ; X64-NEXT: orq %rdi , %rax
69
+ ; X64-NEXT: movq %rdi , %rax
70
+ ; X64-NEXT: orq %rcx , %rsi
71
+ ; X64-NEXT: orq %rdx , %rax
72
+ ; X64-NEXT: shldq $15, %rsi , %rax
76
73
; X64-NEXT: retq
77
74
%fshl.0 = call i64 @llvm.fshl.i64 (i64 %a , i64 %b , i64 15 )
78
75
%fshl.1 = call i64 @llvm.fshl.i64 (i64 %c , i64 %d , i64 15 )
@@ -83,11 +80,11 @@ define i64 @hoist_fshl_from_or_const_shift(i64 %a, i64 %b, i64 %c, i64 %d) nounw
83
80
define i64 @hoist_fshr_from_or (i64 %a , i64 %b , i64 %c , i64 %d , i64 %s ) nounwind {
84
81
; X64-LABEL: hoist_fshr_from_or:
85
82
; X64: # %bb.0:
86
- ; X64-NEXT: movq %rcx, %rax
83
+ ; X64-NEXT: movq %rsi, %rax
84
+ ; X64-NEXT: orq %rdx, %rdi
85
+ ; X64-NEXT: orq %rcx, %rax
87
86
; X64-NEXT: movl %r8d, %ecx
88
- ; X64-NEXT: shrdq %cl, %rdi, %rsi
89
- ; X64-NEXT: shrdq %cl, %rdx, %rax
90
- ; X64-NEXT: orq %rsi, %rax
87
+ ; X64-NEXT: shrdq %cl, %rdi, %rax
91
88
; X64-NEXT: retq
92
89
%fshr.0 = call i64 @llvm.fshr.i64 (i64 %a , i64 %b , i64 %s )
93
90
%fshr.1 = call i64 @llvm.fshr.i64 (i64 %c , i64 %d , i64 %s )
@@ -98,11 +95,11 @@ define i64 @hoist_fshr_from_or(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind
98
95
define i64 @hoist_fshr_from_and (i64 %a , i64 %b , i64 %c , i64 %d , i64 %s ) nounwind {
99
96
; X64-LABEL: hoist_fshr_from_and:
100
97
; X64: # %bb.0:
101
- ; X64-NEXT: movq %rcx, %rax
98
+ ; X64-NEXT: movq %rsi, %rax
99
+ ; X64-NEXT: andq %rdx, %rdi
100
+ ; X64-NEXT: andq %rcx, %rax
102
101
; X64-NEXT: movl %r8d, %ecx
103
- ; X64-NEXT: shrdq %cl, %rdi, %rsi
104
- ; X64-NEXT: shrdq %cl, %rdx, %rax
105
- ; X64-NEXT: andq %rsi, %rax
102
+ ; X64-NEXT: shrdq %cl, %rdi, %rax
106
103
; X64-NEXT: retq
107
104
%fshr.0 = call i64 @llvm.fshr.i64 (i64 %a , i64 %b , i64 %s )
108
105
%fshr.1 = call i64 @llvm.fshr.i64 (i64 %c , i64 %d , i64 %s )
@@ -113,11 +110,11 @@ define i64 @hoist_fshr_from_and(i64 %a, i64 %b, i64 %c, i64 %d, i64 %s) nounwind
113
110
define i64 @hoist_fshr_from_xor (i64 %a , i64 %b , i64 %c , i64 %d , i64 %s ) nounwind {
114
111
; X64-LABEL: hoist_fshr_from_xor:
115
112
; X64: # %bb.0:
116
- ; X64-NEXT: movq %rcx, %rax
113
+ ; X64-NEXT: movq %rsi, %rax
114
+ ; X64-NEXT: xorq %rdx, %rdi
115
+ ; X64-NEXT: xorq %rcx, %rax
117
116
; X64-NEXT: movl %r8d, %ecx
118
- ; X64-NEXT: shrdq %cl, %rdi, %rsi
119
- ; X64-NEXT: shrdq %cl, %rdx, %rax
120
- ; X64-NEXT: xorq %rsi, %rax
117
+ ; X64-NEXT: shrdq %cl, %rdi, %rax
121
118
; X64-NEXT: retq
122
119
%fshr.0 = call i64 @llvm.fshr.i64 (i64 %a , i64 %b , i64 %s )
123
120
%fshr.1 = call i64 @llvm.fshr.i64 (i64 %c , i64 %d , i64 %s )
@@ -142,10 +139,10 @@ define i64 @fshr_or_with_different_shift_value(i64 %a, i64 %b, i64 %c, i64 %d) n
142
139
define i64 @hoist_fshr_from_or_const_shift (i64 %a , i64 %b , i64 %c , i64 %d ) nounwind {
143
140
; X64-LABEL: hoist_fshr_from_or_const_shift:
144
141
; X64: # %bb.0:
145
- ; X64-NEXT: movq %rdx , %rax
146
- ; X64-NEXT: shldq $49, %rsi , %rdi
147
- ; X64-NEXT: shldq $49, %rcx , %rax
148
- ; X64-NEXT: orq %rdi , %rax
142
+ ; X64-NEXT: movq %rdi , %rax
143
+ ; X64-NEXT: orq %rcx , %rsi
144
+ ; X64-NEXT: orl %edx , %eax
145
+ ; X64-NEXT: shldq $49, %rsi , %rax
149
146
; X64-NEXT: retq
150
147
%fshr.0 = call i64 @llvm.fshr.i64 (i64 %a , i64 %b , i64 15 )
151
148
%fshr.1 = call i64 @llvm.fshr.i64 (i64 %c , i64 %d , i64 15 )
0 commit comments