Statistics
| Branch: | Revision:

root / target-s390x / fpu_helper.c @ 5d7fd045

History | View | Annotate | Download (17.5 kB)

1
/*
2
 *  S/390 FPU helper routines
3
 *
4
 *  Copyright (c) 2009 Ulrich Hecht
5
 *  Copyright (c) 2009 Alexander Graf
6
 *
7
 * This library is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2 of the License, or (at your option) any later version.
11
 *
12
 * This library is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19
 */
20

    
21
#include "cpu.h"
22
#include "helper.h"
23

    
24
#if !defined(CONFIG_USER_ONLY)
25
#include "exec/softmmu_exec.h"
26
#endif
27

    
28
/* #define DEBUG_HELPER */
29
#ifdef DEBUG_HELPER
30
#define HELPER_LOG(x...) qemu_log(x)
31
#else
32
#define HELPER_LOG(x...)
33
#endif
34

    
35
#define RET128(F) (env->retxl = F.low, F.high)
36

    
37
#define convert_bit(mask, from, to) \
38
    (to < from                      \
39
     ? (mask / (from / to)) & to    \
40
     : (mask & from) * (to / from))
41

    
42
static void ieee_exception(CPUS390XState *env, uint32_t dxc, uintptr_t retaddr)
43
{
44
    /* Install the DXC code.  */
45
    env->fpc = (env->fpc & ~0xff00) | (dxc << 8);
46
    /* Trap.  */
47
    runtime_exception(env, PGM_DATA, retaddr);
48
}
49

    
50
/* Should be called after any operation that may raise IEEE exceptions.  */
51
static void handle_exceptions(CPUS390XState *env, uintptr_t retaddr)
52
{
53
    unsigned s390_exc, qemu_exc;
54

    
55
    /* Get the exceptions raised by the current operation.  Reset the
56
       fpu_status contents so that the next operation has a clean slate.  */
57
    qemu_exc = env->fpu_status.float_exception_flags;
58
    if (qemu_exc == 0) {
59
        return;
60
    }
61
    env->fpu_status.float_exception_flags = 0;
62

    
63
    /* Convert softfloat exception bits to s390 exception bits.  */
64
    s390_exc = 0;
65
    s390_exc |= convert_bit(qemu_exc, float_flag_invalid, 0x80);
66
    s390_exc |= convert_bit(qemu_exc, float_flag_divbyzero, 0x40);
67
    s390_exc |= convert_bit(qemu_exc, float_flag_overflow, 0x20);
68
    s390_exc |= convert_bit(qemu_exc, float_flag_underflow, 0x10);
69
    s390_exc |= convert_bit(qemu_exc, float_flag_inexact, 0x08);
70

    
71
    /* Install the exceptions that we raised.  */
72
    env->fpc |= s390_exc << 16;
73

    
74
    /* Send signals for enabled exceptions.  */
75
    s390_exc &= env->fpc >> 24;
76
    if (s390_exc) {
77
        ieee_exception(env, s390_exc, retaddr);
78
    }
79
}
80

    
81
static inline int float_comp_to_cc(CPUS390XState *env, int float_compare)
82
{
83
    switch (float_compare) {
84
    case float_relation_equal:
85
        return 0;
86
    case float_relation_less:
87
        return 1;
88
    case float_relation_greater:
89
        return 2;
90
    case float_relation_unordered:
91
        return 3;
92
    default:
93
        cpu_abort(env, "unknown return value for float compare\n");
94
    }
95
}
96

    
97
/* condition codes for unary FP ops */
98
uint32_t set_cc_nz_f32(float32 v)
99
{
100
    if (float32_is_any_nan(v)) {
101
        return 3;
102
    } else if (float32_is_zero(v)) {
103
        return 0;
104
    } else if (float32_is_neg(v)) {
105
        return 1;
106
    } else {
107
        return 2;
108
    }
109
}
110

    
111
uint32_t set_cc_nz_f64(float64 v)
112
{
113
    if (float64_is_any_nan(v)) {
114
        return 3;
115
    } else if (float64_is_zero(v)) {
116
        return 0;
117
    } else if (float64_is_neg(v)) {
118
        return 1;
119
    } else {
120
        return 2;
121
    }
122
}
123

    
124
uint32_t set_cc_nz_f128(float128 v)
125
{
126
    if (float128_is_any_nan(v)) {
127
        return 3;
128
    } else if (float128_is_zero(v)) {
129
        return 0;
130
    } else if (float128_is_neg(v)) {
131
        return 1;
132
    } else {
133
        return 2;
134
    }
135
}
136

    
137
/* convert 32-bit int to 64-bit float */
138
void HELPER(cdfbr)(CPUS390XState *env, uint32_t f1, int32_t v2)
139
{
140
    HELPER_LOG("%s: converting %d to f%d\n", __func__, v2, f1);
141
    env->fregs[f1].d = int32_to_float64(v2, &env->fpu_status);
142
}
143

    
144
/* convert 32-bit int to 128-bit float */
145
void HELPER(cxfbr)(CPUS390XState *env, uint32_t f1, int32_t v2)
146
{
147
    CPU_QuadU v1;
148

    
149
    v1.q = int32_to_float128(v2, &env->fpu_status);
150
    env->fregs[f1].ll = v1.ll.upper;
151
    env->fregs[f1 + 2].ll = v1.ll.lower;
152
}
153

    
154
/* convert 64-bit int to 32-bit float */
155
void HELPER(cegbr)(CPUS390XState *env, uint32_t f1, int64_t v2)
156
{
157
    HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1);
