PageRenderTime 17ms CodeModel.GetById 8ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 1ms

/media/libjpeg/simd/jsimdcpu.asm

http://github.com/zpao/v8monkey
Assembly | 105 lines | 56 code | 15 blank | 34 comment | 0 complexity | 81b82ffcfcc55fecba9c4d5dfa85b42a MD5 | raw file
  1;
  2; jsimdcpu.asm - SIMD instruction support check
  3;
  4; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
  5;
  6; Based on
  7; x86 SIMD extension for IJG JPEG library
  8; Copyright (C) 1999-2006, MIYASAKA Masaru.
  9; For conditions of distribution and use, see copyright notice in jsimdext.inc
 10;
 11; This file should be assembled with NASM (Netwide Assembler),
 12; can *not* be assembled with Microsoft's MASM or any compatible
 13; assembler (including Borland's Turbo Assembler).
 14; NASM is available from http://nasm.sourceforge.net/ or
 15; http://sourceforge.net/project/showfiles.php?group_id=6208
 16;
 17; [TAB8]
 18
 19%include "jsimdext.inc"
 20
 21; --------------------------------------------------------------------------
 22	SECTION	SEG_TEXT
 23	BITS	32
 24;
 25; Check if the CPU supports SIMD instructions
 26;
 27; GLOBAL(unsigned int)
 28; jpeg_simd_cpu_support (void)
 29;
 30
 31	align	16
 32	global	EXTN(jpeg_simd_cpu_support)
 33
 34EXTN(jpeg_simd_cpu_support):
 35	push	ebx
 36;	push	ecx		; need not be preserved
 37;	push	edx		; need not be preserved
 38;	push	esi		; unused
 39	push	edi
 40
 41	xor	edi,edi			; simd support flag
 42
 43	pushfd
 44	pop	eax
 45	mov	edx,eax
 46	xor	eax, 1<<21		; flip ID bit in EFLAGS
 47	push	eax
 48	popfd
 49	pushfd
 50	pop	eax
 51	xor	eax,edx
 52	jz	short .return		; CPUID is not supported
 53
 54	; Check for MMX instruction support
 55	xor	eax,eax
 56	cpuid
 57	test	eax,eax
 58	jz	short .return
 59
 60	xor	eax,eax
 61	inc	eax
 62	cpuid
 63	mov	eax,edx			; eax = Standard feature flags
 64
 65	test	eax, 1<<23		; bit23:MMX
 66	jz	short .no_mmx
 67	or	edi, byte JSIMD_MMX
 68.no_mmx:
 69	test	eax, 1<<25		; bit25:SSE
 70	jz	short .no_sse
 71	or	edi, byte JSIMD_SSE
 72.no_sse:
 73	test	eax, 1<<26		; bit26:SSE2
 74	jz	short .no_sse2
 75	or	edi, byte JSIMD_SSE2
 76.no_sse2:
 77
 78	; Check for 3DNow! instruction support
 79	mov	eax, 0x80000000
 80	cpuid
 81	cmp	eax, 0x80000000
 82	jbe	short .return
 83
 84	mov	eax, 0x80000001
 85	cpuid
 86	mov	eax,edx			; eax = Extended feature flags
 87
 88	test	eax, 1<<31		; bit31:3DNow!(vendor independent)
 89	jz	short .no_3dnow
 90	or	edi, byte JSIMD_3DNOW
 91.no_3dnow:
 92
 93.return:
 94	mov	eax,edi
 95
 96	pop	edi
 97;	pop	esi		; unused
 98;	pop	edx		; need not be preserved
 99;	pop	ecx		; need not be preserved
100	pop	ebx
101	ret
102
103; For some reason, the OS X linker does not honor the request to align the
104; segment unless we do this.
105	align	16