Skip to content

Commit 88fc69f

Browse files
add FP compares and implicit register defs to the dag isel
llvm-svn: 24118
1 parent 94d1562 commit 88fc69f

File tree

2 files changed

+45
-23
lines changed

2 files changed

+45
-23
lines changed

llvm/lib/Target/IA64/IA64InstrFormats.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,8 @@ class RawForm<bits<4> opcode, bits<26> rest, dag OL, string asmstr> :
7272
class PseudoInstIA64<dag OL, string nm> : InstIA64<0, OL, nm> {
7373
}
7474

75+
class PseudoInstIA64_DAG<dag OL, string nm, list<dag> pattern>
76+
: InstIA64<0, OL, nm> {
77+
let Pattern = pattern;
78+
}
7579

llvm/lib/Target/IA64/IA64InstrInfo.td

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ def : Pat<(mulhu GR:$src1, GR:$src2),
200200
// load constants of various sizes // FIXME: prettyprint -ve constants
201201
def : Pat<(i64 immSExt14:$imm), (ADDS r0, immSExt14:$imm)>;
202202
def : Pat<(i64 imm64:$imm), (MOVL imm64:$imm)>;
203-
// TODO: def : Pat<(i1 1), (MOV p0)>;
203+
// TODO: def : Pat<(i1 1), (<stuff>)>;
204204

205205
def AND : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
206206
"and $dst = $src1, $src2;;",
@@ -290,11 +290,51 @@ def CMPGEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
290290
"cmp.geu $dst, p0 = $src1, $src2;;",
291291
[(set PR:$dst, (setuge GR:$src1, GR:$src2))]>;
292292

293+
// and we do the whole thing again for FP compares!
294+
def FCMPEQ : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
295+
"fcmp.eq $dst, p0 = $src1, $src2;;",
296+
[(set PR:$dst, (seteq FP:$src1, FP:$src2))]>;
297+
def FCMPGT : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
298+
"fcmp.gt $dst, p0 = $src1, $src2;;",
299+
[(set PR:$dst, (setgt FP:$src1, FP:$src2))]>;
300+
def FCMPGE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
301+
"fcmp.ge $dst, p0 = $src1, $src2;;",
302+
[(set PR:$dst, (setge FP:$src1, FP:$src2))]>;
303+
def FCMPLT : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
304+
"fcmp.lt $dst, p0 = $src1, $src2;;",
305+
[(set PR:$dst, (setlt FP:$src1, FP:$src2))]>;
306+
def FCMPLE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
307+
"fcmp.le $dst, p0 = $src1, $src2;;",
308+
[(set PR:$dst, (setle FP:$src1, FP:$src2))]>;
309+
def FCMPNE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
310+
"fcmp.neq $dst, p0 = $src1, $src2;;",
311+
[(set PR:$dst, (setne FP:$src1, FP:$src2))]>;
312+
def FCMPLTU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
313+
"fcmp.ltu $dst, p0 = $src1, $src2;;",
314+
[(set PR:$dst, (setult FP:$src1, FP:$src2))]>;
315+
def FCMPGTU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
316+
"fcmp.gtu $dst, p0 = $src1, $src2;;",
317+
[(set PR:$dst, (setugt FP:$src1, FP:$src2))]>;
318+
def FCMPLEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
319+
"fcmp.leu $dst, p0 = $src1, $src2;;",
320+
[(set PR:$dst, (setule FP:$src1, FP:$src2))]>;
321+
def FCMPGEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
322+
"fcmp.geu $dst, p0 = $src1, $src2;;",
323+
[(set PR:$dst, (setuge FP:$src1, FP:$src2))]>;
324+
293325
// TODO: support postincrement (reg, imm9) loads+stores - this needs more
294326
// tablegen support
295327

296328
def PHI : PseudoInstIA64<(ops variable_ops), "PHI">;
297329
def IDEF : PseudoInstIA64<(ops variable_ops), "// IDEF">;
330+
331+
def IDEF_GR_D : PseudoInstIA64_DAG<(ops GR:$reg), "// $reg = IDEF",
332+
[(set GR:$reg, (undef))]>;
333+
def IDEF_FP_D : PseudoInstIA64_DAG<(ops FP:$reg), "// $reg = IDEF",
334+
[(set FP:$reg, (undef))]>;
335+
def IDEF_PR_D : PseudoInstIA64_DAG<(ops PR:$reg), "// $reg = IDEF",
336+
[(set PR:$reg, (undef))]>;
337+
298338
def IUSE : PseudoInstIA64<(ops variable_ops), "// IUSE">;
299339
def ADJUSTCALLSTACKUP : PseudoInstIA64<(ops variable_ops),
300340
"// ADJUSTCALLSTACKUP">;
@@ -365,28 +405,6 @@ def EXTRU : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm1, u6imm:$imm2),
365405

366406
def DEPZ : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm1, u6imm:$imm2), "dep.z $dst = $src1, $imm1, $imm2;;">;
367407

368-
// and we do the whole thing again for FP compares!
369-
def FCMPEQ : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
370-
"fcmp.eq $dst, p0 = $src1, $src2;;">;
371-
def FCMPGT : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
372-
"fcmp.gt $dst, p0 = $src1, $src2;;">;
373-
def FCMPGE : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
374-
"fcmp.ge $dst, p0 = $src1, $src2;;">;
375-
def FCMPLT : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
376-
"fcmp.lt $dst, p0 = $src1, $src2;;">;
377-
def FCMPLE : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
378-
"fcmp.le $dst, p0 = $src1, $src2;;">;
379-
def FCMPNE : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
380-
"fcmp.neq $dst, p0 = $src1, $src2;;">;
381-
def FCMPLTU : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
382-
"fcmp.ltu $dst, p0 = $src1, $src2;;">;
383-
def FCMPGTU : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
384-
"fcmp.gtu $dst, p0 = $src1, $src2;;">;
385-
def FCMPLEU : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
386-
"fcmp.leu $dst, p0 = $src1, $src2;;">;
387-
def FCMPGEU : AForm<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
388-
"fcmp.geu $dst, p0 = $src1, $src2;;">;
389-
390408
def PCMPEQOR : AForm<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2, PR:$qp),
391409
"($qp) cmp.eq.or $dst, p0 = $src1, $src2;;">;
392410
def PCMPEQUNC : AForm<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2, PR:$qp),

0 commit comments

Comments
 (0)