emit_x64_data_processing: Deduplicate some code in zero-extension functions

EmitZeroExtendByteToLong() can be implemented in terms of EmitZeroExtendByteToWord() and
EmitZeroExtendHalfToLong() can be implemented in terms of EmitZeroExtendHalfToWord().
This commit is contained in:
Lioncash 2018-03-29 14:56:31 -04:00 committed by Merry
parent a94f321f69
commit cad9d31b83

View File

@ -1218,17 +1218,13 @@ void EmitX64::EmitZeroExtendHalfToWord(EmitContext& ctx, IR::Inst* inst) {
} }
void EmitX64::EmitZeroExtendByteToLong(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitZeroExtendByteToLong(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); // x64 zeros upper 32 bits on a 32-bit move
Xbyak::Reg64 result = ctx.reg_alloc.UseScratchGpr(args[0]); EmitZeroExtendByteToWord(ctx, inst);
code.movzx(result.cvt32(), result.cvt8()); // x64 zeros upper 32 bits on a 32-bit move
ctx.reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitZeroExtendHalfToLong(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitZeroExtendHalfToLong(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); // x64 zeros upper 32 bits on a 32-bit move
Xbyak::Reg64 result = ctx.reg_alloc.UseScratchGpr(args[0]); EmitZeroExtendHalfToWord(ctx, inst);
code.movzx(result.cvt32(), result.cvt16()); // x64 zeros upper 32 bits on a 32-bit move
ctx.reg_alloc.DefineValue(inst, result);
} }
void EmitX64::EmitZeroExtendWordToLong(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitZeroExtendWordToLong(EmitContext& ctx, IR::Inst* inst) {