@@ -8760,8 +8760,9 @@ define void @flat_atomic_usub_sat_i64_ret_a_a(ptr %ptr) #0 {
8760
8760
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
8761
8761
; GFX90A-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v6
8762
8762
; GFX90A-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v7, vcc
8763
- ; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
8763
+ ; GFX90A-NEXT: v_cmp_gt_u64_e32 vcc, v[0:1], v[2:3]
8764
8764
; GFX90A-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc
8765
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
8765
8766
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc
8766
8767
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
8767
8768
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -8780,19 +8781,20 @@ define void @flat_atomic_usub_sat_i64_ret_a_a(ptr %ptr) #0 {
8780
8781
; GFX90A-NEXT: s_cbranch_execz .LBB113_6
8781
8782
; GFX90A-NEXT: ; %bb.5: ; %atomicrmw.private
8782
8783
; GFX90A-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5]
8783
- ; GFX90A-NEXT: v_cndmask_b32_e32 v0 , -1, v4, vcc
8784
- ; GFX90A-NEXT: buffer_load_dword v1, v0 , s[0:3], 0 offen
8785
- ; GFX90A-NEXT: buffer_load_dword v2, v0 , s[0:3], 0 offen offset:4
8784
+ ; GFX90A-NEXT: v_cndmask_b32_e32 v4 , -1, v4, vcc
8785
+ ; GFX90A-NEXT: buffer_load_dword v0, v4 , s[0:3], 0 offen
8786
+ ; GFX90A-NEXT: buffer_load_dword v1, v4 , s[0:3], 0 offen offset:4
8786
8787
; GFX90A-NEXT: s_waitcnt vmcnt(1)
8787
- ; GFX90A-NEXT: v_sub_co_u32_e32 v3 , vcc, v1 , v6
8788
+ ; GFX90A-NEXT: v_sub_co_u32_e32 v2 , vcc, v0 , v6
8788
8789
; GFX90A-NEXT: s_waitcnt vmcnt(0)
8789
- ; GFX90A-NEXT: v_subb_co_u32_e32 v4, vcc, v2, v7, vcc
8790
- ; GFX90A-NEXT: v_accvgpr_write_b32 a0, v1
8791
- ; GFX90A-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc
8792
- ; GFX90A-NEXT: v_accvgpr_write_b32 a1, v2
8793
- ; GFX90A-NEXT: v_cndmask_b32_e64 v1, v4, 0, vcc
8794
- ; GFX90A-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen
8795
- ; GFX90A-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:4
8790
+ ; GFX90A-NEXT: v_subb_co_u32_e32 v3, vcc, v1, v7, vcc
8791
+ ; GFX90A-NEXT: v_cmp_gt_u64_e32 vcc, v[2:3], v[0:1]
8792
+ ; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0
8793
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v0, v3, 0, vcc
8794
+ ; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1
8795
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
8796
+ ; GFX90A-NEXT: buffer_store_dword v0, v4, s[0:3], 0 offen offset:4
8797
+ ; GFX90A-NEXT: buffer_store_dword v2, v4, s[0:3], 0 offen
8796
8798
; GFX90A-NEXT: .LBB113_6: ; %atomicrmw.phi
8797
8799
; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]
8798
8800
; GFX90A-NEXT: ;;#ASMSTART
@@ -8826,9 +8828,10 @@ define void @flat_atomic_usub_sat_i64_ret_a_a(ptr %ptr) #0 {
8826
8828
; GFX950-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v6
8827
8829
; GFX950-NEXT: s_nop 1
8828
8830
; GFX950-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v7, vcc
8831
+ ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, v[0:1], v[2:3]
8829
8832
; GFX950-NEXT: s_nop 1
8830
- ; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
8831
8833
; GFX950-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc
8834
+ ; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
8832
8835
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] sc0
8833
8836
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
8834
8837
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -8854,11 +8857,11 @@ define void @flat_atomic_usub_sat_i64_ret_a_a(ptr %ptr) #0 {
8854
8857
; GFX950-NEXT: v_sub_co_u32_e32 v2, vcc, v0, v6
8855
8858
; GFX950-NEXT: s_nop 1
8856
8859
; GFX950-NEXT: v_subb_co_u32_e32 v3, vcc, v1, v7, vcc
8860
+ ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, v[2:3], v[0:1]
8857
8861
; GFX950-NEXT: v_accvgpr_write_b32 a0, v0
8858
- ; GFX950-NEXT: s_nop 0
8862
+ ; GFX950-NEXT: v_accvgpr_write_b32 a1, v1
8859
8863
; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc
8860
8864
; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
8861
- ; GFX950-NEXT: v_accvgpr_write_b32 a1, v1
8862
8865
; GFX950-NEXT: scratch_store_dwordx2 v4, v[2:3], off
8863
8866
; GFX950-NEXT: .LBB113_6: ; %atomicrmw.phi
8864
8867
; GFX950-NEXT: s_or_b64 exec, exec, s[0:1]
@@ -8898,8 +8901,9 @@ define void @flat_atomic_usub_sat_i64_ret_av_av(ptr %ptr) #0 {
8898
8901
; GFX90A-NEXT: v_pk_mov_b32 v[6:7], v[4:5], v[4:5] op_sel:[0,1]
8899
8902
; GFX90A-NEXT: v_sub_co_u32_e32 v4, vcc, v6, v2
8900
8903
; GFX90A-NEXT: v_subb_co_u32_e32 v5, vcc, v7, v3, vcc
8901
- ; GFX90A-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc
8904
+ ; GFX90A-NEXT: v_cmp_gt_u64_e32 vcc, v[4:5], v[6:7]
8902
8905
; GFX90A-NEXT: v_cndmask_b32_e64 v5, v5, 0, vcc
8906
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc
8903
8907
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[4:5], v[0:1], v[4:7] glc
8904
8908
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
8905
8909
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[4:5], v[6:7]
@@ -8915,17 +8919,18 @@ define void @flat_atomic_usub_sat_i64_ret_av_av(ptr %ptr) #0 {
8915
8919
; GFX90A-NEXT: s_cbranch_execz .LBB114_6
8916
8920
; GFX90A-NEXT: ; %bb.5: ; %atomicrmw.private
8917
8921
; GFX90A-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[0:1]
8918
- ; GFX90A-NEXT: v_cndmask_b32_e32 v0 , -1, v0, vcc
8919
- ; GFX90A-NEXT: buffer_load_dword v4, v0 , s[0:3], 0 offen
8920
- ; GFX90A-NEXT: buffer_load_dword v5, v0 , s[0:3], 0 offen offset:4
8922
+ ; GFX90A-NEXT: v_cndmask_b32_e32 v6 , -1, v0, vcc
8923
+ ; GFX90A-NEXT: buffer_load_dword v4, v6 , s[0:3], 0 offen
8924
+ ; GFX90A-NEXT: buffer_load_dword v5, v6 , s[0:3], 0 offen offset:4
8921
8925
; GFX90A-NEXT: s_waitcnt vmcnt(1)
8922
- ; GFX90A-NEXT: v_sub_co_u32_e32 v1 , vcc, v4, v2
8926
+ ; GFX90A-NEXT: v_sub_co_u32_e32 v0 , vcc, v4, v2
8923
8927
; GFX90A-NEXT: s_waitcnt vmcnt(0)
8924
- ; GFX90A-NEXT: v_subb_co_u32_e32 v2, vcc, v5, v3, vcc
8928
+ ; GFX90A-NEXT: v_subb_co_u32_e32 v1, vcc, v5, v3, vcc
8929
+ ; GFX90A-NEXT: v_cmp_gt_u64_e32 vcc, v[0:1], v[4:5]
8930
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
8925
8931
; GFX90A-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc
8926
- ; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
8927
- ; GFX90A-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen
8928
- ; GFX90A-NEXT: buffer_store_dword v2, v0, s[0:3], 0 offen offset:4
8932
+ ; GFX90A-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen
8933
+ ; GFX90A-NEXT: buffer_store_dword v1, v6, s[0:3], 0 offen offset:4
8929
8934
; GFX90A-NEXT: .LBB114_6: ; %atomicrmw.phi
8930
8935
; GFX90A-NEXT: s_or_b64 exec, exec, s[4:5]
8931
8936
; GFX90A-NEXT: ;;#ASMSTART
@@ -8958,9 +8963,10 @@ define void @flat_atomic_usub_sat_i64_ret_av_av(ptr %ptr) #0 {
8958
8963
; GFX950-NEXT: v_sub_co_u32_e32 v2, vcc, v8, v0
8959
8964
; GFX950-NEXT: s_nop 1
8960
8965
; GFX950-NEXT: v_subb_co_u32_e32 v3, vcc, v9, v1, vcc
8966
+ ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, v[2:3], v[8:9]
8961
8967
; GFX950-NEXT: s_nop 1
8962
- ; GFX950-NEXT: v_cndmask_b32_e64 v6, v2, 0, vcc
8963
8968
; GFX950-NEXT: v_cndmask_b32_e64 v7, v3, 0, vcc
8969
+ ; GFX950-NEXT: v_cndmask_b32_e64 v6, v2, 0, vcc
8964
8970
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[2:3], v[4:5], v[6:9] sc0
8965
8971
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
8966
8972
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[8:9]
@@ -8983,6 +8989,7 @@ define void @flat_atomic_usub_sat_i64_ret_av_av(ptr %ptr) #0 {
8983
8989
; GFX950-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v0
8984
8990
; GFX950-NEXT: s_nop 1
8985
8991
; GFX950-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v1, vcc
8992
+ ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, v[0:1], v[2:3]
8986
8993
; GFX950-NEXT: s_nop 1
8987
8994
; GFX950-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc
8988
8995
; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
@@ -17058,8 +17065,9 @@ define void @flat_atomic_usub_sat_i64_saddr_ret_a_a(ptr inreg %ptr) #0 {
17058
17065
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
17059
17066
; GFX90A-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v4
17060
17067
; GFX90A-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc
17061
- ; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
17068
+ ; GFX90A-NEXT: v_cmp_gt_u64_e32 vcc, v[0:1], v[2:3]
17062
17069
; GFX90A-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc
17070
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
17063
17071
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] glc
17064
17072
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
17065
17073
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -17078,19 +17086,20 @@ define void @flat_atomic_usub_sat_i64_saddr_ret_a_a(ptr inreg %ptr) #0 {
17078
17086
; GFX90A-NEXT: ; %bb.5: ; %atomicrmw.private
17079
17087
; GFX90A-NEXT: s_cmp_lg_u64 s[4:5], 0
17080
17088
; GFX90A-NEXT: s_cselect_b32 s4, s4, -1
17081
- ; GFX90A-NEXT: v_mov_b32_e32 v0 , s4
17082
- ; GFX90A-NEXT: buffer_load_dword v1, v0 , s[0:3], 0 offen
17083
- ; GFX90A-NEXT: buffer_load_dword v2, v0 , s[0:3], 0 offen offset:4
17089
+ ; GFX90A-NEXT: v_mov_b32_e32 v6 , s4
17090
+ ; GFX90A-NEXT: buffer_load_dword v0, v6 , s[0:3], 0 offen
17091
+ ; GFX90A-NEXT: buffer_load_dword v1, v6 , s[0:3], 0 offen offset:4
17084
17092
; GFX90A-NEXT: s_waitcnt vmcnt(1)
17085
- ; GFX90A-NEXT: v_sub_co_u32_e32 v3 , vcc, v1 , v4
17093
+ ; GFX90A-NEXT: v_sub_co_u32_e32 v2 , vcc, v0 , v4
17086
17094
; GFX90A-NEXT: s_waitcnt vmcnt(0)
17087
- ; GFX90A-NEXT: v_subb_co_u32_e32 v4, vcc, v2, v5, vcc
17088
- ; GFX90A-NEXT: v_accvgpr_write_b32 a0, v1
17089
- ; GFX90A-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc
17090
- ; GFX90A-NEXT: v_accvgpr_write_b32 a1, v2
17091
- ; GFX90A-NEXT: v_cndmask_b32_e64 v1, v4, 0, vcc
17092
- ; GFX90A-NEXT: buffer_store_dword v3, v0, s[0:3], 0 offen
17093
- ; GFX90A-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:4
17095
+ ; GFX90A-NEXT: v_subb_co_u32_e32 v3, vcc, v1, v5, vcc
17096
+ ; GFX90A-NEXT: v_cmp_gt_u64_e32 vcc, v[2:3], v[0:1]
17097
+ ; GFX90A-NEXT: v_accvgpr_write_b32 a0, v0
17098
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v0, v3, 0, vcc
17099
+ ; GFX90A-NEXT: v_accvgpr_write_b32 a1, v1
17100
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
17101
+ ; GFX90A-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen offset:4
17102
+ ; GFX90A-NEXT: buffer_store_dword v2, v6, s[0:3], 0 offen
17094
17103
; GFX90A-NEXT: .LBB221_6: ; %atomicrmw.phi
17095
17104
; GFX90A-NEXT: ;;#ASMSTART
17096
17105
; GFX90A-NEXT: ; use a[0:1]
@@ -17123,9 +17132,10 @@ define void @flat_atomic_usub_sat_i64_saddr_ret_a_a(ptr inreg %ptr) #0 {
17123
17132
; GFX950-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v4
17124
17133
; GFX950-NEXT: s_nop 1
17125
17134
; GFX950-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v5, vcc
17135
+ ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, v[0:1], v[2:3]
17126
17136
; GFX950-NEXT: s_nop 1
17127
- ; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
17128
17137
; GFX950-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc
17138
+ ; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
17129
17139
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[6:7], v[0:3] sc0
17130
17140
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
17131
17141
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]
@@ -17149,11 +17159,11 @@ define void @flat_atomic_usub_sat_i64_saddr_ret_a_a(ptr inreg %ptr) #0 {
17149
17159
; GFX950-NEXT: v_sub_co_u32_e32 v2, vcc, v0, v4
17150
17160
; GFX950-NEXT: s_nop 1
17151
17161
; GFX950-NEXT: v_subb_co_u32_e32 v3, vcc, v1, v5, vcc
17162
+ ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, v[2:3], v[0:1]
17152
17163
; GFX950-NEXT: v_accvgpr_write_b32 a0, v0
17153
- ; GFX950-NEXT: s_nop 0
17164
+ ; GFX950-NEXT: v_accvgpr_write_b32 a1, v1
17154
17165
; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc
17155
17166
; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc
17156
- ; GFX950-NEXT: v_accvgpr_write_b32 a1, v1
17157
17167
; GFX950-NEXT: scratch_store_dwordx2 off, v[2:3], s0
17158
17168
; GFX950-NEXT: .LBB221_6: ; %atomicrmw.phi
17159
17169
; GFX950-NEXT: ;;#ASMSTART
@@ -17192,8 +17202,9 @@ define void @flat_atomic_usub_sat_i64_saddr_ret_av_av(ptr inreg %ptr) #0 {
17192
17202
; GFX90A-NEXT: v_pk_mov_b32 v[8:9], v[2:3], v[2:3] op_sel:[0,1]
17193
17203
; GFX90A-NEXT: v_sub_co_u32_e32 v2, vcc, v8, v0
17194
17204
; GFX90A-NEXT: v_subb_co_u32_e32 v3, vcc, v9, v1, vcc
17195
- ; GFX90A-NEXT: v_cndmask_b32_e64 v6, v2, 0, vcc
17205
+ ; GFX90A-NEXT: v_cmp_gt_u64_e32 vcc, v[2:3], v[8:9]
17196
17206
; GFX90A-NEXT: v_cndmask_b32_e64 v7, v3, 0, vcc
17207
+ ; GFX90A-NEXT: v_cndmask_b32_e64 v6, v2, 0, vcc
17197
17208
; GFX90A-NEXT: flat_atomic_cmpswap_x2 v[2:3], v[4:5], v[6:9] glc
17198
17209
; GFX90A-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
17199
17210
; GFX90A-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[8:9]
@@ -17216,6 +17227,7 @@ define void @flat_atomic_usub_sat_i64_saddr_ret_av_av(ptr inreg %ptr) #0 {
17216
17227
; GFX90A-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v0
17217
17228
; GFX90A-NEXT: s_waitcnt vmcnt(0)
17218
17229
; GFX90A-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v1, vcc
17230
+ ; GFX90A-NEXT: v_cmp_gt_u64_e32 vcc, v[0:1], v[2:3]
17219
17231
; GFX90A-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
17220
17232
; GFX90A-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc
17221
17233
; GFX90A-NEXT: buffer_store_dword v0, v4, s[0:3], 0 offen
@@ -17251,9 +17263,10 @@ define void @flat_atomic_usub_sat_i64_saddr_ret_av_av(ptr inreg %ptr) #0 {
17251
17263
; GFX950-NEXT: v_sub_co_u32_e32 v2, vcc, v8, v0
17252
17264
; GFX950-NEXT: s_nop 1
17253
17265
; GFX950-NEXT: v_subb_co_u32_e32 v3, vcc, v9, v1, vcc
17266
+ ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, v[2:3], v[8:9]
17254
17267
; GFX950-NEXT: s_nop 1
17255
- ; GFX950-NEXT: v_cndmask_b32_e64 v6, v2, 0, vcc
17256
17268
; GFX950-NEXT: v_cndmask_b32_e64 v7, v3, 0, vcc
17269
+ ; GFX950-NEXT: v_cndmask_b32_e64 v6, v2, 0, vcc
17257
17270
; GFX950-NEXT: flat_atomic_cmpswap_x2 v[2:3], v[4:5], v[6:9] sc0
17258
17271
; GFX950-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)
17259
17272
; GFX950-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[8:9]
@@ -17274,6 +17287,7 @@ define void @flat_atomic_usub_sat_i64_saddr_ret_av_av(ptr inreg %ptr) #0 {
17274
17287
; GFX950-NEXT: v_sub_co_u32_e32 v0, vcc, v2, v0
17275
17288
; GFX950-NEXT: s_nop 1
17276
17289
; GFX950-NEXT: v_subb_co_u32_e32 v1, vcc, v3, v1, vcc
17290
+ ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, v[0:1], v[2:3]
17277
17291
; GFX950-NEXT: s_nop 1
17278
17292
; GFX950-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc
17279
17293
; GFX950-NEXT: v_cndmask_b32_e64 v0, v0, 0, vcc
0 commit comments