@@ -77,49 +77,112 @@ define void @ds_atomic_cmpxchg_i32_ret_av_av__a(ptr addrspace(3) %ptr) #0 {
77
77
ret void
78
78
}
79
79
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
+ }
90
107
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
+ }
101
134
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
+ }
112
160
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
+ }
123
186
124
187
define void @ds_atomic_cmpxchg_i32_ret_v_v__a (ptr addrspace (3 ) %ptr ) #0 {
125
188
; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_v_v__a:
0 commit comments