| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 1 | //===- ARMInstrInfo.td - Target Description for ARM Target ----------------===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file was developed by the "Instituto Nokia de Tecnologia" and | 
|  | 6 | // is distributed under the University of Illinois Open Source | 
|  | 7 | // License. See LICENSE.TXT for details. | 
|  | 8 | // | 
|  | 9 | //===----------------------------------------------------------------------===// | 
|  | 10 | // | 
|  | 11 | // This file describes the ARM instructions in TableGen format. | 
|  | 12 | // | 
|  | 13 | //===----------------------------------------------------------------------===// | 
|  | 14 |  | 
| Rafael Espindola | 185c5c2 | 2006-07-11 11:36:48 +0000 | [diff] [blame] | 15 | // Address operands | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 16 | def op_addr_mode1 : Operand<iPTR> { | 
|  | 17 | let PrintMethod = "printAddrMode1"; | 
| Rafael Espindola | 3130a75 | 2006-09-13 12:09:43 +0000 | [diff] [blame] | 18 | let NumMIOperands = 3; | 
|  | 19 | let MIOperandInfo = (ops ptr_rc, ptr_rc, i32imm); | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 20 | } | 
|  | 21 |  | 
| Rafael Espindola | 185c5c2 | 2006-07-11 11:36:48 +0000 | [diff] [blame] | 22 | def memri : Operand<iPTR> { | 
|  | 23 | let PrintMethod = "printMemRegImm"; | 
|  | 24 | let NumMIOperands = 2; | 
|  | 25 | let MIOperandInfo = (ops i32imm, ptr_rc); | 
|  | 26 | } | 
|  | 27 |  | 
| Rafael Espindola | e40a7e2 | 2006-07-10 01:41:35 +0000 | [diff] [blame] | 28 | // Define ARM specific addressing mode. | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 29 | //Addressing Mode 1: data processing operands | 
| Evan Cheng | 577ef76 | 2006-10-11 21:03:53 +0000 | [diff] [blame] | 30 | def addr_mode1 : ComplexPattern<iPTR, 3, "SelectAddrMode1", [imm, sra, shl, srl], | 
|  | 31 | []>; | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 32 |  | 
| Rafael Espindola | 185c5c2 | 2006-07-11 11:36:48 +0000 | [diff] [blame] | 33 | //register plus/minus 12 bit offset | 
| Evan Cheng | 577ef76 | 2006-10-11 21:03:53 +0000 | [diff] [blame] | 34 | def iaddr  : ComplexPattern<iPTR, 2, "SelectAddrRegImm", [frameindex], []>; | 
| Rafael Espindola | 185c5c2 | 2006-07-11 11:36:48 +0000 | [diff] [blame] | 35 | //register plus scaled register | 
| Evan Cheng | 577ef76 | 2006-10-11 21:03:53 +0000 | [diff] [blame] | 36 | //def raddr  : ComplexPattern<iPTR, 2, "SelectAddrRegReg", [], []>; | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 37 |  | 
|  | 38 | //===----------------------------------------------------------------------===// | 
| Rafael Espindola | 203922d | 2006-10-16 17:57:20 +0000 | [diff] [blame] | 39 | // Instruction Class Templates | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 40 | //===----------------------------------------------------------------------===// | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 41 | class InstARM<dag ops, string asmstr, list<dag> pattern> : Instruction { | 
|  | 42 | let Namespace = "ARM"; | 
|  | 43 |  | 
|  | 44 | dag OperandList = ops; | 
|  | 45 | let AsmString   = asmstr; | 
|  | 46 | let Pattern = pattern; | 
|  | 47 | } | 
|  | 48 |  | 
| Rafael Espindola | 203922d | 2006-10-16 17:57:20 +0000 | [diff] [blame] | 49 | class IntBinOp<string OpcStr, SDNode OpNode> : | 
|  | 50 | InstARM<(ops IntRegs:$dst, IntRegs:$a, IntRegs:$b), | 
|  | 51 | !strconcat(OpcStr, " $dst, $a, $b"), | 
|  | 52 | [(set IntRegs:$dst, (OpNode IntRegs:$a, IntRegs:$b))]>; | 
|  | 53 |  | 
| Rafael Espindola | f63752f | 2006-10-16 18:32:36 +0000 | [diff] [blame] | 54 | class FPBinOp<string OpcStr, SDNode OpNode> : | 
|  | 55 | InstARM<(ops FPRegs:$dst, FPRegs:$a, FPRegs:$b), | 
|  | 56 | !strconcat(OpcStr, " $dst, $a, $b"), | 
|  | 57 | [(set FPRegs:$dst, (OpNode FPRegs:$a, FPRegs:$b))]>; | 
|  | 58 |  | 
| Rafael Espindola | e341d60 | 2006-10-16 18:39:22 +0000 | [diff] [blame] | 59 | class DFPBinOp<string OpcStr, SDNode OpNode> : | 
|  | 60 | InstARM<(ops DFPRegs:$dst, DFPRegs:$a, DFPRegs:$b), | 
|  | 61 | !strconcat(OpcStr, " $dst, $a, $b"), | 
|  | 62 | [(set DFPRegs:$dst, (OpNode DFPRegs:$a, DFPRegs:$b))]>; | 
|  | 63 |  | 
| Rafael Espindola | b23dc14 | 2006-10-16 18:18:14 +0000 | [diff] [blame] | 64 | class Addr1BinOp<string OpcStr, SDNode OpNode> : | 
|  | 65 | InstARM<(ops IntRegs:$dst, IntRegs:$a, op_addr_mode1:$b), | 
|  | 66 | !strconcat(OpcStr, " $dst, $a, $b"), | 
|  | 67 | [(set IntRegs:$dst, (OpNode IntRegs:$a, addr_mode1:$b))]>; | 
|  | 68 |  | 
| Rafael Espindola | 203922d | 2006-10-16 17:57:20 +0000 | [diff] [blame] | 69 | //===----------------------------------------------------------------------===// | 
|  | 70 | // Instructions | 
|  | 71 | //===----------------------------------------------------------------------===// | 
|  | 72 |  | 
| Rafael Espindola | e08b985 | 2006-08-24 13:45:55 +0000 | [diff] [blame] | 73 | def brtarget : Operand<OtherVT>; | 
|  | 74 |  | 
| Rafael Espindola | fe03fe9 | 2006-08-24 16:13:15 +0000 | [diff] [blame] | 75 | // Operand for printing out a condition code. | 
|  | 76 | let PrintMethod = "printCCOperand" in | 
|  | 77 | def CCOp : Operand<i32>; | 
|  | 78 |  | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 79 | def SDT_ARMCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i32> ]>; | 
| Evan Cheng | 81b645a | 2006-08-11 09:03:33 +0000 | [diff] [blame] | 80 | def callseq_start  : SDNode<"ISD::CALLSEQ_START", SDT_ARMCallSeq, | 
|  | 81 | [SDNPHasChain, SDNPOutFlag]>; | 
|  | 82 | def callseq_end    : SDNode<"ISD::CALLSEQ_END",   SDT_ARMCallSeq, | 
|  | 83 | [SDNPHasChain, SDNPOutFlag]>; | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 84 |  | 
| Rafael Espindola | 75269be | 2006-07-16 01:02:57 +0000 | [diff] [blame] | 85 | def SDT_ARMcall    : SDTypeProfile<0, -1, [SDTCisInt<0>]>; | 
|  | 86 | def ARMcall        : SDNode<"ARMISD::CALL", SDT_ARMcall, | 
|  | 87 | [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>; | 
| Rafael Espindola | a94b9e3 | 2006-08-03 17:02:20 +0000 | [diff] [blame] | 88 | def retflag        : SDNode<"ARMISD::RET_FLAG", SDTRet, | 
|  | 89 | [SDNPHasChain, SDNPOptInFlag]>; | 
| Rafael Espindola | 29e4875 | 2006-08-24 17:19:08 +0000 | [diff] [blame] | 90 |  | 
|  | 91 | def SDTarmselect   : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisInt<0>, SDTCisVT<2, i32>]>; | 
| Rafael Espindola | 29e4875 | 2006-08-24 17:19:08 +0000 | [diff] [blame] | 92 | def armselect      : SDNode<"ARMISD::SELECT", SDTarmselect, [SDNPInFlag, SDNPOutFlag]>; | 
| Rafael Espindola | d0dee77 | 2006-08-21 22:00:32 +0000 | [diff] [blame] | 93 |  | 
| Rafael Espindola | d15c892 | 2006-10-10 12:56:00 +0000 | [diff] [blame] | 94 | def SDTarmfmstat   : SDTypeProfile<0, 0, []>; | 
|  | 95 | def armfmstat      : SDNode<"ARMISD::FMSTAT", SDTarmfmstat, [SDNPInFlag, SDNPOutFlag]>; | 
|  | 96 |  | 
| Rafael Espindola | fe03fe9 | 2006-08-24 16:13:15 +0000 | [diff] [blame] | 97 | def SDTarmbr       : SDTypeProfile<0, 2, [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>]>; | 
| Rafael Espindola | e08b985 | 2006-08-24 13:45:55 +0000 | [diff] [blame] | 98 | def armbr          : SDNode<"ARMISD::BR", SDTarmbr, [SDNPHasChain, SDNPInFlag]>; | 
|  | 99 |  | 
| Rafael Espindola | d0dee77 | 2006-08-21 22:00:32 +0000 | [diff] [blame] | 100 | def SDTVoidBinOp : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>; | 
|  | 101 | def armcmp       : SDNode<"ARMISD::CMP",  SDTVoidBinOp, [SDNPOutFlag]>; | 
| Rafael Espindola | 75269be | 2006-07-16 01:02:57 +0000 | [diff] [blame] | 102 |  | 
| Rafael Espindola | b509388 | 2006-10-07 14:24:52 +0000 | [diff] [blame] | 103 | def armfsitos      : SDNode<"ARMISD::FSITOS", SDTUnaryOp>; | 
| Rafael Espindola | 57d109f | 2006-10-10 18:55:14 +0000 | [diff] [blame] | 104 | def armftosis      : SDNode<"ARMISD::FTOSIS", SDTUnaryOp>; | 
| Rafael Espindola | d55c0a4 | 2006-10-02 19:30:56 +0000 | [diff] [blame] | 105 | def armfsitod      : SDNode<"ARMISD::FSITOD", SDTUnaryOp>; | 
| Rafael Espindola | 57d109f | 2006-10-10 18:55:14 +0000 | [diff] [blame] | 106 | def armftosid      : SDNode<"ARMISD::FTOSID", SDTUnaryOp>; | 
| Rafael Espindola | b509388 | 2006-10-07 14:24:52 +0000 | [diff] [blame] | 107 | def armfuitos      : SDNode<"ARMISD::FUITOS", SDTUnaryOp>; | 
| Rafael Espindola | 8429e1f | 2006-10-10 20:38:57 +0000 | [diff] [blame] | 108 | def armftouis      : SDNode<"ARMISD::FTOUIS", SDTUnaryOp>; | 
| Rafael Espindola | b509388 | 2006-10-07 14:24:52 +0000 | [diff] [blame] | 109 | def armfuitod      : SDNode<"ARMISD::FUITOD", SDTUnaryOp>; | 
| Rafael Espindola | 8429e1f | 2006-10-10 20:38:57 +0000 | [diff] [blame] | 110 | def armftouid      : SDNode<"ARMISD::FTOUID", SDTUnaryOp>; | 
| Rafael Espindola | d55c0a4 | 2006-10-02 19:30:56 +0000 | [diff] [blame] | 111 |  | 
|  | 112 | def SDTarmfmrrd    : SDTypeProfile<0, 3, [SDTCisInt<0>, SDTCisInt<1>, SDTCisFP<2>]>; | 
| Rafael Espindola | aa2a12f | 2006-10-06 20:33:26 +0000 | [diff] [blame] | 113 | def armfmrrd       : SDNode<"ARMISD::FMRRD", SDTarmfmrrd, | 
|  | 114 | [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>; | 
| Rafael Espindola | 53f78be | 2006-09-29 21:20:16 +0000 | [diff] [blame] | 115 |  | 
| Rafael Espindola | e04df41 | 2006-10-05 16:48:49 +0000 | [diff] [blame] | 116 | def SDTarmfmdrr    : SDTypeProfile<1, 2, [SDTCisFP<0>, SDTCisInt<1>, SDTCisInt<2>]>; | 
|  | 117 | def armfmdrr       : SDNode<"ARMISD::FMDRR", SDTarmfmdrr, []>; | 
|  | 118 |  | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 119 | def ADJCALLSTACKUP : InstARM<(ops i32imm:$amt), | 
|  | 120 | "!ADJCALLSTACKUP $amt", | 
| Chris Lattner | 8c9422c | 2006-10-12 18:00:26 +0000 | [diff] [blame] | 121 | [(callseq_end imm:$amt)]>, Imp<[R13],[R13]>; | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 122 |  | 
|  | 123 | def ADJCALLSTACKDOWN : InstARM<(ops i32imm:$amt), | 
|  | 124 | "!ADJCALLSTACKDOWN $amt", | 
| Chris Lattner | 8c9422c | 2006-10-12 18:00:26 +0000 | [diff] [blame] | 125 | [(callseq_start imm:$amt)]>, Imp<[R13],[R13]>; | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 126 |  | 
| Rafael Espindola | bf3a17c | 2006-07-18 17:00:30 +0000 | [diff] [blame] | 127 | let isReturn = 1 in { | 
| Rafael Espindola | a94b9e3 | 2006-08-03 17:02:20 +0000 | [diff] [blame] | 128 | def bx: InstARM<(ops), "bx r14", [(retflag)]>; | 
| Rafael Espindola | bf3a17c | 2006-07-18 17:00:30 +0000 | [diff] [blame] | 129 | } | 
| Rafael Espindola | b15597b | 2006-05-18 21:45:49 +0000 | [diff] [blame] | 130 |  | 
| Rafael Espindola | f719c5f | 2006-10-16 21:10:32 +0000 | [diff] [blame] | 131 | let noResults = 1, Defs = [R0, R1, R2, R3, R14] in { | 
|  | 132 | def bl: InstARM<(ops i32imm:$func, variable_ops), "bl $func", []>; | 
| Rafael Espindola | 8b7bd82 | 2006-08-01 18:53:10 +0000 | [diff] [blame] | 133 | } | 
| Rafael Espindola | 75269be | 2006-07-16 01:02:57 +0000 | [diff] [blame] | 134 |  | 
| Rafael Espindola | 185c5c2 | 2006-07-11 11:36:48 +0000 | [diff] [blame] | 135 | def ldr   : InstARM<(ops IntRegs:$dst, memri:$addr), | 
| Rafael Espindola | 8b7bd82 | 2006-08-01 18:53:10 +0000 | [diff] [blame] | 136 | "ldr $dst, $addr", | 
| Rafael Espindola | 185c5c2 | 2006-07-11 11:36:48 +0000 | [diff] [blame] | 137 | [(set IntRegs:$dst, (load iaddr:$addr))]>; | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 138 |  | 
| Rafael Espindola | 677ee83 | 2006-10-16 17:17:22 +0000 | [diff] [blame] | 139 | def LDRB    : InstARM<(ops IntRegs:$dst, IntRegs:$addr), | 
| Rafael Espindola | c4abf8d | 2006-10-16 17:38:12 +0000 | [diff] [blame] | 140 | "ldrb $dst, [$addr]", | 
| Rafael Espindola | 677ee83 | 2006-10-16 17:17:22 +0000 | [diff] [blame] | 141 | [(set IntRegs:$dst, (zextloadi8 IntRegs:$addr))]>; | 
|  | 142 |  | 
|  | 143 | def LDRSB   : InstARM<(ops IntRegs:$dst, IntRegs:$addr), | 
| Rafael Espindola | c4abf8d | 2006-10-16 17:38:12 +0000 | [diff] [blame] | 144 | "ldrsb $dst, [$addr]", | 
| Rafael Espindola | 677ee83 | 2006-10-16 17:17:22 +0000 | [diff] [blame] | 145 | [(set IntRegs:$dst, (sextloadi8 IntRegs:$addr))]>; | 
|  | 146 |  | 
|  | 147 | def LDRH    : InstARM<(ops IntRegs:$dst, IntRegs:$addr), | 
| Rafael Espindola | c4abf8d | 2006-10-16 17:38:12 +0000 | [diff] [blame] | 148 | "ldrh $dst, [$addr]", | 
| Rafael Espindola | 677ee83 | 2006-10-16 17:17:22 +0000 | [diff] [blame] | 149 | [(set IntRegs:$dst, (zextloadi16 IntRegs:$addr))]>; | 
|  | 150 |  | 
|  | 151 | def LDRSH   : InstARM<(ops IntRegs:$dst, IntRegs:$addr), | 
| Rafael Espindola | c4abf8d | 2006-10-16 17:38:12 +0000 | [diff] [blame] | 152 | "ldrsh $dst, [$addr]", | 
| Rafael Espindola | 677ee83 | 2006-10-16 17:17:22 +0000 | [diff] [blame] | 153 | [(set IntRegs:$dst, (sextloadi16 IntRegs:$addr))]>; | 
|  | 154 |  | 
| Rafael Espindola | 8c41f99 | 2006-08-08 20:35:03 +0000 | [diff] [blame] | 155 | def str  : InstARM<(ops IntRegs:$src, memri:$addr), | 
|  | 156 | "str $src, $addr", | 
|  | 157 | [(store IntRegs:$src, iaddr:$addr)]>; | 
| Rafael Espindola | ffdc24b | 2006-05-14 22:18:28 +0000 | [diff] [blame] | 158 |  | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 159 | def MOV   : InstARM<(ops IntRegs:$dst, op_addr_mode1:$src), | 
|  | 160 | "mov $dst, $src", [(set IntRegs:$dst, addr_mode1:$src)]>; | 
| Rafael Espindola | b15597b | 2006-05-18 21:45:49 +0000 | [diff] [blame] | 161 |  | 
| Rafael Espindola | b23dc14 | 2006-10-16 18:18:14 +0000 | [diff] [blame] | 162 | def ADD     : Addr1BinOp<"add",  add>; | 
|  | 163 | def ADCS    : Addr1BinOp<"adcs", adde>; | 
|  | 164 | def ADDS    : Addr1BinOp<"adds", addc>; | 
| Rafael Espindola | 396b4a6 | 2006-10-09 17:18:28 +0000 | [diff] [blame] | 165 |  | 
| Rafael Espindola | c3ed77e | 2006-08-17 17:09:40 +0000 | [diff] [blame] | 166 | // "LEA" forms of add | 
|  | 167 | def lea_addri : InstARM<(ops IntRegs:$dst, memri:$addr), | 
|  | 168 | "add $dst, ${addr:arith}", | 
|  | 169 | [(set IntRegs:$dst, iaddr:$addr)]>; | 
|  | 170 |  | 
|  | 171 |  | 
| Rafael Espindola | b23dc14 | 2006-10-16 18:18:14 +0000 | [diff] [blame] | 172 | def SUB     : Addr1BinOp<"sub",  sub>; | 
|  | 173 | def SBCS    : Addr1BinOp<"sbcs", sube>; | 
|  | 174 | def SUBS    : Addr1BinOp<"subs", subc>; | 
|  | 175 | def AND     : Addr1BinOp<"and",  and>; | 
|  | 176 | def EOR     : Addr1BinOp<"eor",  xor>; | 
|  | 177 | def ORR     : Addr1BinOp<"orr",  or>; | 
| Rafael Espindola | 4443c7d | 2006-09-08 16:59:47 +0000 | [diff] [blame] | 178 |  | 
| Rafael Espindola | d0dee77 | 2006-08-21 22:00:32 +0000 | [diff] [blame] | 179 | let isTwoAddress = 1 in { | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 180 | def movcond : InstARM<(ops IntRegs:$dst, IntRegs:$false, | 
|  | 181 | op_addr_mode1:$true, CCOp:$cc), | 
| Rafael Espindola | 29e4875 | 2006-08-24 17:19:08 +0000 | [diff] [blame] | 182 | "mov$cc $dst, $true", | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 183 | [(set IntRegs:$dst, (armselect addr_mode1:$true, | 
|  | 184 | IntRegs:$false, imm:$cc))]>; | 
| Rafael Espindola | d0dee77 | 2006-08-21 22:00:32 +0000 | [diff] [blame] | 185 | } | 
|  | 186 |  | 
| Rafael Espindola | 203922d | 2006-10-16 17:57:20 +0000 | [diff] [blame] | 187 | def MUL     : IntBinOp<"mul", mul>; | 
| Rafael Espindola | c7829d6 | 2006-09-11 19:24:19 +0000 | [diff] [blame] | 188 |  | 
| Rafael Espindola | 595dc4c | 2006-10-16 16:33:29 +0000 | [diff] [blame] | 189 | let Defs = [R0] in { | 
| Rafael Espindola | 203922d | 2006-10-16 17:57:20 +0000 | [diff] [blame] | 190 | def SMULL   : IntBinOp<"smull r12,", mulhs>; | 
|  | 191 | def UMULL   : IntBinOp<"umull r12,", mulhu>; | 
| Rafael Espindola | 595dc4c | 2006-10-16 16:33:29 +0000 | [diff] [blame] | 192 | } | 
|  | 193 |  | 
| Rafael Espindola | fe03fe9 | 2006-08-24 16:13:15 +0000 | [diff] [blame] | 194 | def bcond      : InstARM<(ops brtarget:$dst, CCOp:$cc), | 
|  | 195 | "b$cc $dst", | 
|  | 196 | [(armbr bb:$dst, imm:$cc)]>; | 
| Rafael Espindola | e08b985 | 2006-08-24 13:45:55 +0000 | [diff] [blame] | 197 |  | 
| Rafael Espindola | 778769a | 2006-09-08 12:47:03 +0000 | [diff] [blame] | 198 | def b      : InstARM<(ops brtarget:$dst), | 
|  | 199 | "b $dst", | 
|  | 200 | [(br bb:$dst)]>; | 
|  | 201 |  | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 202 | def cmp      : InstARM<(ops IntRegs:$a, op_addr_mode1:$b), | 
| Rafael Espindola | d0dee77 | 2006-08-21 22:00:32 +0000 | [diff] [blame] | 203 | "cmp $a, $b", | 
| Rafael Espindola | e45a79a | 2006-09-11 17:25:40 +0000 | [diff] [blame] | 204 | [(armcmp IntRegs:$a, addr_mode1:$b)]>; | 
| Rafael Espindola | 53f78be | 2006-09-29 21:20:16 +0000 | [diff] [blame] | 205 |  | 
| Rafael Espindola | d15c892 | 2006-10-10 12:56:00 +0000 | [diff] [blame] | 206 | // Floating Point Compare | 
| Rafael Espindola | 3874a16 | 2006-10-13 13:14:59 +0000 | [diff] [blame] | 207 | def fcmps   : InstARM<(ops FPRegs:$a, FPRegs:$b), | 
|  | 208 | "fcmps $a, $b", | 
|  | 209 | [(armcmp FPRegs:$a, FPRegs:$b)]>; | 
|  | 210 |  | 
| Rafael Espindola | 3874a16 | 2006-10-13 13:14:59 +0000 | [diff] [blame] | 211 | def fcmpd   : InstARM<(ops DFPRegs:$a, DFPRegs:$b), | 
|  | 212 | "fcmpd $a, $b", | 
| Rafael Espindola | d1a4ea4 | 2006-10-10 16:33:47 +0000 | [diff] [blame] | 213 | [(armcmp DFPRegs:$a, DFPRegs:$b)]>; | 
|  | 214 |  | 
| Rafael Espindola | 53f78be | 2006-09-29 21:20:16 +0000 | [diff] [blame] | 215 | // Floating Point Conversion | 
|  | 216 | // We use bitconvert for moving the data between the register classes. | 
|  | 217 | // The format conversion is done with ARM specific nodes | 
|  | 218 |  | 
|  | 219 | def FMSR    : InstARM<(ops FPRegs:$dst, IntRegs:$src), | 
|  | 220 | "fmsr $dst, $src", [(set FPRegs:$dst, (bitconvert IntRegs:$src))]>; | 
|  | 221 |  | 
|  | 222 | def FMRS    : InstARM<(ops IntRegs:$dst, FPRegs:$src), | 
|  | 223 | "fmrs $dst, $src", [(set IntRegs:$dst, (bitconvert FPRegs:$src))]>; | 
|  | 224 |  | 
| Rafael Espindola | d55c0a4 | 2006-10-02 19:30:56 +0000 | [diff] [blame] | 225 | def FMRRD   : InstARM<(ops IntRegs:$i0, IntRegs:$i1, DFPRegs:$src), | 
|  | 226 | "fmrrd $i0, $i1, $src", [(armfmrrd IntRegs:$i0, IntRegs:$i1, DFPRegs:$src)]>; | 
|  | 227 |  | 
| Rafael Espindola | e04df41 | 2006-10-05 16:48:49 +0000 | [diff] [blame] | 228 | def FMDRR   : InstARM<(ops DFPRegs:$dst, IntRegs:$i0, IntRegs:$i1), | 
|  | 229 | "fmdrr $dst, $i0, $i1", [(set DFPRegs:$dst, (armfmdrr IntRegs:$i0, IntRegs:$i1))]>; | 
|  | 230 |  | 
| Rafael Espindola | 53f78be | 2006-09-29 21:20:16 +0000 | [diff] [blame] | 231 | def FSITOS  : InstARM<(ops FPRegs:$dst, FPRegs:$src), | 
|  | 232 | "fsitos $dst, $src", [(set FPRegs:$dst, (armfsitos FPRegs:$src))]>; | 
| Rafael Espindola | d55c0a4 | 2006-10-02 19:30:56 +0000 | [diff] [blame] | 233 |  | 
| Rafael Espindola | 57d109f | 2006-10-10 18:55:14 +0000 | [diff] [blame] | 234 | def FTOSIS  : InstARM<(ops FPRegs:$dst, FPRegs:$src), | 
|  | 235 | "ftosis $dst, $src", [(set FPRegs:$dst, (armftosis FPRegs:$src))]>; | 
|  | 236 |  | 
| Rafael Espindola | d55c0a4 | 2006-10-02 19:30:56 +0000 | [diff] [blame] | 237 | def FSITOD  : InstARM<(ops DFPRegs:$dst, FPRegs:$src), | 
|  | 238 | "fsitod $dst, $src", [(set DFPRegs:$dst, (armfsitod FPRegs:$src))]>; | 
| Rafael Espindola | 40f5dd2 | 2006-10-07 13:46:42 +0000 | [diff] [blame] | 239 |  | 
| Rafael Espindola | 57d109f | 2006-10-10 18:55:14 +0000 | [diff] [blame] | 240 | def FTOSID  : InstARM<(ops FPRegs:$dst, DFPRegs:$src), | 
|  | 241 | "ftosid $dst, $src", [(set FPRegs:$dst, (armftosid DFPRegs:$src))]>; | 
|  | 242 |  | 
| Rafael Espindola | b509388 | 2006-10-07 14:24:52 +0000 | [diff] [blame] | 243 | def FUITOS  : InstARM<(ops FPRegs:$dst, FPRegs:$src), | 
|  | 244 | "fuitos $dst, $src", [(set FPRegs:$dst, (armfuitos FPRegs:$src))]>; | 
|  | 245 |  | 
| Rafael Espindola | 8429e1f | 2006-10-10 20:38:57 +0000 | [diff] [blame] | 246 | def FTOUIS  : InstARM<(ops FPRegs:$dst, FPRegs:$src), | 
|  | 247 | "ftouis $dst, $src", [(set FPRegs:$dst, (armftouis FPRegs:$src))]>; | 
|  | 248 |  | 
| Rafael Espindola | b509388 | 2006-10-07 14:24:52 +0000 | [diff] [blame] | 249 | def FUITOD  : InstARM<(ops DFPRegs:$dst, FPRegs:$src), | 
|  | 250 | "fuitod $dst, $src", [(set DFPRegs:$dst, (armfuitod FPRegs:$src))]>; | 
|  | 251 |  | 
| Rafael Espindola | 8429e1f | 2006-10-10 20:38:57 +0000 | [diff] [blame] | 252 | def FTOUID  : InstARM<(ops FPRegs:$dst, DFPRegs:$src), | 
|  | 253 | "ftouid $dst, $src", [(set FPRegs:$dst, (armftouid DFPRegs:$src))]>; | 
|  | 254 |  | 
| Rafael Espindola | 9e29ec3 | 2006-10-09 17:50:29 +0000 | [diff] [blame] | 255 | def FCVTDS  : InstARM<(ops DFPRegs:$dst, FPRegs:$src), | 
|  | 256 | "fcvtds $dst, $src", [(set DFPRegs:$dst, (fextend FPRegs:$src))]>; | 
|  | 257 |  | 
|  | 258 | def FCVTSD  : InstARM<(ops FPRegs:$dst, DFPRegs:$src), | 
|  | 259 | "fcvtsd $dst, $src", [(set FPRegs:$dst, (fround DFPRegs:$src))]>; | 
| Rafael Espindola | 40f5dd2 | 2006-10-07 13:46:42 +0000 | [diff] [blame] | 260 |  | 
| Rafael Espindola | d15c892 | 2006-10-10 12:56:00 +0000 | [diff] [blame] | 261 | def FMSTAT  : InstARM<(ops ), "fmstat", [(armfmstat)]>; | 
|  | 262 |  | 
| Rafael Espindola | 40f5dd2 | 2006-10-07 13:46:42 +0000 | [diff] [blame] | 263 | // Floating Point Arithmetic | 
| Rafael Espindola | e341d60 | 2006-10-16 18:39:22 +0000 | [diff] [blame] | 264 | def FADDS   : FPBinOp<"fadds",  fadd>; | 
|  | 265 | def FADDD   : DFPBinOp<"faddd", fadd>; | 
|  | 266 | def FSUBS   : FPBinOp<"fsubs",  fsub>; | 
|  | 267 | def FSUBD   : DFPBinOp<"fsubd", fsub>; | 
| Rafael Espindola | b5f1ff33 | 2006-10-10 19:35:01 +0000 | [diff] [blame] | 268 |  | 
| Rafael Espindola | 5ab3166 | 2006-10-13 17:37:35 +0000 | [diff] [blame] | 269 | def FNEGS   : InstARM<(ops FPRegs:$dst, FPRegs:$src), | 
|  | 270 | "fnegs $dst, $src", | 
|  | 271 | [(set FPRegs:$dst, (fneg FPRegs:$src))]>; | 
|  | 272 |  | 
|  | 273 | def FNEGD   : InstARM<(ops DFPRegs:$dst, DFPRegs:$src), | 
|  | 274 | "fnegd $dst, $src", | 
|  | 275 | [(set DFPRegs:$dst, (fneg DFPRegs:$src))]>; | 
|  | 276 |  | 
| Rafael Espindola | f63752f | 2006-10-16 18:32:36 +0000 | [diff] [blame] | 277 | def FMULS   : FPBinOp<"fmuls", fmul>; | 
| Rafael Espindola | e341d60 | 2006-10-16 18:39:22 +0000 | [diff] [blame] | 278 | def FMULD   : DFPBinOp<"fmuld", fmul>; | 
| Rafael Espindola | afdd47ac | 2006-10-16 21:50:04 +0000 | [diff] [blame] | 279 | def FDIVS   : FPBinOp<"fdivs", fdiv>; | 
|  | 280 | def FDIVD   : DFPBinOp<"fdivd", fdiv>; | 
| Rafael Espindola | 58c368b | 2006-10-07 14:03:39 +0000 | [diff] [blame] | 281 |  | 
|  | 282 | // Floating Point Load | 
|  | 283 | def FLDS  : InstARM<(ops FPRegs:$dst, IntRegs:$addr), | 
|  | 284 | "flds $dst, $addr", | 
|  | 285 | [(set FPRegs:$dst, (load IntRegs:$addr))]>; | 
|  | 286 |  | 
|  | 287 | def FLDD  : InstARM<(ops DFPRegs:$dst, IntRegs:$addr), | 
|  | 288 | "fldd $dst, $addr", | 
|  | 289 | [(set DFPRegs:$dst, (load IntRegs:$addr))]>; | 
| Rafael Espindola | f719c5f | 2006-10-16 21:10:32 +0000 | [diff] [blame] | 290 |  | 
|  | 291 | def : Pat<(ARMcall tglobaladdr:$dst), | 
|  | 292 | (bl tglobaladdr:$dst)>; | 
|  | 293 |  | 
|  | 294 | def : Pat<(ARMcall texternalsym:$dst), | 
|  | 295 | (bl texternalsym:$dst)>; |