Index: llvm/lib/Target/X86/X86InstrCompiler.td =================================================================== --- llvm/lib/Target/X86/X86InstrCompiler.td +++ llvm/lib/Target/X86/X86InstrCompiler.td @@ -896,15 +896,15 @@ multiclass ATOMIC_LOGIC_OP_RM Opc8, string s> { let Defs = [EFLAGS], mayLoad = 1, mayStore = 1, isCodeGenOnly = 1, SchedRW = [WriteBitTestSetRegRMW] in { - def 16rm : Ii8("x86_rm_" # s) addr:$src1, GR16:$src2))]>, OpSize16, TB, LOCK; - def 32rm : Ii8("x86_rm_" # s) addr:$src1, GR32:$src2))]>, OpSize32, TB, LOCK; - def 64rm : RIi8("x86_rm_" # s) addr:$src1, GR64:$src2))]>, TB, LOCK; Index: llvm/test/CodeGen/X86/atomic-rm-bit-test-64.ll =================================================================== --- llvm/test/CodeGen/X86/atomic-rm-bit-test-64.ll +++ llvm/test/CodeGen/X86/atomic-rm-bit-test-64.ll @@ -1,17 +1,17 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s +; RUN: llc -mtriple=x86_64-unknown-linux-gnu -show-mc-encoding < %s | FileCheck %s define i64 @atomic_shl1_xor_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_xor_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btcq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btcq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xbb,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -22,21 +22,22 @@ define i64 @atomic_shl2_xor_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl2_xor_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $2, %edx +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $2, %edx # encoding: [0xba,0x02,0x00,0x00,0x00] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB1_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: xorq %rdx, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB1_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: xorq %rdx, %rcx # encoding: [0x48,0x31,0xd1] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB1_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB1_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: andq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: andq %rdx, %rax # encoding: [0x48,0x21,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl i64 2, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -47,24 +48,25 @@ define i64 @atomic_shl1_neq_xor_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_neq_xor_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB2_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB2_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB2_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB2_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: incb %cl -; CHECK-NEXT: movl $1, %edx +; CHECK-NEXT: incb %cl # encoding: [0xfe,0xc1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: andq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: andq %rdx, %rax # encoding: [0x48,0x21,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -77,14 +79,14 @@ define i64 @atomic_shl1_small_mask_xor_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_small_mask_xor_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $31, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btcq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $31, %ecx # encoding: [0x83,0xe1,0x1f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btcq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xbb,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 31 %shl = shl nuw nsw i64 1, %rem @@ -96,14 +98,14 @@ define i64 @atomic_shl1_mask0_xor_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask0_xor_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btcq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btcq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xbb,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -116,14 +118,14 @@ define i64 @atomic_shl1_mask1_xor_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask1_xor_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btcq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btcq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xbb,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -136,14 +138,14 @@ define i64 @atomic_shl1_mask01_xor_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask01_xor_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btcq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btcq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xbb,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -155,20 +157,21 @@ define i64 @atomic_blsi_xor_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_blsi_xor_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: negq %rcx -; CHECK-NEXT: andq %rsi, %rcx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: negq %rcx # encoding: [0x48,0xf7,0xd9] +; CHECK-NEXT: andq %rsi, %rcx # encoding: [0x48,0x21,0xf1] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB7_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rdx -; CHECK-NEXT: xorq %rcx, %rdx -; CHECK-NEXT: lock cmpxchgq %rdx, (%rdi) -; CHECK-NEXT: jne .LBB7_1 +; CHECK-NEXT: movq %rax, %rdx # encoding: [0x48,0x89,0xc2] +; CHECK-NEXT: xorq %rcx, %rdx # encoding: [0x48,0x31,0xca] +; CHECK-NEXT: lock cmpxchgq %rdx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x17] +; CHECK-NEXT: jne .LBB7_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB7_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: andq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: andq %rcx, %rax # encoding: [0x48,0x21,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %sub = sub i64 0, %c %and = and i64 %sub, %c @@ -180,23 +183,24 @@ define i64 @atomic_shl1_xor_64_gpr_valz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_xor_64_gpr_valz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB8_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB8_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB8_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB8_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setae %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setae %dl # encoding: [0x0f,0x93,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -209,24 +213,25 @@ define i64 @atomic_shl2_xor_64_gpr_valz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl2_xor_64_gpr_valz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $2, %edx +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $2, %edx # encoding: [0xba,0x02,0x00,0x00,0x00] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB9_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: xorq %rdx, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB9_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: xorq %rdx, %rcx # encoding: [0x48,0x31,0xd1] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB9_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB9_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: testq %rax, %rdx -; CHECK-NEXT: sete %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: testq %rax, %rdx # encoding: [0x48,0x85,0xc2] +; CHECK-NEXT: sete %cl # encoding: [0x0f,0x94,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl i64 2, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -239,25 +244,26 @@ define i64 @atomic_shl1_neq_xor_64_gpr_valz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_neq_xor_64_gpr_valz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB10_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB10_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB10_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB10_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: incb %cl -; CHECK-NEXT: movzbl %cl, %edx -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: btq %rdx, %rax -; CHECK-NEXT: setae %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: incb %cl # encoding: [0xfe,0xc1] +; CHECK-NEXT: movzbl %cl, %edx # encoding: [0x0f,0xb6,0xd1] +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: btq %rdx, %rax # encoding: [0x48,0x0f,0xa3,0xd0] +; CHECK-NEXT: setae %cl # encoding: [0x0f,0x93,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -271,24 +277,25 @@ define i64 @atomic_shl1_small_mask_xor_64_gpr_valz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_small_mask_xor_64_gpr_valz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $31, %ecx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $31, %ecx # encoding: [0x83,0xe1,0x1f] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB11_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB11_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB11_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB11_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btl %ecx, %eax -; CHECK-NEXT: setae %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btl %ecx, %eax # encoding: [0x0f,0xa3,0xc8] +; CHECK-NEXT: setae %dl # encoding: [0x0f,0x93,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 31 %shl = shl nuw nsw i64 1, %rem @@ -302,23 +309,24 @@ define i64 @atomic_shl1_mask0_xor_64_gpr_valz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask0_xor_64_gpr_valz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB12_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB12_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB12_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB12_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setae %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setae %dl # encoding: [0x0f,0x93,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -332,23 +340,24 @@ define i64 @atomic_shl1_mask1_xor_64_gpr_valz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask1_xor_64_gpr_valz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB13_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB13_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB13_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB13_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setae %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setae %dl # encoding: [0x0f,0x93,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -362,24 +371,25 @@ define i64 @atomic_shl1_mask01_xor_64_gpr_valz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask01_xor_64_gpr_valz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB14_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB14_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB14_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB14_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setae %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setae %dl # encoding: [0x0f,0x93,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -393,23 +403,24 @@ define i64 @atomic_blsi_xor_64_gpr_valz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_blsi_xor_64_gpr_valz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rdx -; CHECK-NEXT: negq %rdx -; CHECK-NEXT: andq %rsi, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rdx # encoding: [0x48,0x89,0xf2] +; CHECK-NEXT: negq %rdx # encoding: [0x48,0xf7,0xda] +; CHECK-NEXT: andq %rsi, %rdx # encoding: [0x48,0x21,0xf2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB15_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: xorq %rdx, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB15_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: xorq %rdx, %rcx # encoding: [0x48,0x31,0xd1] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB15_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB15_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: testq %rdx, %rax -; CHECK-NEXT: sete %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: testq %rdx, %rax # encoding: [0x48,0x85,0xd0] +; CHECK-NEXT: sete %cl # encoding: [0x0f,0x94,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %sub = sub i64 0, %c %and = and i64 %sub, %c @@ -423,23 +434,24 @@ define i64 @atomic_shl1_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_xor_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB16_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB16_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB16_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB16_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -451,24 +463,25 @@ define i64 @atomic_shl2_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl2_xor_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $2, %edx +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $2, %edx # encoding: [0xba,0x02,0x00,0x00,0x00] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB17_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: xorq %rdx, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB17_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: xorq %rdx, %rcx # encoding: [0x48,0x31,0xd1] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB17_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB17_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: testq %rdx, %rax -; CHECK-NEXT: setne %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: testq %rdx, %rax # encoding: [0x48,0x85,0xd0] +; CHECK-NEXT: setne %cl # encoding: [0x0f,0x95,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl i64 2, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -481,25 +494,26 @@ define i64 @atomic_shl1_neq_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_neq_xor_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB18_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB18_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB18_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB18_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: incb %cl -; CHECK-NEXT: movzbl %cl, %edx -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: btq %rdx, %rax -; CHECK-NEXT: setb %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: incb %cl # encoding: [0xfe,0xc1] +; CHECK-NEXT: movzbl %cl, %edx # encoding: [0x0f,0xb6,0xd1] +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: btq %rdx, %rax # encoding: [0x48,0x0f,0xa3,0xd0] +; CHECK-NEXT: setb %cl # encoding: [0x0f,0x92,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -512,24 +526,25 @@ define i64 @atomic_shl1_small_mask_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_small_mask_xor_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $31, %ecx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $31, %ecx # encoding: [0x83,0xe1,0x1f] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB19_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB19_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB19_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB19_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btl %ecx, %eax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btl %ecx, %eax # encoding: [0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 31 %shl = shl nuw nsw i64 1, %rem @@ -542,23 +557,24 @@ define i64 @atomic_shl1_mask0_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask0_xor_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB20_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB20_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB20_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB20_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -571,23 +587,24 @@ define i64 @atomic_shl1_mask1_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask1_xor_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB21_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB21_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB21_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB21_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %0 = atomicrmw xor ptr %v, i64 %shl monotonic, align 8 @@ -600,24 +617,25 @@ define i64 @atomic_shl1_mask01_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask01_xor_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: movl $1, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB22_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: xorq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB22_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: xorq %rdx, %rsi # encoding: [0x48,0x31,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB22_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB22_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -630,23 +648,24 @@ define i64 @atomic_blsi_xor_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_blsi_xor_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rdx -; CHECK-NEXT: negq %rdx -; CHECK-NEXT: andq %rsi, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rdx # encoding: [0x48,0x89,0xf2] +; CHECK-NEXT: negq %rdx # encoding: [0x48,0xf7,0xda] +; CHECK-NEXT: andq %rsi, %rdx # encoding: [0x48,0x21,0xf2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB23_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: xorq %rdx, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB23_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: xorq %rdx, %rcx # encoding: [0x48,0x31,0xd1] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB23_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB23_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: testq %rdx, %rax -; CHECK-NEXT: setne %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: testq %rdx, %rax # encoding: [0x48,0x85,0xd0] +; CHECK-NEXT: setne %cl # encoding: [0x0f,0x95,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %sub = sub i64 0, %c %and = and i64 %sub, %c @@ -660,14 +679,14 @@ define i64 @atomic_shl1_and_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_and_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btrq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btrq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = sub i64 -1, %shl @@ -679,23 +698,24 @@ define i64 @atomic_shl2_and_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl2_and_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $2, %edx +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $2, %edx # encoding: [0xba,0x02,0x00,0x00,0x00] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq %rdx, %rcx -; CHECK-NEXT: notq %rcx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq %rdx, %rcx # encoding: [0x48,0x89,0xd1] +; CHECK-NEXT: notq %rcx # encoding: [0x48,0xf7,0xd1] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB25_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rcx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB25_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rcx, %rsi # encoding: [0x48,0x21,0xce] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB25_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB25_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: andq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: andq %rdx, %rax # encoding: [0x48,0x21,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl i64 2, %c %not = xor i64 %shl, -1 @@ -707,24 +727,25 @@ define i64 @atomic_shl1_neq_and_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_neq_and_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movq $-2, %rdx -; CHECK-NEXT: rolq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movq $-2, %rdx # encoding: [0x48,0xc7,0xc2,0xfe,0xff,0xff,0xff] +; CHECK-NEXT: rolq %cl, %rdx # encoding: [0x48,0xd3,0xc2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB26_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB26_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rdx, %rsi # encoding: [0x48,0x21,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB26_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB26_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: incb %cl -; CHECK-NEXT: movl $1, %edx +; CHECK-NEXT: incb %cl # encoding: [0xfe,0xc1] +; CHECK-NEXT: movl $1, %edx # encoding: [0xba,0x01,0x00,0x00,0x00] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: andq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: andq %rdx, %rax # encoding: [0x48,0x21,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = xor i64 %shl, -1 @@ -738,14 +759,14 @@ define i64 @atomic_shl1_small_mask_and_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_small_mask_and_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $31, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btrq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $31, %ecx # encoding: [0x83,0xe1,0x1f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btrq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 31 %shl = shl nuw nsw i64 1, %rem @@ -758,14 +779,14 @@ define i64 @atomic_shl1_mask0_and_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask0_and_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btrq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btrq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -779,14 +800,14 @@ define i64 @atomic_shl1_mask1_and_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask1_and_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btrq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btrq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = xor i64 %shl, -1 @@ -800,14 +821,14 @@ define i64 @atomic_shl1_mask01_and_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask01_and_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $63, %ecx -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btrq %rcx, (%rdi) -; CHECK-NEXT: setb %al +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $63, %ecx # encoding: [0x83,0xe1,0x3f] +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btrq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x0f] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: shlq %cl, %rax # encoding: [0x48,0xd3,0xe0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -820,23 +841,24 @@ define i64 @atomic_blsi_and_64_gpr_val(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_blsi_and_64_gpr_val: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: negq %rcx -; CHECK-NEXT: andq %rsi, %rcx -; CHECK-NEXT: movq %rcx, %rdx -; CHECK-NEXT: notq %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: negq %rcx # encoding: [0x48,0xf7,0xd9] +; CHECK-NEXT: andq %rsi, %rcx # encoding: [0x48,0x21,0xf1] +; CHECK-NEXT: movq %rcx, %rdx # encoding: [0x48,0x89,0xca] +; CHECK-NEXT: notq %rdx # encoding: [0x48,0xf7,0xd2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB31_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB31_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rdx, %rsi # encoding: [0x48,0x21,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB31_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB31_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: andq %rax, %rcx -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: andq %rax, %rcx # encoding: [0x48,0x21,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %sub = sub i64 0, %c %and = and i64 %sub, %c @@ -849,23 +871,24 @@ define i64 @atomic_shl1_and_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_and_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movq $-2, %rdx -; CHECK-NEXT: rolq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movq $-2, %rdx # encoding: [0x48,0xc7,0xc2,0xfe,0xff,0xff,0xff] +; CHECK-NEXT: rolq %cl, %rdx # encoding: [0x48,0xd3,0xc2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB32_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB32_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rdx, %rsi # encoding: [0x48,0x21,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB32_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB32_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = xor i64 %shl, -1 @@ -878,26 +901,27 @@ define i64 @atomic_shl2_and_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl2_and_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $2, %edx +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $2, %edx # encoding: [0xba,0x02,0x00,0x00,0x00] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq %rdx, %rcx -; CHECK-NEXT: notq %rcx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq %rdx, %rcx # encoding: [0x48,0x89,0xd1] +; CHECK-NEXT: notq %rcx # encoding: [0x48,0xf7,0xd1] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB33_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rcx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB33_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rcx, %rsi # encoding: [0x48,0x21,0xce] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB33_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB33_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: testq %rax, %rdx -; CHECK-NEXT: setne %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: testq %rax, %rdx # encoding: [0x48,0x85,0xc2] +; CHECK-NEXT: setne %cl # encoding: [0x0f,0x95,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl i64 2, %c %not = xor i64 %shl, -1 @@ -911,25 +935,26 @@ define i64 @atomic_shl1_neq_and_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_neq_and_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movq $-2, %rdx -; CHECK-NEXT: rolq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movq $-2, %rdx # encoding: [0x48,0xc7,0xc2,0xfe,0xff,0xff,0xff] +; CHECK-NEXT: rolq %cl, %rdx # encoding: [0x48,0xd3,0xc2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB34_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB34_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rdx, %rsi # encoding: [0x48,0x21,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB34_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB34_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: incb %cl -; CHECK-NEXT: movzbl %cl, %edx -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: btq %rdx, %rax -; CHECK-NEXT: setb %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: incb %cl # encoding: [0xfe,0xc1] +; CHECK-NEXT: movzbl %cl, %edx # encoding: [0x0f,0xb6,0xd1] +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: btq %rdx, %rax # encoding: [0x48,0x0f,0xa3,0xd0] +; CHECK-NEXT: setb %cl # encoding: [0x0f,0x92,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = xor i64 %shl, -1 @@ -943,24 +968,25 @@ define i64 @atomic_shl1_small_mask_and_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_small_mask_and_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: andl $31, %ecx -; CHECK-NEXT: movq $-2, %rdx -; CHECK-NEXT: rolq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: andl $31, %ecx # encoding: [0x83,0xe1,0x1f] +; CHECK-NEXT: movq $-2, %rdx # encoding: [0x48,0xc7,0xc2,0xfe,0xff,0xff,0xff] +; CHECK-NEXT: rolq %cl, %rdx # encoding: [0x48,0xd3,0xc2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB35_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB35_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rdx, %rsi # encoding: [0x48,0x21,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB35_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB35_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btl %ecx, %eax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btl %ecx, %eax # encoding: [0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 31 %shl = shl nuw nsw i64 1, %rem @@ -974,23 +1000,24 @@ define i64 @atomic_shl1_mask0_and_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask0_and_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movq $-2, %rdx -; CHECK-NEXT: rolq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movq $-2, %rdx # encoding: [0x48,0xc7,0xc2,0xfe,0xff,0xff,0xff] +; CHECK-NEXT: rolq %cl, %rdx # encoding: [0x48,0xd3,0xc2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB36_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB36_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rdx, %rsi # encoding: [0x48,0x21,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB36_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB36_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -1004,23 +1031,24 @@ define i64 @atomic_shl1_mask1_and_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask1_and_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movq $-2, %rdx -; CHECK-NEXT: rolq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movq $-2, %rdx # encoding: [0x48,0xc7,0xc2,0xfe,0xff,0xff,0xff] +; CHECK-NEXT: rolq %cl, %rdx # encoding: [0x48,0xd3,0xc2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB37_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB37_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rdx, %rsi # encoding: [0x48,0x21,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB37_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB37_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %edx, %edx -; CHECK-NEXT: btq %rcx, %rax -; CHECK-NEXT: setb %dl -; CHECK-NEXT: movq %rdx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %edx, %edx # encoding: [0x31,0xd2] +; CHECK-NEXT: btq %rcx, %rax # encoding: [0x48,0x0f,0xa3,0xc8] +; CHECK-NEXT: setb %dl # encoding: [0x0f,0x92,0xc2] +; CHECK-NEXT: movq %rdx, %rax # encoding: [0x48,0x89,0xd0] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = xor i64 %shl, -1 @@ -1034,26 +1062,27 @@ define i64 @atomic_shl1_mask01_and_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask01_and_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl %ecx, %edx -; CHECK-NEXT: andl $63, %edx -; CHECK-NEXT: movq $-2, %rsi +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl %ecx, %edx # encoding: [0x89,0xca] +; CHECK-NEXT: andl $63, %edx # encoding: [0x83,0xe2,0x3f] +; CHECK-NEXT: movq $-2, %rsi # encoding: [0x48,0xc7,0xc6,0xfe,0xff,0xff,0xff] ; CHECK-NEXT: # kill: def $cl killed $cl killed $rcx -; CHECK-NEXT: rolq %cl, %rsi -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: rolq %cl, %rsi # encoding: [0x48,0xd3,0xc6] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB38_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: andq %rsi, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB38_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: andq %rsi, %rcx # encoding: [0x48,0x21,0xf1] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB38_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB38_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: btq %rdx, %rax -; CHECK-NEXT: setb %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: btq %rdx, %rax # encoding: [0x48,0x0f,0xa3,0xd0] +; CHECK-NEXT: setb %cl # encoding: [0x0f,0x92,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -1067,25 +1096,26 @@ define i64 @atomic_blsi_and_64_gpr_valnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_blsi_and_64_gpr_valnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rdx -; CHECK-NEXT: negq %rdx -; CHECK-NEXT: andq %rsi, %rdx -; CHECK-NEXT: movq %rdx, %rcx -; CHECK-NEXT: notq %rcx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rdx # encoding: [0x48,0x89,0xf2] +; CHECK-NEXT: negq %rdx # encoding: [0x48,0xf7,0xda] +; CHECK-NEXT: andq %rsi, %rdx # encoding: [0x48,0x21,0xf2] +; CHECK-NEXT: movq %rdx, %rcx # encoding: [0x48,0x89,0xd1] +; CHECK-NEXT: notq %rcx # encoding: [0x48,0xf7,0xd1] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB39_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rcx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB39_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rcx, %rsi # encoding: [0x48,0x21,0xce] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB39_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB39_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: xorl %ecx, %ecx -; CHECK-NEXT: testq %rdx, %rax -; CHECK-NEXT: setne %cl -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: xorl %ecx, %ecx # encoding: [0x31,0xc9] +; CHECK-NEXT: testq %rdx, %rax # encoding: [0x48,0x85,0xd0] +; CHECK-NEXT: setne %cl # encoding: [0x0f,0x95,0xc1] +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %sub = sub i64 0, %c %and = and i64 %sub, %c @@ -1100,16 +1130,17 @@ define i64 @atomic_shl1_and_64_gpr_brnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_and_64_gpr_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movl %esi, %eax -; CHECK-NEXT: andl $63, %eax -; CHECK-NEXT: lock btrq %rax, (%rdi) -; CHECK-NEXT: jae .LBB40_1 +; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0] +; CHECK-NEXT: andl $63, %eax # encoding: [0x83,0xe0,0x3f] +; CHECK-NEXT: lock btrq %rax, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x07] +; CHECK-NEXT: jae .LBB40_1 # encoding: [0x73,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB40_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %if.then -; CHECK-NEXT: movq (%rdi,%rsi,8), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq (%rdi,%rsi,8), %rax # encoding: [0x48,0x8b,0x04,0xf7] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB40_1: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = xor i64 %shl, -1 @@ -1131,28 +1162,30 @@ define i64 @atomic_shl2_and_64_gpr_brnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl2_and_64_gpr_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movl $2, %edx -; CHECK-NEXT: shlq %cl, %rdx -; CHECK-NEXT: movq %rdx, %rsi -; CHECK-NEXT: notq %rsi -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movl $2, %edx # encoding: [0xba,0x02,0x00,0x00,0x00] +; CHECK-NEXT: shlq %cl, %rdx # encoding: [0x48,0xd3,0xe2] +; CHECK-NEXT: movq %rdx, %rsi # encoding: [0x48,0x89,0xd6] +; CHECK-NEXT: notq %rsi # encoding: [0x48,0xf7,0xd6] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB41_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %r8 -; CHECK-NEXT: andq %rsi, %r8 -; CHECK-NEXT: lock cmpxchgq %r8, (%rdi) -; CHECK-NEXT: jne .LBB41_1 +; CHECK-NEXT: movq %rax, %r8 # encoding: [0x49,0x89,0xc0] +; CHECK-NEXT: andq %rsi, %r8 # encoding: [0x49,0x21,0xf0] +; CHECK-NEXT: lock cmpxchgq %r8, (%rdi) # encoding: [0xf0,0x4c,0x0f,0xb1,0x07] +; CHECK-NEXT: jne .LBB41_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB41_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: testq %rdx, %rax -; CHECK-NEXT: je .LBB41_3 +; CHECK-NEXT: testq %rdx, %rax # encoding: [0x48,0x85,0xd0] +; CHECK-NEXT: je .LBB41_3 # encoding: [0x74,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB41_3-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.4: # %if.then -; CHECK-NEXT: movq (%rdi,%rcx,8), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq (%rdi,%rcx,8), %rax # encoding: [0x48,0x8b,0x04,0xcf] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB41_3: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl i64 2, %c %not = xor i64 %shl, -1 @@ -1174,28 +1207,30 @@ define i64 @atomic_shl1_neq_and_64_gpr_brnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_neq_and_64_gpr_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: movq $-2, %rdx -; CHECK-NEXT: rolq %cl, %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: movq $-2, %rdx # encoding: [0x48,0xc7,0xc2,0xfe,0xff,0xff,0xff] +; CHECK-NEXT: rolq %cl, %rdx # encoding: [0x48,0xd3,0xc2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB42_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rsi -; CHECK-NEXT: andq %rdx, %rsi -; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) -; CHECK-NEXT: jne .LBB42_1 +; CHECK-NEXT: movq %rax, %rsi # encoding: [0x48,0x89,0xc6] +; CHECK-NEXT: andq %rdx, %rsi # encoding: [0x48,0x21,0xd6] +; CHECK-NEXT: lock cmpxchgq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x37] +; CHECK-NEXT: jne .LBB42_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB42_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: leal 1(%rcx), %edx -; CHECK-NEXT: movzbl %dl, %edx -; CHECK-NEXT: btq %rdx, %rax -; CHECK-NEXT: jae .LBB42_3 +; CHECK-NEXT: leal 1(%rcx), %edx # encoding: [0x8d,0x51,0x01] +; CHECK-NEXT: movzbl %dl, %edx # encoding: [0x0f,0xb6,0xd2] +; CHECK-NEXT: btq %rdx, %rax # encoding: [0x48,0x0f,0xa3,0xd0] +; CHECK-NEXT: jae .LBB42_3 # encoding: [0x73,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB42_3-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.4: # %if.then -; CHECK-NEXT: movq (%rdi,%rcx,8), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq (%rdi,%rcx,8), %rax # encoding: [0x48,0x8b,0x04,0xcf] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB42_3: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = xor i64 %shl, -1 @@ -1219,15 +1254,16 @@ define i64 @atomic_shl1_small_mask_and_64_gpr_brnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_small_mask_and_64_gpr_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: andl $31, %esi -; CHECK-NEXT: lock btrq %rsi, (%rdi) -; CHECK-NEXT: jae .LBB43_1 +; CHECK-NEXT: andl $31, %esi # encoding: [0x83,0xe6,0x1f] +; CHECK-NEXT: lock btrq %rsi, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x37] +; CHECK-NEXT: jae .LBB43_1 # encoding: [0x73,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB43_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %if.then -; CHECK-NEXT: movq (%rdi,%rsi,8), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq (%rdi,%rsi,8), %rax # encoding: [0x48,0x8b,0x04,0xf7] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB43_1: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 31 %shl = shl nuw nsw i64 1, %rem @@ -1250,16 +1286,17 @@ define i64 @atomic_shl1_mask0_and_64_gpr_brnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask0_and_64_gpr_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movl %esi, %eax -; CHECK-NEXT: andl $63, %eax -; CHECK-NEXT: lock btrq %rax, (%rdi) -; CHECK-NEXT: jae .LBB44_1 +; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0] +; CHECK-NEXT: andl $63, %eax # encoding: [0x83,0xe0,0x3f] +; CHECK-NEXT: lock btrq %rax, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x07] +; CHECK-NEXT: jae .LBB44_1 # encoding: [0x73,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB44_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %if.then -; CHECK-NEXT: movq (%rdi,%rsi,8), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq (%rdi,%rsi,8), %rax # encoding: [0x48,0x8b,0x04,0xf7] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB44_1: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -1283,16 +1320,17 @@ define i64 @atomic_shl1_mask1_and_64_gpr_brnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask1_and_64_gpr_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movl %esi, %eax -; CHECK-NEXT: andl $63, %eax -; CHECK-NEXT: lock btrq %rax, (%rdi) -; CHECK-NEXT: jae .LBB45_1 +; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0] +; CHECK-NEXT: andl $63, %eax # encoding: [0x83,0xe0,0x3f] +; CHECK-NEXT: lock btrq %rax, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x07] +; CHECK-NEXT: jae .LBB45_1 # encoding: [0x73,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB45_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %if.then -; CHECK-NEXT: movq (%rdi,%rsi,8), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq (%rdi,%rsi,8), %rax # encoding: [0x48,0x8b,0x04,0xf7] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB45_1: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %shl = shl nuw i64 1, %c %not = xor i64 %shl, -1 @@ -1316,16 +1354,17 @@ define i64 @atomic_shl1_mask01_and_64_gpr_brnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_shl1_mask01_and_64_gpr_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movl %esi, %eax -; CHECK-NEXT: andl $63, %eax -; CHECK-NEXT: lock btrq %rax, (%rdi) -; CHECK-NEXT: jae .LBB46_1 +; CHECK-NEXT: movl %esi, %eax # encoding: [0x89,0xf0] +; CHECK-NEXT: andl $63, %eax # encoding: [0x83,0xe0,0x3f] +; CHECK-NEXT: lock btrq %rax, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb3,0x07] +; CHECK-NEXT: jae .LBB46_1 # encoding: [0x73,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB46_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %if.then -; CHECK-NEXT: movq (%rdi,%rsi,8), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq (%rdi,%rsi,8), %rax # encoding: [0x48,0x8b,0x04,0xf7] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB46_1: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %rem = and i64 %c, 63 %shl = shl nuw i64 1, %rem @@ -1348,28 +1387,30 @@ define i64 @atomic_blsi_and_64_gpr_brnz(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_blsi_and_64_gpr_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq %rsi, %rcx -; CHECK-NEXT: negq %rcx -; CHECK-NEXT: andq %rsi, %rcx -; CHECK-NEXT: movq %rcx, %rdx -; CHECK-NEXT: notq %rdx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq %rsi, %rcx # encoding: [0x48,0x89,0xf1] +; CHECK-NEXT: negq %rcx # encoding: [0x48,0xf7,0xd9] +; CHECK-NEXT: andq %rsi, %rcx # encoding: [0x48,0x21,0xf1] +; CHECK-NEXT: movq %rcx, %rdx # encoding: [0x48,0x89,0xca] +; CHECK-NEXT: notq %rdx # encoding: [0x48,0xf7,0xd2] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB47_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %r8 -; CHECK-NEXT: andq %rdx, %r8 -; CHECK-NEXT: lock cmpxchgq %r8, (%rdi) -; CHECK-NEXT: jne .LBB47_1 +; CHECK-NEXT: movq %rax, %r8 # encoding: [0x49,0x89,0xc0] +; CHECK-NEXT: andq %rdx, %r8 # encoding: [0x49,0x21,0xd0] +; CHECK-NEXT: lock cmpxchgq %r8, (%rdi) # encoding: [0xf0,0x4c,0x0f,0xb1,0x07] +; CHECK-NEXT: jne .LBB47_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB47_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: testq %rcx, %rax -; CHECK-NEXT: je .LBB47_3 +; CHECK-NEXT: testq %rcx, %rax # encoding: [0x48,0x85,0xc8] +; CHECK-NEXT: je .LBB47_3 # encoding: [0x74,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB47_3-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.4: # %if.then -; CHECK-NEXT: movq (%rdi,%rsi,8), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq (%rdi,%rsi,8), %rax # encoding: [0x48,0x8b,0x04,0xf7] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB47_3: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %sub = sub i64 0, %c %and = and i64 %sub, %c @@ -1392,17 +1433,18 @@ define i64 @atomic_shl1_xor_64_const_br(ptr %v) nounwind { ; CHECK-LABEL: atomic_shl1_xor_64_const_br: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btcq $4, (%rdi) -; CHECK-NEXT: setb %al -; CHECK-NEXT: shlq $4, %rax -; CHECK-NEXT: je .LBB48_1 +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btcq $4, (%rdi) # encoding: [0xf0,0x48,0x0f,0xba,0x3f,0x04] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] +; CHECK-NEXT: shlq $4, %rax # encoding: [0x48,0xc1,0xe0,0x04] +; CHECK-NEXT: je .LBB48_1 # encoding: [0x74,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB48_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %if.then -; CHECK-NEXT: movq 32(%rdi), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq 32(%rdi), %rax # encoding: [0x48,0x8b,0x47,0x20] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB48_1: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 8 %and = and i64 %0, 16 @@ -1422,23 +1464,25 @@ define i64 @atomic_shl1_neq_xor_64_const_br(ptr %v) nounwind { ; CHECK-LABEL: atomic_shl1_neq_xor_64_const_br: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB49_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: xorq $16, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB49_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: xorq $16, %rcx # encoding: [0x48,0x83,0xf1,0x10] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB49_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB49_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: movl $123, %ecx -; CHECK-NEXT: testb $32, %al -; CHECK-NEXT: je .LBB49_4 +; CHECK-NEXT: movl $123, %ecx # encoding: [0xb9,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: testb $32, %al # encoding: [0xa8,0x20] +; CHECK-NEXT: je .LBB49_4 # encoding: [0x74,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB49_4-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.3: # %if.then -; CHECK-NEXT: movq 32(%rdi), %rcx +; CHECK-NEXT: movq 32(%rdi), %rcx # encoding: [0x48,0x8b,0x4f,0x20] ; CHECK-NEXT: .LBB49_4: # %return -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 8 %and = and i64 %0, 32 @@ -1458,17 +1502,18 @@ define i64 @atomic_shl1_xor_64_const_brz(ptr %v) nounwind { ; CHECK-LABEL: atomic_shl1_xor_64_const_brz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btcq $4, (%rdi) -; CHECK-NEXT: setb %al -; CHECK-NEXT: shlq $4, %rax -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: je .LBB50_1 +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btcq $4, (%rdi) # encoding: [0xf0,0x48,0x0f,0xba,0x3f,0x04] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] +; CHECK-NEXT: shlq $4, %rax # encoding: [0x48,0xc1,0xe0,0x04] +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: je .LBB50_1 # encoding: [0x74,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB50_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %return -; CHECK-NEXT: retq +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB50_1: # %if.then -; CHECK-NEXT: movq 32(%rdi), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq 32(%rdi), %rax # encoding: [0x48,0x8b,0x47,0x20] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 8 %and = and i64 16, %0 @@ -1488,23 +1533,25 @@ define i64 @atomic_shl1_neq_xor_64_const_brz(ptr %v) nounwind { ; CHECK-LABEL: atomic_shl1_neq_xor_64_const_brz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB51_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: xorq $16, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB51_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: xorq $16, %rcx # encoding: [0x48,0x83,0xf1,0x10] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB51_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB51_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: movl $123, %ecx -; CHECK-NEXT: testb $32, %al -; CHECK-NEXT: jne .LBB51_4 +; CHECK-NEXT: movl $123, %ecx # encoding: [0xb9,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: testb $32, %al # encoding: [0xa8,0x20] +; CHECK-NEXT: jne .LBB51_4 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB51_4-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.3: # %if.then -; CHECK-NEXT: movq 32(%rdi), %rcx +; CHECK-NEXT: movq 32(%rdi), %rcx # encoding: [0x48,0x8b,0x4f,0x20] ; CHECK-NEXT: .LBB51_4: # %return -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 8 %and = and i64 %0, 32 @@ -1524,17 +1571,18 @@ define i64 @atomic_shl1_xor_64_const_brnz(ptr %v) nounwind { ; CHECK-LABEL: atomic_shl1_xor_64_const_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: lock btcq $4, (%rdi) -; CHECK-NEXT: setb %al -; CHECK-NEXT: shlq $4, %rax -; CHECK-NEXT: je .LBB52_1 +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btcq $4, (%rdi) # encoding: [0xf0,0x48,0x0f,0xba,0x3f,0x04] +; CHECK-NEXT: setb %al # encoding: [0x0f,0x92,0xc0] +; CHECK-NEXT: shlq $4, %rax # encoding: [0x48,0xc1,0xe0,0x04] +; CHECK-NEXT: je .LBB52_1 # encoding: [0x74,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB52_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %if.then -; CHECK-NEXT: movq 32(%rdi), %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq 32(%rdi), %rax # encoding: [0x48,0x8b,0x47,0x20] +; CHECK-NEXT: retq # encoding: [0xc3] ; CHECK-NEXT: .LBB52_1: -; CHECK-NEXT: movl $123, %eax -; CHECK-NEXT: retq +; CHECK-NEXT: movl $123, %eax # encoding: [0xb8,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 8 %and = and i64 %0, 16 @@ -1554,23 +1602,25 @@ define i64 @atomic_shl1_neq_xor_64_const_brnz(ptr %v) nounwind { ; CHECK-LABEL: atomic_shl1_neq_xor_64_const_brnz: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB53_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rcx -; CHECK-NEXT: xorq $16, %rcx -; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) -; CHECK-NEXT: jne .LBB53_1 +; CHECK-NEXT: movq %rax, %rcx # encoding: [0x48,0x89,0xc1] +; CHECK-NEXT: xorq $16, %rcx # encoding: [0x48,0x83,0xf1,0x10] +; CHECK-NEXT: lock cmpxchgq %rcx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x0f] +; CHECK-NEXT: jne .LBB53_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB53_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: movl $123, %ecx -; CHECK-NEXT: testb $32, %al -; CHECK-NEXT: je .LBB53_4 +; CHECK-NEXT: movl $123, %ecx # encoding: [0xb9,0x7b,0x00,0x00,0x00] +; CHECK-NEXT: testb $32, %al # encoding: [0xa8,0x20] +; CHECK-NEXT: je .LBB53_4 # encoding: [0x74,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB53_4-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.3: # %if.then -; CHECK-NEXT: movq 32(%rdi), %rcx +; CHECK-NEXT: movq 32(%rdi), %rcx # encoding: [0x48,0x8b,0x4f,0x20] ; CHECK-NEXT: .LBB53_4: # %return -; CHECK-NEXT: movq %rcx, %rax -; CHECK-NEXT: retq +; CHECK-NEXT: movq %rcx, %rax # encoding: [0x48,0x89,0xc8] +; CHECK-NEXT: retq # encoding: [0xc3] entry: %0 = atomicrmw xor ptr %v, i64 16 monotonic, align 8 %and = and i64 %0, 32 @@ -1590,19 +1640,37 @@ define i64 @atomic_and_with_not_arg(ptr %v, i64 %c) nounwind { ; CHECK-LABEL: atomic_and_with_not_arg: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: movq $-1, %rcx -; CHECK-NEXT: movq (%rdi), %rax +; CHECK-NEXT: movq $-1, %rcx # encoding: [0x48,0xc7,0xc1,0xff,0xff,0xff,0xff] +; CHECK-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] ; CHECK-NEXT: .p2align 4, 0x90 ; CHECK-NEXT: .LBB54_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: movq %rax, %rdx -; CHECK-NEXT: orq %rcx, %rdx -; CHECK-NEXT: lock cmpxchgq %rdx, (%rdi) -; CHECK-NEXT: jne .LBB54_1 +; CHECK-NEXT: movq %rax, %rdx # encoding: [0x48,0x89,0xc2] +; CHECK-NEXT: orq %rcx, %rdx # encoding: [0x48,0x09,0xca] +; CHECK-NEXT: lock cmpxchgq %rdx, (%rdi) # encoding: [0xf0,0x48,0x0f,0xb1,0x17] +; CHECK-NEXT: jne .LBB54_1 # encoding: [0x75,A] +; CHECK-NEXT: # fixup A - offset: 1, value: .LBB54_1-1, kind: FK_PCRel_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end -; CHECK-NEXT: retq +; CHECK-NEXT: retq # encoding: [0xc3] entry: %0 = xor i64 0, -1 %1 = atomicrmw or ptr %v, i64 %0 monotonic, align 8 ret i64 %1 } + +@a = external dso_local global { { i64 } } + +define i32 @atomic_global() nounwind { +; CHECK-LABEL: atomic_global: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: lock btsq %rax, a(%rip) # encoding: [0xf0,0x48,0x0f,0xab,0x05,A,A,A,A] +; CHECK-NEXT: # fixup A - offset: 5, value: a-4, kind: reloc_riprel_4byte +; CHECK-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0] +; CHECK-NEXT: retq # encoding: [0xc3] +entry: + %shl.i = shl i64 1, 0 + %0 = atomicrmw or ptr @a, i64 %shl.i monotonic, align 8 + %and.i = and i64 %shl.i, %0 + ret i32 0 +}