mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
b649874e8d
The isScaledConstantInRange function takes upper and lower bounds which are checked after dividing by the scale, so the bounds checks for half, single and double precision should all be the same. Previously, we had wrong bounds checks for half precision, so selected an immediate the instructions can't actually represent. Differential revision: https://reviews.llvm.org/D58822 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355305 91177308-0d34-0410-b5e6-96231b3b80d8
106 lines
3.0 KiB
LLVM
106 lines
3.0 KiB
LLVM
; RUN: llc < %s -mtriple armv8a--none-eabi -mattr=+fullfp16 | FileCheck %s
|
|
|
|
define void @load_zero(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: load_zero:
|
|
; CHECK: vldr.16 {{s[0-9]+}}, [r0]
|
|
%arrayidx = getelementptr inbounds half, half* %in, i32 0
|
|
%load = load half, half* %arrayidx, align 2
|
|
store half %load, half* %out
|
|
ret void
|
|
}
|
|
|
|
define void @load_255(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: load_255:
|
|
; CHECK: vldr.16 {{s[0-9]+}}, [r0, #510]
|
|
%arrayidx = getelementptr inbounds half, half* %in, i32 255
|
|
%load = load half, half* %arrayidx, align 2
|
|
store half %load, half* %out
|
|
ret void
|
|
}
|
|
|
|
define void @load_256(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: load_256:
|
|
; CHECK: add [[ADDR:r[0-9]+]], r0, #512
|
|
; CHECK: vldr.16 {{s[0-9]+}}, {{\[}}[[ADDR]]{{\]}}
|
|
%arrayidx = getelementptr inbounds half, half* %in, i32 256
|
|
%load = load half, half* %arrayidx, align 2
|
|
store half %load, half* %out
|
|
ret void
|
|
}
|
|
|
|
define void @load_neg_255(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: load_neg_255:
|
|
; CHECK: vldr.16 {{s[0-9]+}}, [r0, #-510]
|
|
%arrayidx = getelementptr inbounds half, half* %in, i32 -255
|
|
%load = load half, half* %arrayidx, align 2
|
|
store half %load, half* %out
|
|
ret void
|
|
}
|
|
|
|
define void @load_neg_256(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: load_neg_256:
|
|
; CHECK: sub [[ADDR:r[0-9]+]], r0, #512
|
|
; CHECK: vldr.16 {{s[0-9]+}}, {{\[}}[[ADDR]]{{\]}}
|
|
%arrayidx = getelementptr inbounds half, half* %in, i32 -256
|
|
%load = load half, half* %arrayidx, align 2
|
|
store half %load, half* %out
|
|
ret void
|
|
}
|
|
|
|
define void @store_zero(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: store_zero:
|
|
%load = load half, half* %in, align 2
|
|
; CHECK: vstr.16 {{s[0-9]+}}, [r1]
|
|
%arrayidx = getelementptr inbounds half, half* %out, i32 0
|
|
store half %load, half* %arrayidx
|
|
ret void
|
|
}
|
|
|
|
define void @store_255(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: store_255:
|
|
%load = load half, half* %in, align 2
|
|
; CHECK: vstr.16 {{s[0-9]+}}, [r1, #510]
|
|
%arrayidx = getelementptr inbounds half, half* %out, i32 255
|
|
store half %load, half* %arrayidx
|
|
ret void
|
|
}
|
|
|
|
define void @store_256(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: store_256:
|
|
%load = load half, half* %in, align 2
|
|
; CHECK: add [[ADDR:r[0-9]+]], r1, #512
|
|
; CHECK: vstr.16 {{s[0-9]+}}, {{\[}}[[ADDR]]{{\]}}
|
|
%arrayidx = getelementptr inbounds half, half* %out, i32 256
|
|
store half %load, half* %arrayidx
|
|
ret void
|
|
}
|
|
|
|
define void @store_neg_255(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: store_neg_255:
|
|
%load = load half, half* %in, align 2
|
|
; CHECK: vstr.16 {{s[0-9]+}}, [r1, #-510]
|
|
%arrayidx = getelementptr inbounds half, half* %out, i32 -255
|
|
store half %load, half* %arrayidx
|
|
ret void
|
|
}
|
|
|
|
define void @store_neg_256(half* %in, half* %out) {
|
|
entry:
|
|
; CHECK-LABEL: store_neg_256:
|
|
%load = load half, half* %in, align 2
|
|
; CHECK: sub [[ADDR:r[0-9]+]], r1, #512
|
|
; CHECK: vstr.16 {{s[0-9]+}}, {{\[}}[[ADDR]]{{\]}}
|
|
%arrayidx = getelementptr inbounds half, half* %out, i32 -256
|
|
store half %load, half* %arrayidx
|
|
ret void
|
|
}
|