@@ -91,4 +91,94 @@ define void @atomic_store_relaxed_f64(ptr %p, i32 %off32, i64 %off64, double %va
9191 ret void
9292}
9393
94+ define half @atomic_load_relaxed_f16 (ptr %p , i32 %off32 , i64 %off64 ) #0 {
95+ ; CHECK-LABEL: atomic_load_relaxed_f16:
96+ %ptr_unsigned = getelementptr half , ptr %p , i32 4095
97+ %val_unsigned = load atomic half , ptr %ptr_unsigned monotonic , align 4
98+ ; CHECK: ldrh {{w[0-9]+}}, [x0, #8190]
99+
100+ %ptr_regoff = getelementptr half , ptr %p , i32 %off32
101+ %val_regoff = load atomic half , ptr %ptr_regoff unordered , align 4
102+ %tot1 = fadd half %val_unsigned , %val_regoff
103+ ; CHECK: ldrh {{w[0-9]+}}, [x0, w1, sxtw #1]
104+
105+ %ptr_regoff64 = getelementptr half , ptr %p , i64 %off64
106+ %val_regoff64 = load atomic half , ptr %ptr_regoff64 monotonic , align 4
107+ %tot2 = fadd half %tot1 , %val_regoff64
108+ ; CHECK: ldrh {{w[0-9]+}}, [x0, x2, lsl #1]
109+
110+ %ptr_unscaled = getelementptr half , ptr %p , i32 -64
111+ %val_unscaled = load atomic half , ptr %ptr_unscaled unordered , align 4
112+ %tot3 = fadd half %tot2 , %val_unscaled
113+ ; CHECK: ldurh {{w[0-9]+}}, [x0, #-128]
114+
115+ ret half %tot3
116+ }
117+
118+ define bfloat @atomic_load_relaxed_bf16 (ptr %p , i32 %off32 , i64 %off64 ) #0 {
119+ ; CHECK-LABEL: atomic_load_relaxed_bf16:
120+ %ptr_unsigned = getelementptr bfloat, ptr %p , i32 4095
121+ %val_unsigned = load atomic bfloat, ptr %ptr_unsigned monotonic , align 4
122+ ; CHECK: ldrh {{w[0-9]+}}, [x0, #8190]
123+
124+ %ptr_regoff = getelementptr bfloat, ptr %p , i32 %off32
125+ %val_regoff = load atomic bfloat, ptr %ptr_regoff unordered , align 4
126+ %tot1 = fadd bfloat %val_unsigned , %val_regoff
127+ ; CHECK: ldrh {{w[0-9]+}}, [x0, w1, sxtw #1]
128+
129+ %ptr_regoff64 = getelementptr bfloat, ptr %p , i64 %off64
130+ %val_regoff64 = load atomic bfloat, ptr %ptr_regoff64 monotonic , align 4
131+ %tot2 = fadd bfloat %tot1 , %val_regoff64
132+ ; CHECK: ldrh {{w[0-9]+}}, [x0, x2, lsl #1]
133+
134+ %ptr_unscaled = getelementptr bfloat, ptr %p , i32 -64
135+ %val_unscaled = load atomic bfloat, ptr %ptr_unscaled unordered , align 4
136+ %tot3 = fadd bfloat %tot2 , %val_unscaled
137+ ; CHECK: ldurh {{w[0-9]+}}, [x0, #-128]
138+
139+ ret bfloat %tot3
140+ }
141+
142+ define void @atomic_store_relaxed_f16 (ptr %p , i32 %off32 , i64 %off64 , half %val ) #0 {
143+ ; CHECK-LABEL: atomic_store_relaxed_f16:
144+ %ptr_unsigned = getelementptr half , ptr %p , i32 4095
145+ store atomic half %val , ptr %ptr_unsigned monotonic , align 4
146+ ; CHECK: strh {{w[0-9]+}}, [x0, #8190]
147+
148+ %ptr_regoff = getelementptr half , ptr %p , i32 %off32
149+ store atomic half %val , ptr %ptr_regoff unordered , align 4
150+ ; CHECK: strh {{w[0-9]+}}, [x0, w1, sxtw #1]
151+
152+ %ptr_regoff64 = getelementptr half , ptr %p , i64 %off64
153+ store atomic half %val , ptr %ptr_regoff64 monotonic , align 4
154+ ; CHECK: strh {{w[0-9]+}}, [x0, x2, lsl #1]
155+
156+ %ptr_unscaled = getelementptr half , ptr %p , i32 -64
157+ store atomic half %val , ptr %ptr_unscaled unordered , align 4
158+ ; CHECK: sturh {{w[0-9]+}}, [x0, #-128]
159+
160+ ret void
161+ }
162+
163+ define void @atomic_store_relaxed_bf16 (ptr %p , i32 %off32 , i64 %off64 , bfloat %val ) #0 {
164+ ; CHECK-LABEL: atomic_store_relaxed_bf16:
165+ %ptr_unsigned = getelementptr bfloat, ptr %p , i32 4095
166+ store atomic bfloat %val , ptr %ptr_unsigned monotonic , align 4
167+ ; CHECK: strh {{w[0-9]+}}, [x0, #8190]
168+
169+ %ptr_regoff = getelementptr bfloat, ptr %p , i32 %off32
170+ store atomic bfloat %val , ptr %ptr_regoff unordered , align 4
171+ ; CHECK: strh {{w[0-9]+}}, [x0, w1, sxtw #1]
172+
173+ %ptr_regoff64 = getelementptr bfloat, ptr %p , i64 %off64
174+ store atomic bfloat %val , ptr %ptr_regoff64 monotonic , align 4
175+ ; CHECK: strh {{w[0-9]+}}, [x0, x2, lsl #1]
176+
177+ %ptr_unscaled = getelementptr bfloat, ptr %p , i32 -64
178+ store atomic bfloat %val , ptr %ptr_unscaled unordered , align 4
179+ ; CHECK: sturh {{w[0-9]+}}, [x0, #-128]
180+
181+ ret void
182+ }
183+
94184attributes #0 = { nounwind }
0 commit comments