ARM: Implement zero/sign extend instructions.
This commit is contained in:
parent
554fb3774e
commit
69365876d8
1 changed files with 142 additions and 0 deletions
|
@ -227,4 +227,146 @@ let {{
|
||||||
header_output += RegImmRegOpDeclare.subst(usat16Iop)
|
header_output += RegImmRegOpDeclare.subst(usat16Iop)
|
||||||
decoder_output += RegImmRegOpConstructor.subst(usat16Iop)
|
decoder_output += RegImmRegOpConstructor.subst(usat16Iop)
|
||||||
exec_output += PredOpExecute.subst(usat16Iop)
|
exec_output += PredOpExecute.subst(usat16Iop)
|
||||||
|
|
||||||
|
sxtbIop = InstObjParams("sxtb", "Sxtb", "RegImmRegOp",
|
||||||
|
{ "code":
|
||||||
|
"Dest = sext<8>((uint8_t)(Op1.ud >> imm));",
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegImmRegOpDeclare.subst(sxtbIop)
|
||||||
|
decoder_output += RegImmRegOpConstructor.subst(sxtbIop)
|
||||||
|
exec_output += PredOpExecute.subst(sxtbIop)
|
||||||
|
|
||||||
|
sxtabIop = InstObjParams("sxtab", "Sxtab", "RegRegRegImmOp",
|
||||||
|
{ "code":
|
||||||
|
'''
|
||||||
|
Dest = sext<8>((uint8_t)(Op2.ud >> imm)) +
|
||||||
|
Op1;
|
||||||
|
''',
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegRegRegImmOpDeclare.subst(sxtabIop)
|
||||||
|
decoder_output += RegRegRegImmOpConstructor.subst(sxtabIop)
|
||||||
|
exec_output += PredOpExecute.subst(sxtabIop)
|
||||||
|
|
||||||
|
sxtb16Code = '''
|
||||||
|
uint32_t resTemp = 0;
|
||||||
|
replaceBits(resTemp, 15, 0, sext<8>(bits(Op1, imm + 7, imm)));
|
||||||
|
replaceBits(resTemp, 31, 16,
|
||||||
|
sext<8>(bits(Op1, (imm + 23) % 32, (imm + 16) % 32)));
|
||||||
|
Dest = resTemp;
|
||||||
|
'''
|
||||||
|
sxtb16Iop = InstObjParams("sxtb16", "Sxtb16", "RegImmRegOp",
|
||||||
|
{ "code": sxtb16Code,
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegImmRegOpDeclare.subst(sxtb16Iop)
|
||||||
|
decoder_output += RegImmRegOpConstructor.subst(sxtb16Iop)
|
||||||
|
exec_output += PredOpExecute.subst(sxtb16Iop)
|
||||||
|
|
||||||
|
sxtab16Code = '''
|
||||||
|
uint32_t resTemp = 0;
|
||||||
|
replaceBits(resTemp, 15, 0, sext<8>(bits(Op2, imm + 7, imm)) +
|
||||||
|
bits(Op1, 15, 0));
|
||||||
|
replaceBits(resTemp, 31, 16,
|
||||||
|
sext<8>(bits(Op2, (imm + 23) % 32, (imm + 16) % 32)) +
|
||||||
|
bits(Op1, 31, 16));
|
||||||
|
Dest = resTemp;
|
||||||
|
'''
|
||||||
|
sxtab16Iop = InstObjParams("sxtab16", "Sxtab16", "RegRegRegImmOp",
|
||||||
|
{ "code": sxtab16Code,
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegRegRegImmOpDeclare.subst(sxtab16Iop)
|
||||||
|
decoder_output += RegRegRegImmOpConstructor.subst(sxtab16Iop)
|
||||||
|
exec_output += PredOpExecute.subst(sxtab16Iop)
|
||||||
|
|
||||||
|
sxthCode = '''
|
||||||
|
uint64_t rotated = (uint32_t)Op1;
|
||||||
|
rotated = (rotated | (rotated << 32)) >> imm;
|
||||||
|
Dest = sext<16>((uint16_t)rotated);
|
||||||
|
'''
|
||||||
|
sxthIop = InstObjParams("sxth", "Sxth", "RegImmRegOp",
|
||||||
|
{ "code": sxthCode,
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegImmRegOpDeclare.subst(sxthIop)
|
||||||
|
decoder_output += RegImmRegOpConstructor.subst(sxthIop)
|
||||||
|
exec_output += PredOpExecute.subst(sxthIop)
|
||||||
|
|
||||||
|
sxtahCode = '''
|
||||||
|
uint64_t rotated = (uint32_t)Op2;
|
||||||
|
rotated = (rotated | (rotated << 32)) >> imm;
|
||||||
|
Dest = sext<16>((uint16_t)rotated) + Op1;
|
||||||
|
'''
|
||||||
|
sxtahIop = InstObjParams("sxtah", "Sxtah", "RegRegRegImmOp",
|
||||||
|
{ "code": sxtahCode,
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegRegRegImmOpDeclare.subst(sxtahIop)
|
||||||
|
decoder_output += RegRegRegImmOpConstructor.subst(sxtahIop)
|
||||||
|
exec_output += PredOpExecute.subst(sxtahIop)
|
||||||
|
|
||||||
|
uxtbIop = InstObjParams("uxtb", "Uxtb", "RegImmRegOp",
|
||||||
|
{ "code": "Dest = (uint8_t)(Op1.ud >> imm);",
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegImmRegOpDeclare.subst(uxtbIop)
|
||||||
|
decoder_output += RegImmRegOpConstructor.subst(uxtbIop)
|
||||||
|
exec_output += PredOpExecute.subst(uxtbIop)
|
||||||
|
|
||||||
|
uxtabIop = InstObjParams("uxtab", "Uxtab", "RegRegRegImmOp",
|
||||||
|
{ "code":
|
||||||
|
"Dest = (uint8_t)(Op2.ud >> imm) + Op1;",
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegRegRegImmOpDeclare.subst(uxtabIop)
|
||||||
|
decoder_output += RegRegRegImmOpConstructor.subst(uxtabIop)
|
||||||
|
exec_output += PredOpExecute.subst(uxtabIop)
|
||||||
|
|
||||||
|
uxtb16Code = '''
|
||||||
|
uint32_t resTemp = 0;
|
||||||
|
replaceBits(resTemp, 15, 0, (uint8_t)(bits(Op1, imm + 7, imm)));
|
||||||
|
replaceBits(resTemp, 31, 16,
|
||||||
|
(uint8_t)(bits(Op1, (imm + 23) % 32, (imm + 16) % 32)));
|
||||||
|
Dest = resTemp;
|
||||||
|
'''
|
||||||
|
uxtb16Iop = InstObjParams("uxtb16", "Uxtb16", "RegImmRegOp",
|
||||||
|
{ "code": uxtb16Code,
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegImmRegOpDeclare.subst(uxtb16Iop)
|
||||||
|
decoder_output += RegImmRegOpConstructor.subst(uxtb16Iop)
|
||||||
|
exec_output += PredOpExecute.subst(uxtb16Iop)
|
||||||
|
|
||||||
|
uxtab16Code = '''
|
||||||
|
uint32_t resTemp = 0;
|
||||||
|
replaceBits(resTemp, 15, 0, (uint8_t)(bits(Op2, imm + 7, imm)) +
|
||||||
|
bits(Op1, 15, 0));
|
||||||
|
replaceBits(resTemp, 31, 16,
|
||||||
|
(uint8_t)(bits(Op2, (imm + 23) % 32, (imm + 16) % 32)) +
|
||||||
|
bits(Op1, 31, 16));
|
||||||
|
Dest = resTemp;
|
||||||
|
'''
|
||||||
|
uxtab16Iop = InstObjParams("uxtab16", "Uxtab16", "RegRegRegImmOp",
|
||||||
|
{ "code": uxtab16Code,
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegRegRegImmOpDeclare.subst(uxtab16Iop)
|
||||||
|
decoder_output += RegRegRegImmOpConstructor.subst(uxtab16Iop)
|
||||||
|
exec_output += PredOpExecute.subst(uxtab16Iop)
|
||||||
|
|
||||||
|
uxthCode = '''
|
||||||
|
uint64_t rotated = (uint32_t)Op1;
|
||||||
|
rotated = (rotated | (rotated << 32)) >> imm;
|
||||||
|
Dest = (uint16_t)rotated;
|
||||||
|
'''
|
||||||
|
uxthIop = InstObjParams("uxth", "Uxth", "RegImmRegOp",
|
||||||
|
{ "code": uxthCode,
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegImmRegOpDeclare.subst(uxthIop)
|
||||||
|
decoder_output += RegImmRegOpConstructor.subst(uxthIop)
|
||||||
|
exec_output += PredOpExecute.subst(uxthIop)
|
||||||
|
|
||||||
|
uxtahCode = '''
|
||||||
|
uint64_t rotated = (uint32_t)Op2;
|
||||||
|
rotated = (rotated | (rotated << 32)) >> imm;
|
||||||
|
Dest = (uint16_t)rotated + Op1;
|
||||||
|
'''
|
||||||
|
uxtahIop = InstObjParams("uxtah", "Uxtah", "RegRegRegImmOp",
|
||||||
|
{ "code": uxtahCode,
|
||||||
|
"predicate_test": predicateTest }, [])
|
||||||
|
header_output += RegRegRegImmOpDeclare.subst(uxtahIop)
|
||||||
|
decoder_output += RegRegRegImmOpConstructor.subst(uxtahIop)
|
||||||
|
exec_output += PredOpExecute.subst(uxtahIop)
|
||||||
}};
|
}};
|
||||||
|
|
Loading…
Reference in a new issue