diff --git a/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td index 0f782c9a8fde..829f65c4623f 100644 --- a/llvm/lib/Target/X86/X86InstrSSE.td +++ b/llvm/lib/Target/X86/X86InstrSSE.td @@ -2417,6 +2417,10 @@ def LFENCE : I<0xAE, MRM_E8, (outs), (ins), def MFENCE : I<0xAE, MRM_F0, (outs), (ins), "mfence", [(int_x86_sse2_mfence)]>, TB, Requires<[HasSSE2]>; +// Pause. This "instruction" is encoded as "rep; nop", so even though it +// was introduced with SSE2, it's backward compabitle. +def PAUSE : I<0x90, RawFrm, (outs), (ins), "pause", []>, REP; + //TODO: custom lower this so as to never even generate the noop def : Pat<(membarrier (i8 imm), (i8 imm), (i8 imm), (i8 imm), (i8 0)), (NOOP)>; diff --git a/llvm/test/MC/AsmParser/X86/x86_32-bit_cat.s b/llvm/test/MC/AsmParser/X86/x86_32-bit_cat.s index ec2bfa4a913d..c1efe293c00a 100644 --- a/llvm/test/MC/AsmParser/X86/x86_32-bit_cat.s +++ b/llvm/test/MC/AsmParser/X86/x86_32-bit_cat.s @@ -2482,6 +2482,12 @@ // CHECK: clflush 305419896 clflush 0x12345678 +// CHECK: pause + pause + +// CHECK: sfence + sfence + // CHECK: lfence lfence diff --git a/llvm/test/MC/AsmParser/X86/x86_32-new-encoder.s b/llvm/test/MC/AsmParser/X86/x86_32-new-encoder.s index 2400f5ad0125..6c087761671e 100644 --- a/llvm/test/MC/AsmParser/X86/x86_32-new-encoder.s +++ b/llvm/test/MC/AsmParser/X86/x86_32-new-encoder.s @@ -1,5 +1,8 @@ // RUN: llvm-mc -triple i386-unknown-unknown --show-encoding %s | FileCheck %s + pause +// CHECK: pause +// CHECK: encoding: [0xf3,0x90] sfence // CHECK: sfence // CHECK: encoding: [0x0f,0xae,0xf8]