From 603cd56372769416346e817f14454f6b796abae3 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Thu, 6 Feb 2014 18:36:39 +0000 Subject: [PATCH] R600/SI: Add a MUBUF store pattern for Imm offsets git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200934 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/R600/SIInstructions.td | 5 +++++ test/CodeGen/R600/mubuf.ll | 35 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/lib/Target/R600/SIInstructions.td b/lib/Target/R600/SIInstructions.td index 429624a05a3..cad41f15fea 100644 --- a/lib/Target/R600/SIInstructions.td +++ b/lib/Target/R600/SIInstructions.td @@ -2006,6 +2006,11 @@ defm : MUBUFLoad_Pattern { + def : Pat < + (st vt:$value, (add i64:$ptr, IMM12bit:$offset)), + (Instr $value, (SI_ADDR64_RSRC (i64 0)), $ptr, (as_i16imm $offset)) + >; + def : Pat < (st vt:$value, i64:$ptr), (Instr $value, (SI_ADDR64_RSRC (i64 0)), $ptr, 0) diff --git a/test/CodeGen/R600/mubuf.ll b/test/CodeGen/R600/mubuf.ll index 0f2f19c9462..fd039611109 100644 --- a/test/CodeGen/R600/mubuf.ll +++ b/test/CodeGen/R600/mubuf.ll @@ -49,3 +49,38 @@ entry: store i32 %2, i32 addrspace(1)* %out ret void } + +;;;==========================================================================;;; +;;; MUBUF STORE TESTS +;;;==========================================================================;;; + +; MUBUF store with an immediate byte offset that fits into 12-bits +; CHECK-LABEL: @mubuf_store0 +; CHECK: BUFFER_STORE_DWORD v{{[0-9]}}, s[{{[0-9]:[0-9]}}] + v[{{[0-9]:[0-9]}}] + 4 ; encoding: [0x04,0x80 +define void @mubuf_store0(i32 addrspace(1)* %out) { +entry: + %0 = getelementptr i32 addrspace(1)* %out, i64 1 + store i32 0, i32 addrspace(1)* %0 + ret void +} + +; MUBUF store with the largest possible immediate offset +; CHECK-LABEL: @mubuf_store1 +; CHECK: BUFFER_STORE_BYTE v{{[0-9]}}, s[{{[0-9]:[0-9]}}] + v[{{[0-9]:[0-9]}}] + 4095 ; encoding: [0xff,0x8f + +define void @mubuf_store1(i8 addrspace(1)* %out) { +entry: + %0 = getelementptr i8 addrspace(1)* %out, i64 4095 + store i8 0, i8 addrspace(1)* %0 + ret void +} + +; MUBUF store with an immediate byte offset that doesn't fit into 12-bits +; CHECK-LABEL: @mubuf_store2 +; CHECK: BUFFER_STORE_DWORD v{{[0-9]}}, s[{{[0-9]:[0-9]}}] + v[{{[0-9]:[0-9]}}] + 0 ; encoding: [0x00,0x80 +define void @mubuf_store2(i32 addrspace(1)* %out) { +entry: + %0 = getelementptr i32 addrspace(1)* %out, i64 1024 + store i32 0, i32 addrspace(1)* %0 + ret void +}