Alexander Timofeev | 982aee6 | 2017-07-04 17:32:00 +0000 | [diff] [blame] | 1 | ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN-SAFE -check-prefix=GCN -check-prefix=SI %s |
| 2 | ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=GCN-SAFE -check-prefix=GCN -check-prefix=CI %s |
| 3 | ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN-SAFE -check-prefix=GCN -check-prefix=FUNC %s |
| 4 | ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -verify-machineinstrs -enable-unsafe-fp-math < %s | FileCheck -check-prefix=GCN-UNSAFE -check-prefix=GCN %s |
| 5 | ; RUN: llc -amdgpu-scalarize-global-loads=false -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs -enable-unsafe-fp-math < %s | FileCheck -check-prefix=GCN-UNSAFE -check-prefix=GCN %s |
Matt Arsenault | 0cbaa17 | 2016-01-22 18:42:38 +0000 | [diff] [blame] | 6 | |
| 7 | declare float @llvm.fabs.f32(float) #0 |
| 8 | declare float @llvm.floor.f32(float) #0 |
| 9 | |
Matt Arsenault | 7401516 | 2016-05-28 00:19:52 +0000 | [diff] [blame] | 10 | ; GCN-LABEL: {{^}}fract_f32: |
| 11 | ; GCN-SAFE: v_floor_f32_e32 [[FLR:v[0-9]+]], [[INPUT:v[0-9]+]] |
Matt Arsenault | 6c29c5a | 2017-07-10 19:53:57 +0000 | [diff] [blame] | 12 | ; GCN-SAFE: v_sub_f32_e32 [[RESULT:v[0-9]+]], [[INPUT]], [[FLR]] |
Matt Arsenault | 0cbaa17 | 2016-01-22 18:42:38 +0000 | [diff] [blame] | 13 | |
Matt Arsenault | 7401516 | 2016-05-28 00:19:52 +0000 | [diff] [blame] | 14 | ; GCN-UNSAFE: v_fract_f32_e32 [[RESULT:v[0-9]+]], [[INPUT:v[0-9]+]] |
| 15 | |
| 16 | ; GCN: buffer_store_dword [[RESULT]] |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 17 | define amdgpu_kernel void @fract_f32(float addrspace(1)* %out, float addrspace(1)* %src) #1 { |
Matt Arsenault | 0cbaa17 | 2016-01-22 18:42:38 +0000 | [diff] [blame] | 18 | %x = load float, float addrspace(1)* %src |
| 19 | %floor.x = call float @llvm.floor.f32(float %x) |
| 20 | %fract = fsub float %x, %floor.x |
| 21 | store float %fract, float addrspace(1)* %out |
| 22 | ret void |
| 23 | } |
| 24 | |
Matt Arsenault | 7401516 | 2016-05-28 00:19:52 +0000 | [diff] [blame] | 25 | ; GCN-LABEL: {{^}}fract_f32_neg: |
| 26 | ; GCN-SAFE: v_floor_f32_e64 [[FLR:v[0-9]+]], -[[INPUT:v[0-9]+]] |
| 27 | ; GCN-SAFE: v_sub_f32_e64 [[RESULT:v[0-9]+]], -[[INPUT]], [[FLR]] |
Matt Arsenault | 0cbaa17 | 2016-01-22 18:42:38 +0000 | [diff] [blame] | 28 | |
Matt Arsenault | 7401516 | 2016-05-28 00:19:52 +0000 | [diff] [blame] | 29 | ; GCN-UNSAFE: v_fract_f32_e64 [[RESULT:v[0-9]+]], -[[INPUT:v[0-9]+]] |
| 30 | |
| 31 | ; GCN: buffer_store_dword [[RESULT]] |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 32 | define amdgpu_kernel void @fract_f32_neg(float addrspace(1)* %out, float addrspace(1)* %src) #1 { |
Matt Arsenault | 0cbaa17 | 2016-01-22 18:42:38 +0000 | [diff] [blame] | 33 | %x = load float, float addrspace(1)* %src |
| 34 | %x.neg = fsub float -0.0, %x |
| 35 | %floor.x.neg = call float @llvm.floor.f32(float %x.neg) |
| 36 | %fract = fsub float %x.neg, %floor.x.neg |
| 37 | store float %fract, float addrspace(1)* %out |
| 38 | ret void |
| 39 | } |
| 40 | |
Matt Arsenault | 7401516 | 2016-05-28 00:19:52 +0000 | [diff] [blame] | 41 | ; GCN-LABEL: {{^}}fract_f32_neg_abs: |
| 42 | ; GCN-SAFE: v_floor_f32_e64 [[FLR:v[0-9]+]], -|[[INPUT:v[0-9]+]]| |
| 43 | ; GCN-SAFE: v_sub_f32_e64 [[RESULT:v[0-9]+]], -|[[INPUT]]|, [[FLR]] |
Matt Arsenault | 0cbaa17 | 2016-01-22 18:42:38 +0000 | [diff] [blame] | 44 | |
Matt Arsenault | 7401516 | 2016-05-28 00:19:52 +0000 | [diff] [blame] | 45 | ; GCN-UNSAFE: v_fract_f32_e64 [[RESULT:v[0-9]+]], -|[[INPUT:v[0-9]+]]| |
| 46 | |
| 47 | ; GCN: buffer_store_dword [[RESULT]] |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 48 | define amdgpu_kernel void @fract_f32_neg_abs(float addrspace(1)* %out, float addrspace(1)* %src) #1 { |
Matt Arsenault | 0cbaa17 | 2016-01-22 18:42:38 +0000 | [diff] [blame] | 49 | %x = load float, float addrspace(1)* %src |
| 50 | %abs.x = call float @llvm.fabs.f32(float %x) |
| 51 | %neg.abs.x = fsub float -0.0, %abs.x |
| 52 | %floor.neg.abs.x = call float @llvm.floor.f32(float %neg.abs.x) |
| 53 | %fract = fsub float %neg.abs.x, %floor.neg.abs.x |
| 54 | store float %fract, float addrspace(1)* %out |
| 55 | ret void |
| 56 | } |
| 57 | |
Matt Arsenault | 7401516 | 2016-05-28 00:19:52 +0000 | [diff] [blame] | 58 | ; GCN-LABEL: {{^}}multi_use_floor_fract_f32: |
| 59 | ; GCN-UNSAFE-DAG: v_floor_f32_e32 [[FLOOR:v[0-9]+]], [[INPUT:v[0-9]+]] |
| 60 | ; GCN-UNSAFE-DAG: v_fract_f32_e32 [[FRACT:v[0-9]+]], [[INPUT:v[0-9]+]] |
| 61 | |
| 62 | ; GCN-UNSAFE: buffer_store_dword [[FLOOR]] |
| 63 | ; GCN-UNSAFE: buffer_store_dword [[FRACT]] |
Matt Arsenault | 3dbeefa | 2017-03-21 21:39:51 +0000 | [diff] [blame] | 64 | define amdgpu_kernel void @multi_use_floor_fract_f32(float addrspace(1)* %out, float addrspace(1)* %src) #1 { |
Matt Arsenault | 7401516 | 2016-05-28 00:19:52 +0000 | [diff] [blame] | 65 | %x = load float, float addrspace(1)* %src |
| 66 | %floor.x = call float @llvm.floor.f32(float %x) |
| 67 | %fract = fsub float %x, %floor.x |
| 68 | store volatile float %floor.x, float addrspace(1)* %out |
| 69 | store volatile float %fract, float addrspace(1)* %out |
| 70 | ret void |
| 71 | } |
| 72 | |
Matt Arsenault | 0cbaa17 | 2016-01-22 18:42:38 +0000 | [diff] [blame] | 73 | attributes #0 = { nounwind readnone } |
| 74 | attributes #1 = { nounwind } |