diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 21:25:48 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 21:25:48 +0000 |
commit | d88c1a5a572cdb661c111098831fa526e933756f (patch) | |
tree | 97b32c3372106ac47ded3d1a99f9c023a8530073 /contrib/llvm/lib/Target/AVR/AVRInstrInfo.td | |
parent | 715652a404ee99f10c09c0a5edbb5883961b8c25 (diff) | |
parent | b915e9e0fc85ba6f398b3fab0db6a81a8913af94 (diff) |
Update llvm to trunk r290819 and resolve conflicts.
Notes
Notes:
svn path=/projects/clang400-import/; revision=311142
Diffstat (limited to 'contrib/llvm/lib/Target/AVR/AVRInstrInfo.td')
-rw-r--r-- | contrib/llvm/lib/Target/AVR/AVRInstrInfo.td | 114 |
1 files changed, 90 insertions, 24 deletions
diff --git a/contrib/llvm/lib/Target/AVR/AVRInstrInfo.td b/contrib/llvm/lib/Target/AVR/AVRInstrInfo.td index e75683680150..bc66379ab708 100644 --- a/contrib/llvm/lib/Target/AVR/AVRInstrInfo.td +++ b/contrib/llvm/lib/Target/AVR/AVRInstrInfo.td @@ -155,7 +155,7 @@ def memspi : Operand<iPTR> let MIOperandInfo = (ops GPRSP, i16imm); } -def i8imm_com : Operand<i8> +def imm_com8 : Operand<i8> { let EncoderMethod = "encodeComplement"; @@ -180,6 +180,38 @@ def call_target : Operand<iPTR> let EncoderMethod = "encodeCallTarget"; } +// A 16-bit address (which can lead to an R_AVR_16 relocation). +def imm16 : Operand<i16> +{ + let EncoderMethod = "encodeImm<AVR::fixup_16>"; +} + +/// A 6-bit immediate used in the ADIW/SBIW instructions. +def imm_arith6 : Operand<i16> +{ + let EncoderMethod = "encodeImm<AVR::fixup_6_adiw>"; +} + +/// An 8-bit immediate inside an instruction with the same format +/// as the `LDI` instruction (the `FRdK` format). +def imm_ldi8 : Operand<i8> +{ + let EncoderMethod = "encodeImm<AVR::fixup_ldi>"; +} + +/// A 5-bit port number used in SBIC and friends (the `FIOBIT` format). +def imm_port5 : Operand<i8> +{ + let EncoderMethod = "encodeImm<AVR::fixup_port5>"; +} + +/// A 6-bit port number used in the `IN` instruction and friends (the +/// `FIORdA` format. +def imm_port6 : Operand<i8> +{ + let EncoderMethod = "encodeImm<AVR::fixup_port6>"; +} + // Addressing mode pattern reg+imm6 def addr : ComplexPattern<iPTR, 2, "SelectAddr", [], [SDNPWantRoot]>; @@ -372,7 +404,7 @@ Defs = [SREG] in // Adds an immediate 6-bit value K to Rd, placing the result in Rd. def ADIWRdK : FWRdK<0b0, (outs IWREGS:$rd), - (ins IWREGS:$src, i16imm:$k), + (ins IWREGS:$src, imm_arith6:$k), "adiw\t$rd, $k", [(set i16:$rd, (add i16:$src, uimm6:$k)), (implicit SREG)]>, @@ -409,7 +441,7 @@ Defs = [SREG] in def SUBIRdK : FRdK<0b0101, (outs LD8:$rd), - (ins LD8:$src, i8imm:$k), + (ins LD8:$src, imm_ldi8:$k), "subi\t$rd, $k", [(set i8:$rd, (sub i8:$src, imm:$k)), (implicit SREG)]>; @@ -427,7 +459,7 @@ Defs = [SREG] in def SBIWRdK : FWRdK<0b1, (outs IWREGS:$rd), - (ins IWREGS:$src, i16imm:$k), + (ins IWREGS:$src, imm_arith6:$k), "sbiw\t$rd, $k", [(set i16:$rd, (sub i16:$src, uimm6:$k)), (implicit SREG)]>, @@ -457,7 +489,7 @@ Defs = [SREG] in def SBCIRdK : FRdK<0b0100, (outs LD8:$rd), - (ins LD8:$src, i8imm:$k), + (ins LD8:$src, imm_ldi8:$k), "sbci\t$rd, $k", [(set i8:$rd, (sube i8:$src, imm:$k)), (implicit SREG)]>; @@ -626,7 +658,7 @@ Defs = [SREG] in def ANDIRdK : FRdK<0b0111, (outs LD8:$rd), - (ins LD8:$src, i8imm:$k), + (ins LD8:$src, imm_ldi8:$k), "andi\t$rd, $k", [(set i8:$rd, (and i8:$src, imm:$k)), (implicit SREG)]>; @@ -644,7 +676,7 @@ Defs = [SREG] in def ORIRdK : FRdK<0b0110, (outs LD8:$rd), - (ins LD8:$src, i8imm:$k), + (ins LD8:$src, imm_ldi8:$k), "ori\t$rd, $k", [(set i8:$rd, (or i8:$src, imm:$k)), (implicit SREG)]>; @@ -871,7 +903,7 @@ let Defs = [SREG] in let Uses = [SREG] in def CPIRdK : FRdK<0b0011, (outs), - (ins GPR8:$rd, i8imm:$k), + (ins GPR8:$rd, imm_ldi8:$k), "cpi\t$rd, $k", [(AVRcmp i8:$rd, imm:$k), (implicit SREG)]>; } @@ -900,13 +932,13 @@ isTerminator = 1 in def SBICAb : FIOBIT<0b01, (outs), - (ins i16imm:$a, i8imm:$b), + (ins imm_port5:$a, i8imm:$b), "sbic\t$a, $b", []>; def SBISAb : FIOBIT<0b11, (outs), - (ins i16imm:$a, i8imm:$b), + (ins imm_port5:$a, i8imm:$b), "sbis\t$a, $b", []>; } @@ -1065,7 +1097,7 @@ let isReMaterializable = 1 in { def LDIRdK : FRdK<0b1110, (outs LD8:$rd), - (ins i8imm:$k), + (ins imm_ldi8:$k), "ldi\t$rd, $k", [(set i8:$rd, imm:$k)]>; @@ -1086,7 +1118,7 @@ isReMaterializable = 1 in { def LDSRdK : F32DM<0b0, (outs GPR8:$rd), - (ins i16imm:$k), + (ins imm16:$k), "lds\t$rd, $k", [(set i8:$rd, (load imm:$k))]>, Requires<[HasSRAM]>; @@ -1175,6 +1207,7 @@ Constraints = "$ptrreg = $base_wb,@earlyclobber $reg,@earlyclobber $base_wb" in let canFoldAsLoad = 1, isReMaterializable = 1 in { + let Constraints = "@earlyclobber $reg" in def LDDRdPtrQ : FSTDLDD<0, (outs GPR8:$reg), (ins memri:$memri), @@ -1194,10 +1227,9 @@ isReMaterializable = 1 in [(set i16:$dst, (load addr:$memri))]>, Requires<[HasSRAM]>; - //:FIXME: remove this once PR13375 gets fixed - // Bug report: https://llvm.org/bugs/show_bug.cgi?id=13375 let mayLoad = 1, - hasSideEffects = 0 in + hasSideEffects = 0, + Constraints = "@earlyclobber $dst" in def LDDWRdYQ : Pseudo<(outs DREGS:$dst), (ins memri:$memri), "lddw\t$dst, $memri", @@ -1205,10 +1237,42 @@ isReMaterializable = 1 in Requires<[HasSRAM]>; } +class AtomicLoad<PatFrag Op, RegisterClass DRC> : + Pseudo<(outs DRC:$rd), (ins PTRREGS:$rr), "atomic_op", + [(set DRC:$rd, (Op i16:$rr))]>; + +class AtomicStore<PatFrag Op, RegisterClass DRC> : + Pseudo<(outs), (ins PTRDISPREGS:$rd, DRC:$rr), "atomic_op", + [(Op i16:$rd, DRC:$rr)]>; + +class AtomicLoadOp<PatFrag Op, RegisterClass DRC> : + Pseudo<(outs DRC:$rd), (ins PTRREGS:$rr, DRC:$operand), + "atomic_op", + [(set DRC:$rd, (Op i16:$rr, DRC:$operand))]>; + +def AtomicLoad8 : AtomicLoad<atomic_load_8, GPR8>; +def AtomicLoad16 : AtomicLoad<atomic_load_16, DREGS>; + +def AtomicStore8 : AtomicStore<atomic_store_8, GPR8>; +def AtomicStore16 : AtomicStore<atomic_store_16, DREGS>; + +def AtomicLoadAdd8 : AtomicLoadOp<atomic_load_add_8, GPR8>; +def AtomicLoadAdd16 : AtomicLoadOp<atomic_load_add_16, DREGS>; +def AtomicLoadSub8 : AtomicLoadOp<atomic_load_sub_8, GPR8>; +def AtomicLoadSub16 : AtomicLoadOp<atomic_load_sub_16, DREGS>; +def AtomicLoadAnd8 : AtomicLoadOp<atomic_load_and_8, GPR8>; +def AtomicLoadAnd16 : AtomicLoadOp<atomic_load_and_16, DREGS>; +def AtomicLoadOr8 : AtomicLoadOp<atomic_load_or_8, GPR8>; +def AtomicLoadOr16 : AtomicLoadOp<atomic_load_or_16, DREGS>; +def AtomicLoadXor8 : AtomicLoadOp<atomic_load_xor_8, GPR8>; +def AtomicLoadXor16 : AtomicLoadOp<atomic_load_xor_16, DREGS>; +def AtomicFence : Pseudo<(outs), (ins), "atomic_fence", + [(atomic_fence imm, imm)]>; + // Indirect store from register to data space. def STSKRr : F32DM<0b1, (outs), - (ins i16imm:$k, GPR8:$rd), + (ins imm16:$k, GPR8:$rd), "sts\t$k, $rd", [(store i8:$rd, imm:$k)]>, Requires<[HasSRAM]>; @@ -1433,24 +1497,24 @@ let canFoldAsLoad = 1, isReMaterializable = 1 in { def INRdA : FIORdA<(outs GPR8:$dst), - (ins i16imm:$src), + (ins imm_port6:$src), "in\t$dst, $src", [(set i8:$dst, (load ioaddr8:$src))]>; def INWRdA : Pseudo<(outs DREGS:$dst), - (ins i16imm:$src), + (ins imm_port6:$src), "inw\t$dst, $src", [(set i16:$dst, (load ioaddr16:$src))]>; } // Write data to IO location operations. def OUTARr : FIOARr<(outs), - (ins i16imm:$dst, GPR8:$src), + (ins imm_port6:$dst, GPR8:$src), "out\t$dst, $src", [(store i8:$src, ioaddr8:$dst)]>; def OUTWARr : Pseudo<(outs), - (ins i16imm:$dst, DREGS:$src), + (ins imm_port6:$dst, DREGS:$src), "outw\t$dst, $src", [(store i16:$src, ioaddr16:$dst)]>; @@ -1613,14 +1677,14 @@ def SWAPRd : FRd<0b1001, // instead of in+ori+out which requires one more instr. def SBIAb : FIOBIT<0b10, (outs), - (ins i16imm:$addr, i8imm:$bit), + (ins imm_port5:$addr, i8imm:$bit), "sbi\t$addr, $bit", [(store (or (i8 (load lowioaddr8:$addr)), iobitpos8:$bit), lowioaddr8:$addr)]>; def CBIAb : FIOBIT<0b00, (outs), - (ins i16imm:$addr, i8imm:$bit), + (ins imm_port5:$addr, i8imm:$bit), "cbi\t$addr, $bit", [(store (and (i8 (load lowioaddr8:$addr)), iobitposn8:$bit), lowioaddr8:$addr)]>; @@ -1648,16 +1712,18 @@ Defs = [SREG] in // Alias for ORI Rd, K def SBRRdK : FRdK<0b0110, (outs LD8:$rd), - (ins LD8:$src, i8imm:$k), + (ins LD8:$src, imm_ldi8:$k), "sbr\t$rd, $k", [(set i8:$rd, (or i8:$src, imm:$k)), (implicit SREG)]>; // CBR Rd, K // Alias for `ANDI Rd, COM(K)` where COM(K) is the compliment of K. + // FIXME: This uses the 'complement' encoder. We need it to also use the + // imm_ldi8 encoder. This will cause no fixups to be created on this instruction. def CBRRdK : FRdK<0b0111, (outs LD8:$rd), - (ins LD8:$src, i8imm_com:$k), + (ins LD8:$src, imm_com8:$k), "cbr\t$rd, $k", []>; } |