// 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;
		}
	}
}
