@@ -71,3 +71,73 @@ entry:
7171 %9 = load i128 , ptr %3 , align 16
7272 ret i128 %9
7373}
74+
75+ define i128 @test_cR_wide_scalar_simple (i128 noundef %0 ) nounwind {
76+ ; CHECK-LABEL: test_cR_wide_scalar_simple:
77+ ; CHECK: # %bb.0: # %entry
78+ ; CHECK-NEXT: #APP
79+ ; CHECK-NEXT: # a2 <- a0
80+ ; CHECK-NEXT: #NO_APP
81+ ; CHECK-NEXT: mv a0, a2
82+ ; CHECK-NEXT: mv a1, a3
83+ ; CHECK-NEXT: ret
84+ entry:
85+ %1 = call i128 asm sideeffect "/* $0 <- $1 */" , "=&^cR,^cR" (i128 %0 )
86+ ret i128 %1
87+ }
88+
89+ define i64 @test_cR_wide_scalar_with_ops (i64 noundef %0 ) nounwind {
90+ ; CHECK-LABEL: test_cR_wide_scalar_with_ops:
91+ ; CHECK: # %bb.0: # %entry
92+ ; CHECK-NEXT: mv a1, a0
93+ ; CHECK-NEXT: #APP
94+ ; CHECK-NEXT: # a2 <- a0
95+ ; CHECK-NEXT: #NO_APP
96+ ; CHECK-NEXT: or a0, a2, a3
97+ ; CHECK-NEXT: ret
98+ entry:
99+ %1 = zext i64 %0 to i128
100+ %2 = shl i128 %1 , 64
101+ %3 = or i128 %1 , %2
102+ %4 = call i128 asm sideeffect "/* $0 <- $1 */" , "=&^cR,^cR" (i128 %3 )
103+ %5 = trunc i128 %4 to i64
104+ %6 = lshr i128 %4 , 64
105+ %7 = trunc i128 %6 to i64
106+ %8 = or i64 %5 , %7
107+ ret i64 %8
108+ }
109+
110+ define i128 @test_cR_wide_scalar_inout (ptr %0 , i128 noundef %1 ) nounwind {
111+ ; CHECK-LABEL: test_cR_wide_scalar_inout:
112+ ; CHECK: # %bb.0: # %entry
113+ ; CHECK-NEXT: addi sp, sp, -32
114+ ; CHECK-NEXT: mv a3, a2
115+ ; CHECK-NEXT: sd a0, 24(sp)
116+ ; CHECK-NEXT: mv a2, a1
117+ ; CHECK-NEXT: sd a1, 0(sp)
118+ ; CHECK-NEXT: sd a3, 8(sp)
119+ ; CHECK-NEXT: #APP
120+ ; CHECK-NEXT: # a0; a2
121+ ; CHECK-NEXT: #NO_APP
122+ ; CHECK-NEXT: sd a0, 24(sp)
123+ ; CHECK-NEXT: sd a2, 0(sp)
124+ ; CHECK-NEXT: sd a3, 8(sp)
125+ ; CHECK-NEXT: mv a0, a2
126+ ; CHECK-NEXT: mv a1, a3
127+ ; CHECK-NEXT: addi sp, sp, 32
128+ ; CHECK-NEXT: ret
129+ entry:
130+ %2 = alloca ptr , align 8
131+ %3 = alloca i128 , align 16
132+ store ptr %0 , ptr %2 , align 8
133+ store i128 %1 , ptr %3 , align 16
134+ %4 = load ptr , ptr %2 , align 8
135+ %5 = load i128 , ptr %3 , align 16
136+ %6 = call { ptr , i128 } asm sideeffect "/* $0; $1 */" , "=r,=^cR,0,1" (ptr %4 , i128 %5 )
137+ %7 = extractvalue { ptr , i128 } %6 , 0
138+ %8 = extractvalue { ptr , i128 } %6 , 1
139+ store ptr %7 , ptr %2 , align 8
140+ store i128 %8 , ptr %3 , align 16
141+ %9 = load i128 , ptr %3 , align 16
142+ ret i128 %9
143+ }
0 commit comments