2015-01-23 4 views
1

필자는 64 비트 ARM으로 포팅 한 일부 어셈블리 함수를 가지고 있지만 안드로이드에서 잘 작동하지만 Xcode에서 같은 파일을 컴파일하려고하면 clang이 다른 구문을 사용한다는 것을 알았습니다 (공식 ARM 설명서).iOS에서 가스를 사용하는 ARM64?

소스 파일을 한 형식에서 다른 형식으로 변환하는 일부 스크립트를 찾았지만 이상적인 솔루션이 아닙니다. 소스 파일에 선행 프로세서 정의가 포함되어 있으면이 스크립트가 작동하지 않는 것 같습니다.

가스를 Xcode에서 단순히 사용하거나 가스 구문을 허용하도록 clang을 구성 할 수 있습니까? 그렇지 않다면 clang 어셈블러 문서는 어디에 있습니까?

UPDATE - 2015년 9월

문제가 엑스 코드 (7)에 의해 해결된다 보인다 (새 연타 버전은?) : 지금은 안드로이드 용으로 작성된 어셈블리 소스 파일을 가져올 수 있습니다, 그들은이다 어떤 변화없이 컴파일.

+0

함수를 인라인으로 배치해야합니까? 그렇지 않으면 C의 의미에서 문자 그대로 기능을 수행해야합니까? 어셈블리 함수가 별도의 컴파일 유닛으로 분할 될 수 있는지에 관해서는 GCC를 사용하여 어셈블리를 정적 라이브러리에 빌드 한 다음 링크 만하면됩니다. – Tommy

+0

함수는 외부 소스 파일에 확장명이 .S –

답변

2

Android 및 iOS에서 ARM64 코드를 작성하는 일반적인 지침으로 제 대답을 사용하겠습니다. (휘발성) 인수 및 반환 값
X8 = 간접적 인 결과 (구조체) 위치 (또는 임시 등록)
X9- -

X0-X7 : 우리는 휘발성 및 비 휘발성 레지스터를 시작하자, 시작합니다 X15 = 임시 (휘발성)
X16-X17 - 소개 - 전화 사용 레지스터 (PLT, 링커) 또는 임시
X18을 - 특정 플랫폼 사용 (TLS)
X19-X28이 - 수신자가 레지스터 (비 휘발성) 저장
X29 - 프레임 포인터
X30 - 링크 레지스터 (LR)
SP - stac K 포인터 제로 (XZR는)
는 V0-V7, V16-V31 - 수신자 (컴파일러에 의해 임시 바르에 사용되는 비 휘발성) 레지스터

다음은 저장된 - 휘발성 NEON 및 FP는 V8-V15는
등록 어셈블러 지시어가 제대로 코드의 "세그먼트"를 만드는 것입니다 :

안드로이드
.cpu 일반 +의 FP + SIMD
각 기능에 대한
는 .text,이 3 줄을 추가
.section .text.MyFunctionName, "도끼", %의 progbits
.align이라는 2
.type의 MyFunctionName % 기능

아이폰 OS (정말 ALIGN 지시문을 제외하고 필요한 경우 Nothing)
.정렬이

선언 대중 (글로벌)의

선도 밑줄 --notice 아이폰 OS
.globl _MyFunctionName <
.global MyFunctionName

안드로이드와 다른 철자를 레이블 글로벌 지시문

다음으로 차이점은 소스 코드에 정의 된 정적 데이터에 대한 포인터를 얻는 것입니다. 예를 들어 데이터 테이블이 있고 테이블에 대한 포인터로 X0 레지스터를로드하려고한다고 가정 해 봅시다.

안드로이드

adrp x0, MyDataTable 
    add x0, x0, #:lo12:MyDataTable 

아이폰 OS

adrp x0,[email protected] 
    add x0,x0,[email protected] 

다음, NEON 구문. 아이폰 OS는 # 크기 정보 안드로이드

안드로이드 크기 접미사
LD1 {v0.16b} [X0]와 레지스터를보고 싶어하면서 명령어 니모닉에 추가 될 수 있도록 16

아이폰 OS
ld1.16b V0} {[X0, # 16

중첩 루프 32 비트 ARM 코드 사전 스택 LR 밀어 전형적인이었다
함수 내에서 함수를 호출해야 할 때이를 제공하십시오. NEON 명령어는 더 이상 보조 프로세서가 아니며 Aarch64의 기본 명령어 세트에 병합되었으므로 데이터를 앞뒤로 이동하는 데 페널티가 없습니다. 사용되지 않는 NEON 레지스터에 X30 (LR)을 보존하는 것이 현실적입니다. 예 :

fmov d0,x30 // preserve LR 
    <some code which makes function calls> 
    fmov x30,d0 // restore LR 

그게 전부입니다. 더 많은 차이점이있는 구체적인 사례를 발견하면 추가 할 것입니다.

+0

첫 번째 PRFM에 붙어 있습니다 : PLDL1KEEP은 안드로이드에 대한 완벽한 토큰이지만 Xcode는 그것을 좋아하지 않습니다. –

+0

동일한 문제가 있습니다. iOS 용 프리 페치 구문을 찾을 수 없습니다. – BitBank

+1

분명히 대소 문자를 구분합니다. 소문자의 pldl1keep은 괜찮습니다. –

0

운이 좋다. Libav 팀은 가스 구문을 수용하고 Apple 어셈블러 용 어셈블러를 출력하는 도구를 지원합니다. 이 도구는 다음 위치에서 찾을 수 있습니다. https://github.com/libav/gas-preprocessor/blob/master/gas-preprocessor.pl

+0

으로 정의되어 있습니다.이 스크립트는 작동하지 못했습니다. 전 처리기 매크로없이 어셈블리 소스 파일 만 처리 할 수 ​​있습니다. –

+0

최신 libx264와 호환되지 않습니다. –