Hi All,
I need to implement select_cc as a "cmp; mov rX,1; brcond cnd, END;
mov rX,0; END:" sequence.
Chris mentioned that the PPC code (as well as the x86 SSE code) does
this, but I can't seem to find it.
What I really need to kmow is how to insert the branch/label pair at
instruction selection phase.
Anyone have an example of this?
someguy wrote:
Hi All,
I need to implement select_cc as a "cmp; mov rX,1; brcond cnd, END;
mov rX,0; END:" sequence.
Chris mentioned that the PPC code (as well as the x86 SSE code) does
this, but I can't seem to find it.
What I really need to kmow is how to insert the branch/label pair at
instruction selection phase.
Anyone have an example of this?
Add a pseudo instruction for the select with usesCustomDAGSchedInsteter = 1. Replace the pseudo instruction with the required control flow in the EmitInstrWithCustomInserter member of your ISelLowering class. There are examples of this in the MIPS or XCore backends.
-Richard
Yeah, I finally found the example in MIPS, but am now having an issue
with SELECT_CC/SETCC nodes.
Should lines 9 and 10 not be a select?
; ModuleID = '<stdin>'
target datalayout =
"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
target triple = "i386-unknown-linux-gnu"
define i32 @test(i32 %data, i32 %number) nounwind readnone {
entry:
%0 = shl i32 1, %number ; <i32> [#uses=1]
%1 = and i32 %0, %data ; <i32> [#uses=1]
%not. = icmp ne i32 %1, 0 ; <i1> [#uses=1]
%.0 = zext i1 %not. to i32 ; <i32> [#uses=1]
ret i32 %.0
}
define i32 @main(i32 %argc, i8** nocapture %argv) nounwind readnone {
entry:
%0 = tail call i32 @test(i32 10, i32 1) nounwind ; <i32> [#uses=1]
ret i32 %0
}
Thanks