audioconvert: Simplify float->s32 conversion

orc 0.4.7 is doing saturated conversion from floats to integers
and it's not necessary to do this manually anymore.
This commit is contained in:
Sebastian Dröge 2010-09-05 12:57:36 +02:00
parent 3544d82192
commit 65e5984634
2 changed files with 74 additions and 182 deletions

View File

@ -1328,69 +1328,54 @@ orc_audio_convert_unpack_float_s32 (guint32 * d1, const gfloat * s1, int n)
int i; int i;
orc_union32 *ORC_RESTRICT ptr0; orc_union32 *ORC_RESTRICT ptr0;
const orc_union32 *ORC_RESTRICT ptr4; const orc_union32 *ORC_RESTRICT ptr4;
orc_union32 var33;
orc_union32 var34;
orc_union32 var35;
orc_union32 var36; orc_union32 var36;
orc_union32 var37; orc_union32 var37;
orc_union32 var38; orc_union32 var38;
orc_union32 var39;
orc_union32 var40;
orc_union32 var41;
orc_union32 var42;
orc_union32 var43;
orc_union32 var44;
orc_union32 var45;
orc_union32 var46;
ptr0 = (orc_union32 *) d1; ptr0 = (orc_union32 *) d1;
ptr4 = (orc_union32 *) s1; ptr4 = (orc_union32 *) s1;
/* 1: loadpl */ /* 1: loadpl */
var36.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */ var33.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
/* 3: loadpl */ /* 3: loadpl */
var37.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */ var34.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
/* 6: loadpl */
var38.i = 0x80000000; /* -2147483648 or -nanf */
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
/* 0: loadl */ /* 0: loadl */
var40 = ptr4[i]; var36 = ptr4[i];
/* 2: mulf */ /* 2: mulf */
{ {
orc_union32 _src1; orc_union32 _src1;
orc_union32 _src2; orc_union32 _src2;
orc_union32 _dest1; orc_union32 _dest1;
_src1.i = ORC_DENORMAL (var40.i); _src1.i = ORC_DENORMAL (var36.i);
_src2.i = ORC_DENORMAL (var36.i); _src2.i = ORC_DENORMAL (var33.i);
_dest1.f = _src1.f * _src2.f; _dest1.f = _src1.f * _src2.f;
var41.i = ORC_DENORMAL (_dest1.i); var37.i = ORC_DENORMAL (_dest1.i);
} }
/* 4: addf */ /* 4: addf */
{ {
orc_union32 _src1; orc_union32 _src1;
orc_union32 _src2; orc_union32 _src2;
orc_union32 _dest1; orc_union32 _dest1;
_src1.i = ORC_DENORMAL (var41.i); _src1.i = ORC_DENORMAL (var37.i);
_src2.i = ORC_DENORMAL (var37.i); _src2.i = ORC_DENORMAL (var34.i);
_dest1.f = _src1.f + _src2.f; _dest1.f = _src1.f + _src2.f;
var42.i = ORC_DENORMAL (_dest1.i); var38.i = ORC_DENORMAL (_dest1.i);
} }
/* 5: convfl */ /* 5: convfl */
{ {
int tmp; int tmp;
tmp = (int) var42.f; tmp = (int) var38.f;
if (tmp == 0x80000000 && !(var42.i & 0x80000000)) if (tmp == 0x80000000 && !(var38.i & 0x80000000))
tmp = 0x7fffffff; tmp = 0x7fffffff;
var43.i = tmp; var35.i = tmp;
} }
/* 7: cmpeql */ /* 6: storel */
var44.i = (var43.i == var38.i) ? (~0) : 0; ptr0[i] = var35;
/* 8: shrsl */
var45.i = var42.i >> 31;
/* 9: andnl */
var46.i = (~var45.i) & var44.i;
/* 10: addl */
var39.i = var43.i + var46.i;
/* 11: storel */
ptr0[i] = var39;
} }
} }
@ -1403,69 +1388,54 @@ _backup_orc_audio_convert_unpack_float_s32 (OrcExecutor * ORC_RESTRICT ex)
int n = ex->n; int n = ex->n;
orc_union32 *ORC_RESTRICT ptr0; orc_union32 *ORC_RESTRICT ptr0;
const orc_union32 *ORC_RESTRICT ptr4; const orc_union32 *ORC_RESTRICT ptr4;
orc_union32 var33;
orc_union32 var34;
orc_union32 var35;
orc_union32 var36; orc_union32 var36;
orc_union32 var37; orc_union32 var37;
orc_union32 var38; orc_union32 var38;
orc_union32 var39;
orc_union32 var40;
orc_union32 var41;
orc_union32 var42;
orc_union32 var43;
orc_union32 var44;
orc_union32 var45;
orc_union32 var46;
ptr0 = (orc_union32 *) ex->arrays[0]; ptr0 = (orc_union32 *) ex->arrays[0];
ptr4 = (orc_union32 *) ex->arrays[4]; ptr4 = (orc_union32 *) ex->arrays[4];
/* 1: loadpl */ /* 1: loadpl */
var36.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */ var33.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
/* 3: loadpl */ /* 3: loadpl */
var37.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */ var34.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
/* 6: loadpl */
var38.i = 0x80000000; /* -2147483648 or -nanf */
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
/* 0: loadl */ /* 0: loadl */
var40 = ptr4[i]; var36 = ptr4[i];
/* 2: mulf */ /* 2: mulf */
{ {
orc_union32 _src1; orc_union32 _src1;
orc_union32 _src2; orc_union32 _src2;
orc_union32 _dest1; orc_union32 _dest1;
_src1.i = ORC_DENORMAL (var40.i); _src1.i = ORC_DENORMAL (var36.i);
_src2.i = ORC_DENORMAL (var36.i); _src2.i = ORC_DENORMAL (var33.i);
_dest1.f = _src1.f * _src2.f; _dest1.f = _src1.f * _src2.f;
var41.i = ORC_DENORMAL (_dest1.i); var37.i = ORC_DENORMAL (_dest1.i);
} }
/* 4: addf */ /* 4: addf */
{ {
orc_union32 _src1; orc_union32 _src1;
orc_union32 _src2; orc_union32 _src2;
orc_union32 _dest1; orc_union32 _dest1;
_src1.i = ORC_DENORMAL (var41.i); _src1.i = ORC_DENORMAL (var37.i);
_src2.i = ORC_DENORMAL (var37.i); _src2.i = ORC_DENORMAL (var34.i);
_dest1.f = _src1.f + _src2.f; _dest1.f = _src1.f + _src2.f;
var42.i = ORC_DENORMAL (_dest1.i); var38.i = ORC_DENORMAL (_dest1.i);
} }
/* 5: convfl */ /* 5: convfl */
{ {
int tmp; int tmp;
tmp = (int) var42.f; tmp = (int) var38.f;
if (tmp == 0x80000000 && !(var42.i & 0x80000000)) if (tmp == 0x80000000 && !(var38.i & 0x80000000))
tmp = 0x7fffffff; tmp = 0x7fffffff;
var43.i = tmp; var35.i = tmp;
} }
/* 7: cmpeql */ /* 6: storel */
var44.i = (var43.i == var38.i) ? (~0) : 0; ptr0[i] = var35;
/* 8: shrsl */
var45.i = var42.i >> 31;
/* 9: andnl */
var46.i = (~var45.i) & var44.i;
/* 10: addl */
var39.i = var43.i + var46.i;
/* 11: storel */
ptr0[i] = var39;
} }
} }
@ -1491,12 +1461,7 @@ orc_audio_convert_unpack_float_s32 (guint32 * d1, const gfloat * s1, int n)
orc_program_add_source (p, 4, "s1"); orc_program_add_source (p, 4, "s1");
orc_program_add_constant (p, 4, 0x4f000000, "c1"); orc_program_add_constant (p, 4, 0x4f000000, "c1");
orc_program_add_constant (p, 4, 0x3f000000, "c2"); orc_program_add_constant (p, 4, 0x3f000000, "c2");
orc_program_add_constant (p, 4, 0x80000000, "c3");
orc_program_add_constant (p, 4, 0x0000001f, "c4");
orc_program_add_temporary (p, 4, "t1"); orc_program_add_temporary (p, 4, "t1");
orc_program_add_temporary (p, 4, "t2");
orc_program_add_temporary (p, 4, "t3");
orc_program_add_temporary (p, 4, "t4");
orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
ORC_VAR_D1); ORC_VAR_D1);
@ -1504,15 +1469,7 @@ orc_audio_convert_unpack_float_s32 (guint32 * d1, const gfloat * s1, int n)
ORC_VAR_D1); ORC_VAR_D1);
orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2, orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
ORC_VAR_D1); ORC_VAR_D1);
orc_program_append_2 (p, "convfl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, orc_program_append_2 (p, "convfl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
ORC_VAR_D1);
orc_program_append_2 (p, "cmpeql", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_C3,
ORC_VAR_D1);
orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T4, ORC_VAR_T1, ORC_VAR_C4,
ORC_VAR_D1);
orc_program_append_2 (p, "andnl", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T3,
ORC_VAR_D1);
orc_program_append_2 (p, "addl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T4,
ORC_VAR_D1); ORC_VAR_D1);
result = orc_program_compile (p); result = orc_program_compile (p);
@ -1540,72 +1497,57 @@ orc_audio_convert_unpack_float_s32_swap (guint32 * d1, const gfloat * s1, int n)
int i; int i;
orc_union32 *ORC_RESTRICT ptr0; orc_union32 *ORC_RESTRICT ptr0;
const orc_union32 *ORC_RESTRICT ptr4; const orc_union32 *ORC_RESTRICT ptr4;
orc_union32 var33;
orc_union32 var34;
orc_union32 var35;
orc_union32 var36; orc_union32 var36;
orc_union32 var37; orc_union32 var37;
orc_union32 var38; orc_union32 var38;
orc_union32 var39; orc_union32 var39;
orc_union32 var40;
orc_union32 var41;
orc_union32 var42;
orc_union32 var43;
orc_union32 var44;
orc_union32 var45;
orc_union32 var46;
orc_union32 var47;
ptr0 = (orc_union32 *) d1; ptr0 = (orc_union32 *) d1;
ptr4 = (orc_union32 *) s1; ptr4 = (orc_union32 *) s1;
/* 2: loadpl */ /* 2: loadpl */
var37.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */ var34.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
/* 4: loadpl */ /* 4: loadpl */
var38.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */ var35.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
/* 7: loadpl */
var39.i = 0x80000000; /* -2147483648 or -nanf */
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
/* 0: loadl */ /* 0: loadl */
var36 = ptr4[i]; var33 = ptr4[i];
/* 1: swapl */ /* 1: swapl */
var41.i = ORC_SWAP_L (var36.i); var37.i = ORC_SWAP_L (var33.i);
/* 3: mulf */ /* 3: mulf */
{ {
orc_union32 _src1; orc_union32 _src1;
orc_union32 _src2; orc_union32 _src2;
orc_union32 _dest1; orc_union32 _dest1;
_src1.i = ORC_DENORMAL (var41.i); _src1.i = ORC_DENORMAL (var37.i);
_src2.i = ORC_DENORMAL (var37.i); _src2.i = ORC_DENORMAL (var34.i);
_dest1.f = _src1.f * _src2.f; _dest1.f = _src1.f * _src2.f;
var42.i = ORC_DENORMAL (_dest1.i); var38.i = ORC_DENORMAL (_dest1.i);
} }
/* 5: addf */ /* 5: addf */
{ {
orc_union32 _src1; orc_union32 _src1;
orc_union32 _src2; orc_union32 _src2;
orc_union32 _dest1; orc_union32 _dest1;
_src1.i = ORC_DENORMAL (var42.i); _src1.i = ORC_DENORMAL (var38.i);
_src2.i = ORC_DENORMAL (var38.i); _src2.i = ORC_DENORMAL (var35.i);
_dest1.f = _src1.f + _src2.f; _dest1.f = _src1.f + _src2.f;
var43.i = ORC_DENORMAL (_dest1.i); var39.i = ORC_DENORMAL (_dest1.i);
} }
/* 6: convfl */ /* 6: convfl */
{ {
int tmp; int tmp;
tmp = (int) var43.f; tmp = (int) var39.f;
if (tmp == 0x80000000 && !(var43.i & 0x80000000)) if (tmp == 0x80000000 && !(var39.i & 0x80000000))
tmp = 0x7fffffff; tmp = 0x7fffffff;
var44.i = tmp; var36.i = tmp;
} }
/* 8: cmpeql */ /* 7: storel */
var45.i = (var44.i == var39.i) ? (~0) : 0; ptr0[i] = var36;
/* 9: shrsl */
var46.i = var43.i >> 31;
/* 10: andnl */
var47.i = (~var46.i) & var45.i;
/* 11: addl */
var40.i = var44.i + var47.i;
/* 12: storel */
ptr0[i] = var40;
} }
} }
@ -1618,72 +1560,57 @@ _backup_orc_audio_convert_unpack_float_s32_swap (OrcExecutor * ORC_RESTRICT ex)
int n = ex->n; int n = ex->n;
orc_union32 *ORC_RESTRICT ptr0; orc_union32 *ORC_RESTRICT ptr0;
const orc_union32 *ORC_RESTRICT ptr4; const orc_union32 *ORC_RESTRICT ptr4;
orc_union32 var33;
orc_union32 var34;
orc_union32 var35;
orc_union32 var36; orc_union32 var36;
orc_union32 var37; orc_union32 var37;
orc_union32 var38; orc_union32 var38;
orc_union32 var39; orc_union32 var39;
orc_union32 var40;
orc_union32 var41;
orc_union32 var42;
orc_union32 var43;
orc_union32 var44;
orc_union32 var45;
orc_union32 var46;
orc_union32 var47;
ptr0 = (orc_union32 *) ex->arrays[0]; ptr0 = (orc_union32 *) ex->arrays[0];
ptr4 = (orc_union32 *) ex->arrays[4]; ptr4 = (orc_union32 *) ex->arrays[4];
/* 2: loadpl */ /* 2: loadpl */
var37.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */ var34.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
/* 4: loadpl */ /* 4: loadpl */
var38.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */ var35.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
/* 7: loadpl */
var39.i = 0x80000000; /* -2147483648 or -nanf */
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
/* 0: loadl */ /* 0: loadl */
var36 = ptr4[i]; var33 = ptr4[i];
/* 1: swapl */ /* 1: swapl */
var41.i = ORC_SWAP_L (var36.i); var37.i = ORC_SWAP_L (var33.i);
/* 3: mulf */ /* 3: mulf */
{ {
orc_union32 _src1; orc_union32 _src1;
orc_union32 _src2; orc_union32 _src2;
orc_union32 _dest1; orc_union32 _dest1;
_src1.i = ORC_DENORMAL (var41.i); _src1.i = ORC_DENORMAL (var37.i);
_src2.i = ORC_DENORMAL (var37.i); _src2.i = ORC_DENORMAL (var34.i);
_dest1.f = _src1.f * _src2.f; _dest1.f = _src1.f * _src2.f;
var42.i = ORC_DENORMAL (_dest1.i); var38.i = ORC_DENORMAL (_dest1.i);
} }
/* 5: addf */ /* 5: addf */
{ {
orc_union32 _src1; orc_union32 _src1;
orc_union32 _src2; orc_union32 _src2;
orc_union32 _dest1; orc_union32 _dest1;
_src1.i = ORC_DENORMAL (var42.i); _src1.i = ORC_DENORMAL (var38.i);
_src2.i = ORC_DENORMAL (var38.i); _src2.i = ORC_DENORMAL (var35.i);
_dest1.f = _src1.f + _src2.f; _dest1.f = _src1.f + _src2.f;
var43.i = ORC_DENORMAL (_dest1.i); var39.i = ORC_DENORMAL (_dest1.i);
} }
/* 6: convfl */ /* 6: convfl */
{ {
int tmp; int tmp;
tmp = (int) var43.f; tmp = (int) var39.f;
if (tmp == 0x80000000 && !(var43.i & 0x80000000)) if (tmp == 0x80000000 && !(var39.i & 0x80000000))
tmp = 0x7fffffff; tmp = 0x7fffffff;
var44.i = tmp; var36.i = tmp;
} }
/* 8: cmpeql */ /* 7: storel */
var45.i = (var44.i == var39.i) ? (~0) : 0; ptr0[i] = var36;
/* 9: shrsl */
var46.i = var43.i >> 31;
/* 10: andnl */
var47.i = (~var46.i) & var45.i;
/* 11: addl */
var40.i = var44.i + var47.i;
/* 12: storel */
ptr0[i] = var40;
} }
} }
@ -1709,12 +1636,7 @@ orc_audio_convert_unpack_float_s32_swap (guint32 * d1, const gfloat * s1, int n)
orc_program_add_source (p, 4, "s1"); orc_program_add_source (p, 4, "s1");
orc_program_add_constant (p, 4, 0x4f000000, "c1"); orc_program_add_constant (p, 4, 0x4f000000, "c1");
orc_program_add_constant (p, 4, 0x3f000000, "c2"); orc_program_add_constant (p, 4, 0x3f000000, "c2");
orc_program_add_constant (p, 4, 0x80000000, "c3");
orc_program_add_constant (p, 4, 0x0000001f, "c4");
orc_program_add_temporary (p, 4, "t1"); orc_program_add_temporary (p, 4, "t1");
orc_program_add_temporary (p, 4, "t2");
orc_program_add_temporary (p, 4, "t3");
orc_program_add_temporary (p, 4, "t4");
orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1, orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
ORC_VAR_D1); ORC_VAR_D1);
@ -1722,15 +1644,7 @@ orc_audio_convert_unpack_float_s32_swap (guint32 * d1, const gfloat * s1, int n)
ORC_VAR_D1); ORC_VAR_D1);
orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2, orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
ORC_VAR_D1); ORC_VAR_D1);
orc_program_append_2 (p, "convfl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, orc_program_append_2 (p, "convfl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
ORC_VAR_D1);
orc_program_append_2 (p, "cmpeql", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_C3,
ORC_VAR_D1);
orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T4, ORC_VAR_T1, ORC_VAR_C4,
ORC_VAR_D1);
orc_program_append_2 (p, "andnl", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_T3,
ORC_VAR_D1);
orc_program_append_2 (p, "addl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_T4,
ORC_VAR_D1); ORC_VAR_D1);
result = orc_program_compile (p); result = orc_program_compile (p);

