case OP_IXOR_IMM:
case OP_AND_IMM:
case OP_SHL_IMM:
+ case OP_SHR_IMM:
case OP_ISHL_IMM:
case OP_LSHL_IMM:
case OP_ISHR_IMM:
switched = TRUE;
break;
case OP_SHL_IMM:
+ case OP_SHR_IMM:
case OP_ISHL_IMM:
case OP_LSHL_IMM:
case OP_ISHR_IMM:
case OP_SHL_IMM:
ins->opcode = OP_LSHL;
break;
+ case OP_SHR_IMM:
+ ins->opcode = OP_LSHR;
+ break;
case OP_LSHL_IMM:
ins->opcode = OP_LSHL;
break;
case OP_ICOMPARE_IMM: {
/* Instead of compare+b<cond>, ia64 has compare<cond>+br */
gboolean imm;
+ CompRelation cond;
/*
* The compare_imm instructions have switched up arguments, and
* some of them take an imm between -127 and 128.
*/
next = ins->next;
- switch (next->opcode) {
- case CEE_BGE:
- case CEE_BLT:
- case OP_COND_EXC_LT:
- case OP_IBGE:
- case OP_IBLT:
+ cond = mono_opcode_to_cond (next->opcode);
+ if ((cond == CMP_LT) || (cond == CMP_GE))
imm = ia64_is_imm8 (ins->inst_imm - 1);
- break;
- case OP_IBGE_UN:
- case OP_IBLT_UN:
- case CEE_BGE_UN:
- case CEE_BLT_UN:
+ else if ((cond == CMP_LT_UN) || (cond == CMP_GE_UN))
imm = ia64_is_imm8 (ins->inst_imm - 1) && (ins->inst_imm > 0);
- break;
- default:
+ else
imm = ia64_is_imm8 (ins->inst_imm);
- break;
- }
if (imm) {
ins->opcode = opcode_to_ia64_cmp_imm (next->opcode, ins->opcode);
case OP_LSHL_IMM:
ia64_shl_imm (code, ins->dreg, ins->sreg1, ins->inst_imm);
break;
- case OP_LSHR_IMM:
- ia64_shr_imm (code, ins->dreg, ins->sreg1, ins->inst_imm);
- break;
+ case OP_SHR_IMM:
case OP_ISHR_IMM:
+ case OP_LSHR_IMM:
ia64_shr_imm (code, ins->dreg, ins->sreg1, ins->inst_imm);
break;
case OP_ISHR_UN_IMM: