diff options
Diffstat (limited to 'llvm/lib/Target/R600/SIInstructions.td')
| -rw-r--r-- | llvm/lib/Target/R600/SIInstructions.td | 50 | 
1 files changed, 30 insertions, 20 deletions
diff --git a/llvm/lib/Target/R600/SIInstructions.td b/llvm/lib/Target/R600/SIInstructions.td index a5b9c033ea2..3b55d427edb 100644 --- a/llvm/lib/Target/R600/SIInstructions.td +++ b/llvm/lib/Target/R600/SIInstructions.td @@ -1915,29 +1915,39 @@ def : Pat <  /**********   Load/Store Patterns   **********/  /********** ======================= **********/ -class DSReadPat <DS inst, ValueType vt, PatFrag frag> : Pat < -  (frag i32:$src0), -  (vt (inst 0, $src0, 0)) ->; +multiclass DSReadPat <DS inst, ValueType vt, PatFrag frag> { +  def : Pat < +    (vt (frag (add i32:$ptr, (i32 IMM16bit:$offset)))), +    (inst (i1 0), $ptr, (as_i16imm $offset)) +  >; -def : DSReadPat <DS_READ_I8,  i32, sextloadi8_local>; -def : DSReadPat <DS_READ_U8,  i32, az_extloadi8_local>; -def : DSReadPat <DS_READ_I16, i32, sextloadi16_local>; -def : DSReadPat <DS_READ_U16, i32, az_extloadi16_local>; -def : DSReadPat <DS_READ_B32, i32, local_load>; -def : Pat < -    (local_load i32:$src0), -    (i32 (DS_READ_B32 0, $src0, 0)) ->; +  def : Pat < +    (frag i32:$src0), +    (vt (inst 0, $src0, 0)) +  >; +} -class DSWritePat <DS inst, ValueType vt, PatFrag frag> : Pat < -  (frag i32:$src1, i32:$src0), -  (inst 0, $src0, $src1, 0) ->; +defm : DSReadPat <DS_READ_I8,  i32, sextloadi8_local>; +defm : DSReadPat <DS_READ_U8,  i32, az_extloadi8_local>; +defm : DSReadPat <DS_READ_I16, i32, sextloadi16_local>; +defm : DSReadPat <DS_READ_U16, i32, az_extloadi16_local>; +defm : DSReadPat <DS_READ_B32, i32, local_load>; + +multiclass DSWritePat <DS inst, ValueType vt, PatFrag frag> { +  def : Pat < +    (frag vt:$value, (add i32:$ptr, (i32 IMM16bit:$offset))), +    (inst (i1 0), $ptr, $value, (as_i16imm $offset)) +  >; + +  def : Pat < +    (frag i32:$src1, i32:$src0), +    (inst 0, $src0, $src1, 0) +  >; +} -def : DSWritePat <DS_WRITE_B8, i32, truncstorei8_local>; -def : DSWritePat <DS_WRITE_B16, i32, truncstorei16_local>; -def : DSWritePat <DS_WRITE_B32, i32, local_store>; +defm : DSWritePat <DS_WRITE_B8, i32, truncstorei8_local>; +defm : DSWritePat <DS_WRITE_B16, i32, truncstorei16_local>; +defm : DSWritePat <DS_WRITE_B32, i32, local_store>;  def : Pat <(atomic_load_add_local i32:$ptr, i32:$val),             (DS_ADD_U32_RTN 0, $ptr, $val, 0)>;  | 

