Files
clang-p2996/llvm/test/CodeGen/AArch64/fdiv.ll
Sander de Smalen 61510b51c3 Revert "[AArch64] Enable subreg liveness tracking by default."
This reverts commit 9c319d5bb4.

Some issues were discovered with the bootstrap builds, which
seem like they were caused by this commit. I'm reverting to investigate.
2024-12-12 17:22:15 +00:00

347 lines
12 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-NOFP16
; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16
; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16
; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16
define double @fdiv_f64(double %a, double %b) {
; CHECK-LABEL: fdiv_f64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fdiv d0, d0, d1
; CHECK-NEXT: ret
entry:
%c = fdiv double %a, %b
ret double %c
}
define float @fdiv_f32(float %a, float %b) {
; CHECK-LABEL: fdiv_f32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fdiv s0, s0, s1
; CHECK-NEXT: ret
entry:
%c = fdiv float %a, %b
ret float %c
}
define half @fdiv_f16(half %a, half %b) {
; CHECK-SD-NOFP16-LABEL: fdiv_f16:
; CHECK-SD-NOFP16: // %bb.0: // %entry
; CHECK-SD-NOFP16-NEXT: fcvt s1, h1
; CHECK-SD-NOFP16-NEXT: fcvt s0, h0
; CHECK-SD-NOFP16-NEXT: fdiv s0, s0, s1
; CHECK-SD-NOFP16-NEXT: fcvt h0, s0
; CHECK-SD-NOFP16-NEXT: ret
;
; CHECK-SD-FP16-LABEL: fdiv_f16:
; CHECK-SD-FP16: // %bb.0: // %entry
; CHECK-SD-FP16-NEXT: fdiv h0, h0, h1
; CHECK-SD-FP16-NEXT: ret
;
; CHECK-GI-NOFP16-LABEL: fdiv_f16:
; CHECK-GI-NOFP16: // %bb.0: // %entry
; CHECK-GI-NOFP16-NEXT: fcvt s0, h0
; CHECK-GI-NOFP16-NEXT: fcvt s1, h1
; CHECK-GI-NOFP16-NEXT: fdiv s0, s0, s1
; CHECK-GI-NOFP16-NEXT: fcvt h0, s0
; CHECK-GI-NOFP16-NEXT: ret
;
; CHECK-GI-FP16-LABEL: fdiv_f16:
; CHECK-GI-FP16: // %bb.0: // %entry
; CHECK-GI-FP16-NEXT: fdiv h0, h0, h1
; CHECK-GI-FP16-NEXT: ret
entry:
%c = fdiv half %a, %b
ret half %c
}
define <2 x double> @fdiv_v2f64(<2 x double> %a, <2 x double> %b) {
; CHECK-LABEL: fdiv_v2f64:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fdiv v0.2d, v0.2d, v1.2d
; CHECK-NEXT: ret
entry:
%c = fdiv <2 x double> %a, %b
ret <2 x double> %c
}
define <3 x double> @fdiv_v3f64(<3 x double> %a, <3 x double> %b) {
; CHECK-SD-LABEL: fdiv_v3f64:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: // kill: def $d3 killed $d3 def $q3
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
; CHECK-SD-NEXT: // kill: def $d4 killed $d4 def $q4
; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1
; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2
; CHECK-SD-NEXT: // kill: def $d5 killed $d5 def $q5
; CHECK-SD-NEXT: mov v3.d[1], v4.d[0]
; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
; CHECK-SD-NEXT: fdiv v2.2d, v2.2d, v5.2d
; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
; CHECK-SD-NEXT: fdiv v0.2d, v0.2d, v3.2d
; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: fdiv_v3f64:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
; CHECK-GI-NEXT: // kill: def $d3 killed $d3 def $q3
; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1
; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4
; CHECK-GI-NEXT: fdiv d2, d2, d5
; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-GI-NEXT: mov v3.d[1], v4.d[0]
; CHECK-GI-NEXT: fdiv v0.2d, v0.2d, v3.2d
; CHECK-GI-NEXT: mov d1, v0.d[1]
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
; CHECK-GI-NEXT: ret
entry:
%c = fdiv <3 x double> %a, %b
ret <3 x double> %c
}
define <4 x double> @fdiv_v4f64(<4 x double> %a, <4 x double> %b) {
; CHECK-SD-LABEL: fdiv_v4f64:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fdiv v1.2d, v1.2d, v3.2d
; CHECK-SD-NEXT: fdiv v0.2d, v0.2d, v2.2d
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: fdiv_v4f64:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fdiv v0.2d, v0.2d, v2.2d
; CHECK-GI-NEXT: fdiv v1.2d, v1.2d, v3.2d
; CHECK-GI-NEXT: ret
entry:
%c = fdiv <4 x double> %a, %b
ret <4 x double> %c
}
define <2 x float> @fdiv_v2f32(<2 x float> %a, <2 x float> %b) {
; CHECK-LABEL: fdiv_v2f32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fdiv v0.2s, v0.2s, v1.2s
; CHECK-NEXT: ret
entry:
%c = fdiv <2 x float> %a, %b
ret <2 x float> %c
}
define <3 x float> @fdiv_v3f32(<3 x float> %a, <3 x float> %b) {
; CHECK-LABEL: fdiv_v3f32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fdiv v0.4s, v0.4s, v1.4s
; CHECK-NEXT: ret
entry:
%c = fdiv <3 x float> %a, %b
ret <3 x float> %c
}
define <4 x float> @fdiv_v4f32(<4 x float> %a, <4 x float> %b) {
; CHECK-LABEL: fdiv_v4f32:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fdiv v0.4s, v0.4s, v1.4s
; CHECK-NEXT: ret
entry:
%c = fdiv <4 x float> %a, %b
ret <4 x float> %c
}
define <8 x float> @fdiv_v8f32(<8 x float> %a, <8 x float> %b) {
; CHECK-SD-LABEL: fdiv_v8f32:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fdiv v1.4s, v1.4s, v3.4s
; CHECK-SD-NEXT: fdiv v0.4s, v0.4s, v2.4s
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: fdiv_v8f32:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fdiv v0.4s, v0.4s, v2.4s
; CHECK-GI-NEXT: fdiv v1.4s, v1.4s, v3.4s
; CHECK-GI-NEXT: ret
entry:
%c = fdiv <8 x float> %a, %b
ret <8 x float> %c
}
define <7 x half> @fdiv_v7f16(<7 x half> %a, <7 x half> %b) {
; CHECK-SD-NOFP16-LABEL: fdiv_v7f16:
; CHECK-SD-NOFP16: // %bb.0: // %entry
; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v1.4h
; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v0.4h
; CHECK-SD-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h
; CHECK-SD-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h
; CHECK-SD-NOFP16-NEXT: fdiv v2.4s, v3.4s, v2.4s
; CHECK-SD-NOFP16-NEXT: fdiv v1.4s, v0.4s, v1.4s
; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s
; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s
; CHECK-SD-NOFP16-NEXT: ret
;
; CHECK-SD-FP16-LABEL: fdiv_v7f16:
; CHECK-SD-FP16: // %bb.0: // %entry
; CHECK-SD-FP16-NEXT: fdiv v0.8h, v0.8h, v1.8h
; CHECK-SD-FP16-NEXT: ret
;
; CHECK-GI-NOFP16-LABEL: fdiv_v7f16:
; CHECK-GI-NOFP16: // %bb.0: // %entry
; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h
; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h
; CHECK-GI-NOFP16-NEXT: mov v4.h[0], v0.h[4]
; CHECK-GI-NOFP16-NEXT: fdiv v2.4s, v2.4s, v3.4s
; CHECK-GI-NOFP16-NEXT: mov v3.h[0], v1.h[4]
; CHECK-GI-NOFP16-NEXT: mov v4.h[1], v0.h[5]
; CHECK-GI-NOFP16-NEXT: mov v3.h[1], v1.h[5]
; CHECK-GI-NOFP16-NEXT: mov v4.h[2], v0.h[6]
; CHECK-GI-NOFP16-NEXT: mov v3.h[2], v1.h[6]
; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v4.4h
; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v3.4h
; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v2.4s
; CHECK-GI-NOFP16-NEXT: fdiv v1.4s, v0.4s, v1.4s
; CHECK-GI-NOFP16-NEXT: mov v0.h[0], v2.h[0]
; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v2.h[1]
; CHECK-GI-NOFP16-NEXT: mov v0.h[2], v2.h[2]
; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v1.4s
; CHECK-GI-NOFP16-NEXT: mov v0.h[3], v2.h[3]
; CHECK-GI-NOFP16-NEXT: mov v0.h[4], v1.h[0]
; CHECK-GI-NOFP16-NEXT: mov v0.h[5], v1.h[1]
; CHECK-GI-NOFP16-NEXT: mov v0.h[6], v1.h[2]
; CHECK-GI-NOFP16-NEXT: ret
;
; CHECK-GI-FP16-LABEL: fdiv_v7f16:
; CHECK-GI-FP16: // %bb.0: // %entry
; CHECK-GI-FP16-NEXT: fdiv v0.8h, v0.8h, v1.8h
; CHECK-GI-FP16-NEXT: ret
entry:
%c = fdiv <7 x half> %a, %b
ret <7 x half> %c
}
define <4 x half> @fdiv_v4f16(<4 x half> %a, <4 x half> %b) {
; CHECK-SD-NOFP16-LABEL: fdiv_v4f16:
; CHECK-SD-NOFP16: // %bb.0: // %entry
; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v1.4h
; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h
; CHECK-SD-NOFP16-NEXT: fdiv v0.4s, v0.4s, v1.4s
; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s
; CHECK-SD-NOFP16-NEXT: ret
;
; CHECK-SD-FP16-LABEL: fdiv_v4f16:
; CHECK-SD-FP16: // %bb.0: // %entry
; CHECK-SD-FP16-NEXT: fdiv v0.4h, v0.4h, v1.4h
; CHECK-SD-FP16-NEXT: ret
;
; CHECK-GI-NOFP16-LABEL: fdiv_v4f16:
; CHECK-GI-NOFP16: // %bb.0: // %entry
; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v0.4h
; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v1.4h
; CHECK-GI-NOFP16-NEXT: fdiv v0.4s, v0.4s, v1.4s
; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s
; CHECK-GI-NOFP16-NEXT: ret
;
; CHECK-GI-FP16-LABEL: fdiv_v4f16:
; CHECK-GI-FP16: // %bb.0: // %entry
; CHECK-GI-FP16-NEXT: fdiv v0.4h, v0.4h, v1.4h
; CHECK-GI-FP16-NEXT: ret
entry:
%c = fdiv <4 x half> %a, %b
ret <4 x half> %c
}
define <8 x half> @fdiv_v8f16(<8 x half> %a, <8 x half> %b) {
; CHECK-SD-NOFP16-LABEL: fdiv_v8f16:
; CHECK-SD-NOFP16: // %bb.0: // %entry
; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v1.4h
; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v0.4h
; CHECK-SD-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h
; CHECK-SD-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h
; CHECK-SD-NOFP16-NEXT: fdiv v2.4s, v3.4s, v2.4s
; CHECK-SD-NOFP16-NEXT: fdiv v1.4s, v0.4s, v1.4s
; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s
; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s
; CHECK-SD-NOFP16-NEXT: ret
;
; CHECK-SD-FP16-LABEL: fdiv_v8f16:
; CHECK-SD-FP16: // %bb.0: // %entry
; CHECK-SD-FP16-NEXT: fdiv v0.8h, v0.8h, v1.8h
; CHECK-SD-FP16-NEXT: ret
;
; CHECK-GI-NOFP16-LABEL: fdiv_v8f16:
; CHECK-GI-NOFP16: // %bb.0: // %entry
; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h
; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h
; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h
; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h
; CHECK-GI-NOFP16-NEXT: fdiv v2.4s, v2.4s, v3.4s
; CHECK-GI-NOFP16-NEXT: fdiv v1.4s, v0.4s, v1.4s
; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s
; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s
; CHECK-GI-NOFP16-NEXT: ret
;
; CHECK-GI-FP16-LABEL: fdiv_v8f16:
; CHECK-GI-FP16: // %bb.0: // %entry
; CHECK-GI-FP16-NEXT: fdiv v0.8h, v0.8h, v1.8h
; CHECK-GI-FP16-NEXT: ret
entry:
%c = fdiv <8 x half> %a, %b
ret <8 x half> %c
}
define <16 x half> @fdiv_v16f16(<16 x half> %a, <16 x half> %b) {
; CHECK-SD-NOFP16-LABEL: fdiv_v16f16:
; CHECK-SD-NOFP16: // %bb.0: // %entry
; CHECK-SD-NOFP16-NEXT: fcvtl2 v4.4s, v2.8h
; CHECK-SD-NOFP16-NEXT: fcvtl2 v5.4s, v0.8h
; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v2.4h
; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h
; CHECK-SD-NOFP16-NEXT: fdiv v4.4s, v5.4s, v4.4s
; CHECK-SD-NOFP16-NEXT: fcvtl v5.4s, v1.4h
; CHECK-SD-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h
; CHECK-SD-NOFP16-NEXT: fdiv v0.4s, v0.4s, v2.4s
; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v3.4h
; CHECK-SD-NOFP16-NEXT: fcvtl2 v3.4s, v3.8h
; CHECK-SD-NOFP16-NEXT: fdiv v2.4s, v5.4s, v2.4s
; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s
; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s
; CHECK-SD-NOFP16-NEXT: fdiv v3.4s, v1.4s, v3.4s
; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v2.4s
; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s
; CHECK-SD-NOFP16-NEXT: ret
;
; CHECK-SD-FP16-LABEL: fdiv_v16f16:
; CHECK-SD-FP16: // %bb.0: // %entry
; CHECK-SD-FP16-NEXT: fdiv v1.8h, v1.8h, v3.8h
; CHECK-SD-FP16-NEXT: fdiv v0.8h, v0.8h, v2.8h
; CHECK-SD-FP16-NEXT: ret
;
; CHECK-GI-NOFP16-LABEL: fdiv_v16f16:
; CHECK-GI-NOFP16: // %bb.0: // %entry
; CHECK-GI-NOFP16-NEXT: fcvtl v4.4s, v0.4h
; CHECK-GI-NOFP16-NEXT: fcvtl v5.4s, v2.4h
; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h
; CHECK-GI-NOFP16-NEXT: fcvtl2 v2.4s, v2.8h
; CHECK-GI-NOFP16-NEXT: fdiv v4.4s, v4.4s, v5.4s
; CHECK-GI-NOFP16-NEXT: fcvtl v5.4s, v3.4h
; CHECK-GI-NOFP16-NEXT: fdiv v2.4s, v0.4s, v2.4s
; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v1.4h
; CHECK-GI-NOFP16-NEXT: fdiv v5.4s, v0.4s, v5.4s
; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v1.8h
; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v3.8h
; CHECK-GI-NOFP16-NEXT: fdiv v3.4s, v0.4s, v1.4s
; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v4.4s
; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v5.4s
; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s
; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s
; CHECK-GI-NOFP16-NEXT: ret
;
; CHECK-GI-FP16-LABEL: fdiv_v16f16:
; CHECK-GI-FP16: // %bb.0: // %entry
; CHECK-GI-FP16-NEXT: fdiv v0.8h, v0.8h, v2.8h
; CHECK-GI-FP16-NEXT: fdiv v1.8h, v1.8h, v3.8h
; CHECK-GI-FP16-NEXT: ret
entry:
%c = fdiv <16 x half> %a, %b
ret <16 x half> %c
}