4 Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at>
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #define REG (env->fpr[0])
26 #include "fop_template.h"
28 #define REG (env->fpr[1])
29 #include "fop_template.h"
31 #define REG (env->fpr[2])
32 #include "fop_template.h"
34 #define REG (env->fpr[3])
35 #include "fop_template.h"
37 #define REG (env->fpr[4])
38 #include "fop_template.h"
40 #define REG (env->fpr[5])
41 #include "fop_template.h"
43 #define REG (env->fpr[6])
44 #include "fop_template.h"
46 #define REG (env->fpr[7])
47 #include "fop_template.h"
49 #define REG (env->fpr[8])
50 #include "fop_template.h"
52 #define REG (env->fpr[9])
53 #include "fop_template.h"
55 #define REG (env->fpr[10])
56 #include "fop_template.h"
58 #define REG (env->fpr[11])
59 #include "fop_template.h"
61 #define REG (env->fpr[12])
62 #include "fop_template.h"
64 #define REG (env->fpr[13])
65 #include "fop_template.h"
67 #define REG (env->fpr[14])
68 #include "fop_template.h"
70 #define REG (env->fpr[15])
71 #include "fop_template.h"
73 #define REG (env->fpr[16])
74 #include "fop_template.h"
76 #define REG (env->fpr[17])
77 #include "fop_template.h"
79 #define REG (env->fpr[18])
80 #include "fop_template.h"
82 #define REG (env->fpr[19])
83 #include "fop_template.h"
85 #define REG (env->fpr[20])
86 #include "fop_template.h"
88 #define REG (env->fpr[21])
89 #include "fop_template.h"
91 #define REG (env->fpr[22])
92 #include "fop_template.h"
94 #define REG (env->fpr[23])
95 #include "fop_template.h"
97 #define REG (env->fpr[24])
98 #include "fop_template.h"
100 #define REG (env->fpr[25])
101 #include "fop_template.h"
103 #define REG (env->fpr[26])
104 #include "fop_template.h"
106 #define REG (env->fpr[27])
107 #include "fop_template.h"
109 #define REG (env->fpr[28])
110 #include "fop_template.h"
112 #define REG (env->fpr[29])
113 #include "fop_template.h"
115 #define REG (env->fpr[30])
116 #include "fop_template.h"
118 #define REG (env->fpr[31])
119 #include "fop_template.h"
121 #ifdef TARGET_SPARC64
123 #define REG (env->fpr[32])
124 #include "fop_template.h"
126 #define REG (env->fpr[34])
127 #include "fop_template.h"
129 #define REG (env->fpr[36])
130 #include "fop_template.h"
132 #define REG (env->fpr[38])
133 #include "fop_template.h"
135 #define REG (env->fpr[40])
136 #include "fop_template.h"
138 #define REG (env->fpr[42])
139 #include "fop_template.h"
141 #define REG (env->fpr[44])
142 #include "fop_template.h"
144 #define REG (env->fpr[46])
145 #include "fop_template.h"
147 #define REG (env->fpr[47])
148 #include "fop_template.h"
150 #define REG (env->fpr[50])
151 #include "fop_template.h"
153 #define REG (env->fpr[52])
154 #include "fop_template.h"
156 #define REG (env->fpr[54])
157 #include "fop_template.h"
159 #define REG (env->fpr[56])
160 #include "fop_template.h"
162 #define REG (env->fpr[58])
163 #include "fop_template.h"
165 #define REG (env->fpr[60])
166 #include "fop_template.h"
168 #define REG (env->fpr[62])
169 #include "fop_template.h"
172 #define FLAG_SET(x) ((env->psr&x)?1:0)
174 void OPPROTO
op_umul_T1_T0(void)
177 res
= (uint64_t) T0
* (uint64_t) T1
;
178 #ifdef TARGET_SPARC64
181 T0
= res
& 0xffffffff;
186 void OPPROTO
op_smul_T1_T0(void)
189 res
= (int64_t) ((int32_t) T0
) * (int64_t) ((int32_t) T1
);
190 #ifdef TARGET_SPARC64
193 T0
= res
& 0xffffffff;
198 void OPPROTO
op_mulscc_T1_T0(void)
200 unsigned int b1
, N
, V
, b2
;
203 N
= FLAG_SET(PSR_NEG
);
204 V
= FLAG_SET(PSR_OVF
);
207 T0
= (b1
<< 31) | (T0
>> 1);
210 /* do addition and update flags */
215 env
->psr
|= PSR_ZERO
;
216 if ((int32_t) T0
< 0)
219 env
->psr
|= PSR_CARRY
;
220 if (((src1
^ T1
^ -1) & (src1
^ T0
)) & (1 << 31))
222 env
->y
= (b2
<< 31) | (env
->y
>> 1);
226 void OPPROTO
op_udiv_T1_T0(void)
231 x0
= T0
| ((uint64_t) (env
->y
) << 32);
235 raise_exception(TT_DIV_ZERO
);
239 if (x0
> 0xffffffff) {
249 void OPPROTO
op_sdiv_T1_T0(void)
254 x0
= T0
| ((int64_t) (env
->y
) << 32);
258 raise_exception(TT_DIV_ZERO
);
262 if ((int32_t) x0
!= x0
) {
263 T0
= x0
< 0? 0x80000000: 0x7fffffff;
273 #define MEMSUFFIX _raw
275 #if !defined(CONFIG_USER_ONLY)
276 #define MEMSUFFIX _user
279 #define MEMSUFFIX _kernel
282 #ifdef TARGET_SPARC64
283 #define MEMSUFFIX _hypv
288 #ifndef TARGET_SPARC64
289 /* XXX: use another pointer for %iN registers to avoid slow wrapping
291 void OPPROTO
op_save(void)
294 cwp
= (env
->cwp
- 1) & (NWINDOWS
- 1);
295 if (env
->wim
& (1 << cwp
)) {
296 raise_exception(TT_WIN_OVF
);
302 void OPPROTO
op_restore(void)
305 cwp
= (env
->cwp
+ 1) & (NWINDOWS
- 1);
306 if (env
->wim
& (1 << cwp
)) {
307 raise_exception(TT_WIN_UNF
);
313 void OPPROTO
op_rdccr(void)
318 void OPPROTO
op_wrccr(void)
323 // CWP handling is reversed in V9, but we still use the V8 register
325 void OPPROTO
op_rdcwp(void)
330 void OPPROTO
op_wrcwp(void)
335 /* XXX: use another pointer for %iN registers to avoid slow wrapping
337 void OPPROTO
op_save(void)
340 cwp
= (env
->cwp
- 1) & (NWINDOWS
- 1);
341 if (env
->cansave
== 0) {
342 raise_exception(TT_SPILL
| (env
->otherwin
!= 0 ?
343 (TT_WOTHER
| ((env
->wstate
& 0x38) >> 1)):
344 ((env
->wstate
& 0x7) << 2)));
346 if (env
->cleanwin
- env
->canrestore
== 0) {
347 // XXX Clean windows without trap
348 raise_exception(TT_CLRWIN
);
358 void OPPROTO
op_restore(void)
361 cwp
= (env
->cwp
+ 1) & (NWINDOWS
- 1);
362 if (env
->canrestore
== 0) {
363 raise_exception(TT_FILL
| (env
->otherwin
!= 0 ?
364 (TT_WOTHER
| ((env
->wstate
& 0x38) >> 1)):
365 ((env
->wstate
& 0x7) << 2)));
375 void OPPROTO
op_jmp_label(void)
380 #define F_OP(name, p) void OPPROTO op_f##name##p(void)
382 #if defined(CONFIG_USER_ONLY)
383 #define F_BINOP(name) \
386 FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \
390 DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \
394 QT0 = float128_ ## name (QT0, QT1, &env->fp_status); \
397 #define F_BINOP(name) \
400 FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \
404 DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \
414 void OPPROTO
op_fsmuld(void)
416 DT0
= float64_mul(float32_to_float64(FT0
, &env
->fp_status
),
417 float32_to_float64(FT1
, &env
->fp_status
),
421 #if defined(CONFIG_USER_ONLY)
422 void OPPROTO
op_fdmulq(void)
424 QT0
= float128_mul(float64_to_float128(DT0
, &env
->fp_status
),
425 float64_to_float128(DT1
, &env
->fp_status
),
430 #if defined(CONFIG_USER_ONLY)
431 #define F_HELPER(name) \
445 #define F_HELPER(name) \
458 FT0
= float32_chs(FT1
);
461 #ifdef TARGET_SPARC64
464 DT0
= float64_chs(DT1
);
467 #if defined(CONFIG_USER_ONLY)
470 QT0
= float128_chs(QT1
);
477 /* Integer to float conversion. */
478 #ifdef USE_INT_TO_FLOAT_HELPERS
480 #ifdef TARGET_SPARC64
486 FT0
= int32_to_float32(*((int32_t *)&FT1
), &env
->fp_status
);
491 DT0
= int32_to_float64(*((int32_t *)&FT1
), &env
->fp_status
);
494 #if defined(CONFIG_USER_ONLY)
497 QT0
= int32_to_float128(*((int32_t *)&FT1
), &env
->fp_status
);
501 #ifdef TARGET_SPARC64
504 FT0
= int64_to_float32(*((int64_t *)&DT1
), &env
->fp_status
);
509 DT0
= int64_to_float64(*((int64_t *)&DT1
), &env
->fp_status
);
511 #if defined(CONFIG_USER_ONLY)
514 QT0
= int64_to_float128(*((int64_t *)&DT1
), &env
->fp_status
);
521 /* floating point conversion */
522 void OPPROTO
op_fdtos(void)
524 FT0
= float64_to_float32(DT1
, &env
->fp_status
);
527 void OPPROTO
op_fstod(void)
529 DT0
= float32_to_float64(FT1
, &env
->fp_status
);
532 #if defined(CONFIG_USER_ONLY)
533 void OPPROTO
op_fqtos(void)
535 FT0
= float128_to_float32(QT1
, &env
->fp_status
);
538 void OPPROTO
op_fstoq(void)
540 QT0
= float32_to_float128(FT1
, &env
->fp_status
);
543 void OPPROTO
op_fqtod(void)
545 DT0
= float128_to_float64(QT1
, &env
->fp_status
);
548 void OPPROTO
op_fdtoq(void)
550 QT0
= float64_to_float128(DT1
, &env
->fp_status
);
554 /* Float to integer conversion. */
555 void OPPROTO
op_fstoi(void)
557 *((int32_t *)&FT0
) = float32_to_int32_round_to_zero(FT1
, &env
->fp_status
);
560 void OPPROTO
op_fdtoi(void)
562 *((int32_t *)&FT0
) = float64_to_int32_round_to_zero(DT1
, &env
->fp_status
);
565 #if defined(CONFIG_USER_ONLY)
566 void OPPROTO
op_fqtoi(void)
568 *((int32_t *)&FT0
) = float128_to_int32_round_to_zero(QT1
, &env
->fp_status
);
572 #ifdef TARGET_SPARC64
573 void OPPROTO
op_fstox(void)
575 *((int64_t *)&DT0
) = float32_to_int64_round_to_zero(FT1
, &env
->fp_status
);
578 void OPPROTO
op_fdtox(void)
580 *((int64_t *)&DT0
) = float64_to_int64_round_to_zero(DT1
, &env
->fp_status
);
583 #if defined(CONFIG_USER_ONLY)
584 void OPPROTO
op_fqtox(void)
586 *((int64_t *)&DT0
) = float128_to_int64_round_to_zero(QT1
, &env
->fp_status
);
590 void OPPROTO
op_flushw(void)
592 if (env
->cansave
!= NWINDOWS
- 2) {
593 raise_exception(TT_SPILL
| (env
->otherwin
!= 0 ?
594 (TT_WOTHER
| ((env
->wstate
& 0x38) >> 1)):
595 ((env
->wstate
& 0x7) << 2)));
599 void OPPROTO
op_saved(void)
602 if (env
->otherwin
== 0)
609 void OPPROTO
op_restored(void)
612 if (env
->cleanwin
< NWINDOWS
- 1)
614 if (env
->otherwin
== 0)
622 #ifdef TARGET_SPARC64
623 // This function uses non-native bit order
624 #define GET_FIELD(X, FROM, TO) \
625 ((X) >> (63 - (TO)) & ((1ULL << ((TO) - (FROM) + 1)) - 1))
627 // This function uses the order in the manuals, i.e. bit 0 is 2^0
628 #define GET_FIELD_SP(X, FROM, TO) \
629 GET_FIELD(X, 63 - (TO), 63 - (FROM))
631 void OPPROTO
op_array8()
633 T0
= (GET_FIELD_SP(T0
, 60, 63) << (17 + 2 * T1
)) |
634 (GET_FIELD_SP(T0
, 39, 39 + T1
- 1) << (17 + T1
)) |
635 (GET_FIELD_SP(T0
, 17 + T1
- 1, 17) << 17) |
636 (GET_FIELD_SP(T0
, 56, 59) << 13) | (GET_FIELD_SP(T0
, 35, 38) << 9) |
637 (GET_FIELD_SP(T0
, 13, 16) << 5) | (((T0
>> 55) & 1) << 4) |
638 (GET_FIELD_SP(T0
, 33, 34) << 2) | GET_FIELD_SP(T0
, 11, 12);
641 void OPPROTO
op_array16()
643 T0
= ((GET_FIELD_SP(T0
, 60, 63) << (17 + 2 * T1
)) |
644 (GET_FIELD_SP(T0
, 39, 39 + T1
- 1) << (17 + T1
)) |
645 (GET_FIELD_SP(T0
, 17 + T1
- 1, 17) << 17) |
646 (GET_FIELD_SP(T0
, 56, 59) << 13) | (GET_FIELD_SP(T0
, 35, 38) << 9) |
647 (GET_FIELD_SP(T0
, 13, 16) << 5) | (((T0
>> 55) & 1) << 4) |
648 (GET_FIELD_SP(T0
, 33, 34) << 2) | GET_FIELD_SP(T0
, 11, 12)) << 1;
651 void OPPROTO
op_array32()
653 T0
= ((GET_FIELD_SP(T0
, 60, 63) << (17 + 2 * T1
)) |
654 (GET_FIELD_SP(T0
, 39, 39 + T1
- 1) << (17 + T1
)) |
655 (GET_FIELD_SP(T0
, 17 + T1
- 1, 17) << 17) |
656 (GET_FIELD_SP(T0
, 56, 59) << 13) | (GET_FIELD_SP(T0
, 35, 38) << 9) |
657 (GET_FIELD_SP(T0
, 13, 16) << 5) | (((T0
>> 55) & 1) << 4) |
658 (GET_FIELD_SP(T0
, 33, 34) << 2) | GET_FIELD_SP(T0
, 11, 12)) << 2;
661 void OPPROTO
op_alignaddr()
667 env
->gsr
|= tmp
& 7ULL;
671 void OPPROTO
op_faligndata()
675 tmp
= (*((uint64_t *)&DT0
)) << ((env
->gsr
& 7) * 8);
676 tmp
|= (*((uint64_t *)&DT1
)) >> (64 - (env
->gsr
& 7) * 8);
677 *((uint64_t *)&DT0
) = tmp
;
680 void OPPROTO
op_movl_FT0_0(void)
682 *((uint32_t *)&FT0
) = 0;
685 void OPPROTO
op_movl_DT0_0(void)
687 *((uint64_t *)&DT0
) = 0;
690 void OPPROTO
op_movl_FT0_1(void)
692 *((uint32_t *)&FT0
) = 0xffffffff;
695 void OPPROTO
op_movl_DT0_1(void)
697 *((uint64_t *)&DT0
) = 0xffffffffffffffffULL
;
700 void OPPROTO
op_fnot(void)
702 *(uint64_t *)&DT0
= ~*(uint64_t *)&DT1
;
705 void OPPROTO
op_fnots(void)
707 *(uint32_t *)&FT0
= ~*(uint32_t *)&FT1
;
710 void OPPROTO
op_fnor(void)
712 *(uint64_t *)&DT0
= ~(*(uint64_t *)&DT0
| *(uint64_t *)&DT1
);
715 void OPPROTO
op_fnors(void)
717 *(uint32_t *)&FT0
= ~(*(uint32_t *)&FT0
| *(uint32_t *)&FT1
);
720 void OPPROTO
op_for(void)
722 *(uint64_t *)&DT0
|= *(uint64_t *)&DT1
;
725 void OPPROTO
op_fors(void)
727 *(uint32_t *)&FT0
|= *(uint32_t *)&FT1
;
730 void OPPROTO
op_fxor(void)
732 *(uint64_t *)&DT0
^= *(uint64_t *)&DT1
;
735 void OPPROTO
op_fxors(void)
737 *(uint32_t *)&FT0
^= *(uint32_t *)&FT1
;
740 void OPPROTO
op_fand(void)
742 *(uint64_t *)&DT0
&= *(uint64_t *)&DT1
;
745 void OPPROTO
op_fands(void)
747 *(uint32_t *)&FT0
&= *(uint32_t *)&FT1
;
750 void OPPROTO
op_fornot(void)
752 *(uint64_t *)&DT0
= *(uint64_t *)&DT0
| ~*(uint64_t *)&DT1
;
755 void OPPROTO
op_fornots(void)
757 *(uint32_t *)&FT0
= *(uint32_t *)&FT0
| ~*(uint32_t *)&FT1
;
760 void OPPROTO
op_fandnot(void)
762 *(uint64_t *)&DT0
= *(uint64_t *)&DT0
& ~*(uint64_t *)&DT1
;
765 void OPPROTO
op_fandnots(void)
767 *(uint32_t *)&FT0
= *(uint32_t *)&FT0
& ~*(uint32_t *)&FT1
;
770 void OPPROTO
op_fnand(void)
772 *(uint64_t *)&DT0
= ~(*(uint64_t *)&DT0
& *(uint64_t *)&DT1
);
775 void OPPROTO
op_fnands(void)
777 *(uint32_t *)&FT0
= ~(*(uint32_t *)&FT0
& *(uint32_t *)&FT1
);
780 void OPPROTO
op_fxnor(void)
782 *(uint64_t *)&DT0
^= ~*(uint64_t *)&DT1
;
785 void OPPROTO
op_fxnors(void)
787 *(uint32_t *)&FT0
^= ~*(uint32_t *)&FT1
;
790 #ifdef WORDS_BIGENDIAN
791 #define VIS_B64(n) b[7 - (n)]
792 #define VIS_W64(n) w[3 - (n)]
793 #define VIS_SW64(n) sw[3 - (n)]
794 #define VIS_L64(n) l[1 - (n)]
795 #define VIS_B32(n) b[3 - (n)]
796 #define VIS_W32(n) w[1 - (n)]
798 #define VIS_B64(n) b[n]
799 #define VIS_W64(n) w[n]
800 #define VIS_SW64(n) sw[n]
801 #define VIS_L64(n) l[n]
802 #define VIS_B32(n) b[n]
803 #define VIS_W32(n) w[n]
821 void OPPROTO
op_fpmerge(void)
828 // Reverse calculation order to handle overlap
829 d
.VIS_B64(7) = s
.VIS_B64(3);
830 d
.VIS_B64(6) = d
.VIS_B64(3);
831 d
.VIS_B64(5) = s
.VIS_B64(2);
832 d
.VIS_B64(4) = d
.VIS_B64(2);
833 d
.VIS_B64(3) = s
.VIS_B64(1);
834 d
.VIS_B64(2) = d
.VIS_B64(1);
835 d
.VIS_B64(1) = s
.VIS_B64(0);
836 //d.VIS_B64(0) = d.VIS_B64(0);
841 void OPPROTO
op_fmul8x16(void)
850 tmp = (int32_t)d.VIS_SW64(r) * (int32_t)s.VIS_B64(r); \
851 if ((tmp & 0xff) > 0x7f) \
853 d.VIS_W64(r) = tmp >> 8;
864 void OPPROTO
op_fmul8x16al(void)
873 tmp = (int32_t)d.VIS_SW64(1) * (int32_t)s.VIS_B64(r); \
874 if ((tmp & 0xff) > 0x7f) \
876 d.VIS_W64(r) = tmp >> 8;
887 void OPPROTO
op_fmul8x16au(void)
896 tmp = (int32_t)d.VIS_SW64(0) * (int32_t)s.VIS_B64(r); \
897 if ((tmp & 0xff) > 0x7f) \
899 d.VIS_W64(r) = tmp >> 8;
910 void OPPROTO
op_fmul8sux16(void)
919 tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8); \
920 if ((tmp & 0xff) > 0x7f) \
922 d.VIS_W64(r) = tmp >> 8;
933 void OPPROTO
op_fmul8ulx16(void)
942 tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2)); \
943 if ((tmp & 0xff) > 0x7f) \
945 d.VIS_W64(r) = tmp >> 8;
956 void OPPROTO
op_fmuld8sux16(void)
965 tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8); \
966 if ((tmp & 0xff) > 0x7f) \
970 // Reverse calculation order to handle overlap
978 void OPPROTO
op_fmuld8ulx16(void)
987 tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2)); \
988 if ((tmp & 0xff) > 0x7f) \
992 // Reverse calculation order to handle overlap
1000 void OPPROTO
op_fexpand(void)
1005 s
.l
= (uint32_t)(*(uint64_t *)&DT0
& 0xffffffff);
1007 d
.VIS_L64(0) = s
.VIS_W32(0) << 4;
1008 d
.VIS_L64(1) = s
.VIS_W32(1) << 4;
1009 d
.VIS_L64(2) = s
.VIS_W32(2) << 4;
1010 d
.VIS_L64(3) = s
.VIS_W32(3) << 4;
1015 #define VIS_OP(name, F) \
1016 void OPPROTO name##16(void) \
1023 d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0)); \
1024 d.VIS_W64(1) = F(d.VIS_W64(1), s.VIS_W64(1)); \
1025 d.VIS_W64(2) = F(d.VIS_W64(2), s.VIS_W64(2)); \
1026 d.VIS_W64(3) = F(d.VIS_W64(3), s.VIS_W64(3)); \
1031 void OPPROTO name##16s(void) \
1038 d.VIS_W32(0) = F(d.VIS_W32(0), s.VIS_W32(0)); \
1039 d.VIS_W32(1) = F(d.VIS_W32(1), s.VIS_W32(1)); \
1044 void OPPROTO name##32(void) \
1051 d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0)); \
1052 d.VIS_L64(1) = F(d.VIS_L64(1), s.VIS_L64(1)); \
1057 void OPPROTO name##32s(void) \
1064 d.l = F(d.l, s.l); \
1069 #define FADD(a, b) ((a) + (b))
1070 #define FSUB(a, b) ((a) - (b))
1071 VIS_OP(op_fpadd
, FADD
)
1072 VIS_OP(op_fpsub
, FSUB
)
1074 #define VIS_CMPOP(name, F) \
1075 void OPPROTO name##16(void) \
1082 d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0))? 1: 0; \
1083 d.VIS_W64(0) |= F(d.VIS_W64(1), s.VIS_W64(1))? 2: 0; \
1084 d.VIS_W64(0) |= F(d.VIS_W64(2), s.VIS_W64(2))? 4: 0; \
1085 d.VIS_W64(0) |= F(d.VIS_W64(3), s.VIS_W64(3))? 8: 0; \
1090 void OPPROTO name##32(void) \
1097 d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0))? 1: 0; \
1098 d.VIS_L64(0) |= F(d.VIS_L64(1), s.VIS_L64(1))? 2: 0; \
1103 #define FCMPGT(a, b) ((a) > (b))
1104 #define FCMPEQ(a, b) ((a) == (b))
1105 #define FCMPLE(a, b) ((a) <= (b))
1106 #define FCMPNE(a, b) ((a) != (b))
1108 VIS_CMPOP(op_fcmpgt
, FCMPGT
)
1109 VIS_CMPOP(op_fcmpeq
, FCMPEQ
)
1110 VIS_CMPOP(op_fcmple
, FCMPLE
)
1111 VIS_CMPOP(op_fcmpne
, FCMPNE
)
1115 #define CHECK_ALIGN_OP(align) \
1116 void OPPROTO op_check_align_T0_ ## align (void) \
1119 raise_exception(TT_UNALIGNED); \