@@ -77,49 +77,112 @@ define void @ds_atomic_cmpxchg_i32_ret_av_av__a(ptr addrspace(3) %ptr) #0 {
7777 ret void
7878}
7979
80- ; FIXME: Broken
81- ; define void @ds_atomic_cmpxchg_i32_ret_a_a__a(ptr addrspace(3) %ptr) #0 {
82- ; %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10
83- ; %data0 = call i32 asm "; def $0", "=a"()
84- ; %data1 = call i32 asm "; def $0", "=a"()
85- ; %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic
86- ; %result = extractvalue { i32, i1 } %pair, 0
87- ; call void asm "; use $0", "a"(i32 %result)
88- ; ret void
89- ; }
80+ define void @ds_atomic_cmpxchg_i32_ret_a_a__a (ptr addrspace (3 ) %ptr ) #0 {
81+ ; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_a_a__a:
82+ ; CHECK: ; %bb.0:
83+ ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
84+ ; CHECK-NEXT: ;;#ASMSTART
85+ ; CHECK-NEXT: ; def a0
86+ ; CHECK-NEXT: ;;#ASMEND
87+ ; CHECK-NEXT: ;;#ASMSTART
88+ ; CHECK-NEXT: ; def a1
89+ ; CHECK-NEXT: ;;#ASMEND
90+ ; CHECK-NEXT: v_accvgpr_read_b32 v1, a0
91+ ; CHECK-NEXT: v_accvgpr_read_b32 v2, a1
92+ ; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:40
93+ ; CHECK-NEXT: s_waitcnt lgkmcnt(0)
94+ ; CHECK-NEXT: v_accvgpr_write_b32 a0, v0
95+ ; CHECK-NEXT: ;;#ASMSTART
96+ ; CHECK-NEXT: ; use a0
97+ ; CHECK-NEXT: ;;#ASMEND
98+ ; CHECK-NEXT: s_setpc_b64 s[30:31]
99+ %gep.0 = getelementptr inbounds [512 x i32 ], ptr addrspace (3 ) %ptr , i32 0 , i32 10
100+ %data0 = call i32 asm "; def $0" , "=a" ()
101+ %data1 = call i32 asm "; def $0" , "=a" ()
102+ %pair = cmpxchg ptr addrspace (3 ) %gep.0 , i32 %data0 , i32 %data1 seq_cst monotonic
103+ %result = extractvalue { i32 , i1 } %pair , 0
104+ call void asm "; use $0" , "a" (i32 %result )
105+ ret void
106+ }
90107
91- ; FIXME: Broken
92- ; define void @ds_atomic_cmpxchg_i32_ret_a_a__v(ptr addrspace(3) %ptr) #0 {
93- ; %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10
94- ; %data0 = call i32 asm "; def $0", "=a"()
95- ; %data1 = call i32 asm "; def $0", "=a"()
96- ; %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic
97- ; %result = extractvalue { i32, i1 } %pair, 0
98- ; call void asm "; use $0", "v"(i32 %result)
99- ; ret void
100- ; }
108+ define void @ds_atomic_cmpxchg_i32_ret_a_a__v (ptr addrspace (3 ) %ptr ) #0 {
109+ ; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_a_a__v:
110+ ; CHECK: ; %bb.0:
111+ ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
112+ ; CHECK-NEXT: ;;#ASMSTART
113+ ; CHECK-NEXT: ; def a0
114+ ; CHECK-NEXT: ;;#ASMEND
115+ ; CHECK-NEXT: ;;#ASMSTART
116+ ; CHECK-NEXT: ; def a1
117+ ; CHECK-NEXT: ;;#ASMEND
118+ ; CHECK-NEXT: v_accvgpr_read_b32 v1, a0
119+ ; CHECK-NEXT: v_accvgpr_read_b32 v2, a1
120+ ; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:40
121+ ; CHECK-NEXT: s_waitcnt lgkmcnt(0)
122+ ; CHECK-NEXT: ;;#ASMSTART
123+ ; CHECK-NEXT: ; use v0
124+ ; CHECK-NEXT: ;;#ASMEND
125+ ; CHECK-NEXT: s_setpc_b64 s[30:31]
126+ %gep.0 = getelementptr inbounds [512 x i32 ], ptr addrspace (3 ) %ptr , i32 0 , i32 10
127+ %data0 = call i32 asm "; def $0" , "=a" ()
128+ %data1 = call i32 asm "; def $0" , "=a" ()
129+ %pair = cmpxchg ptr addrspace (3 ) %gep.0 , i32 %data0 , i32 %data1 seq_cst monotonic
130+ %result = extractvalue { i32 , i1 } %pair , 0
131+ call void asm "; use $0" , "v" (i32 %result )
132+ ret void
133+ }
101134
102- ; FIXME: Broken
103- ; define void @ds_atomic_cmpxchg_i32_ret_v_a__v(ptr addrspace(3) %ptr) #0 {
104- ; %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10
105- ; %data0 = call i32 asm "; def $0", "=v"()
106- ; %data1 = call i32 asm "; def $0", "=a"()
107- ; %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic
108- ; %result = extractvalue { i32, i1 } %pair, 0
109- ; call void asm "; use $0", "v"(i32 %result)
110- ; ret void
111- ; }
135+ define void @ds_atomic_cmpxchg_i32_ret_v_a__v (ptr addrspace (3 ) %ptr ) #0 {
136+ ; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_v_a__v:
137+ ; CHECK: ; %bb.0:
138+ ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
139+ ; CHECK-NEXT: ;;#ASMSTART
140+ ; CHECK-NEXT: ; def a0
141+ ; CHECK-NEXT: ;;#ASMEND
142+ ; CHECK-NEXT: v_accvgpr_read_b32 v2, a0
143+ ; CHECK-NEXT: ;;#ASMSTART
144+ ; CHECK-NEXT: ; def v1
145+ ; CHECK-NEXT: ;;#ASMEND
146+ ; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:40
147+ ; CHECK-NEXT: s_waitcnt lgkmcnt(0)
148+ ; CHECK-NEXT: ;;#ASMSTART
149+ ; CHECK-NEXT: ; use v0
150+ ; CHECK-NEXT: ;;#ASMEND
151+ ; CHECK-NEXT: s_setpc_b64 s[30:31]
152+ %gep.0 = getelementptr inbounds [512 x i32 ], ptr addrspace (3 ) %ptr , i32 0 , i32 10
153+ %data0 = call i32 asm "; def $0" , "=v" ()
154+ %data1 = call i32 asm "; def $0" , "=a" ()
155+ %pair = cmpxchg ptr addrspace (3 ) %gep.0 , i32 %data0 , i32 %data1 seq_cst monotonic
156+ %result = extractvalue { i32 , i1 } %pair , 0
157+ call void asm "; use $0" , "v" (i32 %result )
158+ ret void
159+ }
112160
113- ; FIXME: Broken
114- ; define void @ds_atomic_cmpxchg_i32_ret_a_v__v(ptr addrspace(3) %ptr) #0 {
115- ; %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10
116- ; %data0 = call i32 asm "; def $0", "=a"()
117- ; %data1 = call i32 asm "; def $0", "=v"()
118- ; %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic
119- ; %result = extractvalue { i32, i1 } %pair, 0
120- ; call void asm "; use $0", "v"(i32 %result)
121- ; ret void
122- ; }
161+ define void @ds_atomic_cmpxchg_i32_ret_a_v__v (ptr addrspace (3 ) %ptr ) #0 {
162+ ; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_a_v__v:
163+ ; CHECK: ; %bb.0:
164+ ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
165+ ; CHECK-NEXT: ;;#ASMSTART
166+ ; CHECK-NEXT: ; def a0
167+ ; CHECK-NEXT: ;;#ASMEND
168+ ; CHECK-NEXT: v_accvgpr_read_b32 v2, a0
169+ ; CHECK-NEXT: ;;#ASMSTART
170+ ; CHECK-NEXT: ; def v1
171+ ; CHECK-NEXT: ;;#ASMEND
172+ ; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v2, v1 offset:40
173+ ; CHECK-NEXT: s_waitcnt lgkmcnt(0)
174+ ; CHECK-NEXT: ;;#ASMSTART
175+ ; CHECK-NEXT: ; use v0
176+ ; CHECK-NEXT: ;;#ASMEND
177+ ; CHECK-NEXT: s_setpc_b64 s[30:31]
178+ %gep.0 = getelementptr inbounds [512 x i32 ], ptr addrspace (3 ) %ptr , i32 0 , i32 10
179+ %data0 = call i32 asm "; def $0" , "=a" ()
180+ %data1 = call i32 asm "; def $0" , "=v" ()
181+ %pair = cmpxchg ptr addrspace (3 ) %gep.0 , i32 %data0 , i32 %data1 seq_cst monotonic
182+ %result = extractvalue { i32 , i1 } %pair , 0
183+ call void asm "; use $0" , "v" (i32 %result )
184+ ret void
185+ }
123186
124187define void @ds_atomic_cmpxchg_i32_ret_v_v__a (ptr addrspace (3 ) %ptr ) #0 {
125188; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_v_v__a:
0 commit comments