diff --git a/src/arch/x86/isa/decoder/two_byte_opcodes.isa b/src/arch/x86/isa/decoder/two_byte_opcodes.isa index c426c6b0f..6d5a04e2d 100644 --- a/src/arch/x86/isa/decoder/two_byte_opcodes.isa +++ b/src/arch/x86/isa/decoder/two_byte_opcodes.isa @@ -164,8 +164,10 @@ 0x05: decode LEGACY_DECODEVAL { // no prefix 0x0: decode OPCODE_OP_BOTTOM3 { - 0x0: movaps_Vo_Wo(); - 0x1: movaps_Wo_Vo(); + //These moves should really use size o (octword), but + //because they are split in two, they use q (quadword). + 0x0: Inst::MOVAPS(Vq,Wq); + 0x1: Inst::MOVAPS(Wq,Vq); 0x2: decode MODRM_MOD { 0x3: cvtpi2pS_Vq_Pq(); default: cvtpi2ps_Vq_Mq(); diff --git a/src/arch/x86/isa/insts/sse/move.py b/src/arch/x86/isa/insts/sse/move.py index 05e28d74d..c03658c7c 100644 --- a/src/arch/x86/isa/insts/sse/move.py +++ b/src/arch/x86/isa/insts/sse/move.py @@ -99,4 +99,31 @@ def macroop MOVSD_P_R { def macroop MOVSD_R_R { movfp xmml, xmml, xmmlm, dataSize=8 }; + +def macroop MOVAPS_R_M { + ldfp xmmh, seg, sib, "DISPLACEMENT + 8", dataSize=8 + ldfp xmml, seg, sib, disp, dataSize=8 +}; + +def macroop MOVAPS_R_P { + rdip t7 + ldfp xmmh, seg, riprel, "DISPLACEMENT + 8", dataSize=8 + ldfp xmml, seg, riprel, disp, dataSize=8 +}; + +def macroop MOVAPS_M_R { + stfp xmmh, seg, sib, "DISPLACEMENT + 8", dataSize=8 + stfp xmml, seg, sib, disp, dataSize=8 +}; + +def macroop MOVAPS_P_R { + rdip t7 + stfp xmmh, seg, riprel, "DISPLACEMENT + 8", dataSize=8 + stfp xmml, seg, riprel, disp, dataSize=8 +}; + +def macroop MOVAPS_R_R { + movfp xmml, xmml, xmmlm, dataSize=8 + movfp xmmh, xmmh, xmmhm, dataSize=8 +}; '''