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