OSDN Git Service

implement vastart. The dag isel compiles this:
authorChris Lattner <sabre@nondot.org>
Fri, 23 Dec 2005 06:24:04 +0000 (06:24 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 23 Dec 2005 06:24:04 +0000 (06:24 +0000)
void test3(va_list Y);
void test2(int F, ...) {
  va_list X;
  va_start(X, F);
  test3(X);
}

into this:

test2:
        save -104, %o6, %o6
        st %i5, [%i6+88]
        st %i4, [%i6+84]
        st %i3, [%i6+80]
        st %i2, [%i6+76]
        st %i1, [%i6+72]
        add %i6, 72, %o0
        st %o0, [%i6+-4]
        call test3
        nop
        restore %g0, %g0, %g0
        retl
        nop

The simple isel emits:

test2:
        save -96, %o6, %o6
        st %i0, [%i6+68]
        st %i1, [%i6+72]
        st %i2, [%i6+76]
        st %i3, [%i6+80]
        st %i4, [%i6+84]
        st %i5, [%i6+88]
        or %g0, 1, %l0
        or %g0, 4, %l1
        umul %l0, %l1, %l0
        add %l0, 7, %l0
        and %l0, -8, %l0
        sub %o6, %l0, %o6
        add %o6, 96, %l0
        add %i6, 72, %l1
        st %l1, [%l0]
        ld [%l0], %o0
        call test3
        nop
        restore %g0, %g0, %g0
        retl
        nop

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24985 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcISelDAGToDAG.cpp
lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp

index ea434ea..e88ad2d 100644 (file)
@@ -568,8 +568,11 @@ SDOperand SparcV8TargetLowering::
 LowerVAStart(SDOperand Chain, SDOperand VAListP, Value *VAListV, 
              SelectionDAG &DAG) {
              
-  assert(0 && "Unimp");
-  abort();
+  SDOperand Offset = DAG.getNode(ISD::ADD, MVT::i32,
+                                 DAG.getRegister(V8::I6, MVT::i32),
+                                 DAG.getConstant(VarArgsFrameOffset, MVT::i32));
+  return DAG.getNode(ISD::STORE, MVT::Other, Chain, Offset, 
+                     VAListP, DAG.getSrcValue(VAListV));
 }
 
 std::pair<SDOperand,SDOperand> SparcV8TargetLowering::
index ea434ea..e88ad2d 100644 (file)
@@ -568,8 +568,11 @@ SDOperand SparcV8TargetLowering::
 LowerVAStart(SDOperand Chain, SDOperand VAListP, Value *VAListV, 
              SelectionDAG &DAG) {
              
-  assert(0 && "Unimp");
-  abort();
+  SDOperand Offset = DAG.getNode(ISD::ADD, MVT::i32,
+                                 DAG.getRegister(V8::I6, MVT::i32),
+                                 DAG.getConstant(VarArgsFrameOffset, MVT::i32));
+  return DAG.getNode(ISD::STORE, MVT::Other, Chain, Offset, 
+                     VAListP, DAG.getSrcValue(VAListV));
 }
 
 std::pair<SDOperand,SDOperand> SparcV8TargetLowering::