diff options
| author | Akira Hatanaka <ahatanak@gmail.com> | 2011-07-20 00:23:01 +0000 | 
|---|---|---|
| committer | Akira Hatanaka <ahatanak@gmail.com> | 2011-07-20 00:23:01 +0000 | 
| commit | 32b7ebb163c95c6632c6e74aa1a84374b5552e36 (patch) | |
| tree | 6438014055bccdb6a306406fa7ac665d7c1266bd | |
| parent | c8dad112b45e26a3015fe0bc426536f394b602ff (diff) | |
| download | external_llvm-32b7ebb163c95c6632c6e74aa1a84374b5552e36.zip external_llvm-32b7ebb163c95c6632c6e74aa1a84374b5552e36.tar.gz external_llvm-32b7ebb163c95c6632c6e74aa1a84374b5552e36.tar.bz2  | |
Define classes for definitions of atomic instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135546 91177308-0d34-0410-b5e6-96231b3b80d8
| -rw-r--r-- | lib/Target/Mips/MipsInstrInfo.td | 148 | 
1 files changed, 42 insertions, 106 deletions
diff --git a/lib/Target/Mips/MipsInstrInfo.td b/lib/Target/Mips/MipsInstrInfo.td index 57867b5..2427a0e 100644 --- a/lib/Target/Mips/MipsInstrInfo.td +++ b/lib/Target/Mips/MipsInstrInfo.td @@ -396,6 +396,22 @@ class ReadHardware: FR<0x1f, 0x3b, (outs CPURegs:$dst), (ins HWRegs:$src),    let shamt = 0;  } +// Atomic instructions with 2 source operands (ATOMIC_SWAP & ATOMIC_LOAD_*). +class Atomic2<PatFrag Op, string Opstr> : +  MipsPseudo<(outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), +             !strconcat("atomic_", Opstr, "\t$dst, $ptr, $incr"), +             [(set CPURegs:$dst, +              (Op CPURegs:$ptr, CPURegs:$incr))]>; + +// Atomic Compare & Swap. +class AtomicCmpSwap<PatFrag Op, string Width> : +  MipsPseudo<(outs CPURegs:$dst),  +             (ins CPURegs:$ptr, CPURegs:$cmp, CPURegs:$swap), +             !strconcat("atomic_cmp_swap_", Width,  +                        "\t$dst, $ptr, $cmp, $swap"), +             [(set CPURegs:$dst, +              (Op CPURegs:$ptr, CPURegs:$cmp, CPURegs:$swap))]>; +  //===----------------------------------------------------------------------===//  // Pseudo instructions  //===----------------------------------------------------------------------===// @@ -430,112 +446,32 @@ def CPLOAD : MipsPseudo<(outs), (ins CPURegs:$picreg), ".cpload\t$picreg", []>;  def CPRESTORE : MipsPseudo<(outs), (ins i32imm:$loc), ".cprestore\t$loc", []>;  let usesCustomInserter = 1 in { -  def ATOMIC_LOAD_ADD_I8 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_add_8\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_add_8 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_ADD_I16 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_add_16\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_add_16 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_ADD_I32 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_add_32\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_add_32 CPURegs:$ptr, CPURegs:$incr))]>; - -  def ATOMIC_LOAD_SUB_I8 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_sub_8\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_sub_8 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_SUB_I16 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_sub_16\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_sub_16 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_SUB_I32 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_sub_32\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_sub_32 CPURegs:$ptr, CPURegs:$incr))]>; - -  def ATOMIC_LOAD_AND_I8 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_and_8\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_and_8 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_AND_I16 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_and_16\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_and_16 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_AND_I32 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_and_32\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_and_32 CPURegs:$ptr, CPURegs:$incr))]>; - -  def ATOMIC_LOAD_OR_I8 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_or_8\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_or_8 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_OR_I16 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_or_16\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_or_16 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_OR_I32 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_or_32\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_or_32 CPURegs:$ptr, CPURegs:$incr))]>; - -  def ATOMIC_LOAD_XOR_I8 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_xor_8\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_xor_8 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_XOR_I16 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_xor_16\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_xor_16 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_XOR_I32 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_xor_32\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_xor_32 CPURegs:$ptr, CPURegs:$incr))]>; - -  def ATOMIC_LOAD_NAND_I8 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_nand_8\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_nand_8 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_NAND_I16 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_nand_16\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_nand_16 CPURegs:$ptr, CPURegs:$incr))]>; -  def ATOMIC_LOAD_NAND_I32 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$incr), -    "atomic_load_nand_32\t$dst, $ptr, $incr", -    [(set CPURegs:$dst, (atomic_load_nand_32 CPURegs:$ptr, CPURegs:$incr))]>; - -  def ATOMIC_SWAP_I8 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$val), -    "atomic_swap_8\t$dst, $ptr, $val", -    [(set CPURegs:$dst, (atomic_swap_8 CPURegs:$ptr, CPURegs:$val))]>; -  def ATOMIC_SWAP_I16 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$val), -    "atomic_swap_16\t$dst, $ptr, $val", -    [(set CPURegs:$dst, (atomic_swap_16 CPURegs:$ptr, CPURegs:$val))]>; -  def ATOMIC_SWAP_I32 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$val), -    "atomic_swap_32\t$dst, $ptr, $val", -    [(set CPURegs:$dst, (atomic_swap_32 CPURegs:$ptr, CPURegs:$val))]>; - -  def ATOMIC_CMP_SWAP_I8 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$oldval, CPURegs:$newval), -    "atomic_cmp_swap_8\t$dst, $ptr, $oldval, $newval", -    [(set CPURegs:$dst, -         (atomic_cmp_swap_8 CPURegs:$ptr, CPURegs:$oldval, CPURegs:$newval))]>; -  def ATOMIC_CMP_SWAP_I16 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$oldval, CPURegs:$newval), -    "atomic_cmp_swap_16\t$dst, $ptr, $oldval, $newval", -    [(set CPURegs:$dst, -         (atomic_cmp_swap_16 CPURegs:$ptr, CPURegs:$oldval, CPURegs:$newval))]>; -  def ATOMIC_CMP_SWAP_I32 : MipsPseudo< -    (outs CPURegs:$dst), (ins CPURegs:$ptr, CPURegs:$oldval, CPURegs:$newval), -    "atomic_cmp_swap_32\t$dst, $ptr, $oldval, $newval", -    [(set CPURegs:$dst, -         (atomic_cmp_swap_32 CPURegs:$ptr, CPURegs:$oldval, CPURegs:$newval))]>; +  def ATOMIC_LOAD_ADD_I8   : Atomic2<atomic_load_add_8, "load_add_8">; +  def ATOMIC_LOAD_ADD_I16  : Atomic2<atomic_load_add_16, "load_add_16">; +  def ATOMIC_LOAD_ADD_I32  : Atomic2<atomic_load_add_32, "load_add_32">; +  def ATOMIC_LOAD_SUB_I8   : Atomic2<atomic_load_sub_8, "load_sub_8">; +  def ATOMIC_LOAD_SUB_I16  : Atomic2<atomic_load_sub_16, "load_sub_16">; +  def ATOMIC_LOAD_SUB_I32  : Atomic2<atomic_load_sub_32, "load_sub_32">; +  def ATOMIC_LOAD_AND_I8   : Atomic2<atomic_load_and_8, "load_and_8">; +  def ATOMIC_LOAD_AND_I16  : Atomic2<atomic_load_and_16, "load_and_16">; +  def ATOMIC_LOAD_AND_I32  : Atomic2<atomic_load_and_32, "load_and_32">; +  def ATOMIC_LOAD_OR_I8    : Atomic2<atomic_load_or_8, "load_or_8">; +  def ATOMIC_LOAD_OR_I16   : Atomic2<atomic_load_or_16, "load_or_16">; +  def ATOMIC_LOAD_OR_I32   : Atomic2<atomic_load_or_32, "load_or_32">; +  def ATOMIC_LOAD_XOR_I8   : Atomic2<atomic_load_xor_8, "load_xor_8">; +  def ATOMIC_LOAD_XOR_I16  : Atomic2<atomic_load_xor_16, "load_xor_16">; +  def ATOMIC_LOAD_XOR_I32  : Atomic2<atomic_load_xor_32, "load_xor_32">; +  def ATOMIC_LOAD_NAND_I8  : Atomic2<atomic_load_nand_8, "load_nand_8">; +  def ATOMIC_LOAD_NAND_I16 : Atomic2<atomic_load_nand_16, "load_nand_16">; +  def ATOMIC_LOAD_NAND_I32 : Atomic2<atomic_load_nand_32, "load_nand_32">; + +  def ATOMIC_SWAP_I8       : Atomic2<atomic_swap_8, "swap_8">; +  def ATOMIC_SWAP_I16      : Atomic2<atomic_swap_16, "swap_16">; +  def ATOMIC_SWAP_I32      : Atomic2<atomic_swap_32, "swap_32">; + +  def ATOMIC_CMP_SWAP_I8   : AtomicCmpSwap<atomic_cmp_swap_8, "8">; +  def ATOMIC_CMP_SWAP_I16  : AtomicCmpSwap<atomic_cmp_swap_16, "16">; +  def ATOMIC_CMP_SWAP_I32  : AtomicCmpSwap<atomic_cmp_swap_32, "32">;  }  //===----------------------------------------------------------------------===//  | 
