mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-31 11:32:38 +00:00
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:
parent
3544d82192
commit
65e5984634
2 changed files with 74 additions and 182 deletions
|
@ -1328,69 +1328,54 @@ orc_audio_convert_unpack_float_s32 (guint32 * d1, const gfloat * s1, int n)
|
|||
int i;
|
||||
orc_union32 *ORC_RESTRICT ptr0;
|
||||
const orc_union32 *ORC_RESTRICT ptr4;
|
||||
orc_union32 var33;
|
||||
orc_union32 var34;
|
||||
orc_union32 var35;
|
||||
orc_union32 var36;
|
||||
orc_union32 var37;
|
||||
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;
|
||||
ptr4 = (orc_union32 *) s1;
|
||||
|
||||
/* 1: loadpl */
|
||||
var36.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
|
||||
var33.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
|
||||
/* 3: loadpl */
|
||||
var37.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
|
||||
/* 6: loadpl */
|
||||
var38.i = 0x80000000; /* -2147483648 or -nanf */
|
||||
var34.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
/* 0: loadl */
|
||||
var40 = ptr4[i];
|
||||
var36 = ptr4[i];
|
||||
/* 2: mulf */
|
||||
{
|
||||
orc_union32 _src1;
|
||||
orc_union32 _src2;
|
||||
orc_union32 _dest1;
|
||||
_src1.i = ORC_DENORMAL (var40.i);
|
||||
_src2.i = ORC_DENORMAL (var36.i);
|
||||
_src1.i = ORC_DENORMAL (var36.i);
|
||||
_src2.i = ORC_DENORMAL (var33.i);
|
||||
_dest1.f = _src1.f * _src2.f;
|
||||
var41.i = ORC_DENORMAL (_dest1.i);
|
||||
var37.i = ORC_DENORMAL (_dest1.i);
|
||||
}
|
||||
/* 4: addf */
|
||||
{
|
||||
orc_union32 _src1;
|
||||
orc_union32 _src2;
|
||||
orc_union32 _dest1;
|
||||
_src1.i = ORC_DENORMAL (var41.i);
|
||||
_src2.i = ORC_DENORMAL (var37.i);
|
||||
_src1.i = ORC_DENORMAL (var37.i);
|
||||
_src2.i = ORC_DENORMAL (var34.i);
|
||||
_dest1.f = _src1.f + _src2.f;
|
||||
var42.i = ORC_DENORMAL (_dest1.i);
|
||||
var38.i = ORC_DENORMAL (_dest1.i);
|
||||
}
|
||||
/* 5: convfl */
|
||||
{
|
||||
int tmp;
|
||||
tmp = (int) var42.f;
|
||||
if (tmp == 0x80000000 && !(var42.i & 0x80000000))
|
||||
tmp = (int) var38.f;
|
||||
if (tmp == 0x80000000 && !(var38.i & 0x80000000))
|
||||
tmp = 0x7fffffff;
|
||||
var43.i = tmp;
|
||||
var35.i = tmp;
|
||||
}
|
||||
/* 7: cmpeql */
|
||||
var44.i = (var43.i == var38.i) ? (~0) : 0;
|
||||
/* 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;
|
||||
/* 6: storel */
|
||||
ptr0[i] = var35;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1403,69 +1388,54 @@ _backup_orc_audio_convert_unpack_float_s32 (OrcExecutor * ORC_RESTRICT ex)
|
|||
int n = ex->n;
|
||||
orc_union32 *ORC_RESTRICT ptr0;
|
||||
const orc_union32 *ORC_RESTRICT ptr4;
|
||||
orc_union32 var33;
|
||||
orc_union32 var34;
|
||||
orc_union32 var35;
|
||||
orc_union32 var36;
|
||||
orc_union32 var37;
|
||||
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];
|
||||
ptr4 = (orc_union32 *) ex->arrays[4];
|
||||
|
||||
/* 1: loadpl */
|
||||
var36.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
|
||||
var33.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
|
||||
/* 3: loadpl */
|
||||
var37.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
|
||||
/* 6: loadpl */
|
||||
var38.i = 0x80000000; /* -2147483648 or -nanf */
|
||||
var34.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
/* 0: loadl */
|
||||
var40 = ptr4[i];
|
||||
var36 = ptr4[i];
|
||||
/* 2: mulf */
|
||||
{
|
||||
orc_union32 _src1;
|
||||
orc_union32 _src2;
|
||||
orc_union32 _dest1;
|
||||
_src1.i = ORC_DENORMAL (var40.i);
|
||||
_src2.i = ORC_DENORMAL (var36.i);
|
||||
_src1.i = ORC_DENORMAL (var36.i);
|
||||
_src2.i = ORC_DENORMAL (var33.i);
|
||||
_dest1.f = _src1.f * _src2.f;
|
||||
var41.i = ORC_DENORMAL (_dest1.i);
|
||||
var37.i = ORC_DENORMAL (_dest1.i);
|
||||
}
|
||||
/* 4: addf */
|
||||
{
|
||||
orc_union32 _src1;
|
||||
orc_union32 _src2;
|
||||
orc_union32 _dest1;
|
||||
_src1.i = ORC_DENORMAL (var41.i);
|
||||
_src2.i = ORC_DENORMAL (var37.i);
|
||||
_src1.i = ORC_DENORMAL (var37.i);
|
||||
_src2.i = ORC_DENORMAL (var34.i);
|
||||
_dest1.f = _src1.f + _src2.f;
|
||||
var42.i = ORC_DENORMAL (_dest1.i);
|
||||
var38.i = ORC_DENORMAL (_dest1.i);
|
||||
}
|
||||
/* 5: convfl */
|
||||
{
|
||||
int tmp;
|
||||
tmp = (int) var42.f;
|
||||
if (tmp == 0x80000000 && !(var42.i & 0x80000000))
|
||||
tmp = (int) var38.f;
|
||||
if (tmp == 0x80000000 && !(var38.i & 0x80000000))
|
||||
tmp = 0x7fffffff;
|
||||
var43.i = tmp;
|
||||
var35.i = tmp;
|
||||
}
|
||||
/* 7: cmpeql */
|
||||
var44.i = (var43.i == var38.i) ? (~0) : 0;
|
||||
/* 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;
|
||||
/* 6: storel */
|
||||
ptr0[i] = var35;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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_constant (p, 4, 0x4f000000, "c1");
|
||||
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, "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_VAR_D1);
|
||||
|
@ -1504,15 +1469,7 @@ orc_audio_convert_unpack_float_s32 (guint32 * d1, const gfloat * s1, int n)
|
|||
ORC_VAR_D1);
|
||||
orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
|
||||
ORC_VAR_D1);
|
||||
orc_program_append_2 (p, "convfl", 0, ORC_VAR_T2, 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_program_append_2 (p, "convfl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
|
||||
ORC_VAR_D1);
|
||||
|
||||
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;
|
||||
orc_union32 *ORC_RESTRICT ptr0;
|
||||
const orc_union32 *ORC_RESTRICT ptr4;
|
||||
orc_union32 var33;
|
||||
orc_union32 var34;
|
||||
orc_union32 var35;
|
||||
orc_union32 var36;
|
||||
orc_union32 var37;
|
||||
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;
|
||||
orc_union32 var47;
|
||||
|
||||
ptr0 = (orc_union32 *) d1;
|
||||
ptr4 = (orc_union32 *) s1;
|
||||
|
||||
/* 2: loadpl */
|
||||
var37.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
|
||||
var34.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
|
||||
/* 4: loadpl */
|
||||
var38.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
|
||||
/* 7: loadpl */
|
||||
var39.i = 0x80000000; /* -2147483648 or -nanf */
|
||||
var35.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
/* 0: loadl */
|
||||
var36 = ptr4[i];
|
||||
var33 = ptr4[i];
|
||||
/* 1: swapl */
|
||||
var41.i = ORC_SWAP_L (var36.i);
|
||||
var37.i = ORC_SWAP_L (var33.i);
|
||||
/* 3: mulf */
|
||||
{
|
||||
orc_union32 _src1;
|
||||
orc_union32 _src2;
|
||||
orc_union32 _dest1;
|
||||
_src1.i = ORC_DENORMAL (var41.i);
|
||||
_src2.i = ORC_DENORMAL (var37.i);
|
||||
_src1.i = ORC_DENORMAL (var37.i);
|
||||
_src2.i = ORC_DENORMAL (var34.i);
|
||||
_dest1.f = _src1.f * _src2.f;
|
||||
var42.i = ORC_DENORMAL (_dest1.i);
|
||||
var38.i = ORC_DENORMAL (_dest1.i);
|
||||
}
|
||||
/* 5: addf */
|
||||
{
|
||||
orc_union32 _src1;
|
||||
orc_union32 _src2;
|
||||
orc_union32 _dest1;
|
||||
_src1.i = ORC_DENORMAL (var42.i);
|
||||
_src2.i = ORC_DENORMAL (var38.i);
|
||||
_src1.i = ORC_DENORMAL (var38.i);
|
||||
_src2.i = ORC_DENORMAL (var35.i);
|
||||
_dest1.f = _src1.f + _src2.f;
|
||||
var43.i = ORC_DENORMAL (_dest1.i);
|
||||
var39.i = ORC_DENORMAL (_dest1.i);
|
||||
}
|
||||
/* 6: convfl */
|
||||
{
|
||||
int tmp;
|
||||
tmp = (int) var43.f;
|
||||
if (tmp == 0x80000000 && !(var43.i & 0x80000000))
|
||||
tmp = (int) var39.f;
|
||||
if (tmp == 0x80000000 && !(var39.i & 0x80000000))
|
||||
tmp = 0x7fffffff;
|
||||
var44.i = tmp;
|
||||
var36.i = tmp;
|
||||
}
|
||||
/* 8: cmpeql */
|
||||
var45.i = (var44.i == var39.i) ? (~0) : 0;
|
||||
/* 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;
|
||||
/* 7: storel */
|
||||
ptr0[i] = var36;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1618,72 +1560,57 @@ _backup_orc_audio_convert_unpack_float_s32_swap (OrcExecutor * ORC_RESTRICT ex)
|
|||
int n = ex->n;
|
||||
orc_union32 *ORC_RESTRICT ptr0;
|
||||
const orc_union32 *ORC_RESTRICT ptr4;
|
||||
orc_union32 var33;
|
||||
orc_union32 var34;
|
||||
orc_union32 var35;
|
||||
orc_union32 var36;
|
||||
orc_union32 var37;
|
||||
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;
|
||||
orc_union32 var47;
|
||||
|
||||
ptr0 = (orc_union32 *) ex->arrays[0];
|
||||
ptr4 = (orc_union32 *) ex->arrays[4];
|
||||
|
||||
/* 2: loadpl */
|
||||
var37.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
|
||||
var34.i = 0x4f000000; /* 1325400064 or 6.54835e-315f */
|
||||
/* 4: loadpl */
|
||||
var38.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
|
||||
/* 7: loadpl */
|
||||
var39.i = 0x80000000; /* -2147483648 or -nanf */
|
||||
var35.i = 0x3f000000; /* 1056964608 or 5.2221e-315f */
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
/* 0: loadl */
|
||||
var36 = ptr4[i];
|
||||
var33 = ptr4[i];
|
||||
/* 1: swapl */
|
||||
var41.i = ORC_SWAP_L (var36.i);
|
||||
var37.i = ORC_SWAP_L (var33.i);
|
||||
/* 3: mulf */
|
||||
{
|
||||
orc_union32 _src1;
|
||||
orc_union32 _src2;
|
||||
orc_union32 _dest1;
|
||||
_src1.i = ORC_DENORMAL (var41.i);
|
||||
_src2.i = ORC_DENORMAL (var37.i);
|
||||
_src1.i = ORC_DENORMAL (var37.i);
|
||||
_src2.i = ORC_DENORMAL (var34.i);
|
||||
_dest1.f = _src1.f * _src2.f;
|
||||
var42.i = ORC_DENORMAL (_dest1.i);
|
||||
var38.i = ORC_DENORMAL (_dest1.i);
|
||||
}
|
||||
/* 5: addf */
|
||||
{
|
||||
orc_union32 _src1;
|
||||
orc_union32 _src2;
|
||||
orc_union32 _dest1;
|
||||
_src1.i = ORC_DENORMAL (var42.i);
|
||||
_src2.i = ORC_DENORMAL (var38.i);
|
||||
_src1.i = ORC_DENORMAL (var38.i);
|
||||
_src2.i = ORC_DENORMAL (var35.i);
|
||||
_dest1.f = _src1.f + _src2.f;
|
||||
var43.i = ORC_DENORMAL (_dest1.i);
|
||||
var39.i = ORC_DENORMAL (_dest1.i);
|
||||
}
|
||||
/* 6: convfl */
|
||||
{
|
||||
int tmp;
|
||||
tmp = (int) var43.f;
|
||||
if (tmp == 0x80000000 && !(var43.i & 0x80000000))
|
||||
tmp = (int) var39.f;
|
||||
if (tmp == 0x80000000 && !(var39.i & 0x80000000))
|
||||
tmp = 0x7fffffff;
|
||||
var44.i = tmp;
|
||||
var36.i = tmp;
|
||||
}
|
||||
/* 8: cmpeql */
|
||||
var45.i = (var44.i == var39.i) ? (~0) : 0;
|
||||
/* 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;
|
||||
/* 7: storel */
|
||||
ptr0[i] = var36;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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_constant (p, 4, 0x4f000000, "c1");
|
||||
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, "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_VAR_D1);
|
||||
|
@ -1722,15 +1644,7 @@ orc_audio_convert_unpack_float_s32_swap (guint32 * d1, const gfloat * s1, int n)
|
|||
ORC_VAR_D1);
|
||||
orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
|
||||
ORC_VAR_D1);
|
||||
orc_program_append_2 (p, "convfl", 0, ORC_VAR_T2, 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_program_append_2 (p, "convfl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
|
||||
ORC_VAR_D1);
|
||||
|
||||
result = orc_program_compile (p);
|
||||
|
|
|
@ -117,47 +117,25 @@ shll d1, t1, p1
|
|||
.source 4 s1 gfloat
|
||||
.dest 4 d1 guint32
|
||||
.temp 4 t1
|
||||
.temp 4 t2
|
||||
.temp 4 t3
|
||||
.temp 4 t4
|
||||
|
||||
loadl t1, s1
|
||||
# multiply with 2147483647.0
|
||||
mulf t1, t1, 0x4F000000
|
||||
# add 0.5 for rounding
|
||||
addf t1, t1, 0x3F000000
|
||||
convfl t2, 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
|
||||
convfl d1, t1
|
||||
|
||||
.function orc_audio_convert_unpack_float_s32_swap
|
||||
.source 4 s1 gfloat
|
||||
.dest 4 d1 guint32
|
||||
.temp 4 t1
|
||||
.temp 4 t2
|
||||
.temp 4 t3
|
||||
.temp 4 t4
|
||||
|
||||
swapl t1, s1
|
||||
# multiply with 2147483647.0
|
||||
mulf t1, t1, 0x4F000000
|
||||
# add 0.5 for rounding
|
||||
addf t1, t1, 0x3F000000
|
||||
convfl t2, 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
|
||||
convfl d1, t1
|
||||
|
||||
.function orc_audio_convert_unpack_float_double
|
||||
.dest 8 d1 gdouble
|
||||
|
|
Loading…
Reference in a new issue