blob: 24a3394515300c95a03fafb5ed371dd8bd3f7f9f [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -global-isel=0 -mtriple=amdgpu8.02-amd-mesa3d < %s | FileCheck -check-prefixes=SDAG,GFX8-SDAG %s
; RUN: llc -global-isel=1 -mtriple=amdgpu8.02-amd-mesa3d < %s | FileCheck -check-prefixes=GISEL,GFX8-GISEL %s
; RUN: llc -global-isel=0 -mtriple=amdgpu9.00-amd-mesa3d < %s | FileCheck -check-prefixes=SDAG,GFX9-SDAG %s
; RUN: llc -global-isel=1 -mtriple=amdgpu9.00-amd-mesa3d < %s | FileCheck -check-prefixes=GISEL,GFX9-GISEL %s
define amdgpu_ps <4 x float> @raw_ptr_buffer_load_format_v4i32(ptr addrspace(8) inreg %rsrc) {
; SDAG-LABEL: raw_ptr_buffer_load_format_v4i32:
; SDAG: ; %bb.0: ; %main_body
; SDAG-NEXT: s_mov_b32 s7, s5
; SDAG-NEXT: s_mov_b32 s6, s4
; SDAG-NEXT: s_mov_b32 s5, s3
; SDAG-NEXT: s_mov_b32 s4, s2
; SDAG-NEXT: buffer_load_format_xyzw v[0:3], off, s[4:7], 0
; SDAG-NEXT: s_waitcnt vmcnt(0)
; SDAG-NEXT: ; return to shader part epilog
;
; GISEL-LABEL: raw_ptr_buffer_load_format_v4i32:
; GISEL: ; %bb.0: ; %main_body
; GISEL-NEXT: s_mov_b32 s0, s2
; GISEL-NEXT: s_mov_b32 s1, s3
; GISEL-NEXT: s_mov_b32 s2, s4
; GISEL-NEXT: s_mov_b32 s3, s5
; GISEL-NEXT: buffer_load_format_xyzw v[0:3], off, s[0:3], 0
; GISEL-NEXT: s_waitcnt vmcnt(0)
; GISEL-NEXT: v_readfirstlane_b32 s0, v0
; GISEL-NEXT: v_readfirstlane_b32 s1, v1
; GISEL-NEXT: v_readfirstlane_b32 s2, v2
; GISEL-NEXT: v_readfirstlane_b32 s3, v3
; GISEL-NEXT: v_mov_b32_e32 v0, s0
; GISEL-NEXT: v_mov_b32_e32 v1, s1
; GISEL-NEXT: v_mov_b32_e32 v2, s2
; GISEL-NEXT: v_mov_b32_e32 v3, s3
; GISEL-NEXT: ; return to shader part epilog
main_body:
%data = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.format.v4i32(ptr addrspace(8) %rsrc, i32 0, i32 0, i32 0)
%fdata = bitcast <4 x i32> %data to <4 x float>
ret <4 x float> %fdata
}
define amdgpu_ps <4 x float> @raw_ptr_buffer_load_format_ofs_v4i32(ptr addrspace(8) inreg %rsrc, i32 %voffset) {
; SDAG-LABEL: raw_ptr_buffer_load_format_ofs_v4i32:
; SDAG: ; %bb.0: ; %main_body
; SDAG-NEXT: s_mov_b32 s7, s5
; SDAG-NEXT: s_mov_b32 s6, s4
; SDAG-NEXT: s_mov_b32 s5, s3
; SDAG-NEXT: s_mov_b32 s4, s2
; SDAG-NEXT: buffer_load_format_xyzw v[0:3], v0, s[4:7], 0 offen
; SDAG-NEXT: s_waitcnt vmcnt(0)
; SDAG-NEXT: ; return to shader part epilog
;
; GISEL-LABEL: raw_ptr_buffer_load_format_ofs_v4i32:
; GISEL: ; %bb.0: ; %main_body
; GISEL-NEXT: s_mov_b32 s0, s2
; GISEL-NEXT: s_mov_b32 s1, s3
; GISEL-NEXT: s_mov_b32 s2, s4
; GISEL-NEXT: s_mov_b32 s3, s5
; GISEL-NEXT: buffer_load_format_xyzw v[0:3], v0, s[0:3], 0 offen
; GISEL-NEXT: s_waitcnt vmcnt(0)
; GISEL-NEXT: ; return to shader part epilog
main_body:
%data = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.format.v4i32(ptr addrspace(8) %rsrc, i32 %voffset, i32 0, i32 0)
%fdata = bitcast <4 x i32> %data to <4 x float>
ret <4 x float> %fdata
}
define amdgpu_ps float @raw_ptr_buffer_load_format_i32(ptr addrspace(8) inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
; SDAG-LABEL: raw_ptr_buffer_load_format_i32:
; SDAG: ; %bb.0: ; %main_body
; SDAG-NEXT: s_mov_b32 s11, s5
; SDAG-NEXT: s_mov_b32 s10, s4
; SDAG-NEXT: s_mov_b32 s9, s3
; SDAG-NEXT: s_mov_b32 s8, s2
; SDAG-NEXT: buffer_load_format_x v0, v0, s[8:11], s6 offen
; SDAG-NEXT: s_waitcnt vmcnt(0)
; SDAG-NEXT: ; return to shader part epilog
;
; GISEL-LABEL: raw_ptr_buffer_load_format_i32:
; GISEL: ; %bb.0: ; %main_body
; GISEL-NEXT: s_mov_b32 s0, s2
; GISEL-NEXT: s_mov_b32 s1, s3
; GISEL-NEXT: s_mov_b32 s2, s4
; GISEL-NEXT: s_mov_b32 s3, s5
; GISEL-NEXT: buffer_load_format_x v0, v0, s[0:3], s6 offen
; GISEL-NEXT: s_waitcnt vmcnt(0)
; GISEL-NEXT: ; return to shader part epilog
main_body:
%data = call i32 @llvm.amdgcn.raw.ptr.buffer.load.format.i32(ptr addrspace(8) %rsrc, i32 %voffset, i32 %soffset, i32 0)
%fdata = bitcast i32 %data to float
ret float %fdata
}
; d16: the format load returns packed i16 data. These became legal for the ptr
; form at the same time as the other integer types.
define amdgpu_ps half @raw_ptr_buffer_load_format_i16(ptr addrspace(8) inreg %rsrc, i32 %voffset) {
; SDAG-LABEL: raw_ptr_buffer_load_format_i16:
; SDAG: ; %bb.0: ; %main_body
; SDAG-NEXT: s_mov_b32 s7, s5
; SDAG-NEXT: s_mov_b32 s6, s4
; SDAG-NEXT: s_mov_b32 s5, s3
; SDAG-NEXT: s_mov_b32 s4, s2
; SDAG-NEXT: buffer_load_format_d16_x v0, v0, s[4:7], 0 offen
; SDAG-NEXT: s_waitcnt vmcnt(0)
; SDAG-NEXT: ; return to shader part epilog
;
; GISEL-LABEL: raw_ptr_buffer_load_format_i16:
; GISEL: ; %bb.0: ; %main_body
; GISEL-NEXT: s_mov_b32 s0, s2
; GISEL-NEXT: s_mov_b32 s1, s3
; GISEL-NEXT: s_mov_b32 s2, s4
; GISEL-NEXT: s_mov_b32 s3, s5
; GISEL-NEXT: buffer_load_format_d16_x v0, v0, s[0:3], 0 offen
; GISEL-NEXT: s_waitcnt vmcnt(0)
; GISEL-NEXT: ; return to shader part epilog
main_body:
%data = call i16 @llvm.amdgcn.raw.ptr.buffer.load.format.i16(ptr addrspace(8) %rsrc, i32 %voffset, i32 0, i32 0)
%hdata = bitcast i16 %data to half
ret half %hdata
}
define amdgpu_ps <4 x half> @raw_ptr_buffer_load_format_v4i16(ptr addrspace(8) inreg %rsrc, i32 %voffset) {
; GFX8-SDAG-LABEL: raw_ptr_buffer_load_format_v4i16:
; GFX8-SDAG: ; %bb.0: ; %main_body
; GFX8-SDAG-NEXT: s_mov_b32 s7, s5
; GFX8-SDAG-NEXT: s_mov_b32 s6, s4
; GFX8-SDAG-NEXT: s_mov_b32 s5, s3
; GFX8-SDAG-NEXT: s_mov_b32 s4, s2
; GFX8-SDAG-NEXT: buffer_load_format_d16_xyzw v[0:3], v0, s[4:7], 0 offen
; GFX8-SDAG-NEXT: s_mov_b32 s0, 0x1000504
; GFX8-SDAG-NEXT: s_waitcnt vmcnt(0)
; GFX8-SDAG-NEXT: v_perm_b32 v0, v0, v1, s0
; GFX8-SDAG-NEXT: v_perm_b32 v1, v2, v3, s0
; GFX8-SDAG-NEXT: ; return to shader part epilog
;
; GFX8-GISEL-LABEL: raw_ptr_buffer_load_format_v4i16:
; GFX8-GISEL: ; %bb.0: ; %main_body
; GFX8-GISEL-NEXT: s_mov_b32 s0, s2
; GFX8-GISEL-NEXT: s_mov_b32 s1, s3
; GFX8-GISEL-NEXT: s_mov_b32 s2, s4
; GFX8-GISEL-NEXT: s_mov_b32 s3, s5
; GFX8-GISEL-NEXT: buffer_load_format_d16_xyzw v[0:3], v0, s[0:3], 0 offen
; GFX8-GISEL-NEXT: s_waitcnt vmcnt(0)
; GFX8-GISEL-NEXT: v_and_b32_e32 v1, 0xffff, v1
; GFX8-GISEL-NEXT: v_and_b32_e32 v3, 0xffff, v3
; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v1, 16, v1
; GFX8-GISEL-NEXT: v_lshlrev_b32_e32 v3, 16, v3
; GFX8-GISEL-NEXT: v_or_b32_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
; GFX8-GISEL-NEXT: v_or_b32_sdwa v1, v2, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
; GFX8-GISEL-NEXT: ; return to shader part epilog
;
; GFX9-SDAG-LABEL: raw_ptr_buffer_load_format_v4i16:
; GFX9-SDAG: ; %bb.0: ; %main_body
; GFX9-SDAG-NEXT: s_mov_b32 s7, s5
; GFX9-SDAG-NEXT: s_mov_b32 s6, s4
; GFX9-SDAG-NEXT: s_mov_b32 s5, s3
; GFX9-SDAG-NEXT: s_mov_b32 s4, s2
; GFX9-SDAG-NEXT: buffer_load_format_d16_xyzw v[0:1], v0, s[4:7], 0 offen
; GFX9-SDAG-NEXT: s_waitcnt vmcnt(0)
; GFX9-SDAG-NEXT: ; return to shader part epilog
;
; GFX9-GISEL-LABEL: raw_ptr_buffer_load_format_v4i16:
; GFX9-GISEL: ; %bb.0: ; %main_body
; GFX9-GISEL-NEXT: s_mov_b32 s0, s2
; GFX9-GISEL-NEXT: s_mov_b32 s1, s3
; GFX9-GISEL-NEXT: s_mov_b32 s2, s4
; GFX9-GISEL-NEXT: s_mov_b32 s3, s5
; GFX9-GISEL-NEXT: buffer_load_format_d16_xyzw v[0:1], v0, s[0:3], 0 offen
; GFX9-GISEL-NEXT: s_waitcnt vmcnt(0)
; GFX9-GISEL-NEXT: ; return to shader part epilog
main_body:
%data = call <4 x i16> @llvm.amdgcn.raw.ptr.buffer.load.format.v4i16(ptr addrspace(8) %rsrc, i32 %voffset, i32 0, i32 0)
%hdata = bitcast <4 x i16> %data to <4 x half>
ret <4 x half> %hdata
}