Floating point promotion was broken since the IR float change. Fix.

This commit is contained in:
David Given 2016-10-09 15:08:03 +02:00
parent 36cddd6afb
commit 38de688c5a
2 changed files with 14 additions and 12 deletions

View file

@ -41,16 +41,14 @@ static void promote(struct ir* ir)
break;
case IR_PHI:
if (!array_appendu(&promotable, ir))
{
if (ir->left)
promote(ir->left);
if (ir->right)
promote(ir->right);
}
int i;
for (i=0; i<ir->u.phivalue.count; i++)
array_appendu(&promotable, ir->u.phivalue.item[i].right);
break;
}
}
}
static void search_for_promotable_irs(void)
{

View file

@ -328,17 +328,21 @@ PATTERNS
emit "la %out, $value"
cost 8;
out:(int)reg = value:CONSTF4
emit "lfs %out, address-containing-$value"
cost 8;
/* FPU operations */
out:(float)reg = value:CONSTF4
emit "lfs %out, address-containing-$value"
cost 8;
out:(float)reg = ADDF4(left:(float)reg, right:(float)reg)
emit "fadds %out, %left, %right"
cost 4;
out:(float)reg = SUBF4(left:(float)reg, right:(float)reg)
emit "fsubs %out, %left, %right"
cost 4;
/* vim: set sw=4 ts=4 expandtab : */