View File

@ -117,47 +117,25 @@ shll d1, t1, p1
.source 4 s1 gfloat .source 4 s1 gfloat
.dest 4 d1 guint32 .dest 4 d1 guint32
.temp 4 t1 .temp 4 t1
.temp 4 t2
.temp 4 t3
.temp 4 t4
loadl t1, s1 loadl t1, s1
# multiply with 2147483647.0 # multiply with 2147483647.0
mulf t1, t1, 0x4F000000 mulf t1, t1, 0x4F000000
# add 0.5 for rounding # add 0.5 for rounding
addf t1, t1, 0x3F000000 addf t1, t1, 0x3F000000
convfl t2, t1 convfl d1, t1
# if overflow, t3 = ~0
cmpeql t3, t2, -2147483648
# if negative, t4 = ~0
shrsl t4, t1, 31
# if overflow and !negative, t4 = ~0
andnl t4, t4, t3
# 0x80000000 + ~0 = 0x7fffffff
addl d1, t2, t4
.function orc_audio_convert_unpack_float_s32_swap .function orc_audio_convert_unpack_float_s32_swap
.source 4 s1 gfloat .source 4 s1 gfloat
.dest 4 d1 guint32 .dest 4 d1 guint32
.temp 4 t1 .temp 4 t1
.temp 4 t2
.temp 4 t3
.temp 4 t4
swapl t1, s1 swapl t1, s1
# multiply with 2147483647.0 # multiply with 2147483647.0
mulf t1, t1, 0x4F000000 mulf t1, t1, 0x4F000000
# add 0.5 for rounding # add 0.5 for rounding
addf t1, t1, 0x3F000000 addf t1, t1, 0x3F000000
convfl t2, t1 convfl d1, t1
# if overflow, t3 = ~0
cmpeql t3, t2, -2147483648
# if negative, t4 = ~0
shrsl t4, t1, 31
# if overflow and !negative, t4 = ~0
andnl t4, t4, t3
# 0x80000000 + ~0 = 0x7fffffff
addl d1, t2, t4
.function orc_audio_convert_unpack_float_double .function orc_audio_convert_unpack_float_double
.dest 8 d1 gdouble .dest 8 d1 gdouble