| 186 | } |
| 187 | |
| 188 | void OpDispatchBuilder::FADD(OpcodeArgs, IR::OpSize Width, bool Integer, OpDispatchBuilder::OpResult ResInST0) { |
| 189 | if (Op->Src[0].IsNone()) { // Implicit argument case |
| 190 | auto Offset = Op->OP & 7; |
| 191 | auto St0 = 0; |
| 192 | if (ResInST0 == OpResult::RES_STI) { |
| 193 | _F80AddStack(Offset, St0); |
| 194 | } else { |
| 195 | _F80AddStack(St0, Offset); |
| 196 | } |
| 197 | if (Op->TableInfo->Flags & X86Tables::InstFlags::FLAGS_POP) { |
| 198 | _PopStackDestroy(); |
| 199 | } |
| 200 | return; |
| 201 | } |
| 202 | |
| 203 | LOGMAN_THROW_A_FMT(Width != OpSize::f80Bit, "No 80-bit floats from memory"); |
| 204 | // We have one memory argument |
| 205 | Ref Arg {}; |
| 206 | if (Integer) { |
| 207 | Arg = LoadSource(GPRClass, Op, Op->Src[0], Op->Flags); |
| 208 | Arg = _F80CVTToInt(Arg, Width); |
| 209 | } else { |
| 210 | Arg = LoadSource(FPRClass, Op, Op->Src[0], Op->Flags); |
| 211 | Arg = _F80CVTTo(Arg, Width); |
| 212 | } |
| 213 | |
| 214 | // top of stack is at offset zero |
| 215 | _F80AddValue(0, Arg); |
| 216 | } |
| 217 | |
| 218 | void OpDispatchBuilder::FMUL(OpcodeArgs, IR::OpSize Width, bool Integer, OpDispatchBuilder::OpResult ResInST0) { |
| 219 | if (Op->Src[0].IsNone()) { // Implicit argument case |