From c03a0cb01b7e40d74d3ed7a2c76d2ae4342c202a Mon Sep 17 00:00:00 2001 From: Brian Gaeke Date: Tue, 19 Nov 2002 09:08:47 +0000 Subject: [PATCH] Brian Gaeke says: lib/Target/X86/InstSelectSimple.cpp: Add a little something to visitBranchInst which supports conditional branches. lib/Target/X86/X86InstrInfo.def: Add defs of JNE, JE, CMPri8 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4755 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/InstSelectSimple.cpp | 26 ++++++++++++++++++++------ lib/Target/X86/X86ISelSimple.cpp | 26 ++++++++++++++++++++------ lib/Target/X86/X86InstrInfo.def | 3 +++ 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index d74bfd4912e..f0ffc679ed7 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -386,17 +386,31 @@ void ISel::visitReturnInst (ReturnInst &I) { BuildMI(BB, X86::RET, 0); } - /// visitBranchInst - Handle conditional and unconditional branches here. Note /// that since code layout is frozen at this point, that if we are trying to /// jump to a block that is the immediate successor of the current block, we can /// just make a fall-through. (but we don't currently). /// -void ISel::visitBranchInst(BranchInst &BI) { - if (BI.isConditional()) // Only handles unconditional branches so far... - visitInstruction(BI); - - BuildMI(BB, X86::JMP, 1).addPCDisp(BI.getSuccessor(0)); +void +ISel::visitBranchInst (BranchInst & BI) +{ + if (BI.isConditional ()) + { + BasicBlock *ifTrue = BI.getSuccessor (0); + BasicBlock *ifFalse = BI.getSuccessor (1); // this is really unobvious + + // simplest thing I can think of: compare condition with zero, + // followed by jump-if-equal to ifFalse, and jump-if-nonequal to + // ifTrue + unsigned int condReg = getReg (BI.getCondition ()); + BuildMI (BB, X86::CMPri8, 2, X86::EFLAGS).addReg (condReg).addZImm (0); + BuildMI (BB, X86::JNE, 1).addPCDisp (BI.getSuccessor (0)); + BuildMI (BB, X86::JE, 1).addPCDisp (BI.getSuccessor (1)); + } + else // unconditional branch + { + BuildMI (BB, X86::JMP, 1).addPCDisp (BI.getSuccessor (0)); + } } diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index d74bfd4912e..f0ffc679ed7 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -386,17 +386,31 @@ void ISel::visitReturnInst (ReturnInst &I) { BuildMI(BB, X86::RET, 0); } - /// visitBranchInst - Handle conditional and unconditional branches here. Note /// that since code layout is frozen at this point, that if we are trying to /// jump to a block that is the immediate successor of the current block, we can /// just make a fall-through. (but we don't currently). /// -void ISel::visitBranchInst(BranchInst &BI) { - if (BI.isConditional()) // Only handles unconditional branches so far... - visitInstruction(BI); - - BuildMI(BB, X86::JMP, 1).addPCDisp(BI.getSuccessor(0)); +void +ISel::visitBranchInst (BranchInst & BI) +{ + if (BI.isConditional ()) + { + BasicBlock *ifTrue = BI.getSuccessor (0); + BasicBlock *ifFalse = BI.getSuccessor (1); // this is really unobvious + + // simplest thing I can think of: compare condition with zero, + // followed by jump-if-equal to ifFalse, and jump-if-nonequal to + // ifTrue + unsigned int condReg = getReg (BI.getCondition ()); + BuildMI (BB, X86::CMPri8, 2, X86::EFLAGS).addReg (condReg).addZImm (0); + BuildMI (BB, X86::JNE, 1).addPCDisp (BI.getSuccessor (0)); + BuildMI (BB, X86::JE, 1).addPCDisp (BI.getSuccessor (1)); + } + else // unconditional branch + { + BuildMI (BB, X86::JMP, 1).addPCDisp (BI.getSuccessor (0)); + } } diff --git a/lib/Target/X86/X86InstrInfo.def b/lib/Target/X86/X86InstrInfo.def index 69c6178b303..27605d79ad8 100644 --- a/lib/Target/X86/X86InstrInfo.def +++ b/lib/Target/X86/X86InstrInfo.def @@ -37,6 +37,8 @@ I(NOOP , "nop", 0x90, 0, X86II::RawFrm | X86II::Void) // no // Flow control instructions I(RET , "ret", 0xCB, M_RET_FLAG, X86II::RawFrm | X86II::Void) // ret I(JMP , "jmp", 0x00, M_BRANCH_FLAG, X86II::Void) // jmp foo EB|E9 cb|w +I(JNE , "jne", 0x00, M_BRANCH_FLAG, X86II::Void) // 75 cb, or 0f 85 cw|cd +I(JE , "je", 0x00, M_BRANCH_FLAG, X86II::Void) // 74 cb, or 0f 84 cw|cd // Misc instructions I(LEAVE , "leave", 0xC9, 0, X86II::RawFrm) // leave @@ -134,6 +136,7 @@ I(SETNE , "setne", 0x95, 0, X86II::TB) // R8 = != 0F 9 I(CMPrr8 , "cmpb", 0x38, 0, X86II::MRMDestReg) // compare R8,R8 38/r I(CMPrr16 , "cmpw", 0x39, 0, X86II::MRMDestReg) // compare R16,R16 39/r I(CMPrr32 , "cmpl", 0x39, 0, X86II::MRMDestReg) // compare R32,R32 39/r +I(CMPri8 , "cmp", 0x80, 0, 0) // compare R8, imm8 80 /7 ib // Sign extenders (first 3 are good for DIV/IDIV; the others are more general) I(CBW , "cbw", 0x98, 0, X86II::RawFrm) // AX = signext(AL) -- 2.11.0