Revision 2792c4f2

b/op-i386.c
634 634
    int eflags;
635 635
    eflags = cc_table[CC_OP].compute_all();
636 636
    if (eflags & CC_O) {
637
        EIP = PARAM1;
637 638
        raise_exception(EXCP04_INTO);
638 639
    }
639 640
    FORCE_RET();
......
1136 1137
    A0 += *(unsigned long *)((char *)env + PARAM1);
1137 1138
}
1138 1139

  
1140
void helper_lsl(void)
1141
{
1142
    unsigned int selector, limit;
1143
    SegmentDescriptorTable *dt;
1144
    int index;
1145
    uint32_t e1, e2;
1146
    uint8_t *ptr;
1147

  
1148
    CC_SRC = cc_table[CC_OP].compute_all() & ~CC_Z;
1149
    selector = T0 & 0xffff;
1150
    if (selector & 0x4)
1151
        dt = &env->ldt;
1152
    else
1153
        dt = &env->gdt;
1154
    index = selector & ~7;
1155
    if ((index + 7) > dt->limit)
1156
        return;
1157
    ptr = dt->base + index;
1158
    e1 = ldl(ptr);
1159
    e2 = ldl(ptr + 4);
1160
    limit = (e1 & 0xffff) | (e2 & 0x000f0000);
1161
    if (e2 & (1 << 23))
1162
        limit = (limit << 12) | 0xfff;
1163
    T1 = limit;
1164
    CC_SRC |= CC_Z;
1165
}
1166

  
1167
void OPPROTO op_lsl(void)
1168
{
1169
    helper_lsl();
1170
}
1171

  
1172
void helper_lar(void)
1173
{
1174
    unsigned int selector;
1175
    SegmentDescriptorTable *dt;
1176
    int index;
1177
    uint32_t e2;
1178
    uint8_t *ptr;
1179

  
1180
    CC_SRC = cc_table[CC_OP].compute_all() & ~CC_Z;
1181
    selector = T0 & 0xffff;
1182
    if (selector & 0x4)
1183
        dt = &env->ldt;
1184
    else
1185
        dt = &env->gdt;
1186
    index = selector & ~7;
1187
    if ((index + 7) > dt->limit)
1188
        return;
1189
    ptr = dt->base + index;
1190
    e2 = ldl(ptr + 4);
1191
    T1 = e2 & 0x00f0ff00;
1192
    CC_SRC |= CC_Z;
1193
}
1194

  
1195
void OPPROTO op_lar(void)
1196
{
1197
    helper_lar();
1198
}
1199

  
1139 1200
/* flags handling */
1140 1201

  
1141 1202
/* slow jumps cases (compute x86 flags) */
......
1490 1551
    [CC_OP_DECW] = { compute_all_decw, compute_c_incl },
1491 1552
    [CC_OP_DECL] = { compute_all_decl, compute_c_incl },
1492 1553
    
1493
    [CC_OP_SHLB] = { compute_all_shlb, compute_c_shll },
1494
    [CC_OP_SHLW] = { compute_all_shlw, compute_c_shll },
1554
    [CC_OP_SHLB] = { compute_all_shlb, compute_c_shlb },
1555
    [CC_OP_SHLW] = { compute_all_shlw, compute_c_shlw },
1495 1556
    [CC_OP_SHLL] = { compute_all_shll, compute_c_shll },
1496 1557

  
1497
    [CC_OP_SARB] = { compute_all_sarb, compute_c_shll },
1498
    [CC_OP_SARW] = { compute_all_sarw, compute_c_shll },
1499
    [CC_OP_SARL] = { compute_all_sarl, compute_c_shll },
1558
    [CC_OP_SARB] = { compute_all_sarb, compute_c_sarl },
1559
    [CC_OP_SARW] = { compute_all_sarw, compute_c_sarl },
1560
    [CC_OP_SARL] = { compute_all_sarl, compute_c_sarl },
1500 1561
};
1501 1562

  
1502 1563
/* floating point support. Some of the code for complicated x87

Also available in: Unified diff