summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2014-11-08 13:23:12 +0000
committerTim-Philipp Müller <tim@centricular.com>2014-11-08 13:48:42 +0000
commit463295f6486badafa389008c0339386e2bf9d4c9 (patch)
treedd71385d3bffca4bceb75f15f9b00d44364933cc /tools
parent85f79a8a4ecf6f22e5c334d6ad0222502e37a5eb (diff)
orcc: program-c: fix 64-bit parameter loading (loadpq) on big-endian systems
When passing 64-bit parameters through OrcExecutor, we have to split them up into two 32-bit parameters for backwards compatibility reasons. When generating C code, make sure that we split up 64-bit parameters in the same way as loadpq will read them back later. The lower 32 bits should end up in params[ORC_VAR_D1+i] and the higher bits should end up in params[ORC_VAR_T1+i]. The way it was done so far, the higher/lower bits ended up swapped on big endian systems, and then got deserialised in swapped order by loadpq. This resulted in bogus parameters being used. In particular, this broke the gstreamer volume element and its unit tests on big endian systems when handling samples in F64 format (i.e. doubles). https://bugzilla.gnome.org/show_bug.cgi?id=739354
Diffstat (limited to 'tools')
-rw-r--r--tools/orcc.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/tools/orcc.c b/tools/orcc.c
index d25b548..fdab530 100644
--- a/tools/orcc.c
+++ b/tools/orcc.c
@@ -843,9 +843,9 @@ output_code_execute (OrcProgram *p, FILE *output, int is_inline)
fprintf(output, " {\n");
fprintf(output, " orc_union64 tmp;\n");
fprintf(output, " tmp.i = %s;\n", varnames[ORC_VAR_P1 + i]);
- fprintf(output, " ex->params[%s] = tmp.x2[0];\n",
+ fprintf(output, " ex->params[%s] = ((orc_uint64) tmp.i) & 0xffffffff;\n",
enumnames[ORC_VAR_P1 + i]);
- fprintf(output, " ex->params[%s] = tmp.x2[1];\n",
+ fprintf(output, " ex->params[%s] = ((orc_uint64) tmp.i) >> 32;\n",
enumnames[ORC_VAR_T1 + i]);
fprintf(output, " }\n");
break;
@@ -854,9 +854,9 @@ output_code_execute (OrcProgram *p, FILE *output, int is_inline)
fprintf(output, " {\n");
fprintf(output, " orc_union64 tmp;\n");
fprintf(output, " tmp.f = %s;\n", varnames[ORC_VAR_P1 + i]);
- fprintf(output, " ex->params[%s] = tmp.x2[0];\n",
+ fprintf(output, " ex->params[%s] = ((orc_uint64) tmp.i) & 0xffffffff;\n",
enumnames[ORC_VAR_P1 + i]);
- fprintf(output, " ex->params[%s] = tmp.x2[1];\n",
+ fprintf(output, " ex->params[%s] = ((orc_uint64) tmp.i) >> 32;\n",
enumnames[ORC_VAR_T1 + i]);
fprintf(output, " }\n");
break;