Changes in directory llvm/lib/Target/IA64:
IA64InstrFormats.td updated: 1.2 -> 1.3 IA64InstrInfo.td updated: 1.19 -> 1.20 --- Log message: add FP compares and implicit register defs to the dag isel --- Diffs of the changes: (+45 -23) IA64InstrFormats.td | 4 +++ IA64InstrInfo.td | 64 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 23 deletions(-) Index: llvm/lib/Target/IA64/IA64InstrFormats.td diff -u llvm/lib/Target/IA64/IA64InstrFormats.td:1.2 llvm/lib/Target/IA64/IA64InstrFormats.td:1.3 --- llvm/lib/Target/IA64/IA64InstrFormats.td:1.2 Fri Oct 28 12:46:36 2005 +++ llvm/lib/Target/IA64/IA64InstrFormats.td Sun Oct 30 19:42:11 2005 @@ -72,4 +72,8 @@ class PseudoInstIA64<dag OL, string nm> : InstIA64<0, OL, nm> { } +class PseudoInstIA64_DAG<dag OL, string nm, list<dag> pattern> + : InstIA64<0, OL, nm> { + let Pattern = pattern; +} Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.19 llvm/lib/Target/IA64/IA64InstrInfo.td:1.20 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.19 Sun Oct 30 04:14:19 2005 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Sun Oct 30 19:42:11 2005 @@ -200,7 +200,7 @@ // load constants of various sizes // FIXME: prettyprint -ve constants def : Pat<(i64 immSExt14:$imm), (ADDS r0, immSExt14:$imm)>; def : Pat<(i64 imm64:$imm), (MOVL imm64:$imm)>; -// TODO: def : Pat<(i1 1), (MOV p0)>; +// TODO: def : Pat<(i1 1), (<stuff>)>; def AND : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2), "and $dst = $src1, $src2;;", @@ -290,11 +290,51 @@ "cmp.geu $dst, p0 = $src1, $src2;;", [(set PR:$dst, (setuge GR:$src1, GR:$src2))]>; +// and we do the whole thing again for FP compares! +def FCMPEQ : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.eq $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (seteq FP:$src1, FP:$src2))]>; +def FCMPGT : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.gt $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setgt FP:$src1, FP:$src2))]>; +def FCMPGE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.ge $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setge FP:$src1, FP:$src2))]>; +def FCMPLT : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.lt $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setlt FP:$src1, FP:$src2))]>; +def FCMPLE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.le $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setle FP:$src1, FP:$src2))]>; +def FCMPNE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.neq $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setne FP:$src1, FP:$src2))]>; +def FCMPLTU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.ltu $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setult FP:$src1, FP:$src2))]>; +def FCMPGTU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.gtu $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setugt FP:$src1, FP:$src2))]>; +def FCMPLEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.leu $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setule FP:$src1, FP:$src2))]>; +def FCMPGEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), + "fcmp.geu $dst, p0 = $src1, $src2;;", + [(set PR:$dst, (setuge FP:$src1, FP:$src2))]>; + // TODO: support postincrement (reg, imm9) loads+stores - this needs more // tablegen support def PHI : PseudoInstIA64<(ops variable_ops), "PHI">; def IDEF : PseudoInstIA64<(ops variable_ops), "// IDEF">; + +def IDEF_GR_D : PseudoInstIA64_DAG<(ops GR:$reg), "// $reg = IDEF", + [(set GR:$reg, (undef))]>; +def IDEF_FP_D : PseudoInstIA64_DAG<(ops FP:$reg), "// $reg = IDEF", + [(set FP:$reg, (undef))]>; +def IDEF_PR_D : PseudoInstIA64_DAG<(ops PR:$reg), "// $reg = IDEF", + [(set PR:$reg, (undef))]>; + def IUSE : PseudoInstIA64<(ops variable_ops), "// IUSE">; def ADJUSTCALLSTACKUP : PseudoInstIA64<(ops variable_ops), "// ADJUSTCALLSTACKUP">; @@ -365,28 +405,6 @@ def DEPZ : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm1, u6imm:$imm2), "dep.z $dst = $src1, $imm1, $imm2;;">; -// and we do the whole thing again for FP compares! -def FCMPEQ : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.eq $dst, p0 = $src1, $src2;;">; -def FCMPGT : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.gt $dst, p0 = $src1, $src2;;">; -def FCMPGE : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.ge $dst, p0 = $src1, $src2;;">; -def FCMPLT : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.lt $dst, p0 = $src1, $src2;;">; -def FCMPLE : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.le $dst, p0 = $src1, $src2;;">; -def FCMPNE : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.neq $dst, p0 = $src1, $src2;;">; -def FCMPLTU : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.ltu $dst, p0 = $src1, $src2;;">; -def FCMPGTU : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.gtu $dst, p0 = $src1, $src2;;">; -def FCMPLEU : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.leu $dst, p0 = $src1, $src2;;">; -def FCMPGEU : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2), - "fcmp.geu $dst, p0 = $src1, $src2;;">; - def PCMPEQOR : AForm<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2, PR:$qp), "($qp) cmp.eq.or $dst, p0 = $src1, $src2;;">; def PCMPEQUNC : AForm<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2, PR:$qp), _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits