blob: 82874ee1cf5a992e883f76cca5a9a3d5c90f94f6 [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#define EXTERN
#include "l.h"
void
softfloat()
{
Prog *p, *next, *psfloat;
Sym *symsfloat;
int wasfloat;
symsfloat = lookup("_sfloat", 0);
psfloat = P;
if(symsfloat->type == STEXT)
for(p = firstp; p != P; p = p->link) {
if(p->as == ATEXT) {
if(p->from.sym == symsfloat) {
psfloat = p;
break;
}
}
}
wasfloat = 0;
p = firstp;
for(p = firstp; p != P; p = p->link) {
switch(p->as) {
case AMOVWD:
case AMOVWF:
case AMOVDW:
case AMOVFW:
case AMOVFD:
case AMOVDF:
case AMOVF:
case AMOVD:
case ACMPF:
case ACMPD:
case AADDF:
case AADDD:
case ASUBF:
case ASUBD:
case AMULF:
case AMULD:
case ADIVF:
case ADIVD:
if (psfloat == P)
diag("floats used with _sfloat not defined");
if (!wasfloat) {
next = prg();
*next = *p;
// BL _sfloat(SB)
*p = zprg;
p->link = next;
p->as = ABL;
p->to.type = D_BRANCH;
p->to.sym = symsfloat;
p->cond = psfloat;
p = next;
wasfloat = 1;
}
break;
default:
wasfloat = 0;
}
}
}