| Index: tests_lit/llvm2ice_tests/nacl-atomic-intrinsics.ll
 | 
| diff --git a/tests_lit/llvm2ice_tests/nacl-atomic-intrinsics.ll b/tests_lit/llvm2ice_tests/nacl-atomic-intrinsics.ll
 | 
| index c16f7c0429d918694553d08895b1e73f4310b96a..fdd1d657356d61f05e8e0ea0ad542a28630e9c02 100644
 | 
| --- a/tests_lit/llvm2ice_tests/nacl-atomic-intrinsics.ll
 | 
| +++ b/tests_lit/llvm2ice_tests/nacl-atomic-intrinsics.ll
 | 
| @@ -1,17 +1,11 @@
 | 
|  ; This tests each of the supported NaCl atomic instructions for every
 | 
|  ; size allowed.
 | 
|  
 | 
| -; RUN: %p2i -i %s --args -O2 --verbose none \
 | 
| -; RUN:   | llvm-mc -triple=i686-none-nacl -filetype=obj \
 | 
| -; RUN:   | llvm-objdump -d --symbolize -x86-asm-syntax=intel - \
 | 
| +; RUN: %p2i -i %s --assemble --disassemble --args -O2 --verbose none \
 | 
|  ; RUN:   | FileCheck %s
 | 
| -; RUN: %p2i -i %s --args -O2 --verbose none \
 | 
| -; RUN:   | llvm-mc -triple=i686-none-nacl -filetype=obj \
 | 
| -; RUN:   | llvm-objdump -d --symbolize -x86-asm-syntax=intel - \
 | 
| -; RUN:   | FileCheck --check-prefix=CHECKO2 %s
 | 
| -; RUN: %p2i -i %s --args -Om1 --verbose none \
 | 
| -; RUN:   | llvm-mc -triple=i686-none-nacl -filetype=obj \
 | 
| -; RUN:   | llvm-objdump -d --symbolize -x86-asm-syntax=intel - \
 | 
| +; RUN: %p2i -i %s --assemble --disassemble --args -O2 --verbose none \
 | 
| +; RUN:   | FileCheck --check-prefix=O2 %s
 | 
| +; RUN: %p2i -i %s --assemble --disassemble --args -Om1 --verbose none \
 | 
|  ; RUN:   | FileCheck %s
 | 
|  
 | 
|  declare i8 @llvm.nacl.atomic.load.i8(i8*, i32)
 | 
| @@ -53,8 +47,8 @@ entry:
 | 
|    ret i32 %r
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_load_8
 | 
| -; CHECK: mov {{.*}}, dword
 | 
| -; CHECK: mov {{.*}}, byte
 | 
| +; CHECK: mov {{.*}},DWORD
 | 
| +; CHECK: mov {{.*}},BYTE
 | 
|  
 | 
