mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-25 05:52:53 +02:00
667cd15c1c
Some of the special intrinsics now that now correspond to a instruction also have special setting of some registers, e.g. llvm.SI.sendmsg sets m0 as well as use s_sendmsg. Using these explicit register intrinsics may be a better option. Reading the exec mask and others may be useful for debugging. For this I'm not sure this is entirely correct because we would want this to be convergent, although it's possible this is already treated sufficently conservatively. llvm-svn: 258785
82 lines
2.7 KiB
LLVM
82 lines
2.7 KiB
LLVM
; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck %s
|
|
|
|
declare i32 @llvm.read_register.i32(metadata) #0
|
|
declare i64 @llvm.read_register.i64(metadata) #0
|
|
|
|
; CHECK-LABEL: {{^}}test_read_m0:
|
|
; CHECK: s_mov_b32 m0, -1
|
|
; CHECK: v_mov_b32_e32 [[COPY:v[0-9]+]], m0
|
|
; CHECK: buffer_store_dword [[COPY]]
|
|
define void @test_read_m0(i32 addrspace(1)* %out) #0 {
|
|
store volatile i32 0, i32 addrspace(3)* undef
|
|
%m0 = call i32 @llvm.read_register.i32(metadata !0)
|
|
store i32 %m0, i32 addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: {{^}}test_read_exec:
|
|
; CHECK: v_mov_b32_e32 v[[LO:[0-9]+]], exec_lo
|
|
; CHECK: v_mov_b32_e32 v[[HI:[0-9]+]], exec_hi
|
|
; CHECK: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
|
|
define void @test_read_exec(i64 addrspace(1)* %out) #0 {
|
|
%exec = call i64 @llvm.read_register.i64(metadata !1)
|
|
store i64 %exec, i64 addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: {{^}}test_read_flat_scratch:
|
|
; CHECK: v_mov_b32_e32 v[[LO:[0-9]+]], flat_scratch_lo
|
|
; CHECK: v_mov_b32_e32 v[[HI:[0-9]+]], flat_scratch_hi
|
|
; CHECK: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]{{\]}}
|
|
define void @test_read_flat_scratch(i64 addrspace(1)* %out) #0 {
|
|
%flat_scratch = call i64 @llvm.read_register.i64(metadata !2)
|
|
store i64 %flat_scratch, i64 addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: {{^}}test_read_flat_scratch_lo:
|
|
; CHECK: v_mov_b32_e32 [[COPY:v[0-9]+]], flat_scratch_lo
|
|
; CHECK: buffer_store_dword [[COPY]]
|
|
define void @test_read_flat_scratch_lo(i32 addrspace(1)* %out) #0 {
|
|
%flat_scratch_lo = call i32 @llvm.read_register.i32(metadata !3)
|
|
store i32 %flat_scratch_lo, i32 addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: {{^}}test_read_flat_scratch_hi:
|
|
; CHECK: v_mov_b32_e32 [[COPY:v[0-9]+]], flat_scratch_hi
|
|
; CHECK: buffer_store_dword [[COPY]]
|
|
define void @test_read_flat_scratch_hi(i32 addrspace(1)* %out) #0 {
|
|
%flat_scratch_hi = call i32 @llvm.read_register.i32(metadata !4)
|
|
store i32 %flat_scratch_hi, i32 addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: {{^}}test_read_exec_lo:
|
|
; CHECK: v_mov_b32_e32 [[COPY:v[0-9]+]], exec_lo
|
|
; CHECK: buffer_store_dword [[COPY]]
|
|
define void @test_read_exec_lo(i32 addrspace(1)* %out) #0 {
|
|
%exec_lo = call i32 @llvm.read_register.i32(metadata !5)
|
|
store i32 %exec_lo, i32 addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: {{^}}test_read_exec_hi:
|
|
; CHECK: v_mov_b32_e32 [[COPY:v[0-9]+]], exec_hi
|
|
; CHECK: buffer_store_dword [[COPY]]
|
|
define void @test_read_exec_hi(i32 addrspace(1)* %out) #0 {
|
|
%exec_hi = call i32 @llvm.read_register.i32(metadata !6)
|
|
store i32 %exec_hi, i32 addrspace(1)* %out
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { nounwind }
|
|
|
|
!0 = !{!"m0"}
|
|
!1 = !{!"exec"}
|
|
!2 = !{!"flat_scratch"}
|
|
!3 = !{!"flat_scratch_lo"}
|
|
!4 = !{!"flat_scratch_hi"}
|
|
!5 = !{!"exec_lo"}
|
|
!6 = !{!"exec_hi"}
|