mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-04-14 10:37:36 +00:00
Added optimize option for using a fragment cache. Yields no significant performance benefit.
This commit is contained in:
parent
d1333cdbe4
commit
13509b59cb
src
main/java/dk/camelot64/kickc
KickC.java
fragment
test
java/dk/camelot64/kickc/test
ref
fragments-assignment-binary-_deref_pbuc1.logfragments-assignment-binary-_deref_pbuz1.logfragments-assignment-binary-pbuc1_derefidx_vbuaa.logfragments-assignment-binary-pbuc1_derefidx_vbuxx.logfragments-assignment-binary-pbuc1_derefidx_vbuyy.logfragments-assignment-binary-pbuc1_derefidx_vbuz1.logfragments-assignment-binary-pbuz1_derefidx_vbuaa.logfragments-assignment-binary-pbuz1_derefidx_vbuc1.logfragments-assignment-binary-pbuz1_derefidx_vbuxx.logfragments-assignment-binary-pbuz1_derefidx_vbuyy.logfragments-assignment-binary-pbuz1_derefidx_vbuz1.logfragments-assignment-binary-pbuz1_derefidx_vbuz2.logfragments-assignment-binary-vbuaa.logfragments-assignment-binary-vbuxx.logfragments-assignment-binary-vbuyy.logfragments-assignment-binary-vbuz1.logfragments-assignment-copy.logfragments-assignment-unary.logfragments-complex.log
@ -61,9 +61,12 @@ public class KickC implements Callable<Void> {
|
||||
@CommandLine.Option(names = {"-Ouplift"}, description = "Optimization Option. Number of combinations to test when uplifting variables to registers in a scope. By default 100 combinations are tested.")
|
||||
private Integer optimizeUpliftCombinations = null;
|
||||
|
||||
@CommandLine.Option(names = {"-Ocoalesce"}, description = "Optimization Option. Enables zero-page coalesce pass which limits zero-page usage significantly, but takes a lot of compile time..")
|
||||
@CommandLine.Option(names = {"-Ocoalesce"}, description = "Optimization Option. Enables zero-page coalesce pass which limits zero-page usage significantly, but takes a lot of compile time.")
|
||||
private boolean optimizeZeroPageCoalesce = false;
|
||||
|
||||
@CommandLine.Option(names = {"-Ocache"}, description = "Optimization Option. Enables a fragment cache file.")
|
||||
private boolean optimizeFragmentCache = false;
|
||||
|
||||
@CommandLine.Option(names = {"-v"}, description = "Verbose output describing the compilation process")
|
||||
private boolean verbose = false;
|
||||
|
||||
@ -134,14 +137,24 @@ public class KickC implements Callable<Void> {
|
||||
}
|
||||
}
|
||||
|
||||
if(fragmentDir != null) {
|
||||
AsmFragmentTemplateSynthesizer.initialize(fragmentDir.toString() + "/");
|
||||
} else {
|
||||
AsmFragmentTemplateSynthesizer.initialize("fragment/");
|
||||
if(fragmentDir == null) {
|
||||
fragmentDir = new File("fragment/").toPath();
|
||||
}
|
||||
|
||||
Path fragmentCacheDir = null;
|
||||
if(optimizeFragmentCache) {
|
||||
if(outputDir != null) {
|
||||
fragmentCacheDir = outputDir;
|
||||
} else {
|
||||
fragmentCacheDir = new File(".").toPath();
|
||||
}
|
||||
}
|
||||
|
||||
configVerbosity(compiler);
|
||||
|
||||
AsmFragmentTemplateSynthesizer.initialize(fragmentDir, fragmentCacheDir, compiler.getLog());
|
||||
|
||||
if(fragment != null) {
|
||||
configVerbosity(compiler);
|
||||
if(verbose) {
|
||||
compiler.getLog().setVerboseFragmentLog(true);
|
||||
}
|
||||
@ -154,8 +167,6 @@ public class KickC implements Callable<Void> {
|
||||
|
||||
if(kcFile != null) {
|
||||
|
||||
configVerbosity(compiler);
|
||||
|
||||
String fileBaseName = getFileBaseName(kcFile);
|
||||
|
||||
Path kcFileDir = kcFile.getParent();
|
||||
@ -182,7 +193,6 @@ public class KickC implements Callable<Void> {
|
||||
compiler.setEnableZeroPageCoalasce(true);
|
||||
}
|
||||
|
||||
|
||||
System.out.println("Compiling " + kcFile);
|
||||
Program program = null;
|
||||
try {
|
||||
@ -202,6 +212,8 @@ public class KickC implements Callable<Void> {
|
||||
asmWriter.close();
|
||||
asmOutputStream.close();
|
||||
|
||||
AsmFragmentTemplateSynthesizer.finalize(compiler.getLog());
|
||||
|
||||
// Copy Resource Files (if out-dir is different from in-dir)
|
||||
if(!kcFileDir.toAbsolutePath().equals(outputDir.toAbsolutePath())) {
|
||||
for(Path resourcePath : program.getAsmResourceFiles()) {
|
||||
@ -270,6 +282,8 @@ public class KickC implements Callable<Void> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,8 @@ public class AsmFragmentTemplate {
|
||||
|
||||
/** true if the fragment was loaded from disk. */
|
||||
private boolean file;
|
||||
/** true if the fragment was loaded from the disk cache. */
|
||||
private boolean cache;
|
||||
/** The fragment template signature name. */
|
||||
private String signature;
|
||||
/** The fragment template body */
|
||||
@ -40,10 +42,11 @@ public class AsmFragmentTemplate {
|
||||
/** The cycles consumed by the ASM of the fragment. */
|
||||
private Double cycles;
|
||||
|
||||
public AsmFragmentTemplate(String signature, String body) {
|
||||
public AsmFragmentTemplate(String signature, String body, boolean cache) {
|
||||
this.signature = signature;
|
||||
this.body = body;
|
||||
this.file = true;
|
||||
this.cache = cache;
|
||||
}
|
||||
|
||||
AsmFragmentTemplate(String signature, String body, AsmFragmentTemplateSynthesisRule synthesis, AsmFragmentTemplate subFragment) {
|
||||
@ -52,6 +55,7 @@ public class AsmFragmentTemplate {
|
||||
this.synthesis = synthesis;
|
||||
this.subFragment = subFragment;
|
||||
this.file = false;
|
||||
this.cache = false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -159,6 +163,10 @@ public class AsmFragmentTemplate {
|
||||
return file;
|
||||
}
|
||||
|
||||
public boolean isCache() {
|
||||
return cache;
|
||||
}
|
||||
|
||||
public AsmFragmentTemplateSynthesisRule getSynthesis() {
|
||||
return synthesis;
|
||||
}
|
||||
|
@ -4,10 +4,8 @@ import dk.camelot64.kickc.CompileLog;
|
||||
import org.antlr.v4.runtime.CharStream;
|
||||
import org.antlr.v4.runtime.CharStreams;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.*;
|
||||
import java.nio.file.Path;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
@ -23,30 +21,45 @@ import java.util.*;
|
||||
*/
|
||||
public class AsmFragmentTemplateSynthesizer {
|
||||
|
||||
/** Name of the file holding the fragment cache. */
|
||||
public static final String FRAGMENT_CACHE_FILE = "fragment-cache.asm";
|
||||
|
||||
/** The static instance. */
|
||||
static AsmFragmentTemplateSynthesizer SYNTHESIZER = null;
|
||||
|
||||
/** Initialize the fragment template synthesizer. */
|
||||
public static void initialize(String folder) {
|
||||
SYNTHESIZER = new AsmFragmentTemplateSynthesizer(folder);
|
||||
public static void initialize(Path fragmentFolder, Path cacheFolder, CompileLog log) {
|
||||
SYNTHESIZER = new AsmFragmentTemplateSynthesizer(fragmentFolder, cacheFolder, log);
|
||||
}
|
||||
|
||||
/** Finalize the fragment template synthesizer. */
|
||||
public static void finalize(CompileLog log) {
|
||||
SYNTHESIZER.saveBestFragmentCache(log);
|
||||
}
|
||||
|
||||
/** Create synthesizer. */
|
||||
private AsmFragmentTemplateSynthesizer(String fragmentFolder) {
|
||||
private AsmFragmentTemplateSynthesizer(Path fragmentFolder, Path cacheFolder, CompileLog log) {
|
||||
this.fragmentFolder = fragmentFolder;
|
||||
this.bestFragmentCache = new LinkedHashMap<>();
|
||||
this.cacheFolder = cacheFolder;
|
||||
this.synthesisGraph = new LinkedHashMap<>();
|
||||
this.bestTemplateUpdate = new ArrayDeque<>();
|
||||
this.bestFragmentCache = loadBestFragmentCache(cacheFolder, log);
|
||||
if(this.bestFragmentCache == null)
|
||||
this.bestFragmentCache = new LinkedHashMap<>();
|
||||
|
||||
}
|
||||
|
||||
/** The folder containing fragment files. */
|
||||
private String fragmentFolder;
|
||||
private Path fragmentFolder;
|
||||
|
||||
/** The folder containing cached fragment files. */
|
||||
private Path cacheFolder;
|
||||
|
||||
/** Cache for the best fragment templates. Maps signature to the best fragment template for the signature. */
|
||||
private Map<String, AsmFragmentTemplate> bestFragmentCache;
|
||||
|
||||
/** Special singleton representing that the fragment can not be synthesized or loaded. */
|
||||
private AsmFragmentTemplate UNKNOWN = new AsmFragmentTemplate("UNKNOWN", null);
|
||||
private AsmFragmentTemplate NO_SYNTHESIS = new AsmFragmentTemplate("NO_SYNTHESIS", null, false);
|
||||
|
||||
/**
|
||||
* Contains the synthesis for each fragment template signature.
|
||||
@ -59,6 +72,7 @@ public class AsmFragmentTemplateSynthesizer {
|
||||
|
||||
/**
|
||||
* Get information about the size of the synthesizer data structures
|
||||
*
|
||||
* @return the size
|
||||
*/
|
||||
public static int getSize() {
|
||||
@ -89,20 +103,22 @@ public class AsmFragmentTemplateSynthesizer {
|
||||
}
|
||||
|
||||
private AsmFragmentTemplate getFragmentTemplate(String signature, CompileLog log) {
|
||||
// Attempt to find in memory/disk cache
|
||||
AsmFragmentTemplate bestTemplate = bestFragmentCache.get(signature);
|
||||
if(bestTemplate == UNKNOWN) {
|
||||
if(bestTemplate == NO_SYNTHESIS) {
|
||||
if(log.isVerboseFragmentLog()) {
|
||||
log.append("Unknown fragment " + signature);
|
||||
}
|
||||
throw new UnknownFragmentException(signature);
|
||||
}
|
||||
if(bestTemplate == null) {
|
||||
// Attempt to synthesize or load in main fragment folder
|
||||
Collection<AsmFragmentTemplate> candidates = getBestTemplates(signature, log);
|
||||
if(candidates.size() == 0) {
|
||||
if(log.isVerboseFragmentLog()) {
|
||||
log.append("Unknown fragment " + signature);
|
||||
}
|
||||
bestFragmentCache.put(signature, UNKNOWN);
|
||||
bestFragmentCache.put(signature, NO_SYNTHESIS);
|
||||
throw new UnknownFragmentException(signature);
|
||||
}
|
||||
double minScore = Double.MAX_VALUE;
|
||||
@ -126,6 +142,82 @@ public class AsmFragmentTemplateSynthesizer {
|
||||
return bestTemplate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to load a fragment cache containing all best synthesized fragments
|
||||
*
|
||||
* @param cacheFolder Folder containing the cache
|
||||
* @param log The compile log
|
||||
* @return The map with all best fragments from the cache file. null if the cache file is not found.
|
||||
*/
|
||||
private Map<String, AsmFragmentTemplate> loadBestFragmentCache(Path cacheFolder, CompileLog log) {
|
||||
if(cacheFolder == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
File cacheFile = cacheFolder.resolve(FRAGMENT_CACHE_FILE).toFile();
|
||||
if(!cacheFile.exists()) {
|
||||
return null;
|
||||
}
|
||||
LinkedHashMap<String, AsmFragmentTemplate> bestFragmentCache = new LinkedHashMap<>();
|
||||
BufferedReader fragmentCacheReader = new BufferedReader(new FileReader(cacheFile));
|
||||
String cacheLine = fragmentCacheReader.readLine();
|
||||
StringBuilder body = null;
|
||||
String signature = null;
|
||||
while(cacheLine != null) {
|
||||
// Determine if the line is a new fragment or the continuation of the current fragment body
|
||||
if(cacheLine.startsWith("//FRAGMENT ")) {
|
||||
// New fragment - first put the current one into the cache
|
||||
if(signature != null) {
|
||||
CharStream fragmentCharStream = CharStreams.fromString(body.toString());
|
||||
AsmFragmentTemplate template = new AsmFragmentTemplate(signature, fixNewlines(fragmentCharStream.toString()), true);
|
||||
bestFragmentCache.put(signature, template);
|
||||
}
|
||||
body = new StringBuilder();
|
||||
signature = cacheLine.substring(11);
|
||||
} else {
|
||||
// Continuation of body
|
||||
body.append(cacheLine).append("\n");
|
||||
}
|
||||
cacheLine = fragmentCacheReader.readLine();
|
||||
}
|
||||
if(log.isVerboseFragmentLog())
|
||||
log.append("Loaded cached fragments " + bestFragmentCache.size() + " from " + cacheFile.getPath());
|
||||
return bestFragmentCache;
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException("Error loading fragment cache file " + fragmentFolder, e);
|
||||
} catch(StringIndexOutOfBoundsException e) {
|
||||
throw new RuntimeException("Problem reading fragment file " + fragmentFolder, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to save fragment cache containing all best synthesized fragments
|
||||
*
|
||||
* @param log The compile log
|
||||
*/
|
||||
public void saveBestFragmentCache(CompileLog log) {
|
||||
if(this.cacheFolder == null) {
|
||||
return;
|
||||
}
|
||||
File cacheFile = this.cacheFolder.resolve(FRAGMENT_CACHE_FILE).toFile();
|
||||
try {
|
||||
PrintStream fragmentFilePrint = new PrintStream(cacheFile);
|
||||
for(String signature : this.bestFragmentCache.keySet()) {
|
||||
AsmFragmentTemplate fragmentTemplate = this.bestFragmentCache.get(signature);
|
||||
fragmentFilePrint.println("//FRAGMENT " + signature);
|
||||
if(fragmentTemplate.getBody()!=null)
|
||||
fragmentFilePrint.println(fragmentTemplate.getBody());
|
||||
}
|
||||
fragmentFilePrint.close();
|
||||
if(log.isVerboseFragmentLog())
|
||||
log.append("Saved cached fragments " + this.bestFragmentCache.size() + " to " + cacheFile.getPath());
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException("Error saving fragment cache file " + cacheFile, e);
|
||||
} catch(StringIndexOutOfBoundsException e) {
|
||||
throw new RuntimeException("Problem saving fragment file " + cacheFile, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the best fragment templates for a signature.
|
||||
* The templates are either loaded or synthesized from other templates.
|
||||
@ -375,9 +467,6 @@ public class AsmFragmentTemplateSynthesizer {
|
||||
return synthesisGraph.get(signature);
|
||||
}
|
||||
|
||||
/** Number of synthesis created
|
||||
private long synthesisCount = 0;
|
||||
|
||||
/**
|
||||
* Get (or create) the synthesis used to synthesize a fragment template.
|
||||
* If the synthesis does not already exist in the synthesis graph it is created - along with any sub-synthesis recursively usable for creating it.
|
||||
@ -504,13 +593,14 @@ public class AsmFragmentTemplateSynthesizer {
|
||||
* @return The fragment template from a file. null if the template is not found as a file.
|
||||
*/
|
||||
private AsmFragmentTemplate loadFragmentTemplate(String signature, CompileLog log) {
|
||||
if(fragmentFolder == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
File fragmentFile = new File(fragmentFolder + signature + ".asm");
|
||||
//System.out.println("looking for "+fragmentFile);
|
||||
File fragmentFile = this.fragmentFolder.resolve(signature + ".asm").toFile();
|
||||
if(!fragmentFile.exists()) {
|
||||
return null;
|
||||
}
|
||||
//System.out.println("found "+fragmentFile);
|
||||
InputStream fragmentStream = new FileInputStream(fragmentFile);
|
||||
String body;
|
||||
if(fragmentStream.available() == 0) {
|
||||
@ -520,7 +610,7 @@ public class AsmFragmentTemplateSynthesizer {
|
||||
body = fixNewlines(fragmentCharStream.toString());
|
||||
|
||||
}
|
||||
return new AsmFragmentTemplate(signature, body);
|
||||
return new AsmFragmentTemplate(signature, body, false);
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException("Error loading fragment file " + signature, e);
|
||||
} catch(StringIndexOutOfBoundsException e) {
|
||||
@ -545,7 +635,7 @@ public class AsmFragmentTemplateSynthesizer {
|
||||
}
|
||||
|
||||
File[] allFragmentFiles() {
|
||||
return new File(fragmentFolder).listFiles((dir, name) -> name.endsWith(".asm"));
|
||||
return fragmentFolder.toFile().listFiles((dir, name) -> name.endsWith(".asm"));
|
||||
|
||||
}
|
||||
|
||||
|
@ -187,7 +187,15 @@ public class AsmFragmentTemplateUsages {
|
||||
}
|
||||
|
||||
public static void logTemplate(CompileLog log, AsmFragmentTemplate template, String indent) {
|
||||
log.append(indent + (template.isFile() ? "*" : "") + template.getName() + " - clobber:" + template.getClobber().toString() + " cycles:" + template.getCycles());
|
||||
String prefix = "";
|
||||
if(template.isCache()) {
|
||||
prefix = "cached ";
|
||||
} else if(template.isFile()) {
|
||||
prefix ="loaded ";
|
||||
} else {
|
||||
prefix ="synthesized ";
|
||||
}
|
||||
log.append(indent + prefix + template.getName() + " - clobber:" + template.getClobber().toString() + " cycles:" + template.getCycles());
|
||||
log.append(indent+ " " + template.getBody().replace("\n", "\n"+indent+" "));
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@ import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
|
||||
@ -20,7 +21,7 @@ public class TestFragments {
|
||||
|
||||
@BeforeClass
|
||||
public static void setUp() {
|
||||
AsmFragmentTemplateSynthesizer.initialize("src/main/fragment/");
|
||||
AsmFragmentTemplateSynthesizer.initialize(new File("src/main/fragment/").toPath(), null, new CompileLog());
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
@ -181,8 +182,8 @@ public class TestFragments {
|
||||
* @param signature The fragment signature
|
||||
*/
|
||||
private void testFragmentExists(String signature) {
|
||||
AsmFragmentTemplateSynthesizer.initialize("src/main/fragment/");
|
||||
CompileLog log = new CompileLog();
|
||||
AsmFragmentTemplateSynthesizer.initialize(new File("src/main/fragment/").toPath(), null, log);
|
||||
log.setSysOut(true);
|
||||
//log.setVerboseFragmentLog(true);
|
||||
List<AsmFragmentTemplate> templates =
|
||||
@ -199,8 +200,8 @@ public class TestFragments {
|
||||
|
||||
|
||||
private void testFragments(String fileName, Collection<String> signatures) throws IOException {
|
||||
AsmFragmentTemplateSynthesizer.initialize("src/main/fragment/");
|
||||
CompileLog log = new CompileLog();
|
||||
AsmFragmentTemplateSynthesizer.initialize(new File("src/main/fragment/").toPath(), null, log);
|
||||
List<String> sigs = new ArrayList<>(signatures);
|
||||
|
||||
// Always test max 1000 signatures
|
||||
@ -224,7 +225,16 @@ public class TestFragments {
|
||||
}
|
||||
|
||||
for(AsmFragmentTemplate template : templates) {
|
||||
log.append((template.isFile() ? "*" : "") + template.getName() + " - clobber:" + template.getClobber().toString() + " cycles:" + template.getCycles());
|
||||
String prefix = "";
|
||||
if(template.isCache()) {
|
||||
prefix = "cached ";
|
||||
} else if(template.isFile()) {
|
||||
prefix ="loaded ";
|
||||
} else {
|
||||
prefix ="synthesized ";
|
||||
}
|
||||
|
||||
log.append(prefix + template.getName() + " - clobber:" + template.getClobber().toString() + " cycles:" + template.getCycles());
|
||||
log.append(" " + template.getBody().replace("\n", "\n "));
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,6 @@ import dk.camelot64.kickc.CompileLog;
|
||||
import dk.camelot64.kickc.Compiler;
|
||||
import dk.camelot64.kickc.asm.AsmProgram;
|
||||
import dk.camelot64.kickc.fragment.AsmFragmentTemplateSynthesizer;
|
||||
import dk.camelot64.kickc.fragment.AsmFragmentTemplateUsages;
|
||||
import dk.camelot64.kickc.model.CompileError;
|
||||
import dk.camelot64.kickc.model.Program;
|
||||
import kickass.KickAssembler;
|
||||
@ -2501,16 +2500,15 @@ public class TestPrograms {
|
||||
|
||||
@BeforeClass
|
||||
public static void setUp() {
|
||||
AsmFragmentTemplateSynthesizer.initialize("src/main/fragment/");
|
||||
AsmFragmentTemplateSynthesizer.initialize(new File("src/main/fragment/").toPath(), getFragmentCacheDir().toPath(), new CompileLog());
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void tearDown() {
|
||||
CompileLog log = log();
|
||||
AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false);
|
||||
|
||||
printGCStats();
|
||||
|
||||
AsmFragmentTemplateSynthesizer.finalize(log);
|
||||
//AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false);
|
||||
//printGCStats();
|
||||
}
|
||||
|
||||
public static void printGCStats() {
|
||||
@ -2676,7 +2674,7 @@ public class TestPrograms {
|
||||
*
|
||||
* @param file The file to create a path for
|
||||
*/
|
||||
private void mkPath(File file) {
|
||||
private static void mkPath(File file) {
|
||||
Path parent = file.toPath().getParent();
|
||||
File dir = parent.toFile();
|
||||
if(!dir.exists()) {
|
||||
@ -2685,7 +2683,7 @@ public class TestPrograms {
|
||||
}
|
||||
}
|
||||
|
||||
public File getBinDir() {
|
||||
public static File getBinDir() {
|
||||
Path tempDir = ReferenceHelper.getTempDir();
|
||||
File binDir = new File(tempDir.toFile(), "bin");
|
||||
if(!binDir.exists()) {
|
||||
@ -2694,5 +2692,13 @@ public class TestPrograms {
|
||||
return binDir;
|
||||
}
|
||||
|
||||
public static File getFragmentCacheDir() {
|
||||
Path tempDir = ReferenceHelper.getTempDir();
|
||||
File binDir = new File(tempDir.toFile(), "cache");
|
||||
if(!binDir.exists()) {
|
||||
binDir.mkdir();
|
||||
}
|
||||
return binDir;
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,17 +1,17 @@
|
||||
vbuz1=pbuz2_derefidx_vbuc1_band_pbuz3_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc2_band_pbuz2_derefidx_vbuc1 < vbuaa=pbuz2_derefidx_vbuc1_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuyy_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuc2_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:18.0
|
||||
synthesized vbuz1=pbuz2_derefidx_vbuc1_band_pbuz3_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc2_band_pbuz2_derefidx_vbuc1 < vbuaa=pbuz2_derefidx_vbuc1_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuyy_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuc2_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:18.0
|
||||
ldy #{c1}
|
||||
lda ({z2}),y
|
||||
ldy #{c2}
|
||||
and ({z3}),y
|
||||
sta {z1}
|
||||
pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz1_band_pbuz3_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuz1_band_pbuz3_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz2_band_pbuz3_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz3_derefidx_vbuc2_band_pbuz1_derefidx_vbuz2 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2_band_pbuz2_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuz3_band_pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz3_band_pbuz2_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz3_band_pbuz2_derefidx_vbuyy < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz2_band_pbuz3_derefidx_vbuyy < pbuc1_derefidx_vbuxx=pbuz3_derefidx_vbuyy_band_pbuz1_derefidx_vbuz2 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuyy_band_pbuz1_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuz3_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz2_derefidx_vbuz3_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuz2_band_vbuaa < vbuaa=pbuz1_derefidx_vbuyy_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A X Y cycles:24.0
|
||||
synthesized pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz1_band_pbuz3_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuz1_band_pbuz3_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz2_band_pbuz3_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz3_derefidx_vbuc2_band_pbuz1_derefidx_vbuz2 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2_band_pbuz2_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuz3_band_pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz3_band_pbuz2_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz3_band_pbuz2_derefidx_vbuyy < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz2_band_pbuz3_derefidx_vbuyy < pbuc1_derefidx_vbuxx=pbuz3_derefidx_vbuyy_band_pbuz1_derefidx_vbuz2 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuyy_band_pbuz1_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz2_derefidx_vbuz3_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz2_derefidx_vbuz3_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuz2_band_vbuaa < vbuaa=pbuz1_derefidx_vbuyy_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A X Y cycles:24.0
|
||||
ldx {z1}
|
||||
ldy #{c2}
|
||||
lda ({z3}),y
|
||||
ldy {z1}
|
||||
and ({z2}),y
|
||||
sta {c1},x
|
||||
pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz1_band_pbuz3_derefidx_vbuc2 < pbuc1_derefidx_vbuyy=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < pbuc1_derefidx_vbuyy=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < pbuc1_derefidx_vbuyy=pbuz1_derefidx_vbuc2_band_vbuaa < pbuc1_derefidx_vbuyy=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:27.0
|
||||
synthesized pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz1_band_pbuz3_derefidx_vbuc2 < pbuc1_derefidx_vbuyy=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < pbuc1_derefidx_vbuyy=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < pbuc1_derefidx_vbuyy=pbuz1_derefidx_vbuc2_band_vbuaa < pbuc1_derefidx_vbuyy=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:27.0
|
||||
ldy {z1}
|
||||
lda ({z2}),y
|
||||
sty $ff
|
||||
@ -20,20 +20,20 @@ pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz1_band_pbuz3_derefidx_vbuc2 < pbuc1_dere
|
||||
and ({z3}),y
|
||||
ldy $ff
|
||||
sta {c1},y
|
||||
vbuxx=pbuz1_derefidx_vbuc1_band_pbuz2_derefidx_vbuc2 < vbuxx=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuc1 < vbuxx=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < vbuxx=pbuz1_derefidx_vbuc2_band_vbuaa < vbuxx=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuxx=vbuaa_band_pbuz1_derefidx_vbuyy < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A X Y cycles:17.0
|
||||
synthesized vbuxx=pbuz1_derefidx_vbuc1_band_pbuz2_derefidx_vbuc2 < vbuxx=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuc1 < vbuxx=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < vbuxx=pbuz1_derefidx_vbuc2_band_vbuaa < vbuxx=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuxx=vbuaa_band_pbuz1_derefidx_vbuyy < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A X Y cycles:17.0
|
||||
ldy #{c1}
|
||||
lda ({z1}),y
|
||||
ldy #{c2}
|
||||
and ({z2}),y
|
||||
tax
|
||||
_deref_pbuz1=pbuz2_derefidx_vbuc1_band_pbuz3_derefidx_vbuc2 < _deref_pbuz1=pbuz3_derefidx_vbuc2_band_pbuz2_derefidx_vbuc1 < _deref_pbuz1=pbuz2_derefidx_vbuc2_band_pbuz3_derefidx_vbuc1 < _deref_pbuz1=pbuz3_derefidx_vbuc1_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc1_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuyy_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuc2_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:23.0
|
||||
synthesized _deref_pbuz1=pbuz2_derefidx_vbuc1_band_pbuz3_derefidx_vbuc2 < _deref_pbuz1=pbuz3_derefidx_vbuc2_band_pbuz2_derefidx_vbuc1 < _deref_pbuz1=pbuz2_derefidx_vbuc2_band_pbuz3_derefidx_vbuc1 < _deref_pbuz1=pbuz3_derefidx_vbuc1_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc1_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuyy_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuc2_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:23.0
|
||||
ldy #{c1}
|
||||
lda ({z2}),y
|
||||
ldy #{c2}
|
||||
and ({z3}),y
|
||||
ldy #0
|
||||
sta ({z1}),y
|
||||
pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuc1_band_pbuz3_derefidx_vbuc2 < pbuz1_derefidx_vbuaa=pbuz3_derefidx_vbuc2_band_pbuz2_derefidx_vbuc1 < pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuc2_band_pbuz3_derefidx_vbuc1 < pbuz1_derefidx_vbuaa=pbuz3_derefidx_vbuc1_band_pbuz2_derefidx_vbuc2 < pbuz1_derefidx_vbuaa=pbuz3_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuyy_band_pbuz3_derefidx_vbuc2 < pbuz1_derefidx_vbuaa=pbuz3_derefidx_vbuc2_band_pbuz2_derefidx_vbuyy < pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuc2_band_pbuz3_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuc2_band_pbuz2_derefidx_vbuyy < vbuaa=pbuz2_derefidx_vbuyy_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuc2_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:27.0
|
||||
synthesized pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuc1_band_pbuz3_derefidx_vbuc2 < pbuz1_derefidx_vbuaa=pbuz3_derefidx_vbuc2_band_pbuz2_derefidx_vbuc1 < pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuc2_band_pbuz3_derefidx_vbuc1 < pbuz1_derefidx_vbuaa=pbuz3_derefidx_vbuc1_band_pbuz2_derefidx_vbuc2 < pbuz1_derefidx_vbuaa=pbuz3_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuyy_band_pbuz3_derefidx_vbuc2 < pbuz1_derefidx_vbuaa=pbuz3_derefidx_vbuc2_band_pbuz2_derefidx_vbuyy < pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuc2_band_pbuz3_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuc2_band_pbuz2_derefidx_vbuyy < vbuaa=pbuz2_derefidx_vbuyy_band_pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuyy_band_pbuz2_derefidx_vbuc2 < vbuaa=pbuz2_derefidx_vbuc2_band_pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuc2_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuc2 < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:27.0
|
||||
ldy #{c1}
|
||||
sta $ff
|
||||
lda ({z2}),y
|
||||
@ -41,7 +41,7 @@ pbuz1_derefidx_vbuaa=pbuz2_derefidx_vbuc1_band_pbuz3_derefidx_vbuc2 < pbuz1_dere
|
||||
and ({z3}),y
|
||||
ldy $ff
|
||||
sta ({z1}),y
|
||||
pbuc1_derefidx_pbuz1_derefidx_vbuc2=pbuz1_derefidx_vbuc3 < pbuc1_derefidx_pbuz1_derefidx_vbuc2=pbuz1_derefidx_vbuyy < pbuc1_derefidx_pbuz1_derefidx_vbuc2=vbuaa < pbuc1_derefidx_pbuz1_derefidx_vbuyy=vbuaa - clobber:A Y cycles:29.0
|
||||
synthesized pbuc1_derefidx_pbuz1_derefidx_vbuc2=pbuz1_derefidx_vbuc3 < pbuc1_derefidx_pbuz1_derefidx_vbuc2=pbuz1_derefidx_vbuyy < pbuc1_derefidx_pbuz1_derefidx_vbuc2=vbuaa < pbuc1_derefidx_pbuz1_derefidx_vbuyy=vbuaa - clobber:A Y cycles:29.0
|
||||
ldy #{c3}
|
||||
lda ({z1}),y
|
||||
ldy #{c2}
|
||||
|
Loading…
x
Reference in New Issue
Block a user