|  define i32 @test_atomic_load_16(i32 %iptr) {
 | 
|  entry:
 | 
| @@ -64,8 +58,8 @@ entry:
 | 
|    ret i32 %r
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_load_16
 | 
| -; CHECK: mov {{.*}}, dword
 | 
| -; CHECK: mov {{.*}}, word
 | 
| +; CHECK: mov {{.*}},DWORD
 | 
| +; CHECK: mov {{.*}},WORD
 | 
|  
 | 
|  define i32 @test_atomic_load_32(i32 %iptr) {
 | 
|  entry:
 | 
| @@ -74,8 +68,8 @@ entry:
 | 
|    ret i32 %r
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_load_32
 | 
| -; CHECK: mov {{.*}}, dword
 | 
| -; CHECK: mov {{.*}}, dword
 | 
| +; CHECK: mov {{.*}},DWORD
 | 
| +; CHECK: mov {{.*}},DWORD
 | 
|  
 | 
|  define i64 @test_atomic_load_64(i32 %iptr) {
 | 
|  entry:
 | 
| @@ -84,8 +78,8 @@ entry:
 | 
|    ret i64 %r
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_load_64
 | 
| -; CHECK: movq x{{.*}}, qword
 | 
| -; CHECK: movq qword {{.*}}, x{{.*}}
 | 
| +; CHECK: movq x{{.*}},QWORD
 | 
| +; CHECK: movq QWORD {{.*}},x{{.*}}
 | 
|  
 | 
|  define i32 @test_atomic_load_32_with_arith(i32 %iptr) {
 | 
|  entry:
 | 
| @@ -98,13 +92,13 @@ next:
 | 
|    ret i32 %r2
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_load_32_with_arith
 | 
| -; CHECK: mov {{.*}}, dword
 | 
| +; CHECK: mov {{.*}},DWORD
 | 
|  ; The next instruction may be a separate load or folded into an add.
 | 
|  ;
 | 
|  ; In O2 mode, we know that the load and add are going to be fused.
 | 
| -; CHECKO2-LABEL: test_atomic_load_32_with_arith
 | 
| -; CHECKO2: mov {{.*}}, dword
 | 
| -; CHECKO2: add {{.*}}, dword
 | 
| +; O2-LABEL: test_atomic_load_32_with_arith
 | 
| +; O2: mov {{.*}},DWORD
 | 
| +; O2: add {{.*}},DWORD
 | 
|  
 | 
|  define i32 @test_atomic_load_32_ignored(i32 %iptr) {
 | 
|  entry:
 | 
| @@ -113,11 +107,11 @@ entry:
 | 
|    ret i32 0
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_load_32_ignored
 | 
| -; CHECK: mov {{.*}}, dword
 | 
| -; CHECK: mov {{.*}}, dword
 | 
| -; CHECKO2-LABEL: test_atomic_load_32_ignored
 | 
| -; CHECKO2: mov {{.*}}, dword
 | 
| -; CHECKO2: mov {{.*}}, dword
 | 
| +; CHECK: mov {{.*}},DWORD
 | 
| +; CHECK: mov {{.*}},DWORD
 | 
| +; O2-LABEL: test_atomic_load_32_ignored
 | 
| +; O2: mov {{.*}},DWORD
 | 
| +; O2: mov {{.*}},DWORD
 | 
|  
 | 
|  define i64 @test_atomic_load_64_ignored(i32 %iptr) {
 | 
|  entry:
 | 
| @@ -126,8 +120,8 @@ entry:
 | 
|    ret i64 0
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_load_64_ignored
 | 
| -; CHECK: movq x{{.*}}, qword
 | 
| -; CHECK: movq qword {{.*}}, x{{.*}}
 | 
| +; CHECK: movq x{{.*}},QWORD
 | 
| +; CHECK: movq QWORD {{.*}},x{{.*}}
 | 
|  
 | 
|  ;;; Store
 | 
|  
 | 
| @@ -139,7 +133,7 @@ entry:
 | 
|    ret void
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_store_8
 | 
| -; CHECK: mov byte
 | 
| +; CHECK: mov BYTE
 | 
|  ; CHECK: mfence
 | 
|  
 | 
|  define void @test_atomic_store_16(i32 %iptr, i32 %v) {
 | 
| @@ -150,7 +144,7 @@ entry:
 | 
|    ret void
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_store_16
 | 
| -; CHECK: mov word
 | 
| +; CHECK: mov WORD
 | 
|  ; CHECK: mfence
 | 
|  
 | 
|  define void @test_atomic_store_32(i32 %iptr, i32 %v) {
 | 
| @@ -160,7 +154,7 @@ entry:
 | 
|    ret void
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_store_32
 | 
| -; CHECK: mov dword
 | 
| +; CHECK: mov DWORD
 | 
|  ; CHECK: mfence
 | 
|  
 | 
|  define void @test_atomic_store_64(i32 %iptr, i64 %v) {
 | 
| @@ -170,8 +164,8 @@ entry:
 | 
|    ret void
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_store_64
 | 
| -; CHECK: movq x{{.*}}, qword
 | 
| -; CHECK: movq qword {{.*}}, x{{.*}}
 | 
| +; CHECK: movq x{{.*}},QWORD
 | 
| +; CHECK: movq QWORD {{.*}},x{{.*}}
 | 
|  ; CHECK: mfence
 | 
|  
 | 
|  define void @test_atomic_store_64_const(i32 %iptr) {
 | 
| @@ -181,10 +175,10 @@ entry:
 | 
|    ret void
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_store_64_const
 | 
| -; CHECK: mov {{.*}}, 1942892530
 | 
| -; CHECK: mov {{.*}}, 2874
 | 
| -; CHECK: movq x{{.*}}, qword
 | 
| -; CHECK: movq qword {{.*}}, x{{.*}}
 | 
| +; CHECK: mov {{.*}},0x73ce2ff2
 | 
| +; CHECK: mov {{.*}},0xb3a
 | 
| +; CHECK: movq x{{.*}},QWORD
 | 
| +; CHECK: movq QWORD {{.*}},x{{.*}}
 | 
|  ; CHECK: mfence
 | 
|  
 | 
|  
 | 
| @@ -202,9 +196,8 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_add_8
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: xadd byte {{.*}}, [[REG:.*]]
 | 
| -; CHECK: {{mov|movzx}} {{.*}}, [[REG]]
 | 
| +; CHECK: lock xadd BYTE {{.*}},[[REG:.*]]
 | 
| +; CHECK: {{mov|movzx}} {{.*}},[[REG]]
 | 
|  
 | 
|  define i32 @test_atomic_rmw_add_16(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -215,9 +208,8 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_add_16
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: xadd word {{.*}}, [[REG:.*]]
 | 
| -; CHECK: {{mov|movzx}} {{.*}}, [[REG]]
 | 
| +; CHECK: lock xadd WORD {{.*}},[[REG:.*]]
 | 
| +; CHECK: {{mov|movzx}} {{.*}},[[REG]]
 | 
|  
 | 
|  define i32 @test_atomic_rmw_add_32(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -226,9 +218,8 @@ entry:
 | 
|    ret i32 %a
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_add_32
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: xadd dword {{.*}}, [[REG:.*]]
 | 
| -; CHECK: mov {{.*}}, [[REG]]
 | 
| +; CHECK: lock xadd DWORD {{.*}},[[REG:.*]]
 | 
| +; CHECK: mov {{.*}},[[REG]]
 | 
|  
 | 
|  define i64 @test_atomic_rmw_add_64(i32 %iptr, i64 %v) {
 | 
|  entry:
 | 
| @@ -238,27 +229,23 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_add_64
 | 
|  ; CHECK: push ebx
 | 
| -; CHECK: mov eax, dword ptr [{{.*}}]
 | 
| -; CHECK: mov edx, dword ptr [{{.*}} + 4]
 | 
| -; CHECK: mov ebx, eax
 | 
| +; CHECK: mov eax,DWORD PTR [{{.*}}]
 | 
| +; CHECK: mov edx,DWORD PTR [{{.*}}+0x4]
 | 
| +; CHECK: [[LABEL:[^ ]*]]: {{.*}} mov ebx,eax
 | 
|  ; RHS of add cannot be any of the e[abcd]x regs because they are
 | 
|  ; clobbered in the loop, and the RHS needs to be remain live.
 | 
| -; CHECK: add ebx, {{.*e.[^x]}}
 | 
| -; CHECK: mov ecx, edx
 | 
| -; CHECK: adc ecx, {{.*e.[^x]}}
 | 
| +; CHECK: add ebx,{{.*e.[^x]}}
 | 
| +; CHECK: mov ecx,edx
 | 
| +; CHECK: adc ecx,{{.*e.[^x]}}
 | 
|  ; Ptr cannot be eax, ebx, ecx, or edx (used up for the expected and desired).
 | 
|  ; It can be esi, edi, or ebp though, for example (so we need to be careful
 | 
|  ; about rejecting eb* and ed*.)
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}
 | 
| +; CHECK: jne [[LABEL]]
 | 
|  
 | 
|  ; Test with some more register pressure. When we have an alloca, ebp is
 | 
|  ; used to manage the stack frame, so it cannot be used as a register either.
 | 
| -define void @use_ptr(i32 %iptr) {
 | 
| -entry:
 | 
| -  ret void
 | 
| -}
 | 
| +declare void @use_ptr(i32 %iptr)
 | 
|  
 | 
|  define i64 @test_atomic_rmw_add_64_alloca(i32 %iptr, i64 %v) {
 | 
|  entry:
 | 
| @@ -284,9 +271,8 @@ entry:
 | 
|  ; not esp, since that's the stack pointer and mucking with it will break
 | 
|  ; the later use_ptr function call.
 | 
|  ; That pretty much leaves esi, or edi as the only viable registers.
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{[ds]}}i]
 | 
| -; CHECK: call use_ptr
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{[ds]}}i]
 | 
| +; CHECK: call {{.*}} R_{{.*}} use_ptr
 | 
|  
 | 
|  define i32 @test_atomic_rmw_add_32_ignored(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -297,8 +283,7 @@ entry:
 | 
|  ; Technically this could use "lock add" instead of "lock xadd", if liveness
 | 
|  ; tells us that the destination variable is dead.
 | 
|  ; CHECK-LABEL: test_atomic_rmw_add_32_ignored
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: xadd dword {{.*}}, [[REG:.*]]
 | 
| +; CHECK: lock xadd DWORD {{.*}},[[REG:.*]]
 | 
|  
 | 
|  ; Atomic RMW 64 needs to be expanded into its own loop.
 | 
|  ; Make sure that works w/ non-trivial function bodies.
 | 
| @@ -322,15 +307,14 @@ err:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_add_64_loop
 | 
|  ; CHECK: push ebx
 | 
| -; CHECK: mov eax, dword ptr [{{.*}}]
 | 
| -; CHECK: mov edx, dword ptr [{{.*}} + 4]
 | 
| -; CHECK: mov ebx, eax
 | 
| -; CHECK: add ebx, {{.*e.[^x]}}
 | 
| -; CHECK: mov ecx, edx
 | 
| -; CHECK: adc ecx, {{.*e.[^x]}}
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: mov eax,DWORD PTR [{{.*}}]
 | 
| +; CHECK: mov edx,DWORD PTR [{{.*}}+0x4]
 | 
| +; CHECK: [[LABEL:[^ ]*]]: {{.*}} mov ebx,eax
 | 
| +; CHECK: add ebx,{{.*e.[^x]}}
 | 
| +; CHECK: mov ecx,edx
 | 
| +; CHECK: adc ecx,{{.*e.[^x]}}
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}+0x0]
 | 
| +; CHECK: jne [[LABEL]]
 | 
|  
 | 
|  ;; sub
 | 
|  
 | 
| @@ -344,9 +328,8 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_sub_8
 | 
|  ; CHECK: neg [[REG:.*]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: xadd byte {{.*}}, [[REG]]
 | 
| -; CHECK: {{mov|movzx}} {{.*}}, [[REG]]
 | 
| +; CHECK: lock xadd BYTE {{.*}},[[REG]]
 | 
| +; CHECK: {{mov|movzx}} {{.*}},[[REG]]
 | 
|  
 | 
|  define i32 @test_atomic_rmw_sub_16(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -358,9 +341,8 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_sub_16
 | 
|  ; CHECK: neg [[REG:.*]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: xadd word {{.*}}, [[REG]]
 | 
| -; CHECK: {{mov|movzx}} {{.*}}, [[REG]]
 | 
| +; CHECK: lock xadd WORD {{.*}},[[REG]]
 | 
| +; CHECK: {{mov|movzx}} {{.*}},[[REG]]
 | 
|  
 | 
|  define i32 @test_atomic_rmw_sub_32(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -370,9 +352,8 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_sub_32
 | 
|  ; CHECK: neg [[REG:.*]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: xadd dword {{.*}}, [[REG]]
 | 
| -; CHECK: mov {{.*}}, [[REG]]
 | 
| +; CHECK: lock xadd DWORD {{.*}},[[REG]]
 | 
| +; CHECK: mov {{.*}},[[REG]]
 | 
|  
 | 
|  define i64 @test_atomic_rmw_sub_64(i32 %iptr, i64 %v) {
 | 
|  entry:
 | 
| @@ -382,15 +363,14 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_sub_64
 | 
|  ; CHECK: push ebx
 | 
| -; CHECK: mov eax, dword ptr [{{.*}}]
 | 
| -; CHECK: mov edx, dword ptr [{{.*}} + 4]
 | 
| -; CHECK: mov ebx, eax
 | 
| -; CHECK: sub ebx, {{.*e.[^x]}}
 | 
| -; CHECK: mov ecx, edx
 | 
| -; CHECK: sbb ecx, {{.*e.[^x]}}
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: mov eax,DWORD PTR [{{.*}}]
 | 
| +; CHECK: mov edx,DWORD PTR [{{.*}}+0x4]
 | 
| +; CHECK: [[LABEL:[^ ]*]]: {{.*}} mov ebx,eax
 | 
| +; CHECK: sub ebx,{{.*e.[^x]}}
 | 
| +; CHECK: mov ecx,edx
 | 
| +; CHECK: sbb ecx,{{.*e.[^x]}}
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}
 | 
| +; CHECK: jne [[LABEL]]
 | 
|  
 | 
|  
 | 
|  define i32 @test_atomic_rmw_sub_32_ignored(i32 %iptr, i32 %v) {
 | 
| @@ -402,8 +382,7 @@ entry:
 | 
|  ; Could use "lock sub" instead of "neg; lock xadd"
 | 
|  ; CHECK-LABEL: test_atomic_rmw_sub_32_ignored
 | 
|  ; CHECK: neg [[REG:.*]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: xadd dword {{.*}}, [[REG]]
 | 
| +; CHECK: lock xadd DWORD {{.*}},[[REG]]
 | 
|  
 | 
|  ;; or
 | 
|  
 | 
| @@ -416,13 +395,12 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_or_8
 | 
| -; CHECK: mov al, byte ptr
 | 
| +; CHECK: mov al,BYTE PTR
 | 
|  ; Dest cannot be eax here, because eax is used for the old value. Also want
 | 
|  ; to make sure that cmpxchg's source is the same register.
 | 
|  ; CHECK: or [[REG:[^a].]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg byte ptr [e{{[^a].}}], [[REG]]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg BYTE PTR [e{{[^a].}}],[[REG]]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i32 @test_atomic_rmw_or_16(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -433,11 +411,10 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_or_16
 | 
| -; CHECK: mov ax, word ptr
 | 
| +; CHECK: mov ax,WORD PTR
 | 
|  ; CHECK: or [[REG:[^a].]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg word ptr [e{{[^a].}}], [[REG]]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg WORD PTR [e{{[^a].}}],[[REG]]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i32 @test_atomic_rmw_or_32(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -446,11 +423,10 @@ entry:
 | 
|    ret i32 %a
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_or_32
 | 
| -; CHECK: mov eax, dword ptr
 | 
| +; CHECK: mov eax,DWORD PTR
 | 
|  ; CHECK: or [[REG:e[^a].]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg dword ptr [e{{[^a].}}], [[REG]]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg DWORD PTR [e{{[^a].}}],[[REG]]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i64 @test_atomic_rmw_or_64(i32 %iptr, i64 %v) {
 | 
|  entry:
 | 
| @@ -460,15 +436,14 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_or_64
 | 
|  ; CHECK: push ebx
 | 
| -; CHECK: mov eax, dword ptr [{{.*}}]
 | 
| -; CHECK: mov edx, dword ptr [{{.*}} + 4]
 | 
| -; CHECK: mov ebx, eax
 | 
| -; CHECK: or ebx, {{.*e.[^x]}}
 | 
| -; CHECK: mov ecx, edx
 | 
| -; CHECK: or ecx, {{.*e.[^x]}}
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: mov eax,DWORD PTR [{{.*}}]
 | 
| +; CHECK: mov edx,DWORD PTR [{{.*}}+0x4]
 | 
| +; CHECK: [[LABEL:[^ ]*]]: {{.*}} mov ebx,eax
 | 
| +; CHECK: or ebx,{{.*e.[^x]}}
 | 
| +; CHECK: mov ecx,edx
 | 
| +; CHECK: or ecx,{{.*e.[^x]}}
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}
 | 
| +; CHECK: jne [[LABEL]]
 | 
|  
 | 
|  define i32 @test_atomic_rmw_or_32_ignored(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -480,11 +455,10 @@ entry:
 | 
|  ; Could just "lock or", if we inspect the liveness information first.
 | 
|  ; Would also need a way to introduce "lock"'edness to binary
 | 
|  ; operators without introducing overhead on the more common binary ops.
 | 
| -; CHECK: mov eax, dword ptr
 | 
| +; CHECK: mov eax,DWORD PTR
 | 
|  ; CHECK: or [[REG:e[^a].]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg dword ptr [e{{[^a].}}], [[REG]]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg DWORD PTR [e{{[^a].}}],[[REG]]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  ;; and
 | 
|  
 | 
| @@ -497,11 +471,10 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_and_8
 | 
| -; CHECK: mov al, byte ptr
 | 
| +; CHECK: mov al,BYTE PTR
 | 
|  ; CHECK: and [[REG:[^a].]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg byte ptr [e{{[^a].}}], [[REG]]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg BYTE PTR [e{{[^a].}}],[[REG]]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i32 @test_atomic_rmw_and_16(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -512,11 +485,10 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_and_16
 | 
| -; CHECK: mov ax, word ptr
 | 
| +; CHECK: mov ax,WORD PTR
 | 
|  ; CHECK: and
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg word ptr [e{{[^a].}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg WORD PTR [e{{[^a].}}]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i32 @test_atomic_rmw_and_32(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -525,11 +497,10 @@ entry:
 | 
|    ret i32 %a
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_and_32
 | 
| -; CHECK: mov eax, dword ptr
 | 
| +; CHECK: mov eax,DWORD PTR
 | 
|  ; CHECK: and
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg dword ptr [e{{[^a].}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg DWORD PTR [e{{[^a].}}]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i64 @test_atomic_rmw_and_64(i32 %iptr, i64 %v) {
 | 
|  entry:
 | 
| @@ -539,15 +510,14 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_and_64
 | 
|  ; CHECK: push ebx
 | 
| -; CHECK: mov eax, dword ptr [{{.*}}]
 | 
| -; CHECK: mov edx, dword ptr [{{.*}} + 4]
 | 
| -; CHECK: mov ebx, eax
 | 
| -; CHECK: and ebx, {{.*e.[^x]}}
 | 
| -; CHECK: mov ecx, edx
 | 
| -; CHECK: and ecx, {{.*e.[^x]}}
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: mov eax,DWORD PTR [{{.*}}]
 | 
| +; CHECK: mov edx,DWORD PTR [{{.*}}+0x4]
 | 
| +; CHECK: [[LABEL:[^ ]*]]: {{.*}} mov ebx,eax
 | 
| +; CHECK: and ebx,{{.*e.[^x]}}
 | 
| +; CHECK: mov ecx,edx
 | 
| +; CHECK: and ecx,{{.*e.[^x]}}
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}
 | 
| +; CHECK: jne [[LABEL]]
 | 
|  
 | 
|  define i32 @test_atomic_rmw_and_32_ignored(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -557,11 +527,10 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_and_32_ignored
 | 
|  ; Could just "lock and"
 | 
| -; CHECK: mov eax, dword ptr
 | 
| +; CHECK: mov eax,DWORD PTR
 | 
|  ; CHECK: and
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg dword ptr [e{{[^a].}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg DWORD PTR [e{{[^a].}}]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  ;; xor
 | 
|  
 | 
| @@ -574,11 +543,10 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xor_8
 | 
| -; CHECK: mov al, byte ptr
 | 
| +; CHECK: mov al,BYTE PTR
 | 
|  ; CHECK: xor [[REG:[^a].]]
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg byte ptr [e{{[^a].}}], [[REG]]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg BYTE PTR [e{{[^a].}}],[[REG]]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i32 @test_atomic_rmw_xor_16(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -589,11 +557,10 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xor_16
 | 
| -; CHECK: mov ax, word ptr
 | 
| +; CHECK: mov ax,WORD PTR
 | 
|  ; CHECK: xor
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg word ptr [e{{[^a].}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg WORD PTR [e{{[^a].}}]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  
 | 
|  define i32 @test_atomic_rmw_xor_32(i32 %iptr, i32 %v) {
 | 
| @@ -603,11 +570,10 @@ entry:
 | 
|    ret i32 %a
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xor_32
 | 
| -; CHECK: mov eax, dword ptr
 | 
| +; CHECK: mov eax,DWORD PTR
 | 
|  ; CHECK: xor
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg dword ptr [e{{[^a].}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg DWORD PTR [e{{[^a].}}]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i64 @test_atomic_rmw_xor_64(i32 %iptr, i64 %v) {
 | 
|  entry:
 | 
| @@ -617,15 +583,14 @@ entry:
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xor_64
 | 
|  ; CHECK: push ebx
 | 
| -; CHECK: mov eax, dword ptr [{{.*}}]
 | 
| -; CHECK: mov edx, dword ptr [{{.*}} + 4]
 | 
| -; CHECK: mov ebx, eax
 | 
| -; CHECK: or ebx, {{.*e.[^x]}}
 | 
| -; CHECK: mov ecx, edx
 | 
| -; CHECK: or ecx, {{.*e.[^x]}}
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: mov eax,DWORD PTR [{{.*}}]
 | 
| +; CHECK: mov edx,DWORD PTR [{{.*}}+0x4]
 | 
| +; CHECK: mov ebx,eax
 | 
| +; CHECK: or ebx,{{.*e.[^x]}}
 | 
| +; CHECK: mov ecx,edx
 | 
| +; CHECK: or ecx,{{.*e.[^x]}}
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i32 @test_atomic_rmw_xor_32_ignored(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -634,11 +599,10 @@ entry:
 | 
|    ret i32 %v
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xor_32_ignored
 | 
| -; CHECK: mov eax, dword ptr
 | 
| +; CHECK: mov eax,DWORD PTR
 | 
|  ; CHECK: xor
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg dword ptr [e{{[^a].}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg DWORD PTR [e{{[^a].}}]
 | 
| +; CHECK: jne
 | 
|  
 | 
|  ;; exchange
 | 
|  
 | 
| @@ -651,7 +615,7 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xchg_8
 | 
| -; CHECK: xchg byte ptr {{.*}}, [[REG:.*]]
 | 
| +; CHECK: xchg BYTE PTR {{.*}},[[REG:.*]]
 | 
|  
 | 
|  define i32 @test_atomic_rmw_xchg_16(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -662,7 +626,7 @@ entry:
 | 
|    ret i32 %a_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xchg_16
 | 
| -; CHECK: xchg word ptr {{.*}}, [[REG:.*]]
 | 
| +; CHECK: xchg WORD PTR {{.*}},[[REG:.*]]
 | 
|  
 | 
|  define i32 @test_atomic_rmw_xchg_32(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -671,7 +635,7 @@ entry:
 | 
|    ret i32 %a
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xchg_32
 | 
| -; CHECK: xchg dword ptr {{.*}}, [[REG:.*]]
 | 
| +; CHECK: xchg DWORD PTR {{.*}},[[REG:.*]]
 | 
|  
 | 
|  define i64 @test_atomic_rmw_xchg_64(i32 %iptr, i64 %v) {
 | 
|  entry:
 | 
| @@ -685,9 +649,8 @@ entry:
 | 
|  ; CHECK-DAG: mov eax
 | 
|  ; CHECK-DAG: mov ecx
 | 
|  ; CHECK-DAG: mov ebx
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [{{e.[^x]}}]
 | 
| -; CHECK: jne -{{[0-9]}}
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [{{e.[^x]}}
 | 
| +; CHECK: jne
 | 
|  
 | 
|  define i32 @test_atomic_rmw_xchg_32_ignored(i32 %iptr, i32 %v) {
 | 
|  entry:
 | 
| @@ -698,7 +661,7 @@ entry:
 | 
|  ; In this case, ignoring the return value doesn't help. The xchg is
 | 
|  ; used to do an atomic store.
 | 
|  ; CHECK-LABEL: test_atomic_rmw_xchg_32_ignored
 | 
| -; CHECK: xchg dword ptr {{.*}}, [[REG:.*]]
 | 
| +; CHECK: xchg DWORD PTR {{.*}},[[REG:.*]]
 | 
|  
 | 
|  ;;;; Cmpxchg
 | 
|  
 | 
| @@ -713,11 +676,10 @@ entry:
 | 
|    ret i32 %old_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_cmpxchg_8
 | 
| -; CHECK: mov eax, {{.*}}
 | 
| +; CHECK: mov eax,{{.*}}
 | 
|  ; Need to check that eax isn't used as the address register or the desired.
 | 
|  ; since it is already used as the *expected* register.
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg byte ptr [e{{[^a].}}], {{[^a]}}l
 | 
| +; CHECK: lock cmpxchg BYTE PTR [e{{[^a].}}],{{[^a]}}l
 | 
|  
 | 
|  define i32 @test_atomic_cmpxchg_16(i32 %iptr, i32 %expected, i32 %desired) {
 | 
|  entry:
 | 
| @@ -730,9 +692,8 @@ entry:
 | 
|    ret i32 %old_ext
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_cmpxchg_16
 | 
| -; CHECK: mov eax, {{.*}}
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg word ptr [e{{[^a].}}], {{[^a]}}x
 | 
| +; CHECK: mov eax,{{.*}}
 | 
| +; CHECK: lock cmpxchg WORD PTR [e{{[^a].}}],{{[^a]}}x
 | 
|  
 | 
|  define i32 @test_atomic_cmpxchg_32(i32 %iptr, i32 %expected, i32 %desired) {
 | 
|  entry:
 | 
| @@ -742,9 +703,8 @@ entry:
 | 
|    ret i32 %old
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_cmpxchg_32
 | 
| -; CHECK: mov eax, {{.*}}
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg dword ptr [e{{[^a].}}], e{{[^a]}}
 | 
| +; CHECK: mov eax,{{.*}}
 | 
| +; CHECK: lock cmpxchg DWORD PTR [e{{[^a].}}],e{{[^a]}}
 | 
|  
 | 
|  define i64 @test_atomic_cmpxchg_64(i32 %iptr, i64 %expected, i64 %desired) {
 | 
|  entry:
 | 
| @@ -759,8 +719,7 @@ entry:
 | 
|  ; CHECK-DAG: mov eax
 | 
|  ; CHECK-DAG: mov ecx
 | 
|  ; CHECK-DAG: mov ebx
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}+0x0]
 | 
|  ; edx and eax are already the return registers, so they don't actually
 | 
|  ; need to be reshuffled via movs. The next test stores the result
 | 
|  ; somewhere, so in that case they do need to be mov'ed.
 | 
| @@ -781,10 +740,9 @@ entry:
 | 
|  ; CHECK-DAG: mov eax
 | 
|  ; CHECK-DAG: mov ecx
 | 
|  ; CHECK-DAG: mov ebx
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| -; CHECK-DAG: mov {{.*}}, edx
 | 
| -; CHECK-DAG: mov {{.*}}, eax
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}
 | 
| +; CHECK-DAG: mov {{.*}},edx
 | 
| +; CHECK-DAG: mov {{.*}},eax
 | 
|  
 | 
|  ; Test with some more register pressure. When we have an alloca, ebp is
 | 
|  ; used to manage the stack frame, so it cannot be used as a register either.
 | 
| @@ -813,9 +771,8 @@ entry:
 | 
|  ; not esp, since that's the stack pointer and mucking with it will break
 | 
|  ; the later use_ptr function call.
 | 
|  ; That pretty much leaves esi, or edi as the only viable registers.
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{[ds]}}i]
 | 
| -; CHECK: call use_ptr
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{[ds]}}i]
 | 
| +; CHECK: call {{.*}} R_{{.*}} use_ptr
 | 
|  
 | 
|  define i32 @test_atomic_cmpxchg_32_ignored(i32 %iptr, i32 %expected, i32 %desired) {
 | 
|  entry:
 | 
| @@ -825,9 +782,8 @@ entry:
 | 
|    ret i32 0
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_cmpxchg_32_ignored
 | 
| -; CHECK: mov eax, {{.*}}
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg dword ptr [e{{[^a].}}]
 | 
| +; CHECK: mov eax,{{.*}}
 | 
| +; CHECK: lock cmpxchg DWORD PTR [e{{[^a].}}]
 | 
|  
 | 
|  define i64 @test_atomic_cmpxchg_64_ignored(i32 %iptr, i64 %expected, i64 %desired) {
 | 
|  entry:
 | 
| @@ -842,8 +798,7 @@ entry:
 | 
|  ; CHECK-DAG: mov eax
 | 
|  ; CHECK-DAG: mov ecx
 | 
|  ; CHECK-DAG: mov ebx
 | 
| -; CHECK: lock
 | 
| -; CHECK-NEXT: cmpxchg8b qword ptr [e{{.[^x]}}]
 | 
| +; CHECK: lock cmpxchg8b QWORD PTR [e{{.[^x]}}+0x0]
 | 
|  
 | 
|  ;;;; Fence and is-lock-free.
 | 
|  
 | 
| @@ -871,7 +826,7 @@ entry:
 | 
|    ret i32 %r
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_is_lock_free
 | 
| -; CHECK: mov {{.*}}, 1
 | 
| +; CHECK: mov {{.*}},0x1
 | 
|  
 | 
|  define i32 @test_not_lock_free(i32 %iptr) {
 | 
|  entry:
 | 
| @@ -881,7 +836,7 @@ entry:
 | 
|    ret i32 %r
 | 
|  }
 | 
|  ; CHECK-LABEL: test_not_lock_free
 | 
| -; CHECK: mov {{.*}}, 0
 | 
| +; CHECK: mov {{.*}},0x0
 | 
|  
 | 
|  define i32 @test_atomic_is_lock_free_ignored(i32 %iptr) {
 | 
|  entry:
 | 
| @@ -890,11 +845,11 @@ entry:
 | 
|    ret i32 0
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_is_lock_free_ignored
 | 
| -; CHECK: mov {{.*}}, 0
 | 
| +; CHECK: mov {{.*}},0x0
 | 
|  ; This can get optimized out, because it's side-effect-free.
 | 
| -; CHECKO2-LABEL: test_atomic_is_lock_free_ignored
 | 
| -; CHECKO2-NOT: mov {{.*}}, 1
 | 
| -; CHECKO2: mov {{.*}}, 0
 | 
| +; O2-LABEL: test_atomic_is_lock_free_ignored
 | 
| +; O2-NOT: mov {{.*}}, 1
 | 
| +; O2: mov {{.*}},0x0
 | 
|  
 | 
|  ; TODO(jvoung): at some point we can take advantage of the
 | 
|  ; fact that nacl.atomic.is.lock.free will resolve to a constant
 | 
| @@ -915,7 +870,7 @@ not_lock_free:
 | 
|    ret i32 %z
 | 
|  }
 | 
|  ; CHECK-LABEL: test_atomic_is_lock_free_can_dce
 | 
| -; CHECK: mov {{.*}}, 1
 | 
| +; CHECK: mov {{.*}},0x1
 | 
|  ; CHECK: ret
 | 
|  ; CHECK: add
 | 
|  ; CHECK: ret
 | 
| 
 |