Revision 6817c355 tcg/i386/tcg-target.c
b/tcg/i386/tcg-target.c | ||
---|---|---|
166 | 166 |
#define OPC_MOVB_EvGv (0x88) /* stores, more or less */ |
167 | 167 |
#define OPC_MOVL_EvGv (0x89) /* stores, more or less */ |
168 | 168 |
#define OPC_MOVL_GvEv (0x8b) /* loads, more or less */ |
169 |
#define OPC_MOVSBL (0xbe | P_EXT) |
|
170 |
#define OPC_MOVSWL (0xbf | P_EXT) |
|
169 | 171 |
#define OPC_MOVZBL (0xb6 | P_EXT) |
170 | 172 |
#define OPC_MOVZWL (0xb7 | P_EXT) |
171 | 173 |
#define OPC_SHIFT_1 (0xd1) |
... | ... | |
330 | 332 |
tcg_out_modrm(s, OPC_MOVZBL, dest, src); |
331 | 333 |
} |
332 | 334 |
|
335 |
static void tcg_out_ext8s(TCGContext *s, int dest, int src) |
|
336 |
{ |
|
337 |
/* movsbl */ |
|
338 |
assert(src < 4); |
|
339 |
tcg_out_modrm(s, OPC_MOVSBL, dest, src); |
|
340 |
} |
|
341 |
|
|
333 | 342 |
static inline void tcg_out_ext16u(TCGContext *s, int dest, int src) |
334 | 343 |
{ |
335 | 344 |
/* movzwl */ |
336 | 345 |
tcg_out_modrm(s, OPC_MOVZWL, dest, src); |
337 | 346 |
} |
338 | 347 |
|
348 |
static inline void tcg_out_ext16s(TCGContext *s, int dest, int src) |
|
349 |
{ |
|
350 |
/* movswl */ |
|
351 |
tcg_out_modrm(s, OPC_MOVSWL, dest, src); |
|
352 |
} |
|
353 |
|
|
339 | 354 |
static inline void tgen_arithi(TCGContext *s, int c, int r0, int32_t val, int cf) |
340 | 355 |
{ |
341 | 356 |
if (!cf && ((c == ARITH_ADD && val == 1) || (c == ARITH_SUB && val == -1))) { |
... | ... | |
680 | 695 |
|
681 | 696 |
switch(opc) { |
682 | 697 |
case 0 | 4: |
683 |
/* movsbl */ |
|
684 |
tcg_out_modrm(s, 0xbe | P_EXT, data_reg, TCG_REG_EAX); |
|
698 |
tcg_out_ext8s(s, data_reg, TCG_REG_EAX); |
|
685 | 699 |
break; |
686 | 700 |
case 1 | 4: |
687 |
/* movswl */ |
|
688 |
tcg_out_modrm(s, 0xbf | P_EXT, data_reg, TCG_REG_EAX); |
|
701 |
tcg_out_ext16s(s, data_reg, TCG_REG_EAX); |
|
689 | 702 |
break; |
690 | 703 |
case 0: |
691 | 704 |
tcg_out_ext8u(s, data_reg, TCG_REG_EAX); |
... | ... | |
735 | 748 |
break; |
736 | 749 |
case 0 | 4: |
737 | 750 |
/* movsbl */ |
738 |
tcg_out_modrm_offset(s, 0xbe | P_EXT, data_reg, r0, GUEST_BASE);
|
|
751 |
tcg_out_modrm_offset(s, OPC_MOVSBL, data_reg, r0, GUEST_BASE);
|
|
739 | 752 |
break; |
740 | 753 |
case 1: |
741 | 754 |
/* movzwl */ |
... | ... | |
746 | 759 |
break; |
747 | 760 |
case 1 | 4: |
748 | 761 |
/* movswl */ |
749 |
tcg_out_modrm_offset(s, 0xbf | P_EXT, data_reg, r0, GUEST_BASE);
|
|
762 |
tcg_out_modrm_offset(s, OPC_MOVSWL, data_reg, r0, GUEST_BASE);
|
|
750 | 763 |
if (bswap) { |
751 | 764 |
tcg_out_rolw_8(s, data_reg); |
752 | 765 |
|
753 | 766 |
/* movswl data_reg, data_reg */ |
754 |
tcg_out_modrm(s, 0xbf | P_EXT, data_reg, data_reg);
|
|
767 |
tcg_out_modrm(s, OPC_MOVSWL, data_reg, data_reg);
|
|
755 | 768 |
} |
756 | 769 |
break; |
757 | 770 |
case 2: |
... | ... | |
1044 | 1057 |
break; |
1045 | 1058 |
case INDEX_op_ld8s_i32: |
1046 | 1059 |
/* movsbl */ |
1047 |
tcg_out_modrm_offset(s, 0xbe | P_EXT, args[0], args[1], args[2]);
|
|
1060 |
tcg_out_modrm_offset(s, OPC_MOVSBL, args[0], args[1], args[2]);
|
|
1048 | 1061 |
break; |
1049 | 1062 |
case INDEX_op_ld16u_i32: |
1050 | 1063 |
/* movzwl */ |
... | ... | |
1052 | 1065 |
break; |
1053 | 1066 |
case INDEX_op_ld16s_i32: |
1054 | 1067 |
/* movswl */ |
1055 |
tcg_out_modrm_offset(s, 0xbf | P_EXT, args[0], args[1], args[2]);
|
|
1068 |
tcg_out_modrm_offset(s, OPC_MOVSWL, args[0], args[1], args[2]);
|
|
1056 | 1069 |
break; |
1057 | 1070 |
case INDEX_op_ld_i32: |
1058 | 1071 |
tcg_out_ld(s, TCG_TYPE_I32, args[0], args[1], args[2]); |
... | ... | |
1180 | 1193 |
break; |
1181 | 1194 |
|
1182 | 1195 |
case INDEX_op_ext8s_i32: |
1183 |
tcg_out_modrm(s, 0xbe | P_EXT, args[0], args[1]);
|
|
1196 |
tcg_out_ext8s(s, args[0], args[1]);
|
|
1184 | 1197 |
break; |
1185 | 1198 |
case INDEX_op_ext16s_i32: |
1186 |
tcg_out_modrm(s, 0xbf | P_EXT, args[0], args[1]);
|
|
1199 |
tcg_out_ext16s(s, args[0], args[1]);
|
|
1187 | 1200 |
break; |
1188 | 1201 |
case INDEX_op_ext8u_i32: |
1189 | 1202 |
tcg_out_ext8u(s, args[0], args[1]); |
Also available in: Unified diff