blob: 309a17798b13c52bdcf50b98de63630f01ba63e4 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple aarch64-unknown-unknown -mattr=+fprcvt,+fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
; RUN: llc < %s -mtriple aarch64-unknown-unknown -global-isel -global-isel-abort=2 -mattr=+fprcvt,+fullfp16 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
; CHECK-GI: warning: Instruction selection used fallback path for test_suqadd_s32
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_suqadd_s64
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_usqadd_s32
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_usqadd_s64
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_uqadd_s32
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_uqadd_s64
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_uqsub_s32
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_uqsub_s64
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sqdmulls_scalar
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sqdmulh_scalar
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sqabs_s32
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sqabs_s64
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sqneg_s32
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for test_sqneg_s64
define void @test_sqrshl_s32(float noundef %a, ptr %dst){
; CHECK-LABEL: test_sqrshl_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqrshl s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqrshl.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqrshl_s64(float noundef %a, ptr %dst){
; CHECK-LABEL: test_sqrshl_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqrshl d0, d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.sqrshl.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_sqshl_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqshl_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqshl s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqshl.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqshl_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqshl_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqshl d0, d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.sqshl.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_uqrshl_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqrshl_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: uqrshl s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.uqrshl.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_uqrshl_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqrshl_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: uqrshl d0, d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.uqrshl.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_uqshl_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqshl_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: uqshl s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.uqshl.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_uqshl_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqshl_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: uqshl d0, d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.uqshl.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_sqshrn_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqshrn_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqshrn s0, d0, #1
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqshrn.i32(i64 %cvt, i32 1)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqshrun_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqshrun_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqshrun s0, d0, #1
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqshrun.i32(i64 %cvt, i32 1)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_uqshrn_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqshrn_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: uqshrn s0, d0, #1
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.uqshrn.i32(i64 %cvt, i32 1)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqrshrn_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqrshrn_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqrshrn s0, d0, #1
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqrshrn.i32(i64 %cvt, i32 1)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqrshrun_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqrshrun_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqrshrun s0, d0, #1
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqrshrun.i32(i64 %cvt, i32 1)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_uqrshrn_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqrshrn_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: uqrshrn s0, d0, #1
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.uqrshrn.i32(i64 %cvt, i32 1)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_suqadd_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_suqadd_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: suqadd s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.suqadd.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_suqadd_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_suqadd_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: suqadd d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.suqadd.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_usqadd_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_usqadd_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: usqadd s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.usqadd.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_usqadd_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_usqadd_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: usqadd d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.usqadd.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_sqadd_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqadd_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqadd s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqadd.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqadd_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqadd_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqadd d0, d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.sqadd.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_sqsub_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqsub_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqsub s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqsub.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqsub_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqsub_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqsub d0, d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.sqsub.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_uqadd_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqadd_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: uqadd s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.uqadd.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_uqadd_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqadd_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: uqadd d0, d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.uqadd.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_abs_s64(float noundef %a, ptr %dst) {
; CHECK-SD-LABEL: test_abs_s64:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fcvtzs d0, s0
; CHECK-SD-NEXT: abs d0, d0
; CHECK-SD-NEXT: str d0, [x0]
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: test_abs_s64:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fcvtzs x8, s0
; CHECK-GI-NEXT: cmp x8, #0
; CHECK-GI-NEXT: cneg x8, x8, le
; CHECK-GI-NEXT: str x8, [x0]
; CHECK-GI-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.abs.i64(i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_uqsub_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqsub_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: uqsub s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.uqsub.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_uqsub_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_uqsub_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: uqsub d0, d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.uqsub.i64(i64 %cvt, i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_sqdmulls_scalar(float %A, ptr %dst){
; CHECK-LABEL: test_sqdmulls_scalar:
; CHECK: // %bb.0:
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqdmull d0, s0, s0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %A)
%prod = call i64 @llvm.aarch64.neon.sqdmulls.scalar(i32 %cvt, i32 %cvt)
store i64 %prod, ptr %dst, align 8
ret void
}
define void @test_sqdmulh_scalar(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqdmulh_scalar:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqdmulh s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = call i32 @llvm.aarch64.neon.sqdmulh.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst
ret void
}
define void @test_sqrdmulh_scalar(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqrdmulh_scalar:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqrdmulh s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = call i32 @llvm.aarch64.neon.sqrdmulh.i32(i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst
ret void
}
define void @test_sqrdmlah_scalar(float noundef %a, ptr %dst) #0 {
; CHECK-LABEL: test_sqrdmlah_scalar:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqrdmlah s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = call i32 @llvm.aarch64.neon.sqrdmlah.i32(i32 %cvt, i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst
ret void
}
define void @test_sqrdmlsh_scalar(float noundef %a, ptr %dst) #0 {
; CHECK-LABEL: test_sqrdmlsh_scalar:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqrdmlsh s0, s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = call i32 @llvm.aarch64.neon.sqrdmlsh.i32(i32 %cvt, i32 %cvt, i32 %cvt)
store i32 %res, ptr %dst
ret void
}
define void @test_sqabs_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqabs_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqabs s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqabs.i32(i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqabs_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqabs_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqabs d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.sqabs.i64(i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
define void @test_sqneg_s32(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqneg_s32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs s0, s0
; CHECK-NEXT: sqneg s0, s0
; CHECK-NEXT: str s0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a)
%res = tail call i32 @llvm.aarch64.neon.sqneg.i32(i32 %cvt)
store i32 %res, ptr %dst, align 4
ret void
}
define void @test_sqneg_s64(float noundef %a, ptr %dst) {
; CHECK-LABEL: test_sqneg_s64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fcvtzs d0, s0
; CHECK-NEXT: sqneg d0, d0
; CHECK-NEXT: str d0, [x0]
; CHECK-NEXT: ret
entry:
%cvt = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %a)
%res = tail call i64 @llvm.aarch64.neon.sqneg.i64(i64 %cvt)
store i64 %res, ptr %dst, align 8
ret void
}
attributes #0 = { "target-features"="+rdm" }