1 /*
   2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package com.oracle.graal.lir.ptx;
  24 
  25 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*;
  26 
  27 import com.oracle.graal.api.meta.*;
  28 import com.oracle.graal.asm.*;
  29 import com.oracle.graal.asm.ptx.*;
  30 import com.oracle.graal.lir.*;
  31 import com.oracle.graal.lir.asm.*;
  32 import com.oracle.graal.nodes.calc.*;
  33 
  34 public class PTXControlFlow {
  35 
  36     public static class ReturnOp extends PTXLIRInstruction {
  37 
  38         @Use({REG, ILLEGAL}) protected Value x;
  39 
  40         public ReturnOp(Value x) {
  41             this.x = x;
  42         }
  43 
  44         @Override
  45         public void emitCode(TargetMethodAssembler tasm, PTXAssembler masm) {
  46             if (tasm.frameContext != null) {
  47                 tasm.frameContext.leave(tasm);
  48             }
  49             masm.exit();
  50         }
  51     }
  52 
  53     public static class BranchOp extends PTXLIRInstruction implements StandardOp.BranchOp {
  54 
  55         protected Condition condition;
  56         protected LabelRef destination;
  57 
  58         public BranchOp(Condition condition, LabelRef destination) {
  59             this.condition = condition;
  60             this.destination = destination;
  61         }
  62 
  63         @Override
  64         public void emitCode(TargetMethodAssembler tasm, PTXAssembler masm) {
  65             masm.at();
  66             Label l = destination.label();
  67             l.addPatchAt(tasm.asm.codeBuffer.position());
  68             String target = l.isBound() ? "L" + l.toString() : AbstractPTXAssembler.UNBOUND_TARGET;
  69             masm.bra(target);
  70         }
  71 
  72         @Override
  73         public LabelRef destination() {
  74             return destination;
  75         }
  76 
  77         @Override
  78         public void negate(LabelRef newDestination) {
  79             destination = newDestination;
  80             condition = condition.negate();
  81         }
  82     }
  83     
  84     public static class CondMoveOp extends PTXLIRInstruction {
  85         @Def({REG, HINT}) protected Value result;
  86         @Alive({REG}) protected Value trueValue;
  87         @Use({REG, STACK, CONST}) protected Value falseValue;
  88         private final Condition condition;
  89 
  90         public CondMoveOp(Variable result, Condition condition, Variable trueValue, Value falseValue) {
  91             this.result = result;
  92             this.condition = condition;
  93             this.trueValue = trueValue;
  94             this.falseValue = falseValue;
  95         }
  96 
  97         @Override
  98         public void emitCode(TargetMethodAssembler tasm, PTXAssembler masm) {
  99             // cmove(tasm, masm, result, false, condition, false, trueValue, falseValue);
 100                 // see 8.3 Predicated Execution p. 61 of PTX ISA 3.1
 101             throw new InternalError("NYI");
 102         }
 103     }
 104 
 105 
 106     public static class FloatCondMoveOp extends PTXLIRInstruction {
 107         @Def({REG}) protected Value result;
 108         @Alive({REG}) protected Value trueValue;
 109         @Alive({REG}) protected Value falseValue;
 110         private final Condition condition;
 111         private final boolean unorderedIsTrue;
 112 
 113         public FloatCondMoveOp(Variable result, Condition condition, boolean unorderedIsTrue, Variable trueValue, Variable falseValue) {
 114             this.result = result;
 115             this.condition = condition;
 116             this.unorderedIsTrue = unorderedIsTrue;
 117             this.trueValue = trueValue;
 118             this.falseValue = falseValue;
 119         }
 120 
 121         @Override
 122         public void emitCode(TargetMethodAssembler tasm, PTXAssembler masm) {
 123             // cmove(tasm, masm, result, true, condition, unorderedIsTrue, trueValue, falseValue);
 124                 // see 8.3 Predicated Execution p. 61 of PTX ISA 3.1
 125             throw new InternalError("NYI");
 126         }
 127     }
 128 }