@@ -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