Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*---------------------------------------------------------------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  |  fpu_aux.c                                                                |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  | Code to implement some of the FPU auxiliary instructions.                 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  | Copyright (C) 1992,1993,1994,1997                                         |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  |                  E-mail   billm@suburbia.net                              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  |                                                                           |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  +---------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include "fpu_system.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include "exception.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include "fpu_emu.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include "status_w.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include "control_w.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) static void fnop(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) static void fclex(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	partial_status &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	    ~(SW_Backward | SW_Summary | SW_Stack_Fault | SW_Precision |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	      SW_Underflow | SW_Overflow | SW_Zero_Div | SW_Denorm_Op |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	      SW_Invalid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	no_ip_update = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) /* Needs to be externally visible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) void fpstate_init_soft(struct swregs_state *soft)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	struct address *oaddr, *iaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	memset(soft, 0, sizeof(*soft));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	soft->cwd = 0x037f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	soft->swd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	soft->ftop = 0;	/* We don't keep top in the status word internally. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	soft->twd = 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	/* The behaviour is different from that detailed in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	   Section 15.1.6 of the Intel manual */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	oaddr = (struct address *)&soft->foo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	oaddr->offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	oaddr->selector = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	iaddr = (struct address *)&soft->fip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	iaddr->offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	iaddr->selector = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	iaddr->opcode = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	soft->no_update = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) void finit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	fpstate_init_soft(&current->thread.fpu.state.soft);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60)  * These are nops on the i387..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) #define feni fnop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #define fdisi fnop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) #define fsetpm fnop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) static FUNC const finit_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	feni, fdisi, fclex, finit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	fsetpm, FPU_illegal, FPU_illegal, FPU_illegal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) void finit_(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	(finit_table[FPU_rm]) ();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) static void fstsw_ax(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	*(short *)&FPU_EAX = status_word();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	no_ip_update = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) static FUNC const fstsw_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	fstsw_ax, FPU_illegal, FPU_illegal, FPU_illegal,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	FPU_illegal, FPU_illegal, FPU_illegal, FPU_illegal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) void fstsw_(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	(fstsw_table[FPU_rm]) ();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) static FUNC const fp_nop_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	fnop, FPU_illegal, FPU_illegal, FPU_illegal,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	FPU_illegal, FPU_illegal, FPU_illegal, FPU_illegal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) void fp_nop(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	(fp_nop_table[FPU_rm]) ();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) void fld_i_(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	FPU_REG *st_new_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	u_char tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	if (STACK_OVERFLOW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 		FPU_stack_overflow();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	/* fld st(i) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	i = FPU_rm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	if (NOT_EMPTY(i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 		reg_copy(&st(i), st_new_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 		tag = FPU_gettagi(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 		push();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 		FPU_settag0(tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 		if (control_word & CW_Invalid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 			/* The masked response */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 			FPU_stack_underflow();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 			EXCEPTION(EX_StackUnder);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) void fxch_i(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	/* fxch st(i) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	FPU_REG t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	int i = FPU_rm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	FPU_REG *st0_ptr = &st(0), *sti_ptr = &st(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	long tag_word = fpu_tag_word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	int regnr = top & 7, regnri = ((regnr + i) & 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	u_char st0_tag = (tag_word >> (regnr * 2)) & 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	u_char sti_tag = (tag_word >> (regnri * 2)) & 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	if (st0_tag == TAG_Empty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		if (sti_tag == TAG_Empty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 			FPU_stack_underflow();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 			FPU_stack_underflow_i(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		if (control_word & CW_Invalid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 			/* Masked response */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 			FPU_copy_to_reg0(sti_ptr, sti_tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		FPU_stack_underflow_i(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	if (sti_tag == TAG_Empty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 		if (control_word & CW_Invalid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 			/* Masked response */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 			FPU_copy_to_regi(st0_ptr, st0_tag, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		FPU_stack_underflow();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	clear_C1();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	reg_copy(st0_ptr, &t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	reg_copy(sti_ptr, st0_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	reg_copy(&t, sti_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	tag_word &= ~(3 << (regnr * 2)) & ~(3 << (regnri * 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	tag_word |= (sti_tag << (regnr * 2)) | (st0_tag << (regnri * 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	fpu_tag_word = tag_word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) static void fcmovCC(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	/* fcmovCC st(i) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	int i = FPU_rm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	FPU_REG *st0_ptr = &st(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	FPU_REG *sti_ptr = &st(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	long tag_word = fpu_tag_word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	int regnr = top & 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	int regnri = (top + i) & 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	u_char sti_tag = (tag_word >> (regnri * 2)) & 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	if (sti_tag == TAG_Empty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		FPU_stack_underflow();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		clear_C1();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	reg_copy(sti_ptr, st0_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	tag_word &= ~(3 << (regnr * 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	tag_word |= (sti_tag << (regnr * 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	fpu_tag_word = tag_word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) void fcmovb(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	if (FPU_EFLAGS & X86_EFLAGS_CF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		fcmovCC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) void fcmove(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	if (FPU_EFLAGS & X86_EFLAGS_ZF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		fcmovCC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) void fcmovbe(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	if (FPU_EFLAGS & (X86_EFLAGS_CF|X86_EFLAGS_ZF))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		fcmovCC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) void fcmovu(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	if (FPU_EFLAGS & X86_EFLAGS_PF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 		fcmovCC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) void fcmovnb(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	if (!(FPU_EFLAGS & X86_EFLAGS_CF))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		fcmovCC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) void fcmovne(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	if (!(FPU_EFLAGS & X86_EFLAGS_ZF))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 		fcmovCC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) void fcmovnbe(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	if (!(FPU_EFLAGS & (X86_EFLAGS_CF|X86_EFLAGS_ZF)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 		fcmovCC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) void fcmovnu(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	if (!(FPU_EFLAGS & X86_EFLAGS_PF))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 		fcmovCC();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) void ffree_(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	/* ffree st(i) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	FPU_settagi(FPU_rm, TAG_Empty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) void ffreep(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	/* ffree st(i) + pop - unofficial code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	FPU_settagi(FPU_rm, TAG_Empty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	FPU_pop();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) void fst_i_(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	/* fst st(i) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	FPU_copy_to_regi(&st(0), FPU_gettag0(), FPU_rm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) void fstp_i(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	/* fstp st(i) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	FPU_copy_to_regi(&st(0), FPU_gettag0(), FPU_rm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	FPU_pop();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }