/*
* Copyright 2012 Phil Pratt-Szeliga and other contributors
* http://chirrup.org/
*
* See the file LICENSE for copying permission.
*/
package org.trifort.rootbeer.generate.opencl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.trifort.rootbeer.generate.opencl.tweaks.Tweaks;
public class ArrayCopyGenerate {
private List<OpenCLArrayType> m_ArrayTypes;
public String get(Set<OpenCLArrayType> array_types_set){
createSet(array_types_set);
StringBuilder ret = new StringBuilder();
String address_qual = Tweaks.v().getGlobalAddressSpaceQualifier();
ret.append(getDecl()+"{\n");
ret.append(" int i;\n");
ret.append(" int src_index;\n");
ret.append(" int dest_index;\n");
ret.append(" "+address_qual+" char * src_deref = org_trifort_gc_deref(src_handle);\n");
ret.append(" "+address_qual+" char * dest_deref = org_trifort_gc_deref(dest_handle);\n");
ret.append(" \n");
ret.append(" GC_OBJ_TYPE_TYPE src_type = org_trifort_gc_get_type(src_deref);\n");
ret.append(" GC_OBJ_TYPE_TYPE dest_type = org_trifort_gc_get_type(dest_deref);\n");
ret.append(" \n");
ret.append(" if(srcPos < destPos){\n");
ret.append(" if(0){}\n");
ret.append(generateForList());
ret.append(" } else {\n");
ret.append(" if(0){}\n");
ret.append(generateForList());
ret.append(" }\n");
ret.append("}\n");
return ret.toString();
}
private String generateForList(){
StringBuilder ret = new StringBuilder();
for(int i = 0; i < m_ArrayTypes.size(); ++i){
for(int j = 0; j < m_ArrayTypes.size(); ++j){
OpenCLArrayType src = m_ArrayTypes.get(i);
OpenCLArrayType dest = m_ArrayTypes.get(j);
ret.append(" else if(src_type == "+src.getTypeInteger()+" && dest_type == "+dest.getTypeInteger()+"){\n");
ret.append(" for(i = length - 1; i >= 0; --i){\n");
ret.append(" src_index = srcPos + i;\n");
ret.append(" dest_index = destPos + i;\n");
ret.append(" "+dest.getDerefTypeString()+"_set(dest_handle, dest_index, ");
ret.append(src.getDerefTypeString()+"_get(src_handle, src_index, exception), exception);\n");
ret.append(" }\n");
ret.append(" }\n");
}
}
return ret.toString();
}
private void createSet(Set<OpenCLArrayType> array_types_set) {
m_ArrayTypes = new ArrayList<OpenCLArrayType>();
Iterator<OpenCLArrayType> iter = array_types_set.iterator();
while(iter.hasNext()){
m_ArrayTypes.add(iter.next());
}
}
private String getDecl(){
String device_function_qual = Tweaks.v().getDeviceFunctionQualifier();
StringBuilder ret = new StringBuilder();
ret.append(device_function_qual+" void \n");
ret.append("java_lang_System_arraycopy(");
ret.append("int src_handle, int srcPos, int dest_handle, int destPos, int length, int * exception)");
return ret.toString();
}
public String getProto() {
return getDecl()+";\n";
}
}