in benchmarks/JetStream2/wasm/TSF/tsf_ir_speed.c [48:250]
static void writeTest(const char *filename,
unsigned programSize, unsigned numPrograms,
tsf_zip_mode_t zipMode) {
tsf_zip_wtr_attr_t zipAttributes;
tsf_stream_file_output_t *out;
unsigned programIndex;
char buf[256];
CT(tsf_zip_wtr_attr_get_for_mode(&zipAttributes, zipMode));
CT(out = tsf_stream_file_output_open(filename, tsf_false, &zipAttributes));
for (programIndex = 0; programIndex < numPrograms; ++programIndex) {
const unsigned numDecls = 25;
const unsigned numDefns = 25;
Program_t *program;
unsigned elementIndex;
CS(program = tsf_region_create(sizeof(Program_t)));
program->globals.len = numDecls + numDefns;
CS(program->globals.data = tsf_region_alloc(
program, sizeof(ProgramElement_t) * program->globals.len));
for (elementIndex = 0; elementIndex < numDecls; ++elementIndex) {
ProgramElement_t *element;
ProcedureDecl_t *procedure;
element = program->globals.data + elementIndex;
element->value = ProgramElement__procedureDecl;
procedure = &element->u.procedureDecl;
snprintf(buf, sizeof(buf), "foo%u", elementIndex);
procedure->name = tsf_region_strdup(program, buf);
}
for (elementIndex = numDecls;
elementIndex < numDecls + numDefns;
++elementIndex) {
ProgramElement_t *element;
ProcedureDefn_t *procedure;
unsigned numVariables = (programIndex % programSize) + 1;
unsigned numInstructions = (programIndex % programSize) * 2 + 1;
unsigned numDebugDatas = (numInstructions + 5) / 6;
unsigned variableIndex;
unsigned instructionIndex;
unsigned debugDataIndex;
element = program->globals.data + elementIndex;
element->value = ProgramElement__procedureDefn;
procedure = &element->u.procedureDefn;
snprintf(buf, sizeof(buf), "bar%u", elementIndex);
procedure->name = tsf_region_strdup(program, buf);
procedure->variables.len = numVariables;
CS(procedure->variables.data = tsf_region_alloc(
program, sizeof(VariableDecl_t) * numVariables));
for (variableIndex = 0; variableIndex < numVariables; ++variableIndex) {
VariableDecl_t *variable;
variable = procedure->variables.data + variableIndex;
switch ((variableIndex + programIndex) % 3) {
case 0:
variable->type = "foo";
break;
case 1:
variable->type = "bar";
break;
case 2:
variable->type = "baz";
break;
default:
abort();
break;
}
snprintf(buf, sizeof(buf), "x%u", variableIndex);
variable->name = tsf_region_strdup(program, buf);
}
procedure->code.len = numInstructions;
CS(procedure->code.data = tsf_region_alloc(
program, sizeof(Instruction_t) * numInstructions));
for (instructionIndex = 0;
instructionIndex < numInstructions;
++instructionIndex) {
Instruction_t *instruction;
instruction = procedure->code.data + instructionIndex;
switch ((instructionIndex + programIndex) % 8) {
case Instruction__nop: {
instruction->value = Instruction__nop;
break;
}
case Instruction__mov: {
instruction->value = Instruction__mov;
instruction->u.mov.dest =
(instructionIndex + programIndex) % numVariables;
instruction->u.mov.src =
(instructionIndex + programIndex + 1) % numVariables;
break;
}
case Instruction__add: {
instruction->value = Instruction__add;
instruction->u.add.dest =
(instructionIndex + programIndex + 2) % numVariables;
instruction->u.add.src =
(instructionIndex + programIndex + 3) % numVariables;
break;
}
case Instruction__alloc: {
instruction->value = Instruction__alloc;
snprintf(buf, sizeof(buf), "t%u", instructionIndex + programIndex);
instruction->u.alloc.type = tsf_region_strdup(program, buf);
break;
}
case Instruction__ret: {
instruction->value = Instruction__ret;
instruction->u.ret.src =
(instructionIndex + programIndex + 4) % numVariables;
break;
}
case Instruction__jump: {
instruction->value = Instruction__jump;
instruction->u.jump.target =
(instructionIndex + programIndex) % numInstructions;
break;
}
case Instruction__call: {
unsigned numArgs = (instructionIndex + programIndex) % 10;
unsigned argIndex;
instruction->value = Instruction__call;
instruction->u.call.dest =
(instructionIndex + programIndex + 7) % numVariables;
instruction->u.call.callee =
((instructionIndex + programIndex) %
(numVariables + numDecls + numDefns)) -
numDecls - numDefns;
instruction->u.call.args.len = numArgs;
CS(instruction->u.call.args.data = tsf_region_alloc(
program, sizeof(Operand_t) * numArgs));
for (argIndex = 0; argIndex < numArgs; ++argIndex) {
instruction->u.call.args.data[argIndex] =
(instructionIndex + programIndex + argIndex) % numVariables;
}
break;
}
case Instruction__branchZero: {
instruction->value = Instruction__branchZero;
instruction->u.branchZero.src =
(instructionIndex + programIndex + 5) % numVariables;
instruction->u.branchZero.target =
(instructionIndex + programIndex + 6) % numInstructions;
break;
}
default:
abort();
break;
}
}
procedure->debug.len = numDebugDatas;
CS(procedure->debug.data = tsf_region_alloc(
program, sizeof(DebugData_t) * numDebugDatas));
for (debugDataIndex = 0; debugDataIndex < numDebugDatas; ++debugDataIndex) {
DebugData_t *debugData;
debugData = procedure->debug.data + debugDataIndex;
debugData->startOffset = debugDataIndex;
debugData->spanSize = 1;
snprintf(buf, sizeof(buf), "debug%u", debugDataIndex);
debugData->data = tsf_region_strdup(program, buf);
}
}
Program__write(out, program);
tsf_region_free(program);
}
CT(tsf_stream_file_output_close(out));
}