Go Home Page
The Go Programming Language

Text file src/cmd/5l/softfloat.c

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