blob: d62695cc673cc22592fb9c772deb669ae96e848a [file] [log] [blame]
/*
* Copyright (c) 2012 The Native Client Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/*
* get_x86_direction_flag() returns whether the x86 direction
* flag is set. The normal way of reading the flag is to use
* "pushf", but this instruction is not allowed under NaCl.
* So instead, we test the flag empirically by checking how a
* string instruction changes its operand register.
*/
#if defined(__x86_64__)
.global get_x86_direction_flag
get_x86_direction_flag:
naclssp $8, %r15
mov %esp, %esi
mov %esp, %edi
movsb %nacl:(%rsi), %nacl:(%rdi), %r15
/* Clear %eax */
xor %eax, %eax
/* This sets the bottom byte of %eax if %edi < %esp (unsigned) */
cmp %esp, %edi
setb %al
naclasp $8, %r15
naclret
#elif defined(__i386__)
.global get_x86_direction_flag
get_x86_direction_flag:
sub $4, %esp
mov %esp, %esi
mov %esp, %edi
movsb %ds:(%esi), %es:(%edi)
/* Clear %eax */
xor %eax, %eax
/* This sets the bottom byte of %eax if %edi < %esp (unsigned) */
cmp %esp, %edi
setb %al
add $4, %esp
#if defined(__native_client_nonsfi__)
ret
#else
naclret
#endif
#else
# error Unknown platform
#endif