@@ -259,6 +259,73 @@ define void @test_half_pow(half %a0, half %a1, ptr %p0) nounwind {
259
259
ret void
260
260
}
261
261
262
+ define half @test_half_powi (half %a0 , i32 %a1 ) {
263
+ ; F16C-LABEL: test_half_powi:
264
+ ; F16C: # %bb.0:
265
+ ; F16C-NEXT: pushq %rax
266
+ ; F16C-NEXT: .cfi_def_cfa_offset 16
267
+ ; F16C-NEXT: vpextrw $0, %xmm0, %eax
268
+ ; F16C-NEXT: vmovd %eax, %xmm0
269
+ ; F16C-NEXT: vcvtph2ps %xmm0, %xmm0
270
+ ; F16C-NEXT: callq __powisf2@PLT
271
+ ; F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0
272
+ ; F16C-NEXT: vmovd %xmm0, %eax
273
+ ; F16C-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0
274
+ ; F16C-NEXT: popq %rax
275
+ ; F16C-NEXT: .cfi_def_cfa_offset 8
276
+ ; F16C-NEXT: retq
277
+ ;
278
+ ; FP16-LABEL: test_half_powi:
279
+ ; FP16: # %bb.0:
280
+ ; FP16-NEXT: pushq %rax
281
+ ; FP16-NEXT: .cfi_def_cfa_offset 16
282
+ ; FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0
283
+ ; FP16-NEXT: callq __powisf2@PLT
284
+ ; FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0
285
+ ; FP16-NEXT: popq %rax
286
+ ; FP16-NEXT: .cfi_def_cfa_offset 8
287
+ ; FP16-NEXT: retq
288
+ ;
289
+ ; X64-LABEL: test_half_powi:
290
+ ; X64: # %bb.0:
291
+ ; X64-NEXT: pushq %rbx
292
+ ; X64-NEXT: .cfi_def_cfa_offset 16
293
+ ; X64-NEXT: .cfi_offset %rbx, -16
294
+ ; X64-NEXT: movl %edi, %ebx
295
+ ; X64-NEXT: callq __extendhfsf2@PLT
296
+ ; X64-NEXT: movl %ebx, %edi
297
+ ; X64-NEXT: callq __powisf2@PLT
298
+ ; X64-NEXT: callq __truncsfhf2@PLT
299
+ ; X64-NEXT: popq %rbx
300
+ ; X64-NEXT: .cfi_def_cfa_offset 8
301
+ ; X64-NEXT: retq
302
+ ;
303
+ ; X86-LABEL: test_half_powi:
304
+ ; X86: # %bb.0:
305
+ ; X86-NEXT: pushl %esi
306
+ ; X86-NEXT: .cfi_def_cfa_offset 8
307
+ ; X86-NEXT: subl $8, %esp
308
+ ; X86-NEXT: .cfi_def_cfa_offset 16
309
+ ; X86-NEXT: .cfi_offset %esi, -8
310
+ ; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0
311
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
312
+ ; X86-NEXT: pextrw $0, %xmm0, %eax
313
+ ; X86-NEXT: movw %ax, (%esp)
314
+ ; X86-NEXT: calll __extendhfsf2
315
+ ; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
316
+ ; X86-NEXT: fstps (%esp)
317
+ ; X86-NEXT: calll __powisf2
318
+ ; X86-NEXT: fstps (%esp)
319
+ ; X86-NEXT: calll __truncsfhf2
320
+ ; X86-NEXT: addl $8, %esp
321
+ ; X86-NEXT: .cfi_def_cfa_offset 8
322
+ ; X86-NEXT: popl %esi
323
+ ; X86-NEXT: .cfi_def_cfa_offset 4
324
+ ; X86-NEXT: retl
325
+ %res = call half @llvm.powi (half %a0 , i32 %a1 )
326
+ ret half %res
327
+ }
328
+
262
329
define void @test_half_sin (half %a0 , ptr %p0 ) nounwind {
263
330
; F16C-LABEL: test_half_sin:
264
331
; F16C: # %bb.0:
0 commit comments