158
    env->fregs[f1].l.upper = int64_to_float32(v2, &env->fpu_status);
159
}
160

    
161
/* convert 64-bit int to 64-bit float */
162
void HELPER(cdgbr)(CPUS390XState *env, uint32_t f1, int64_t v2)
163
{
164
    HELPER_LOG("%s: converting %ld to f%d\n", __func__, v2, f1);
165
    env->fregs[f1].d = int64_to_float64(v2, &env->fpu_status);
166
}
167

    
168
/* convert 64-bit int to 128-bit float */
169
void HELPER(cxgbr)(CPUS390XState *env, uint32_t f1, int64_t v2)
170
{
171
    CPU_QuadU x1;
172

    
173
    x1.q = int64_to_float128(v2, &env->fpu_status);
174
    HELPER_LOG("%s: converted %ld to 0x%lx and 0x%lx\n", __func__, v2,
175
               x1.ll.upper, x1.ll.lower);
176
    env->fregs[f1].ll = x1.ll.upper;
177
    env->fregs[f1 + 2].ll = x1.ll.lower;
178
}
179

    
180
/* convert 32-bit int to 32-bit float */
181
void HELPER(cefbr)(CPUS390XState *env, uint32_t f1, int32_t v2)
182
{
183
    env->fregs[f1].l.upper = int32_to_float32(v2, &env->fpu_status);
184
    HELPER_LOG("%s: converting %d to 0x%d in f%d\n", __func__, v2,
185
               env->fregs[f1].l.upper, f1);
186
}
187

    
188
/* 32-bit FP addition */
189
uint64_t HELPER(aeb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
190
{
191
    float32 ret = float32_add(f1, f2, &env->fpu_status);
192
    handle_exceptions(env, GETPC());
193
    return ret;
194
}
195

    
196
/* 64-bit FP addition */
197
uint64_t HELPER(adb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
198
{
199
    float64 ret = float64_add(f1, f2, &env->fpu_status);
200
    handle_exceptions(env, GETPC());
201
    return ret;
202
}
203

    
204
/* 128-bit FP addition */
205
uint64_t HELPER(axb)(CPUS390XState *env, uint64_t ah, uint64_t al,
206
                     uint64_t bh, uint64_t bl)
207
{
208
    float128 ret = float128_add(make_float128(ah, al),
209
                                make_float128(bh, bl),
210
                                &env->fpu_status);
211
    handle_exceptions(env, GETPC());
212
    return RET128(ret);
213
}
214

    
215
/* 32-bit FP subtraction */
216
uint64_t HELPER(seb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
217
{
218
    float32 ret = float32_sub(f1, f2, &env->fpu_status);
219
    handle_exceptions(env, GETPC());
220
    return ret;
221
}
222

    
223
/* 64-bit FP subtraction */
224
uint64_t HELPER(sdb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
225
{
226
    float64 ret = float64_sub(f1, f2, &env->fpu_status);
227
    handle_exceptions(env, GETPC());
228
    return ret;
229
}
230

    
231
/* 128-bit FP subtraction */
232
uint64_t HELPER(sxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
233
                     uint64_t bh, uint64_t bl)
234
{
235
    float128 ret = float128_sub(make_float128(ah, al),
236
                                make_float128(bh, bl),
237
                                &env->fpu_status);
238
    handle_exceptions(env, GETPC());
239
    return RET128(ret);
240
}
241

    
242
/* 32-bit FP division */
243
uint64_t HELPER(deb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
244
{
245
    float32 ret = float32_div(f1, f2, &env->fpu_status);
246
    handle_exceptions(env, GETPC());
247
    return ret;
248
}
249

    
250
/* 64-bit FP division */
251
uint64_t HELPER(ddb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
252
{
253
    float64 ret = float64_div(f1, f2, &env->fpu_status);
254
    handle_exceptions(env, GETPC());
255
    return ret;
256
}
257

    
258
/* 128-bit FP division */
259
uint64_t HELPER(dxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
260
                     uint64_t bh, uint64_t bl)
261
{
262
    float128 ret = float128_div(make_float128(ah, al),
263
                                make_float128(bh, bl),
264
                                &env->fpu_status);
265
    handle_exceptions(env, GETPC());
266
    return RET128(ret);
267
}
268

    
269
/* 32-bit FP multiplication */
270
uint64_t HELPER(meeb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
271
{
272
    float32 ret = float32_mul(f1, f2, &env->fpu_status);
273
    handle_exceptions(env, GETPC());
274
    return ret;
275
}
276

    
277
/* 64-bit FP multiplication */
278
uint64_t HELPER(mdb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
279
{
280
    float64 ret = float64_mul(f1, f2, &env->fpu_status);
281
    handle_exceptions(env, GETPC());
282
    return ret;
283
}
284

    
285
/* 64/32-bit FP multiplication */
286
uint64_t HELPER(mdeb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
287
{
288
    float64 ret = float32_to_float64(f2, &env->fpu_status);
289
    ret = float64_mul(f1, ret, &env->fpu_status);
290
    handle_exceptions(env, GETPC());
291
    return ret;
292
}
293

    
294
/* 128-bit FP multiplication */
295
uint64_t HELPER(mxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
296
                     uint64_t bh, uint64_t bl)
297
{
298
    float128 ret = float128_mul(make_float128(ah, al),
299
                                make_float128(bh, bl),
300
                                &env->fpu_status);
301
    handle_exceptions(env, GETPC());
302
    return RET128(ret);
303
}
304

    
305
/* 128/64-bit FP multiplication */
306
uint64_t HELPER(mxdb)(CPUS390XState *env, uint64_t ah, uint64_t al,
307
                      uint64_t f2)
308
{
309
    float128 ret = float64_to_float128(f2, &env->fpu_status);
310
    ret = float128_mul(make_float128(ah, al), ret, &env->fpu_status);
311
    handle_exceptions(env, GETPC());
312
    return RET128(ret);
313
}
314

    
315
/* convert 32-bit float to 64-bit float */
316
uint64_t HELPER(ldeb)(CPUS390XState *env, uint64_t f2)
317
{
318
    float64 ret = float32_to_float64(f2, &env->fpu_status);
319
    handle_exceptions(env, GETPC());
320
    return ret;
321
}
322

    
323
/* convert 128-bit float to 64-bit float */
324
uint64_t HELPER(ldxb)(CPUS390XState *env, uint64_t ah, uint64_t al)
325
{
326
    float64 ret = float128_to_float64(make_float128(ah, al), &env->fpu_status);
327
    handle_exceptions(env, GETPC());
328
    return ret;
329
}
330

    
331
/* convert 64-bit float to 128-bit float */
332
uint64_t HELPER(lxdb)(CPUS390XState *env, uint64_t f2)
333
{
334
    float128 ret = float64_to_float128(f2, &env->fpu_status);
335
    handle_exceptions(env, GETPC());
336
    return RET128(ret);
337
}
338

    
339
/* convert 32-bit float to 128-bit float */
340
uint64_t HELPER(lxeb)(CPUS390XState *env, uint64_t f2)
341
{
342
    float128 ret = float32_to_float128(f2, &env->fpu_status);
343
    handle_exceptions(env, GETPC());
344
    return RET128(ret);
345
}
346

    
347
/* convert 64-bit float to 32-bit float */
348
uint64_t HELPER(ledb)(CPUS390XState *env, uint64_t f2)
349
{
350
    float32 ret = float64_to_float32(f2, &env->fpu_status);
351
    handle_exceptions(env, GETPC());
352
    return ret;
353
}
354

    
355
/* convert 128-bit float to 32-bit float */
356
uint64_t HELPER(lexb)(CPUS390XState *env, uint64_t ah, uint64_t al)
357
{
358
    float32 ret = float128_to_float32(make_float128(ah, al), &env->fpu_status);
359
    handle_exceptions(env, GETPC());
360
    return ret;
361
}
362

    
363
/* 32-bit FP compare */
364
uint32_t HELPER(ceb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
365
{
366
    int cmp = float32_compare_quiet(f1, f2, &env->fpu_status);
367
    handle_exceptions(env, GETPC());
368
    return float_comp_to_cc(env, cmp);
369
}
370

    
371
/* 64-bit FP compare */
372
uint32_t HELPER(cdb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
373
{
374
    int cmp = float64_compare_quiet(f1, f2, &env->fpu_status);
375
    handle_exceptions(env, GETPC());
376
    return float_comp_to_cc(env, cmp);
377
}
378

    
379
/* 128-bit FP compare */
380
uint32_t HELPER(cxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
381
                     uint64_t bh, uint64_t bl)
382
{
383
    int cmp = float128_compare_quiet(make_float128(ah, al),
384
                                     make_float128(bh, bl),
385
                                     &env->fpu_status);
386
    handle_exceptions(env, GETPC());
387
    return float_comp_to_cc(env, cmp);
388
}
389

    
390
static void set_round_mode(CPUS390XState *env, int m3)
391
{
392
    switch (m3) {
393
    case 0:
394
        /* current mode */
395
        break;
396
    case 1:
397
        /* biased round no nearest */
398
    case 4:
399
        /* round to nearest */
400
        set_float_rounding_mode(float_round_nearest_even, &env->fpu_status);
401
        break;
402
    case 5:
403
        /* round to zero */
404
        set_float_rounding_mode(float_round_to_zero, &env->fpu_status);
405
        break;
406
    case 6:
407
        /* round to +inf */
408
        set_float_rounding_mode(float_round_up, &env->fpu_status);
409
        break;
410
    case 7:
411
        /* round to -inf */
412
        set_float_rounding_mode(float_round_down, &env->fpu_status);
413
        break;
414
    }
415
}
416

    
417
/* convert 32-bit float to 64-bit int */
418
uint32_t HELPER(cgebr)(CPUS390XState *env, uint32_t r1, uint32_t f2,
419
                       uint32_t m3)
420
{
421
    float32 v2 = env->fregs[f2].l.upper;
422

    
423
    set_round_mode(env, m3);
424
    env->regs[r1] = float32_to_int64(v2, &env->fpu_status);
425
    return set_cc_nz_f32(v2);
426
}
427

    
428
/* convert 64-bit float to 64-bit int */
429
uint32_t HELPER(cgdbr)(CPUS390XState *env, uint32_t r1, uint32_t f2,
430
                       uint32_t m3)
431
{
432
    float64 v2 = env->fregs[f2].d;
433

    
434
    set_round_mode(env, m3);
435
    env->regs[r1] = float64_to_int64(v2, &env->fpu_status);
436
    return set_cc_nz_f64(v2);
437
}
438

    
439
/* convert 128-bit float to 64-bit int */
440
uint32_t HELPER(cgxbr)(CPUS390XState *env, uint32_t r1, uint32_t f2,
441
                       uint32_t m3)
442
{
443
    CPU_QuadU v2;
444

    
445
    v2.ll.upper = env->fregs[f2].ll;
446
    v2.ll.lower = env->fregs[f2 + 2].ll;
447
    set_round_mode(env, m3);
448
    env->regs[r1] = float128_to_int64(v2.q, &env->fpu_status);
449
    if (float128_is_any_nan(v2.q)) {
450
        return 3;
451
    } else if (float128_is_zero(v2.q)) {
452
        return 0;
453
    } else if (float128_is_neg(v2.q)) {
454
        return 1;
455
    } else {
456
        return 2;
457
    }
458
}
459

    
460
/* convert 32-bit float to 32-bit int */
461
uint32_t HELPER(cfebr)(CPUS390XState *env, uint32_t r1, uint32_t f2,
462
                       uint32_t m3)
463
{
464
    float32 v2 = env->fregs[f2].l.upper;
465

    
466
    set_round_mode(env, m3);
467
    env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) |
468
        float32_to_int32(v2, &env->fpu_status);
469
    return set_cc_nz_f32(v2);
470
}
471

    
472
/* convert 64-bit float to 32-bit int */
473
uint32_t HELPER(cfdbr)(CPUS390XState *env, uint32_t r1, uint32_t f2,
474
                       uint32_t m3)
475
{
476
    float64 v2 = env->fregs[f2].d;
477

    
478
    set_round_mode(env, m3);
479
    env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) |
480
        float64_to_int32(v2, &env->fpu_status);
481
    return set_cc_nz_f64(v2);
482
}
483

    
484
/* convert 128-bit float to 32-bit int */
485
uint32_t HELPER(cfxbr)(CPUS390XState *env, uint32_t r1, uint32_t f2,
486
                       uint32_t m3)
487
{
488
    CPU_QuadU v2;
489

    
490
    v2.ll.upper = env->fregs[f2].ll;
491
    v2.ll.lower = env->fregs[f2 + 2].ll;
492
    env->regs[r1] = (env->regs[r1] & 0xffffffff00000000ULL) |
493
        float128_to_int32(v2.q, &env->fpu_status);
494
    return set_cc_nz_f128(v2.q);
495
}
496

    
497
/* load 32-bit FP zero */
498
void HELPER(lzer)(CPUS390XState *env, uint32_t f1)
499
{
500
    env->fregs[f1].l.upper = float32_zero;
501
}
502

    
503
/* load 64-bit FP zero */
504
void HELPER(lzdr)(CPUS390XState *env, uint32_t f1)
505
{
506
    env->fregs[f1].d = float64_zero;
507
}
508

    
509
/* load 128-bit FP zero */
510
void HELPER(lzxr)(CPUS390XState *env, uint32_t f1)
511
{
512
    CPU_QuadU x;
513

    
514
    x.q = float64_to_float128(float64_zero, &env->fpu_status);
515
    env->fregs[f1].ll = x.ll.upper;
516
    env->fregs[f1 + 1].ll = x.ll.lower;
517
}
518

    
519
/* 32-bit FP multiply and add */
520
uint64_t HELPER(maeb)(CPUS390XState *env, uint64_t f1,
521
                      uint64_t f2, uint64_t f3)
522
{
523
    float32 ret = float32_muladd(f2, f3, f1, 0, &env->fpu_status);
524
    handle_exceptions(env, GETPC());
525
    return ret;
526
}
527

    
528
/* 64-bit FP multiply and add */
529
uint64_t HELPER(madb)(CPUS390XState *env, uint64_t f1,
530
                      uint64_t f2, uint64_t f3)
531
{
532
    float64 ret = float64_muladd(f2, f3, f1, 0, &env->fpu_status);
533
    handle_exceptions(env, GETPC());
534
    return ret;
535
}
536

    
537
/* 32-bit FP multiply and subtract */
538
uint64_t HELPER(mseb)(CPUS390XState *env, uint64_t f1,
539
                      uint64_t f2, uint64_t f3)
540
{
541
    float32 ret = float32_muladd(f2, f3, f1, float_muladd_negate_c,
542
                                 &env->fpu_status);
543
    handle_exceptions(env, GETPC());
544
    return ret;
545
}
546

    
547
/* 64-bit FP multiply and subtract */
548
uint64_t HELPER(msdb)(CPUS390XState *env, uint64_t f1,
549
                      uint64_t f2, uint64_t f3)
550
{
551
    float64 ret = float64_muladd(f2, f3, f1, float_muladd_negate_c,
552
                                 &env->fpu_status);
553
    handle_exceptions(env, GETPC());
554
    return ret;
555
}
556

    
557
/* test data class 32-bit */
558
uint32_t HELPER(tceb)(uint64_t f1, uint64_t m2)
559
{
560
    float32 v1 = f1;
561
    int neg = float32_is_neg(v1);
562
    uint32_t cc = 0;
563

    
564
    if ((float32_is_zero(v1) && (m2 & (1 << (11-neg)))) ||
565
        (float32_is_infinity(v1) && (m2 & (1 << (5-neg)))) ||
566
        (float32_is_any_nan(v1) && (m2 & (1 << (3-neg)))) ||
567
        (float32_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) {
568
        cc = 1;
569
    } else if (m2 & (1 << (9-neg))) {
570
        /* assume normalized number */
571
        cc = 1;
572
    }
573
    /* FIXME: denormalized? */
574
    return cc;
575
}
576

    
577
/* test data class 64-bit */
578
uint32_t HELPER(tcdb)(uint64_t v1, uint64_t m2)
579
{
580
    int neg = float64_is_neg(v1);
581
    uint32_t cc = 0;
582

    
583
    if ((float64_is_zero(v1) && (m2 & (1 << (11-neg)))) ||
584
        (float64_is_infinity(v1) && (m2 & (1 << (5-neg)))) ||
585
        (float64_is_any_nan(v1) && (m2 & (1 << (3-neg)))) ||
586
        (float64_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) {
587
        cc = 1;
588
    } else if (m2 & (1 << (9-neg))) {
589
        /* assume normalized number */
590
        cc = 1;
591
    }
592
    /* FIXME: denormalized? */
593
    return cc;
594
}
595

    
596
/* test data class 128-bit */
597
uint32_t HELPER(tcxb)(uint64_t ah, uint64_t al, uint64_t m2)
598
{
599
    float128 v1 = make_float128(ah, al);
600
    int neg = float128_is_neg(v1);
601
    uint32_t cc = 0;
602

    
603
    if ((float128_is_zero(v1) && (m2 & (1 << (11-neg)))) ||
604
        (float128_is_infinity(v1) && (m2 & (1 << (5-neg)))) ||
605
        (float128_is_any_nan(v1) && (m2 & (1 << (3-neg)))) ||
606
        (float128_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) {
607
        cc = 1;
608
    } else if (m2 & (1 << (9-neg))) {
609
        /* assume normalized number */
610
        cc = 1;
611
    }
612
    /* FIXME: denormalized? */
613
    return cc;
614
}
615

    
616
/* square root 64-bit RR */
617
void HELPER(sqdbr)(CPUS390XState *env, uint32_t f1, uint32_t f2)
618
{
619
    env->fregs[f1].d = float64_sqrt(env->fregs[f2].d, &env->fpu_status);
620
}