This patch adds support for vector @llvm.ceil intrinsics when full 16 bit floating point support isn't available. To do this, this patch... - Implements basic isel for G_UNMERGE_VALUES - Teaches the legalizer about 16 bit floats - Teaches AArch64RegisterBankInfo to respect floating point registers on G_BUILD_VECTOR and G_UNMERGE_VALUES - Teaches selectCopy about 16-bit floating point vectors It also adds - A legalizer test for the 16-bit vector ceil which verifies that we create a G_UNMERGE_VALUES and G_BUILD_VECTOR when full fp16 isn't supported - An instruction selection test which makes sure we lower to G_FCEIL when full fp16 is supported - A test for selecting G_UNMERGE_VALUES And also updates arm64-vfloatintrinsics.ll to show that the new ceiling types work as expected. https://reviews.llvm.org/D56682 llvm-svn: 352113
131 lines
2.9 KiB
YAML
131 lines
2.9 KiB
YAML
# RUN: llc -verify-machineinstrs -mtriple aarch64--- \
|
|
# RUN: -run-pass=instruction-select -mattr=+fullfp16 -global-isel %s -o - \
|
|
# RUN: | FileCheck %s
|
|
...
|
|
---
|
|
name: ceil_float
|
|
legalized: true
|
|
regBankSelected: true
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: fpr }
|
|
- { id: 1, class: fpr }
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: ceil_float
|
|
; CHECK: %{{[0-9]+}}:fpr32 = FRINTPSr %{{[0-9]+}}
|
|
liveins: $s0
|
|
%0:fpr(s32) = COPY $s0
|
|
%1:fpr(s32) = G_FCEIL %0
|
|
$s0 = COPY %1(s32)
|
|
|
|
...
|
|
---
|
|
name: ceil_double
|
|
legalized: true
|
|
regBankSelected: true
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: fpr }
|
|
- { id: 1, class: fpr }
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: ceil_double
|
|
; CHECK: %{{[0-9]+}}:fpr64 = FRINTPDr %{{[0-9]+}}
|
|
liveins: $d0
|
|
%0:fpr(s64) = COPY $d0
|
|
%1:fpr(s64) = G_FCEIL %0
|
|
$d0 = COPY %1(s64)
|
|
|
|
...
|
|
---
|
|
name: ceil_v2f32
|
|
legalized: true
|
|
regBankSelected: true
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: fpr }
|
|
- { id: 1, class: fpr }
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: ceil_v2f32
|
|
; CHECK: %{{[0-9]+}}:fpr64 = FRINTPv2f32 %{{[0-9]+}}
|
|
liveins: $d0
|
|
%0:fpr(<2 x s32>) = COPY $d0
|
|
%1:fpr(<2 x s32>) = G_FCEIL %0
|
|
$d0 = COPY %1(<2 x s32>)
|
|
|
|
...
|
|
---
|
|
name: ceil_v4f32
|
|
legalized: true
|
|
regBankSelected: true
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: fpr }
|
|
- { id: 1, class: fpr }
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: ceil_v4f32
|
|
; CHECK: %{{[0-9]+}}:fpr128 = FRINTPv4f32 %{{[0-9]+}}
|
|
liveins: $q0
|
|
%0:fpr(<4 x s32>) = COPY $q0
|
|
%1:fpr(<4 x s32>) = G_FCEIL %0
|
|
$q0 = COPY %1(<4 x s32>)
|
|
|
|
...
|
|
---
|
|
name: ceil_v2f64
|
|
legalized: true
|
|
regBankSelected: true
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: fpr }
|
|
- { id: 1, class: fpr }
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: ceil_v2f64
|
|
; CHECK: %{{[0-9]+}}:fpr128 = FRINTPv2f64 %{{[0-9]+}}
|
|
liveins: $q0
|
|
%0:fpr(<2 x s64>) = COPY $q0
|
|
%1:fpr(<2 x s64>) = G_FCEIL %0
|
|
$q0 = COPY %1(<2 x s64>)
|
|
|
|
...
|
|
---
|
|
name: ceil_v4f16
|
|
legalized: true
|
|
regBankSelected: true
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: fpr }
|
|
- { id: 1, class: fpr }
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: ceil_v4f16
|
|
; CHECK: %{{[0-9]+}}:fpr64 = FRINTPv4f16 %{{[0-9]+}}
|
|
liveins: $d0
|
|
%0:fpr(<4 x s16>) = COPY $d0
|
|
%1:fpr(<4 x s16>) = G_FCEIL %0
|
|
$d0 = COPY %1(<4 x s16>)
|
|
|
|
...
|
|
---
|
|
name: ceil_v8f16
|
|
legalized: true
|
|
regBankSelected: true
|
|
tracksRegLiveness: true
|
|
registers:
|
|
- { id: 0, class: fpr }
|
|
- { id: 1, class: fpr }
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: ceil_v8f16
|
|
; CHECK: %{{[0-9]+}}:fpr128 = FRINTPv8f16 %{{[0-9]+}}
|
|
liveins: $q0
|
|
%0:fpr(<8 x s16>) = COPY $q0
|
|
%1:fpr(<8 x s16>) = G_FCEIL %0
|
|
$q0 = COPY %1(<8 x s16>)
|
|
|
|
...
|