@@ -44,3 +44,44 @@ define i32 @shl24sar25(i32 %a) #0 {
4444 %2 = ashr exact i32 %1 , 25
4545 ret i32 %2
4646}
47+
48+ define void @shl144sar48 (ptr %p ) #0 {
49+ ; CHECK-LABEL: shl144sar48:
50+ ; CHECK: # %bb.0:
51+ ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
52+ ; CHECK-NEXT: movswl (%eax), %ecx
53+ ; CHECK-NEXT: movl %ecx, %edx
54+ ; CHECK-NEXT: sarl $31, %edx
55+ ; CHECK-NEXT: shldl $2, %ecx, %edx
56+ ; CHECK-NEXT: shll $2, %ecx
57+ ; CHECK-NEXT: movl %ecx, 12(%eax)
58+ ; CHECK-NEXT: movl %edx, 16(%eax)
59+ ; CHECK-NEXT: movl $0, 8(%eax)
60+ ; CHECK-NEXT: movl $0, 4(%eax)
61+ ; CHECK-NEXT: movl $0, (%eax)
62+ ; CHECK-NEXT: retl
63+ %a = load i160 , ptr %p
64+ %1 = shl i160 %a , 144
65+ %2 = ashr exact i160 %1 , 46
66+ store i160 %2 , ptr %p
67+ ret void
68+ }
69+
70+ define void @shl144sar2 (ptr %p ) #0 {
71+ ; CHECK-LABEL: shl144sar2:
72+ ; CHECK: # %bb.0:
73+ ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
74+ ; CHECK-NEXT: movswl (%eax), %ecx
75+ ; CHECK-NEXT: sarl $31, %ecx
76+ ; CHECK-NEXT: movl %ecx, 16(%eax)
77+ ; CHECK-NEXT: movl %ecx, 8(%eax)
78+ ; CHECK-NEXT: movl %ecx, 12(%eax)
79+ ; CHECK-NEXT: movl %ecx, 4(%eax)
80+ ; CHECK-NEXT: movl %ecx, (%eax)
81+ ; CHECK-NEXT: retl
82+ %a = load i160 , ptr %p
83+ %1 = shl i160 %a , 144
84+ %2 = ashr exact i160 %1 , 2
85+ store i160 %2 , ptr %p
86+ ret void
87+ }
0 commit comments