KR20130018925A - 효율적인 동적 바이너리 변환을 위한 레지스터 맵핑 기술 - Google Patents

효율적인 동적 바이너리 변환을 위한 레지스터 맵핑 기술 Download PDF

Info

Publication number
KR20130018925A
KR20130018925A KR1020127032581A KR20127032581A KR20130018925A KR 20130018925 A KR20130018925 A KR 20130018925A KR 1020127032581 A KR1020127032581 A KR 1020127032581A KR 20127032581 A KR20127032581 A KR 20127032581A KR 20130018925 A KR20130018925 A KR 20130018925A
Authority
KR
South Korea
Prior art keywords
code block
binary code
target
source
register
Prior art date
Application number
KR1020127032581A
Other languages
English (en)
Inventor
길레르미 디 오토니
홍 왕
웨이 리
Original Assignee
인텔 코포레이션
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 인텔 코포레이션 filed Critical 인텔 코포레이션
Publication of KR20130018925A publication Critical patent/KR20130018925A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/441Register allocation; Assignment of physical memory space to logical memory space
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/22Microcontrol or microprogram arrangements
    • G06F9/24Loading of the microprogram
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30105Register structure
    • G06F9/30112Register structure comprising data of variable length
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/3017Runtime instruction translation, e.g. macros
    • G06F9/30174Runtime instruction translation, e.g. macros for non-native instruction set, e.g. Javabyte, legacy code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • G06F9/45525Optimisation or modification within the same instruction set architecture, e.g. HP Dynamo

Abstract

일반적으로, 본 개시물은 더 많은 레지스터를 갖는 시스템으로부터 더 적은 레지스터를 갖는 시스템으로 레지스터를 맵핑하는 시스템 및 방법을 제공한다. 비교적 빈번한 레지스터 액세스를 갖는 코드의 하나 이상의 블럭을 포함하는 영역이 형성될 수 있다. 가장 빈번히 액세스되는 소스 레지스터는 타겟 레지스터에 맵핑될 수 있다. 영역의 각 블럭은 하나의 프롤로그 및 적어도 하나의 에필로그에 의해 경계가 이루어질 수 있다. 프롤로그는 레지스터 맵핑을 구현하도록 구성될 수 있고, 에필로그(들)는 영역의 한 블럭으로부터 그 영역 내의 다른 블럭으로 또는 그 영역 밖의 블럭으로의 프로그램 흐름을 관리하도록 구성될 수 있다.

Description

효율적인 동적 바이너리 변환을 위한 레지스터 맵핑 기술{REGISTER MAPPING TECHNIQUES FOR EFFICIENT DYNAMIC BINARY TRANSLATION}
본 발명은 동적 바이너리 변환에 관한 것으로, 더 상세하게는, 더 많은 레지스터를 갖는 명령어 집합 구조(instruction-set architecture, ISA)로부터 더 적은 레지스터를 갖는 ISA로 동적 바이너리 변환을 수행하는 효율적인 기술에 관한 것이다.
동적 바이너리 변환(dynamic binary translation, DBT)은 상이한 ISA의 상부에서 하나의 명령어 집합 구조(ISA)에 대해 생성된 애플리케이션을 실행하는 수단으로서 널리 사용되고 있다. x86 ISA에 기초하여, PC용으로 개발된 레거시(legacy) 소프트웨어의 양을 고려하면, 다른 ISA에 대해 x86을 변환하는 주의가 부여된다. 더 작은 휴대용 PC 및 더 강력한 내장형 휴대용 인터넷 장치(예컨대, 스마트폰) 모두에 대한 산업에서의 최신 트렌드는 이러한 뚜렷한 시장 사이의 경계를 모호하게 하고 있다. 그 결과, 이 시장 집중성은 현재 내장형 휴대용 인터넷 장치 시장(예컨대, ARM(ARM 홀딩스), MIPS(MIPS 테크놀로지), PowerPC(애플-IBM-모토롤라 연합)를 지배하는 ISA에서 x86(인텔사)까지 DBT에 큰 관심을 생성하고 있다.
바이너리 변환("BT")은 다른 타겟("호스트") ISA에 대한 하나의 소스("게스트") ISA를 위해 구축된 바이너리를 변환하는 일반적 기술이다. BT를 이용하여, 하이레벨 소스 코드를 다시 컴파일하거나 어셈블리 코드를 재기록할 필요 없이, 상이한 구조를 갖는 프로세서에서 하나의 프로세서 ISA에 대해 구축된 애플리케이션 바이너리를 실행하는 것이 가능하다. 대부분의 레거시 컴퓨터 애플리케이션은 바이너리 포맷에만 이용 가능하기 때문에, BT는 프로세서가 그것에 대해 구축되지 않고 이용 가능한 애플리케이션을 실행하게 하는 그 잠재력 때문에 매우 매력적이다. 디지털 이큅먼트사(Digital Equipment Corporation, "DEC")의 FX!32, 인텔의 IA32EL, 트랜스메타(Transmeta)의 CMS("Code Morping Software"), Godson-3(MIPS 구조), IBM의 DAISY("Dynamically Architected Instruction Set from Yorktown")를 포함한 다수의 성공적인 BT 프로젝트는 지난 수십년동안 기술 수준을 발전시켰다. 이들 툴의 대부분은 레거시 x86 애플리케이션을 Alpha(DEC), Itanium(인텔), Crusoe(트랜스메타), MIPS(MIPS 테크놀로지) 등의 프로세서에서 실행하는 것을 목표로 한다.
상기한 툴의 대부분은 애플리케이션이 실행될 때, 즉, 런타임(run time)에 즉시 변환을 수행하는 것을 의미하는 동적 BT(DBT)를 이용한다. 이와 달리, BT는 오프라인, 즉 정적 BT(SBT)로 수행될 수 있다. 동적 사용 모델은 이것이 더 일반적이고(예컨대, 자가 수정 코드(self-modifying code)를 처리할 수 있음), 비 네이티브 바이너리에 대한 DBT를 자동으로 불러오기 위한 간단한 OS 변화에 의해 사용자에게 투명하게 작동하기 때문에 일반적으로 바람직하다. SBT에 비해 DBT의 주요 단점은 오버헤드이다. 애플리케이션을 변환하고 최적화하는 데 걸리는 사이클은 애플리케이션 코드를 실제로 실행하는 데 달리 사용될 수 있었을 사이클이다. 따라서, DBT 툴은 변환/최적화에 걸리는 시간과 그 결과로 초래된 코드의 품질 사이의 트레이드오프에 직면하고, 이는 결국 변환된 코드의 런타임에 반영된다.
DBT에 의해 직면한 과제는 소스 및 타겟 ISA에 크게 좌우된다. 최근, x86 ISA의 사용을 휴대용 및 내장형 마켓 세그먼트(예컨대, 인텔의 아톰(Atom) 프로세서)로의 확장에 큰 관심이 있었다. 사용자의 관점에서, 이것은 레거시 PC 소프트웨어를 내장형 휴대용 플랫폼에서 효과적으로 실행하게 할 수 있기 때문에 매우 편리하다. 그러나, 이들 새로운 도메인에 적용될 x86에 대해, x86이 이들 세그먼트에 이용 가능한 방대한 소프트웨어 베이스를 실행할 수 있게 할 필요가 있고, 이는 주로 ARM(ARM 홀딩스), MIPS(MIPS 테크놀로지), PowerPC(애플-IBM-모토롤라 연합) ISA에 기초한다. 잠재적으로 실행하는 PC 애플리케이션 외에, 예컨대, 미래의 x-86 기반 스마트폰에서, 이것은, 예컨대, 애플의 아이폰 앱 스토어로부터 ARM 기반의 애플리케이션을 다운로드하고 끊김없이 실행할 수 있게 되어 이익이 될 수 있을 것이다. 이 시나리오를 가능하게 하는 과제는 DBT의 성능과 낮은 에너지 오버헤드를 유지하는 것을 포함한다.
다양한 DBT 시스템이 제안되어 있지만, 그들 대부분은 동일한 기본적 실행 흐름을 따른다. 우선, 소스(게스트) 구조에 대해 생성된 바이너리 파일은 메모리로 로딩된다. 그 후 이 소스 바이너리의 부분은 타겟(호스트) 바이너리 코드로 변환된다. 이 변환은 일반적으로 "요구에 따라" 행해진다. 즉, 소스 코드 명령어는 제어의 흐름이 그들에 도달하도록 변환된다. 일반적으로, 변환은 기본적인 블럭의 입도(granularity)로 수행되고, 이는 단일 입구 및 잠재적으로 다수의 출구를 갖는 명령어의 시퀀스이다. 일단 기본 블럭이 변환되면, 변환은 장래의 재사용을 위해 메모리의 변환 캐시(또한 코드 캐시라고 불림)에 유지된다. 대부분의 공격적 DBT 시스템은 상이한 레벨의 최적화를 수행한다. 트랜스메타의 CMS 및 다른 DBT 시스템에 따르면, 이들 최적화 레벨은 "기어(gear)"라고 불린다. 우선, 매우 빠른 변환(기어-1)이 사용된다. 이 기어는 변환된 코드의 낮은 품질의 비용으로 매우 빠르게 되는 것을 목표로 한다. 이 트레이드오프는 OS 부트 코드(boot code) 등의 드물게 실행되는 코드에 대해 이상적인 경향이 있다. 기어-1에서, DBT는 또한 "뜨거운(hot)"(즉, 빈번히 실행되는) 기본 블럭을 검출하기 위한 프로브(카운터)를 구현한다. 블럭이 뜨거워지면, 그것 및 그와 관련된 주변 블럭이 한 영역으로 병합된다. 그러면 이 영역은, 그 코드에 대해 추가 최적화를 적용하는 더 높은 기어에 의해 재변환된다. 이 동일한 전략은 임의의 다수의 기어에 대해 반복될 수 있다. 예를 들어, 트랜스메타의 CMS가 4개의 기어를 사용한다. 사실상, 기어 기반 시스템은, 전체 런타임에 기여하는 코드의 영역이 많을수록, 더 빠른 코드를 생성하기 위해 그것을 최적화하는 데 소비되는 시간은 더 길어지게 한다.
적용된 최적화의 세트, 수, 공격성은 하나의 DBT부터 다른 것까지 매우 다양하다. 일반적인 최적화는, 명령어 스케줄링, 불필요한 코드의 제거, 중복 제거를 포함한다. 실제로, 정적인 컴파일러 최적화와 마찬가지로 가장 적절한 최적화의 세트는 목표 구조(target architecture)에 따라 달라진다. 그러나 컴파일러 최적화와 반대로, DBT에서, 이들 최적화는 더 높은 품질의 코드를 얻기 위해 사용될 수 있는 정확한 실행시간 정보를 갖는다. DBT의 주된 단점은 정적 컴파일러에 비해 더 엄격한 최적화 시간 예산이다.
청구대상의 특징 및 이점은 그와 일관된 실시예의 다음의 상세한 설명으로부터 분명해질 것이고, 그 설명은 첨부하는 도면과 관련하여 고려되어야 한다.
도 1은 본 개시물과 일관된 메모리 시스템을 도시하는 도면,
도 2(a)는 본 개시물과 일관된 동적 바이너리 변환기에 대한 예시적 동작의 흐름도를 도시하는 도면,
도 2(b)는 본 개시물과 일관된 코드를 최적화하는 예시적 동작의 흐름도를 도시하는 도면,
도 3은 빈번히 실행되는 코드 블럭의 영역을 포함하는 예시적 제어 흐름도를 도시하는 도면,
도 4는 본 개시물과 일관된 프롤로그, 본문, 조건부점프 및 적어도 하나의 에필로그를 포함하는 예시적인 최적화 타겟 바이너리 코드 블럭을 도시하는 도면,
도 5는 본 개시물과 일관된 최적화를 포함하여, 타겟 바이너리 코드 블럭을 실행하는 예시적 동작의 흐름도를 도시하는 도면,
도 6은 도 3의 제어 흐름도에 대응하는 예시적 최적화 제어 흐름도를 도시하는 도면,
도 7은 본 개시물과 일관된 블럭 레벨 레지스터 맵핑 및 영역 레벨 레지스터 맵핑을 포함하는 동적 바이너리 변환의 성능 기준의 비교를 나타내는 그래프이다.
동적 바이너리 변환("DBT")에 의해 직면한 과제는 그것이 초래하는 오버헤드이다. 이 오버헤드는 주로 호스트("타겟")-ISA에 쉽게 맵핑되지 않는 게스트("소스")-ISA에서 비교적 빈번히 사용되는 특징으로부터 비롯된다. 예컨대, 소스-ISA가 타겟-ISA보다 더 큰 레지스터 세트를 갖는 경우, 레지스터 모방 오버헤드, 예컨대, 메모리 액세스를 줄이기 위해 소스 레지스터로부터 타겟 레지스터로의 효율적인 레지스터 맵핑을 이용하는 것이 중요하다. 이것은 특히, 다른 ISA, 예컨대, 32 레지스터를 갖는 PowerPC, ARM 및 MIPS, 및 128 레지스터를 갖는 아이태니엄(Itanium)에 비해 비교적 적은 수의 범용/정수 레지스터(예컨대, 8 및 16)를 갖는 x86 및 x86-64 등의 타겟-ISA에 대해 중요하다.
레지스터 맵핑 문제는 최적의 맵핑(즉, 최소의 오버헤드를 초래하는 맵핑)이 소스 바이너리 코드 시퀀스에 크게 의존하는 사실에 의해 악화되며, 따라서 그것은 코드의 한 부분으로부터 다른 부분까지 다르다. 이상적으로, 각 코드 영역은 그것에 최적인 레지스터 맵핑을 이용해야 한다.
본 개시물은 영역 레벨 레지스터 맵핑을 제공하도록 구성된 시스템 및 방법을 제공한다. 방법은 한 영역의 각 바이너리 코드 블럭에 대해, 영역에서 가장 빈번하게 액세스한 소스 프로세서 레지스터 중 적어도 일부를 타겟 프로세서 레지스터에 맵핑하는 것을 포함한다. 가장 빈번하게 액세스한 소스 프로세서 레지스터는 소스 바이너리 코드의 블럭에 대응하는 타겟 바이너리 코드의 블럭으로 구현된, 카운터를 포함하는, 프로브(들)로부터 결정될 수 있다. 그 후 최적화된 타겟 바이너리 코드의 블럭은 최적화를 위해 선택된 영역에서 소스 바이너리 코드의 각 블럭에 대해 생성될 수 있다. 최적화된 타겟 바이너리 코드의 블럭은 프롤로그, 변환된 소스 바이너리 코드를 포함하는 본문, 조건부점프 및 적어도 하나의 에필로그를 포함할 수 있다. 프롤로그는 영역에 대해 맵핑된 레지스터 또는 맵핑된 리브인(live-in) 레지스터를 로딩하도록 구성된다. 조건부점프는, 소스 바이너리 코드의 블럭의 경계에서의 분기(branch)가 그 영역의 다음의 바이너리 블럭에 대한 것인지 아닌지에 기초하여 흐름을 제어하도록 구성된다. 에필로그(들)는, 다음 바이너리 블럭이 그 영역 내에 있으면 블럭 본문으로 점프하고, 다음 바이너리 블럭이 그 영역 내에 없으면 다음 바이너리 블럭의 처음으로 점프하도록 구성된다. 처음은 다른 영역의 최적화된 타겟 바이너리 코드 블럭 또는 최적화되지 않은 타겟 바이너리 코드 블럭의 프롤로그에 대응할 수 있다. 다음 바이너리 블럭이 영역 내에 없으면, 그 영역에 대한 리브아웃 레지스터가 메모리에 저장될 수 있다. 유리하게, 메모리 액세스는, 타겟 바이너리 코드의 최적화 블럭이 실행될 때마다가 아니라 영역 경계를 지날 때 그 영역에 대한 맵핑된 또는 맵핑된 리브인 레지스터를 로딩함으로써 감소될 수 있다.
본 개시물과 일관된 방법 및/또는 시스템은 영역 레벨 레지스터 맵핑을 제공하도록 구성된다. 그 영역은 비교적 복잡할 수 있다. 예컨대, 당업자에 의해 이해될 수 있는 바와 같이, 영역은 임의의 루프 네스트(들), 즉, 루프의 임의의 조합(들), 예컨대, 부모 루프 내의 다수의 동기(sibling)를 포함할 수 있다. 또 다른 예에서, 영역은 더이상 줄일 수 없는 흐름 그래프, 예컨대, 루프로의 다수의 가능한 엔트리에 대응하는 타겟 바이너리 코드 블럭을 포함할 수 있다. 영역은 인접 및/또는 비인접 타겟 바이너리 코드 블럭으로 형성될 수 있다.
도 1은 본 개시물과 일관된 시스템(100)을 묘사한다. 시스템(100)은 시스템 메모리(104)에 연결된 프로세서("CPU")(102)를 포함한다. 시스템(100)은, 캐시 메모리(105)(시스템 메모리(104)와 함께 포함될 수 있음) 및/또는 캐시 메모리와 유사하지만 소프트웨어에 의해 관리되는 스크래치 패드 메모리(107)를 포함할 수 있다. CPU(102)는 복수의 프로세서 레지스터(106-1, 106-2, …, 106-m, 통칭하여 106)를 포함할 수 있다. CPU(102)는 복수의 코어 프로세싱 유닛(이하 "코어들" 또는 단수형으로 "코어")을 포함할 수 있고, 각 코어는 복수의 스레드(thread)를 실행하도록 구성될 수 있다. 시스템 메모리(104)는 소스 바이너리 애플리케이션(110), 동적 바이너리 변환 시스템(115) 및 호스트 운영 시스템("OS")(120)을 관리할 수 있다. 동적 바이너리 변환 시스템(115)은 타겟 바이너리 코드 블럭(들)(112), 레지스터 맵핑 모듈(116)을 포함하는 동적 바이너리 변환기 코드(114) 및/또는 소스 레지스터 스토리지(118)를 포함할 수 있다. 소스 바이너리 애플리케이션(110)은 소스 ISA에 대응하는 복수의 소스 바이너리 코드 블럭을 포함할 수 있다. 타겟 바이너리 코드 블럭(들)은 타겟 ISA에 대응한다. 소스 바이너리 코드 블럭은 분기 명령어를 포함하는, 예컨대, 분기 명령어로 끝나는 하나 이상의 명령어의 시퀀스이다. 타겟 바이너리 코드 블럭은 대응하는 소스 바이너리 코드 블럭의 기능을 포함하도록 구성된다. 최적화된 타겟 바이너리 코드 블럭은 최적화된 타겟 바이너리 코드 블럭의 본문 내에 대응하는 소스 바이너리 코드 블럭의 기능을 포함할 수 있다. 최적화된 타겟 바이너리 코드 블럭은, 여기에 설명된 바와 같이, 추가 기능을 포함할 수 있다.
타겟 바이너리 코드 블럭(들)(112)은 "코드 캐시"(111)로 지정된 시스템 메모리의 구역에 저장될 수 있다. 코드 캐시(111)는 타겟 바이너리 코드 블럭(들)(112), 즉, 하나 이상의 대응하는 소스 바이너리 코드 블럭(들)로부터 변환된 하나 이상의 타겟 바이너리 코드 블럭(들)(112)에 대한 스토리지로서 이해될 수 있다. 시스템 메모리(104)는 프로세서 레지스터(106)로/로부터 데이터를 로딩/저장하도록 구성된 소스 레지스터 스토리지(118)를 관리할 수 있다. 일부 실시예에서, 캐시 메모리(105) 및/또는 스크래치 패드 메모리(107)는 프로세서 레지스터(들)(106)로/로부터 데이터를 로드/저장하도록 구성된다.
동적 바이너리 변환기 코드(114) 및 레지스터 맵핑 모듈(116)은 소스 바이너리 애플리케이션(110)의 블럭(들)을 타겟 바이너리 코드 블럭(들)(112)으로 변환하기 위해 소스 바이너리 애플리케이션(110)에서 동작하도록 하나 이상의 코어에 의해 실행될 수 있다. 소스 바이너리 코드 블럭은 타겟 바이너리 코드 블럭으로 동적으로 변환될 수 있다. 즉, 소스 바이너리 코드 블럭은 정적으로가 아니라 바이너리 블럭을 실행하라는 호출에 응답하여, 즉 런타임 이전에 타겟 바이너리 코드 블럭으로 변환될 수 있다. 그 후 타겟 바이너리 코드 블럭은 코드 캐시(111)의 시스템 메모리(104)에 저장되고 실행을 위해 CPU(102)에 제공될 수 있다. 소스 바이너리 코드(110)를 타겟 바이너리 코드 블럭(들)(112)으로 변환하는 것은, 영역에 대한 레지스터 액세스의 빈도에 적어도 부분적으로 기초해서, 하나 이상의 소스 레지스터를 하나 이상의 타겟 레지스터, 예컨대, 프로세서 레지스터(들)(106)로 맵핑하는 것을 포함할 수 있다. 예컨대, 소스 ISA는 Ns 소스 레지스터를 포함할 수 있고, 타겟 ISA는 Nt 타겟 레지스터, 예컨대, 레지스터(106)를 포함할 수 있고, Nt는 Ns보다 작다.
도 2(a)는 동적 바이너리 변환기에 대한 흐름도(200)를 묘사한다. 흐름도(200)의 동작은 동적 바이너리 변환기 코드(114)에 의해 수행될 수 있다. 프로그램 흐름은 바이너리 코드 블럭(들)(202)을 실행하라는 호출을 받아 시작될 수 있다. 바이너리 코드 블럭(들)(202)을 실행하라는 호출 이전에, 소스 바이너리 애플리케이션(110)은 시스템 메모리(104)로 로딩되었다는 것이 가정된다. 동작(204)에서, 하나 이상의 타겟 바이너리 코드 블럭(들)이 코드 캐시, 예컨대, 코드 캐시(111) 내에 있는 지 여부가 판정될 수 있다. 각각의 타겟 바이너리 코드 블럭은 소스 바이너리 애플리케이션(110)의 소스 바이너리 코드 블럭에 대응한다. 타겟 바이너리 코드 블럭(들)이 코드 캐시 내에 없으면, 동작(206)은 소스 바이너리 코드 블럭(들)을 타겟 바이너리 블럭(들)으로 변환하는 것, 프로브(들)을 구현하는 것 및 코드 캐시 내에 타겟 바이너리 블럭(들) 및 프로브(들)를 저장하는 것을 포함할 수 있다. 이 변환은 비교적 빠르게 되도록 구성될 수 있다. 예컨대, 프로브(들)는 바이너리 블럭이 실행되는 다수의 카운트를 유지하도록 구성된 카운터(들)를 포함할 수 있다. 소스 프로세서 레지스터(들)는 시스템 메모리(104)의 레지스터 스토리지, 예컨대, 소스 레지스터 스토리지(118), 캐시 메모리(105) 및/또는 스크래치 패드 메모리(107)에 맵핑될 수 있다. 그 후 프로그램 흐름은 동작(211)으로 진행할 수 있다. 동작(211)에서, 변환된 코드 블럭(들)이 실행될 수 있다. 동작(204)에서 타겟 바이너리 코드 블럭(들)이 코드 캐시에 있으면, 프로그램 흐름은 동작(208)으로 진행할 수 있다.
동작(208)에서, 임계값이 도달되었는지 여부가 판정될 수 있다. 임계값이 도달되었는지 여부는, 코드 블럭(들)을 실행하라는 이전의 호출에 응답하여 동작(206)에서 구현된 프로브(들)에 적어도 부분적으로 기초하여 판정될 수 있다. 예컨대, 카운트는 바이너리 블럭이 실행될 때마다 증가할 수 있다. 카운트가 사전 결정된 임계값에 도달하면, 프로브는 추가의 처리를 위해 프로그램 흐름(즉, 분기)이 동적 바이너리 변환기로 복귀하도록 구성될 수 있다. 사전 결정된 임계값은 최적화로부터 이로울 수 있는, 비교적 빈번히 실행되는 바이너리 블럭을 표시하도록 구성될 수 있다. 임계값에 도달하지 않았다면, 프로그램 흐름은 동작(211)으로 진행하여 변환된 코드 블럭(들)을 실행할 수 있다. 임계값에 도달했다면, 프로그램 흐름은 동작(210)으로 진행하여 코드를 최적화할 수 있다. 코드를 최적화하는 것(210)은 여기에 설명된 바와 같이 영역 형성 및 레지스터 맵핑을 포함하도록 구성된다. 그 후 프로그램 흐름은 동작(211)으로 진행하여 변환된 코드 블럭(들)을 실행할 수 있다.
도 2(b)는 본 개시물과 일관된 코드를 최적화하는 흐름도(210)를 도시한다. 프로그램 흐름은 개시(212)에서 시작될 수 있다. 흐름도(210)의 동작은 레지스터 맵핑 모듈(116)을 포함하여 동적 바이너리 변환기 코드(114)에 의해 수행될 수 있다. 동작(214)에서, 관련성 임계값(affinity threshold)을 충족 및/또는 초과하는 이웃 바이너리 블럭에 대해 검색이 수행될 수 있다. 이웃하는 바이너리 블럭은 코드 최적화를 트리거링한 바이너리 블럭에 관련될 수 있다. 예컨대, 이웃하는 바이너리 블럭(들)은 코드 최적화를 트리거링한 바이너리 블럭의 직전 또는 직후에 실행되도록 구성될 수 있다. 이웃하는 바이너리 블럭(들)은 트리거링되는 바이너리 블럭과 근접할 수 있고, 및/또는 분기 또는 점프에 의해 트리거링 바이너리 블럭에 관련될 수 있다. 바이너리 블럭 사이의 또는 바이너리 블럭 내의 관련성은 바이너리 블럭의 실행 가능성의 상관관계로서 이해될 수 있다. 예컨대, 그 상관관계는 하나의 바이너리 블럭으로부터 다른 바이너리 블럭으로의 분기에 의한 것일 수 있다. 그러면, 동작(216)에서, 영역은 관련성 임계값을 충족 및/또는 초과하는 이웃하는 바이너리 블럭을 포함하도록 형성될 수 있다.
동작(218)에서, 다수의 액세스는 영역에서 액세스되는 각각의 소스 레지스터에 대해 판정될 수 있다. 그 영역에서의 명령어는 소스 레지스터를 사용, 즉 그로부터 판독할 수 있고, 및/또는 소스 레지스터를 정의, 즉, 그것에 기입할 수 있다. 레지스터 액세스, 즉, 레지스터 사용은 레지스터를 이용 및/또는 정의하는 것을 포함한다. 레지스터 맵핑은 그 영역의 각 소스 레지스터의 총 액세스의 수에 기초하여 이루어질 수 있다.
예컨대, 동작(216)에서 형성된 영역은 하나 이상의 바이너리 코드 블럭(들)을 포함할 수 있다. 바이너리 블럭의 다수의 실행의 카운트를 포함하는 프로브는 각각의 바이너리 코드 블럭과 연관될 수 있다. 각 바이너리 블럭에 대해, 레지스터 액세스의 수는 바이너리 블럭의 다수의 실행의 카운트, 바이너리 블럭의 명령어 및 각 명령어에 의해 액세스되는 레지스터에 기초하여 결정될 수 있다. 그 후 영역에서 액세스되는 각 레지스터에 대한 총 액세스 수는 영역의 각 바이너리 블럭의 각 레지스터에 대한 액세스의 수를 합산함으로써 결정될 수 있다.
도 3은 코드의 예시적 영역(305)을 포함하는 예시적 제어 흐름 그래프(300)를 도시한다. 제어 흐름 그래프(300)는 코드의 5개의 블럭인 블럭 A(310), 블럭 B(320), 블럭 C(330), 블럭 D(340), 블럭 E(350)를 포함한다. 각 블럭은, 예컨대, 동작(206)(도 2(a))에서 구현된 프로브(들)에 기초하여 결정된, 블럭의 실행 수에 대응하는 연관 카운트(312, 322, 332, 342, 352)를 갖는다. 예컨대, 블럭 A, 블럭 C 및 블럭 E는 각각 10의 연관 카운트를 갖고, 블럭 B는 1000의 연관 카운트를 가지며, 블럭 D는 990의 연관 카운트를 갖는다. 본 예에서, 블럭 B는 도 2(a)의 동작(208)에 관하여 기술된 사전 결정된 임계값을 충족시켰을 수 있다, 즉, 블럭 B는 빈번히 실행되는 소스 바이너리 코드 블럭이다. 블럭 A, 블럭 C 및 블럭 D는 블럭 B에 대해 이웃하는 블럭일 수 있다. 도 2(b)의 동작(214), 관련성 임계값을 충족/초과하는 이웃하는 블럭에 대한 탐색은 블럭 D를 산출할 수 있다. 블럭 D는 블럭 B에 대해 관련성 임계값을 충족하거나 초과하는 이웃 소스 바이너리 코드 블럭이다.
관련성은 빈번히 실행되는 소스 바이너리 코드 블럭과 이웃하는 소스 바이너리 코드 블럭의 실행 가능성의 상관관계에 대응한다. 즉, 블럭 B는 비교적 높은 실행 가능성(카운트=1000)을 갖는다. 블럭 D는 또한 비교적 높은 실행 가능성(카운트=990)을 갖는다. 카운트 정보는 역사적이고 미래의 실행 빈도는 변할 것이기 때문에 "실행 가능성"이 사용된다. 블럭 D의 실행 가능성은, 예컨대, 블럭 B와 블럭 D 사이의 분기에 기초한 블럭 B의 실행 가능성에 관련된다. 즉, 블럭 D의 실행 가능성은 블럭 B의 실행 가능성과 연관된다.
본 예에서, 코드의 5 블럭 중, 각각 1000 및 990의 비교적 높은 실행 빈도(즉, 카운트)를 갖고, 관련성 임계값을 충족하거나 초과하는 블럭 B와 블럭 D는 영역(305)에 포함된다. 블럭 B의 명령어는 레지스터 r1, r2, r3, r4 및 r5에 액세스한다. 레지스터 r1 및 r4는 정의(기록)되고 레지스터 r1, r2, r3, r4 및 r4는 사용(판독)된다. 즉, 블럭 B의 각각의 실행에 대해, r1 및 r4는 두 번 액세스되고 나머지 레지스터는 각각 한번씩 액세스되는다. 따라서, 실행 빈도 1000인 블럭 B에 대해, r1 및 r4는 각각 2000번 액세스되고 나머지 레지스터는 각각 1000번씩 액세스되는다. 블럭 D는 레지스터 r2에 두 번(한 번은 판독, 한 번은 기록) 액세스하고 레지스터 r5에 한 번(판독) 액세스하는 하나의 명령어를 포함한다. 따라서, 실행 빈도 990인 블럭 D에 대해, r2는 1980번 액세스되고 r5는 990번 액세스되는다. 따라서, 블럭 B와 블럭 D를 포함하는 영역(305)에 대해, r1은 총 2000번 액세스되고, r2는 총 2980번 액세스되고, r3은 총 1000번 액세스되고, r4는 총 2000번 액세스되고, r5는 총 1990번 액세스되는다. 레지스터들을 가장 자주 액세스되는 것부터 가장 덜 액세스되는 것까지 레지스터 액세스의 수로 정렬하면, r2, r1 및 r4, r5, 그리고 r3으로 된다.
도 2(b)로 다시 돌아가면, 동작(220)에서, 소스 레지스터는 타겟 레지스터에 맵핑될 수 있다. 가장 큰 수의 액세스에 대응하는, 즉, 가장 자주 액세스되는 소스 레지스터(들)는 그 영역에 대해 타겟 레지스터(들)에 맵핑될 수 있다. 예컨대, 타겟 ISA는 Nt개의 타겟 프로세서 레지스터를 가질 수 있고, 소스 ISA는 Ns개의 소스 프로세서 레지스터를 가질 수 있고, 여기서 Nt는 Ns보다 작다. Nt 타겟 프로세서 레지스터 중 N개는 맵핑에 이용 가능할 수 있고, 여기서 N은 Nt 이하이다. 도 3에 도시된 예로 계속하면, N이 3인 경우, 레지스터 r1, r2, r4는 그 영역에 대한 타겟 프로세서 레지스터에 맵핑될 수 있다. 레지스터 r3, r5는 타겟 프로세서 레지스터에 맵핑되지 않을 것이고, 따라서 필요에 따라 메모리로부터 검색될 수 있다.
일부 실시예에서, 맵핑에 이용 가능한 타겟 프로세서 레지스터의 수 N은 타겟 ISA의 프로세서 레지스터의 수 Nt보다 작을 수 있다. 즉, 하나 이상의 타겟 프로세서 레지스터는, 예컨대, 맵핑되지 않은 소스 레지스터를 사용 또는 정의되는 명령어에 대해 예약될 수 있다. 예컨대, 하나 또는 두 개의 타겟 프로세서 레지스터는 그러한 명령어에 대해 예약될 수 있다.
표 1은 영역의 각 소스 레지스터에 대한 레지스터 액세스의 총 횟수를 결정하고 N개의 소스 레지스터를 N개의 타겟 레지스터에 맵핑하는 일례에 대응하는 의사 코드(pseudocode)를 포함한다.
Figure pct00001
따라서, 동작(220)의 완료시에, N개의 소스 레지스터는 N개의 타겟 레지스터에 맵핑될 수 있다. 타겟 레지스터(들)에 맵핑되지 않은 소스 레지스터(들)는 시스템 메모리(104)의 소스 레지스터 스토리지(118), 캐시 메모리(105) 및/또는 스크래치 패드 메모리(107)에 맵핑될 수 있다.
동작(222)에서, 리브인(live-in) 및/또는 리브아웃(live-out) 레지스터는 영역의 각 바이너리 블럭에 대해 식별될 수 있다. 리브인은 바이너리 블럭에서 처음 정의(즉, 기록)되지 않고 바이너리 블럭에서 사용(즉, 판독)되는 레지스터에 대응한다. 예컨대, 도 3에 도시된 영역(305)에서, 레지스터 r2, r3 및 r5는 블럭 B에서 처음 정의되지 않고 사용되고, 레지스터 r2는 블럭 D에서 정의되기 전에 사용된다. 따라서, 레지스터 r2, r3 및 r5는 영역(305)에 대해 리브인이다. 리브아웃은 값(들)이 바이너리 블럭에서 명령어에 의해 변경될 수 있는 레지스터(들)에 대응한다. 예컨대, 영역(305)에서, 레지스터 r1 및 r4의 값은 블럭 B에서 명령어에 의해 변경될 수 있고, r2의 값은 블럭 D에서 명령어에 의해 변경될 수 있다. 따라서, r1, r2 및 r4는 영역(305)에 대해 리브아웃이다. 일부 실시예에서, 동작(222)은 수행되지 않을 수도 있고, 동작(222)을 표현하는 상자를 나타내는 점선에 의해 표시된다.
동작(224)에서, 영역, 예컨대, 영역(305)의 각 바이너리 블럭에 대해, 최적화된 타겟 바이너리 코드 블럭이 생성될 수 있다. 예컨대, 각각의 최적화된 타겟 바이너리 코드 블럭은 프롤로그, 대응하는 소스 바이너리 코드 블럭의 변환된 소스 코드를 포함하는 블럭 본문(block body), 조건부점프 및 적어도 하나의 에필로그를 포함할 수 있다. 도 4는 프롤로그(410), 블럭 본문(420) 및 두 개의 에필로그(430, 440)를 포함하는 타겟 코드 블럭(400)의 일례를 도시한다. 조건부점프는 블럭 본문(420)에 포함된다.
프롤로그는 타겟 레지스터를, 예컨대, 소스 레지스터 스토리지(118)로부터 맵핑된 또는 맵핑된 리브인 소스 레지스터에 대응하는 데이터로 로딩하도록 구성된다. 맵핑된 또는 맵핑된 리브인 소스 레지스터가 로딩되는지 여부는 오버헤드, 즉, 영역의 각 소스 바이너리 코드 블럭에 대한 리브인 소스 레지스터를 식별하는 것과 연관된 오버헤드 대 영역으로의 엔트리에 모든 맵핑된 소스 레지스터를 로딩하는 것과 연관된 오버헤드에 따라 달라질 수 있다. 예컨대, 도 3에 도시된 영역(305)에 대해, 레지스터 r1, r2 및 r4는 영역(305)에 대한 타겟 레지스터에 맵핑된다. 따라서, 본 예에서, 블럭 B 및 블럭 D와 연관된 각각의 프롤로그는 각각 메모리로부터 타겟 레지스터로 소스 레지스터 r1, r2 및 r4를 로딩하도록 구성될 수 있다. 다른 예에서, 레지스터 r2는 모두 맵핑되고 영역(305)에 대해 리브인이다. 따라서, 블럭 B 및 블럭 D와 연관된 각각의 프롤로그는 각각 레지스터 r2를 로딩하도록 구성되고, 그 결과, 맵핑된 소스 레지스터의 모두(즉, r1, r2 및 r4)를 로딩하는 것에 비해 메모리 액세스가 더 적다.
적어도 하나의 에필로그는 제 1 에필로그와 제 2 에필로그를 포함할 수 있다. 조건부점프는, 소스 바이너리 코드 블럭을 종료하는 분기가 영역 내의 타겟 바이너리 코드 블럭인지 또는 영역에 없는 타겟 바이너리 코드 블럭인지에 기초하여, 흐름이 제 1 에필로그 또는 제 2 에필로그로 진행할 지를 제어하도록 구성된다. 영역 내의 타겟 바이너리 코드 블럭은 여기에 설명된 바와 같이 최적화된 타겟 바이너리 코드 블럭이다. 영역 내에 없는 타겟 바이너리 코드 블럭은 최적화되지 않은 타겟 바이너리 코드 블럭 또는 다른 영역과 연관된 최적화된 타겟 바이너리 코드 블럭일 수 있다.
제 1 에필로그는 영역 내의 타겟 바이너리 코드 블럭으로의 점프를 포함한다. 예컨대, 도 3을 다시 참조하면, 블럭 B로부터 블럭 D로의 점프는 영역 내의 타겟 바이너리 코드 블럭으로의 점프에 대응한다. 제 2 에필로그는 그 영역 밖에 있는, 예컨대, 영역(305)에 없는 타겟 바이너리 코드 블럭으로의 점프를 포함한다. 제 2 에필로그는 다음 타겟 바이너리 코드 블럭으로의 점프 이전에 리브아웃 레지스터를 저장하도록 더 구성된다. 여기 설명된 리브인 레지스터를 로딩하는 것과 마찬가지로, 제 2 에필로그는 다음 타겟 바이너리 코드 블럭으로 점프하기 이전에 맵핑된 또는 맵핑된 리브아웃 레지스터를 저장하도록 구성될 수 있다.
도 3을 다시 참조하면, 블럭 B로부터 블럭 C로의 점프는 그 영역 밖에 있는 타겟 바이너리 코드 블럭으로의 점프에 대응한다. 영역 내의 타겟 바이너리 코드 블럭으로의 점프는 영역 내의 바이너리 코드 블럭의 본문으로 점프하도록 구성되고, 영역 내의 바이너리 코드 블럭과 연관된 프롤로그를 건너뛴다. 영역 밖의 타겟 바이너리 코드 블럭으로의 점프는 영역 밖의 타겟 바이너리 코드 블럭의 처음으로 점프하도록 구성된다. 영역 밖의 타겟 바이너리 코드 블럭이 다른 영역과 연관된 최적화된 타겟 바이너리 코드 블럭이면, 점프는 최적화된 타겟 바이너리 코드 블럭의 프롤로그를 향한다.
런타임 시스템, 즉, 호스트 운영 시스템(120)이 타겟 코드에 의해 직접 처리될 수 없는 기능, 예컨대, 인터럽트 처리를 수행하도록 구성된다. 이러한 기능을 적절히 작동하게 하기 위해, 게스트 상태가 일관성있는 점이어야 하는, 즉, 메모리의 적절한 데이터 구조에서 일관성 있는 게스트 상태인 것이 중요하다. 게스트 상태는 블럭의 실행 내에서 일관되지 않을 수 있지만 블럭 경계에서는 일관된다. 따라서, 오픈 소스 QEMU 등의 동작 바이너리 변환기는 인터럽트 처리를 코드 블럭의 끝으로 지연시키도록 구성된다. 블럭의 끝에서 일관성있는 게스트 상태를 갖기 위해, 리브아웃 레지스터는 런타임 시스템으로 복귀하기 전에, 영역 내의 블럭으로 점프한 후에 (예컨대, 소스 레지스터 스토리지(118)에) 저장될 수 있다. 영역에 없는 블럭으로의 점프를 위해, 리브아웃 레지스터는 영역에 없는 블럭으로의 점프 이전에 저장될 수 있다. 영역에 없는 블럭으로의 점프 후에, 제어는 런타임 시스템으로 돌아갈 수 있다.
도 5는 적어도 하나의 최적화 타겟 바이너리 코드 블럭을 포함하는 적어도 하나의 최적화된 코드 영역을 포함하는 소스 바이너리 애플리케이션에 대응하는 타겟 바이너리 코드 블럭을 실행하기 위한 예시적 동작의 흐름도(500)를 도시한다. 프로그램 흐름은 개시(502)에서 시작할 수 있다. 개시(502)는 적어도 하나의 최적화된 타겟 코드 블럭을 포함하는 최적화된 타겟 바이너리 코드의 제 1 영역으로의 진입에 대응한다. 동작(504)에서, 제 1 영역에서의 제 1 최적화 타겟 바이너리 코드 블럭의 프롤로그가 실행될 수 있다. 여기에 설명한 바와 같이, 프롤로그는 맵핑된 또는 맵핑된 리브인 레지스터를 메모리로부터 로딩하도록 구성된다.
그 후 제 1 최적화 타겟 바이너리 코드 블럭의 본문은 동작(506)에서 실행될 수 있다. 제 1 최적화 타겟 바이너리 코드 블럭에 대응하는 소스 바이너리 코드 블럭의 경계에서의 분기가 제 1 영역의 타겟 바이너리 코드 블럭에 대한 것인지 여부는 동작(508)에서 판정될 수 있다. 분기가 제 1 영역에 없는 타겟 바이너리 코드 블럭에 대한 것이면, 맵핑된 또는 맵핑된 리브아웃 레지스터는 동작(510)에서 메모리, 예컨대, 소스 레지스터 스토리지(118)에 저장될 수 있다. 제 1 영역에 없는, 다음 타겟 바이너리 코드 블럭의 처음으로의 점프는 동작(512)에서 실행될 수 있다. 다음 타겟 바이너리 코드 블럭은 최적화될 수 있고 또는 그렇지 않을 수 있다. 다음 타겟 바이너리 코드 블럭이 최적화되지 않으면, 다음 소스 바이너리 코드 블럭에 대응하는 다음 타겟 바이너리 코드 블럭이 동작(514)에서 실행될 수 있다. 다음 타겟 바이너리 코드 블럭이 최적화되면, 예컨대, 제 2 영역에서, (제 2 영역의 다음 타겟 바이너리 코드 블럭의) 프롤로그는 동작(504)에서 실행되고, 그 뒤에 동작(506)에서 다음 타겟 바이너리 코드 블럭의 본문을 실행할 수 있다.
동작(508)에서, 분기가 제 1 영역의 타겟 바이너리 코드 블럭에 대한 것으로 판정되면, 다음 타겟 바이너리 코드 블럭의 본문으로의 점프가 동작(516)에서 실행될 수 있다. 일부 실시예에서, 레지스터는, 예컨대, 런타임 시스템에 의한 인터럽트 처리를 용이하게 하기 위해, 메모리에 저장될 수 있다. 이들 실시예에서, 런타임 시스템으로 복귀할 필요가 있는지 여부가 동작(517)에서 판정될 수 있다. 런타임 시스템으로 복귀할 필요가 없으면, 프로그램 흐름은 동작(506)으로 진행할 수 있고, 그 후 (타겟 바이너리 코드 블럭의) 본문은 동작(506)에서 실행될 수 있다. 런타임 시스템으로 복귀할 필요가 있으면, 레지스터는 동작(518)에서 메모리에 저장될 수 있고, 프로그램 흐름은 동작(520)에서 런타임 시스템으로 진행할 수 있다. 런타임 시스템으로부터 복귀하면, 프로그램 흐름은 동작(504)으로 진행하여 프롤로그를 실행할 수 있고, 여기서 레지스터는 메모리로부터 로딩될 수 있다.
도 4 및 도 5를 참조하면, 분기가 영역의 또는 영역에 없는 다음 타겟 바이너리 코드 블럭에 대한 것인지 판정하는 동작(508)은, 최적화된 타겟 바이너리 코드 블럭의 본문(420)의 조건부점프(jCC T)에 대응한다. 동작(516)은 제 1 에필로그(430)에 대응하고, 영역 본문 내에서 점프한다. 동작(510, 512)은 제 2 에필로그(440)에 대응한다.
도 6은 도 3에 도시된 예시적 제어 흐름 그래프(300)에 대응하는 최적화된 제어 흐름 그래프(600)를 도시한다. 최적화된 제어 흐름 그래프(600)에서, 타겟 블럭 B(620)는 도 3의 제어 흐름 그래프(300)의 블럭 B(320)에 대응하고, 타겟 블럭 D(640)는 제어 흐름 그래프(300)의 블럭 D(340)에 대응한다. 타겟 블럭 B 및 타겟 블럭 D는 도 4의 타겟 코드 블럭(400)에 따라 구성된다. 최적화된 제어 흐름 그래프(600)의 타겟 바이너리 코드 블럭 사이의 제어 흐름은, 흐름이 영역의 타겟 바이너리 코드 블럭 사이에 있는지 또는 그 영역의 타겟 바이너리 코드 블럭과 그 영역에 없는 타겟 바이너리 코드 블럭 사이에 있는지에 따라 달라진다. 그 영역에 없는 타겟 바이너리 코드 블럭은 다른 영역과 연관된 최적화된 타겟 바이너리 코드 블럭일 수 있거나 최적화되지 않은 타겟 바이너리 코드 블럭일 수 있다. 예컨대, 타겟 블럭 B로부터 영역(605) 밖의 블럭 C로의 제어 흐름은 타겟 블럭 B의 (맵핑된 또는 맵핑된 리브아웃을 저장하는) 에필로그 2로부터 블럭 C로(즉, 블럭 C의 시작으로) 향하고, 블럭 C로부터 타겟 블럭 D로의 제어 흐름은 블럭 C로부터 타겟 블럭 D의 (맵핑된 또는 맵핑된 리브인을 로딩하는) 프롤로그로 향한다. 영역(605)에서 타겟 블럭 B와 타겟 블럭 D 사이의 제어 흐름은 블럭 B 또는 블럭 D의 에필로그 1로부터 블럭 D 또는 블럭 B의 본문으로 향하며, 각각 경로(624) 및 경로(642)로 도시된다.
따라서, 최적화된 제어 흐름 그래프(600)에 도시된 바와 같이, 프롤로그는 영역으로의 진입시에만 실행할 수 있다. 영역 내에서의 타겟 바이너리 코드 블럭 사이의 점프는 타겟 바이너리 코드 블럭의 본문으로 점프하고, 프롤로그 및 맵핑된 또는 맵핑된 리브인 레지스터를 로딩하는 것과 연관된 메모리 액세스를 건너뛰도록 구성된다. 유리하게, 이것은 성능 개선, 예컨대, 비교적 빈번히 실행되는 코드의 영역에 대해 속도의 증가를 초래할 수 있다.
최적화된 타겟 바이너리 코드 블럭의 복수의 영역은 소스 애플리케이션에 대해 생성될 수 있다. 유리하게, 레지스터 맵핑은 다른 영역(들)에 대해 최적화된 레지스터 맵핑과 관계없이 각 영역에 대해 최적화될 수 있다. 이런 식으로, 최적화는 영역 특정적이다. 일부 실시예에서, 맵핑된 또는 맵핑된 리브아웃 레지스터의 저장은 영역을 나갈 때에만 실행할 수 있고, 성능을 더 향상시킨다.
도 7은 블럭 레벨 레지스터 맵핑(710, 720, 730, 740, 750) 및 본 개시물과 일관된 영역 레벨 레지스터 맵핑(715, 725, 735, 745, 755)을 구현하기 위한 동적 바이너리 변환에 대한 성능 기준의 비교를 도시하는 그래프이다. 성능은 (메모리에 레지스터를 맵핑하는) 오픈 소스 QEMU 동적 바이너리 변환기에 대해 도시된다. 블럭 레벨 레지스터 맵핑에서, 맵핑된 리브인 레지스터는 각각의 타겟 코드 블럭에 진입하면 로딩되고, 맵핑된 리브아웃 레지스터는 각각의 타겟 코드 블럭을 나가면 저장된다. 본 개시물과 일관된 영역 레벨 레지스터 맵핑의 도시된 실시예는 영역으로 진입 시에 (메모리로부터) 맵핑된 리브인 레지스터를 로딩하고, 영역에서 나갈 때 (메모리에) 리브아웃 레지스터를 저장하도록 구성된다. 모든 기준에 대해, 본 개시물과 일관된 영역 레벨 레지스터 맵핑은 기준치의 QEMU 및 블럭 레벨 레지스터 맵핑에 비해 성능을 개선했다. 평균적으로 기준에 대한 성능 개선은 블럭 레벨 레지스터 맵핑에 비해 약 17%였고, QEMU 기준치에 비교해서 약 31%였다.
따라서, 본 개시물과 일치하는 방법 및 시스템은, 타겟 프로세서 레지스터가 소스 프로세서 레지스터보다 더 적을 때 동적 바이너리 변환으로 소스 프로세서 레지스터를 타겟 프로세서 레지스터로 맵핑하는 것을 포함한다. "뜨거운", 즉 비교적 빈번히 실행될 것으로 판정된 코드의 영역에 대해, 각 소스 레지스터의 액세스 수가 결정될 수 있다. 그 후 가장 자주 액세스되는 소스 레지스터는 이용 가능한 타겟 레지스터에 맵핑될 수 있다. 영역의 소스 바이너리 코드의 각 블럭에 대해, 프롤로그, 변환된 소스 코드를 포함하는 본문, 조건부점프 및 적어도 하나의 에필로그를 포함하는, 최적화된 타겟 바이너리 코드의 대응하는 블럭이 생성될 수 있다. 조건부점프 및 적어도 하나의 에필로그는, 제 1 타겟 바이너리 코드 블럭으로부터의 분기가 영역 내에서의 다음 타겟 바이너리 코드 블럭에 대한 것인지 또는 영역 밖의 다음 타겟 바이너리 코드 블럭에 대한 것인지에 기초해서 흐름을 제어하도록 구성된다. 다음 타겟 바이너리 코드 블럭이 영역 내에 있으면, 점프는 다음 타겟 바이너리 코드 블럭의 본문으로 향하고 프롤로그를 건너뛴다. 다음 타겟 바이너리 코드 블럭이 영역 내에 없으면, 점프는 다음 타겟 바이너리 코드 블럭의 시작으로 향한다. 프롤로그는 메모리로부터 영역에 대한 맵핑된 또는 맵핑된 리브인 레지스터를 로딩하도록 구성된다. 다음 타겟 바이너리 코드 블럭이 영역 내에 없으면, 에필로그는 다음 타겟 바이너리 코드 블럭의 시작으로 점프하기 전에 맵핑된 또는 맵핑된 리브아웃 레지스터를 저장하도록 구성된다. 이런 방식으로, 영역에 진입할 때 맵핑된 또는 맵핑된 리브인 레지스터가 메모리로부터 로딩되고, 영역을 나갈 때 맵핑된 또는 맵핑된 리브아웃 레지스터는 메모리에 저장되며, 블럭 레벨 레지스터 로딩/저장에 비해 메모리 액세스를 줄인다.
여기에 설명한 바와 같이, 최적화는, 카운터를 포함하여, 타겟 바이너리 코드 블럭에 삽입된 프로브(들)에 따라 달라진다. 따라서, 카운터에 기초하여 판정된 실행 빈도는 한정된 기간을 나타낸다. 코드의 영역에 대한 실행 빈도가 시간이 경과함에 따라 변하면, 최적화에 의해 처음에 제공된 성능 개선은 저하, 즉 덜 최적화될 수 있다. 최적화가 반복될 수 있지만, 여기서 설명한 프로시저를 반복할지의 여부는 이전에 최적화된 타겟 바이너리 코드 블럭을 실행하기 위해 최적화 대 시간을 구현하기 위한 시간의 고려에 따라 달라질 수 있다.
물론, 도 2(a), 도 2(b), 도 5는 일부 실시예에 따른 예시적 동작을 나타내지만, 다른 실시예에서 도 2(a), 도 2(b), 도 5에 도시된 동작 모두가 필요하지 않을 수도 있음이 이해될 것이다. 실제로, 본 개시물의 다른 실시예는 도 2(a), 도 2(b), 도 5에 도시된 동작의 하위 조합 및/또는 추가 동작을 포함할 수 있음은 충분히 고려된다. 따라서 하나의 도면에 정확하게 도시되지 않은 특징 및/또는 동작에 대한 청구항은 본 개시물의 범위 및 내용에 있는 것으로 간주된다.
메모리(104), 캐시 메모리(105), 및/또는 스크래치 패드 메모리(107)는 다음의 메모리 타입 : 반도체 펌웨어 메모리, 프로그램 가능한 메모리, 비휘발성 메모리, 판독 전용 메모리, 전기적으로 프로그램 가능한 메모리, 랜덤액세스 메모리, 플래시 메모리, 자기 디스크 메모리, 및/또는 광 디스크 메모리 중 하나 이상을 포함할 수 있다. 추가적으로 또는 대안적으로, 메모리(104), 캐시 메모리(105) 및/또는 스크래치 패드 메모리(107)는 다른 및/또는 나중에 개발된 타입의 컴퓨터 판독 가능한 메모리를 포함할 수 있다.
여기서 설명된 방법의 실시예는 프로세서 및/또는 다른 프로그램 가능한 장치를 이용하여 구현될 수 있다. 이를 위해, 여기서 설명된 방법은, 방법을 수행하는 하나 이상의 프로세서에 의해 실행될 때 내부에 저장된 명령어를 갖는 유형의(tangible) 컴퓨터 판독 가능한 매체에 구현될 수 있다. 스토리지 매체는 임의의 타입의 유형의 매체, 예컨대, 플로피 디스크, 광 디스크, CD-ROM(compact disk read-only memory), CD-RW(compact disk rewritable), 자기 광 디스크 등의 임의의 타입의 디스크, 판독전용 메모리(ROM), 동적 및 정적 RAM 등의 랜덤 액세스 메모리(RAM), 소거가능한 프로그래머블 판독 전용 메모리(EPROM), 전기적으로 소거가능한 프로그래머블 판독 전용 메모리(EEPROM), 플래시 메모리, 자기 또는 광 카드 등의 반도체 장치, 또는 전기적 명령을 저장하기에 적합한 임의의 타입의 매체를 포함할 수 있다.
특별히 다르게 언급하지 않는 한, 앞선 논의로부터 분명하듯이, 컴퓨터 또는 컴퓨팅 시스템 또는 유사한 전자 컴퓨팅 장치 또는 기기의 조치 및/또는 프로세스를 일컫는 "동작", "프로세싱", "컴퓨팅", "산출", "판정" 등의 용어를 사용하는 명세서 논의의 전반에 걸쳐, 컴퓨팅 시스템의 레지스터 및/또는 메모리 내의, 전자적(electronic) 등의 물리적 양으로 표현된 데이터를 조작 및/또는, 컴퓨팅 시스템의 메모리, 레지스터 또는 다른 그러한 정보 스토리지, 전송 또는 디스플레이 장치 내의 물리적 양으로 유사하게 표현된 다른 데이터로 변환하는 것이 이해될 것이다.
여기서 임의의 실시예에서 사용된 "회로"는, 예컨대, 고정배선(hardwired) 회로, 프로그램 가능한 회로, 상태머신 회로 및/또는 프로그램 가능한 회로에 의해 실행되는 명령어를 저장하는 펌웨어를 단일 또는 임의의 조합으로 포함할 수 있다.
일 국면에 따르면 방법이 개시된다. 방법은 컴퓨터 시스템에 의한 실행을 위해 복수의 소스 바이너리 코드 블럭을 포함하는 소스 바이너리 애플리케이션을 로딩하는 단계를 포함할 수 있다. 컴퓨터 시스템은 메모리 및, Nt개의 타겟 레지스터를 포함하는 프로세싱 유닛을 포함할 수 있고, 여기서 Nt는 대응하는 소스 명령어 세트 구조의 소스 레지스터의 수 Ns보다 작다. 방법은, 소스 바이너리 애플리케이션의 런타임동안, 소스 바이너리 애플리케이션 내에서 빈번히 실행되는 소스 바이너리 코드 블럭을 식별하는 단계와, 빈번히 실행되는 소스 바이너리 코드 블럭 및 관련성 임계값을 초과하는 적어도 하나의 이웃하는 소스 바이너리 코드 블럭을 포함하는 영역을 정의하는 단계를 더 포함할 수 있고, 빈번히 실행되는 소스 바이너리 코드 블럭 및 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 적어도 하나의 소스 레지스터 액세스를 포함하고 각각 분기 명령어에 의해 경계가 이루어진다. 방법은 영역에서 액세스되는 각각의 소스 레지스터에 대한 액세스의 빈도를 판정하는 단계와, 영역에서 가장 빈번히 액세스되는 N개의 소스 레지스터의 각각을 Nt개의 타겟 레지스터의 각각에 맵핑하는 단계 - 여기서 N은 Nt 이하임 - 와, 레지스터 맵핑에 적어도 부분적으로 기초하여 각각의 소스 바이너리 코드 블럭에 대응하는 최적화된 타겟 바이너리 코드 블럭을 생성하는 단계를 더 포함할 수 있다.
다른 국면에 따르면, 프로세서에 의해 실행될 때 다음의 동작 : 실행을 위한 복수의 소스 바이너리 코드 블럭을 포함하는 소스 바이너리 애플리케이션을 로딩하는 동작 - 여기서 프로세서는 Nt개의 타겟 레지스터를 포함하고, Nt는 대응하는 소스 명령어 세트 구조의 소스 레지스터의 수 Ns보다 작음 - 과, 상기 소스 바이너리 애플리케이션의 런타임동안, 상기 소스 바이너리 애플리케이션 내에서 빈번히 실행되는 소스 바이너리 코드 블럭을 식별하는 동작과, 빈번히 실행되는 소스 바이너리 코드 블럭 및 관련성 임계값을 초과하는 적어도 하나의 이웃하는 소스 바이너리 코드 블럭을 포함하는 영역을 정의하는 동작 - 빈번히 실행되는 소스 바이너리 코드 블럭 및 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 적어도 하나의 소스 레지스터 액세스를 포함하고 각각 분기 명령어에 의해 경계가 이루어짐 - 과, 영역에서 액세스되는 각각의 소스 레지스터에 대한 액세스의 빈도를 판정하는 동작과, 영역에서 가장 빈번히 액세스되는 N개의 소스 레지스터의 각각을 Nt개의 타겟 레지스터의 각각에 맵핑하는 동작 - 여기서 N은 Nt 이하임- 과, 레지스터 맵핑에 적어도 부분적으로 기초하여 영역에서 각각의 소스 바이너리 코드 블럭에 대응하는 최적화된 타겟 바이너리 코드 블럭을 생성하는 동작을 초래할 수 있는, 내부에 저장된 명령어를 갖는 유형의 스토리지 매체를 포함하는 물품이 개시된다.
또 다른 국면에 따르면, 시스템이 개시된다. 시스템은 Nt개의 타겟 레지스터를 포함하는 프로세서 - Nt는 대응하는 소스 명령어 세트 구조의 소스 레지스터의 수 Ns보다 작음 - 와, 동적 바이너리 변환기를 운영하도록 구성된 메모리와, 레지스터 맵핑 모듈과, 프로세서 상에서 실행될 복수의 소스 바이너리 코드 블럭을 포함하는 소스 바이너리 애플리케이션을 포함할 수 있고, 동적 바이너리 변환기 및 레지스터 맵핑 모듈이 프로세서 상에서 실행될 때, 적어도 하나의 동적 바이너리 변환기 및 레지스터 맵핑 모듈은, 프로세서로 하여금, 소스 바이너리 애플리케이션의 런타임동안 소스 바이너리 애플리케이션 내에서 빈번히 실행되는 소스 바이너리 코드 블럭을 식별하고, 빈번히 실행되는 소스 바이너리 코드 블럭 및 관련성 임계값을 초과하는 적어도 하나의 이웃하는 소스 바이너리 코드 블럭을 포함하는 영역을 정의 - 빈번히 실행되는 소스 바이너리 코드 블럭 및 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 적어도 하나의 소스 레지스터 액세스를 포함하고 각각 분기 명령어에 의해 경계가 이루어짐 - 하고, 영역에서 액세스되는 각각의 소스 레지스터에 대한 액세스의 빈도를 판정하고, 영역에서 가장 빈번히 액세스되는 N개의 소스 레지스터의 각각을 Nt개의 타겟 레지스터의 각각에 맵핑 - 여기서 N은 Nt 이하임- 하고, 레지스터 맵핑에 적어도 부분적으로 기초하여 각각의 소스 바이너리 코드 블럭에 대응하는 최적화된 타겟 바이너리 코드 블럭을 생성하도록 할 수 있다.
여기서 사용된 용어 및 표현은 제한이 아니라 설명의 관점에서 사용된 것이며, 그러한 용어 및 표현의 사용에 있어, 도시 및 설명된 특징의 임의의 등가물(또는 그 일부)을 배제하려는 의도가 없고, 다양한 변형이 청구범위의 영역 내에서 가능한 것이 이해될 것이다. 따라서, 청구범위는 그러한 모든 등가물을 포함하도록 의도된다.

Claims (24)

  1. 컴퓨터 시스템에 의한 실행을 위해 복수의 소스 바이너리 코드 블럭을 포함하는 소스 바이너리 애플리케이션을 로딩하는 단계 - 상기 컴퓨터 시스템은 메모리 및, Nt개의 타겟 레지스터를 포함하는 프로세싱 유닛을 포함하며, 상기 소스 바이너리 애플리케이션은 Ns개의 소스 레지스터를 갖는 환경에서 실행되도록 구성되고, Nt는 Ns보다 작음 - 와,
    상기 소스 바이너리 애플리케이션의 런타임동안, 상기 소스 바이너리 애플리케이션 내에서 빈번히 실행되는 소스 바이너리 코드 블럭을 식별하는 단계와,
    상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 관련성 임계값(an affinity threshold)을 초과하는 적어도 하나의 이웃하는 소스 바이너리 코드 블럭을 포함하는 영역을 정의하는 단계 - 상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 모두 적어도 하나의 소스 레지스터에서 액세스하라는 명령어를 포함함 - 와,
    상기 영역에서 액세스되는 각각의 소스 레지스터에 대한 액세스의 빈도를 판정하는 단계와,
    상기 영역에서 가장 빈번히 액세스되는 N개의 소스 레지스터의 각각을 Nt개의 타겟 레지스터의 각각에 맵핑하는 단계 - 여기서 N은 Nt 이하임 - 를 포함하는
    방법.
  2. 제 1 항에 있어서,
    상기 레지스터 맵핑에 적어도 부분적으로 기초하여 상기 영역에서 각각의 소스 바이너리 코드 블럭에 대응하는 최적화된 타겟 바이너리 코드 블럭을 생성하는 단계를 더 포함하고,
    각각의 최적화된 타겟 바이너리 코드 블럭은, 메모리로부터 각각의 맵핑된 소스 레지스터와 연관된 데이터를 대응하는 타겟 레지스터로 로딩하도록 구성된 프롤로그와, 상기 소스 바이너리 코드 블럭에 대응하는 변환된 소스 바이너리 코드를 포함하는 본문과, 조건부점프(jump on condition)와, 적어도 하나의 에필로그를 포함하고, 상기 조건부점프 및 상기 적어도 하나의 에필로그는, 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부에 적어도 부분적으로 기초하여 상기 영역에서의 제 1 최적화 타겟 바이너리 코드 블럭으로부터 상기 제 2 타겟 바이너리 코드 블럭으로의 흐름을 제어하도록 구성되는
    방법.
  3. 제 2 항에 있어서,
    복수의 상기 에필로그는 제 1 에필로그 및 제 2 에필로그를 포함하고, 상기 제 1 에필로그는, 상기 제 2 타겟 바이너리 코드 블럭이 상기 영역의 제 2 최적화 타겟 바이너리 코드 블럭이면 실행되도록 구성되고, 상기 제 1 에필로그는 상기 제 2 최적화 타겟 바이너리 코드 블럭의 본문으로 점프하라는 제 1 명령어를 포함하고, 상기 제 2 에필로그는, 상기 제 2 타겟 바이너리 코드 블럭이 상기 영역에 없으면 실행되도록 구성되고, 상기 제 2 에필로그는 각각의 맵핑된 소스 레지스터에 대응하는 각각의 타겟 레지스터를 메모리에 저장하라는 제 2 명령어와, 상기 제 2 타겟 바이너리 코드 블럭의 시작으로 점프하라는 제 3 명령어를 포함하는
    방법.
  4. 제 1 항에 있어서,
    상기 영역의 각 소스 바이너리 코드 블럭에 대해 리브인(live-in) 레지스터 및 리브아웃(live-out) 레지스터를 식별하는 것을 포함하는, 상기 영역에 대해 리브인 및 리브아웃 레지스터를 식별하는 단계를 더 포함하는
    방법.
  5. 제 4 항에 있어서,
    상기 레지스터 맵핑에 적어도 부분적으로 기초하여 상기 영역의 각각의 소스 바이너리 코드 블럭에 대응하는 최적화된 타겟 바이너리 코드 블럭을 생성하는 단계를 더 포함하고,
    각각의 최적화된 타겟 바이너리 코드 블럭은, 메모리로부터 각각의 맵핑된 리브인 소스 레지스터와 연관된 데이터를 대응하는 타겟 레지스터로 로딩하도록 구성된 프롤로그와, 상기 소스 바이너리 코드 블럭에 대응하는 변환된 소스 바이너리 코드를 포함하는 본문과, 조건부점프와, 적어도 하나의 에필로그를 포함하고, 상기 조건부점프 및 상기 적어도 하나의 에필로그는, 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부에 적어도 부분적으로 기초하여 상기 영역에서의 제 1 최적화 타겟 바이너리 코드 블럭으로부터 상기 제 2 타겟 바이너리 코드 블럭으로의 흐름을 제어하도록 구성되는
    방법.
  6. 제 2 항에 있어서,
    상기 영역의 제 1 최적화 타겟 바이너리 코드 블럭의 프롤로그를 실행하는 단계 - 상기 실행하는 단계는 상기 영역에 대해 상기 N개의 맵핑된 소스 레지스터의 각각에 대해 대응하는 데이터를 갖는 N개의 타겟 레지스터의 각각을 로딩하는 단계를 포함함 - 와,
    상기 제 1 최적화 타겟 바이너리 코드 블럭의 본문을 실행하는 단계 - 상기 제 1 최적화 타겟 바이너리 코드 블럭은 제 2 타겟 바이너리 코드 블럭으로 점프하도록 구성된 제 1 분기 명령어를 포함함 - 와,
    상기 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부를 판정하는 단계와,
    상기 제 2 타겟 코드 블럭이 상기 영역에 있으면, 상기 제 2 타겟 바이너리 코드 블럭에 대응하는 제 2 최적화 타겟 코드 블럭의 본문으로 점프하는 제 1 에필로그를 실행하는 단계, 또는 상기 제 2 타겟 코드 블럭이 상기 영역에 없으면, 상기 제 2 타겟 코드 블럭의 시작으로 점프하는 제 2 에필로그를 실행하는 단계를 더 포함하는
    방법.
  7. 제 5 항에 있어서,
    상기 영역의 제 1 최적화 타겟 바이너리 코드 블럭의 프롤로그를 실행하는 단계 - 상기 실행하는 단계는, 상기 영역에서 각각의 맵핑된 리브인 소스 레지스터에 대해, 상기 맵핑된 리브인 소스 레지스터에 대응하여 메모리로부터의 데이터를 갖는 하나의 타겟 레지스터를 로딩하는 단계를 포함함 - 와,
    상기 제 1 최적화 타겟 바이너리 코드 블럭의 본문을 실행하는 단계 - 상기 제 1 최적화 타겟 바이너리 코드 블럭은 제 2 타겟 바이너리 코드 블럭으로 점프하도록 구성된 제 1 분기 명령어를 포함함 - 와,
    상기 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부를 판정하는 단계와,
    상기 제 2 타겟 코드 블럭이 상기 영역에 있으면, 상기 제 2 타겟 코드 블럭의 본문으로 점프하는 제 1 에필로그를 실행하는 단계, 또는 상기 제 2 타겟 코드 블럭이 상기 영역에 없으면, 상기 영역에 대해 맵핑된 리브아웃 레지스터를 상기 메모리에 저장하고 상기 제 2 타겟 코드 블럭의 시작으로 점프하는 제 2 에필로그를 실행하는 단계를 더 포함하는
    방법.
  8. 제 1 항에 있어서,
    관련성은 상기 빈번히 실행되는 소스 바이너리 코드 블럭과 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭의 실행 가능성(likelihood of execution)의 상관관계(a correlation)에 대응하는
    방법.
  9. 제 1 항에 있어서,
    상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 분기 명령어에 의해 각각 경계를 이루는
    방법.
  10. 내부에 저장된 명령어를 갖는 유형의(tangible) 스토리지 매체를 포함하는 물품으로서,
    상기 명령어는 프로세서에 의해 실행될 때,
    실행을 위한 복수의 소스 바이너리 코드 블럭을 포함하는 소스 바이너리 애플리케이션을 로딩하는 동작 - 상기 프로세서는 Nt개의 타겟 레지스터를 포함하고, 상기 소스 바이너리 애플리케이션은 Ns개의 소스 레지스터를 갖는 환경에서 실행되도록 구성되며, Nt는 Ns보다 작음 - 과,
    상기 소스 바이너리 애플리케이션의 런타임동안, 상기 소스 바이너리 애플리케이션 내에서 빈번히 실행되는 소스 바이너리 코드 블럭을 식별하는 동작과,
    상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 관련성(affinity) 임계값을 초과하는 적어도 하나의 이웃하는 소스 바이너리 코드 블럭을 포함하는 영역을 정의하는 동작 - 관련성은 상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭의 실행 가능성의 상관관계에 대응하고, 상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 모두 적어도 하나의 소스 레지스터에 액세스하라는 명령어를 포함하고, 각각 분기 명령어에 의해 경계가 이루어짐 - 과,
    상기 영역에서 액세스되는 각각의 소스 레지스터에 대한 액세스의 빈도를 판정하는 동작과,
    상기 영역에서 가장 빈번히 액세스되는 N개의 소스 레지스터의 각각을 Nt개의 타겟 레지스터의 각각에 맵핑하는 동작 - N은 Nt 이하임- 을 포함하는 동작을 발생시키는
    물품.
  11. 제 10 항에 있어서,
    상기 명령어는, 상기 프로세서에 의해 실행될 때,
    상기 레지스터 맵핑에 적어도 부분적으로 기초하여 상기 영역의 각각의 소스 바이너리 코드 블럭에 대응하는 최적화된 타겟 바이너리 코드 블럭을 생성하는 동작을 더 발생시키며,
    각각의 최적화된 타겟 바이너리 코드 블럭은, 각각의 맵핑된 소스 레지스터와 연관된 데이터를 메모리로부터 대응하는 타겟 레지스터로 로딩하도록 구성된 프롤로그와, 상기 소스 바이너리 코드 블럭에 대응하는 변환된 소스 바이너리 코드를 포함하는 본문과, 조건부점프와, 적어도 하나의 에필로그를 포함하고, 상기 조건부점프 및 상기 적어도 하나의 에필로그는, 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부에 적어도 부분적으로 기초하여 상기 영역에서의 제 1 최적화 타겟 바이너리 코드 블럭으로부터 상기 제 2 타겟 바이너리 코드 블럭으로의 흐름을 제어하도록 구성되는
    물품.
  12. 제 11 항에 있어서,
    복수의 상기 에필로그는 제 1 에필로그 및 제 2 에필로그를 포함하고, 상기 제 1 에필로그는, 상기 제 2 타겟 바이너리 코드 블럭이 상기 영역의 제 2 최적화 타겟 바이너리 코드 블럭이면 실행되도록 구성되고, 상기 제 1 에필로그는 상기 제 2 최적화 타겟 바이너리 코드 블럭의 본문으로 점프하라는 제 1 명령어를 포함하고, 상기 제 2 에필로그는, 상기 제 2 타겟 바이너리 코드 블럭이 상기 영역에 없으면 실행되도록 구성되고, 상기 제 2 에필로그는 각각의 맵핑된 소스 레지스터에 대응하는 각각의 타겟 레지스터를 메모리에 저장하라는 제 2 명령어와, 상기 제 2 타겟 바이너리 코드 블럭의 시작으로 점프하라는 제 3 명령어를 포함하는
    물품.
  13. 제 10 항에 있어서,
    상기 명령어는, 상기 프로세서에 의해 실행될 때,
    상기 영역의 각각의 소스 바이너리 코드 블럭에 대해 리브인 레지스터 및 리브아웃 레지스터를 식별하는 것을 포함하는, 상기 영역에 대해 리브인 레지스터 및 리브아웃 레지스터를 식별하는 동작을 더 발생시키는
    물품.
  14. 제 13 항에 있어서,
    상기 명령어는, 상기 프로세서에 의해 실행될 때,
    상기 레지스터 맵핑에 적어도 부분적으로 기초하여 상기 영역의 각각의 소스 바이너리 코드 블럭에 대응하는 최적화된 타겟 바이너리 코드 블럭을 생성하는 동작을 더 발생시키며,
    각각의 최적화된 타겟 바이너리 코드 블럭은, 각각의 맵핑된 리브인 소스 레지스터와 연관된 데이터를 메모리로부터 대응하는 타겟 레지스터로 로딩하도록 구성된 프롤로그와, 상기 소스 바이너리 코드 블럭에 대응하는 변환된 소스 바이너리 코드를 포함하는 본문과, 조건부점프와, 적어도 하나의 에필로그를 포함하고, 상기 조건부점프 및 상기 적어도 하나의 에필로그는 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부에 적어도 부분적으로 기초하여 상기 영역에서의 제 1 최적화 타겟 바이너리 코드 블럭으로부터 상기 제 2 타겟 바이너리 코드 블럭으로의 흐름을 제어하도록 구성되는
    물품.
  15. 제 11 항에 있어서,
    상기 명령어는, 상기 프로세서에 의해 실행될 때,
    상기 영역의 제 1 최적화 타겟 바이너리 코드 블럭의 프롤로그를 실행하는 동작 - 상기 실행하는 동작은 상기 영역에 대해 상기 N개의 맵핑된 소스 레지스터의 각각에 대해 대응하는 데이터를 갖는 N개의 타겟 레지스터의 각각을 로딩하는 동작을 포함함 - 과,
    상기 제 1 최적화 타겟 바이너리 코드 블럭의 본문을 실행하는 동작 - 상기 제 1 최적화 타겟 바이너리 코드 블럭은 제 2 타겟 바이너리 코드 블럭으로 점프하도록 구성된 제 1 분기 명령어를 포함함 - 과,
    상기 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부를 판정하는 동작과,
    상기 제 2 타겟 코드 블럭이 상기 영역에 있으면, 상기 제 2 타겟 바이너리 코드 블럭에 대응하는 제 2 최적화 타겟 코드 블럭의 본문으로 점프하는 제 1 에필로그를 실행하는 동작, 또는 상기 제 2 타겟 코드 블럭이 상기 영역에 없으면, 상기 제 2 타겟 코드 블럭의 시작으로 점프하는 제 2 에필로그를 실행하는 동작을 더 발생시키는
    물품.
  16. 제 14 항에 있어서,
    상기 명령어는, 상기 프로세서에 의해 실행될 때,
    상기 영역의 제 1 최적화 타겟 바이너리 코드 블럭의 프롤로그를 실행하는 동작 - 상기 실행하는 동작은, 상기 영역에서 각각의 맵핑된 리브인 소스 레지스터에 대해, 상기 맵핑된 리브인 소스 레지스터에 대응하는 메모리로부터의 데이터를 갖는 하나의 타겟 레지스터를 로딩하는 동작을 포함함 - 과,
    상기 제 1 최적화 타겟 바이너리 코드 블럭의 본문을 실행하는 동작 - 상기 제 1 최적화 타겟 바이너리 코드 블럭은 제 2 타겟 바이너리 코드 블럭으로 점프하도록 구성된 제 1 분기 명령어를 포함함 - 과,
    상기 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부를 판정하는 동작과,
    상기 제 2 타겟 코드 블럭이 상기 영역에 있으면, 상기 제 2 타겟 코드 블럭의 본문으로 점프하는 제 1 에필로그를 실행하는 동작, 또는 상기 제 2 타겟 코드 블럭이 상기 영역에 없으면, 상기 영역에 대해 맵핑된 리브아웃 레지스터를 상기 메모리에 저장하고 상기 제 2 타겟 코드 블럭의 시작으로 점프하는 제 2 에필로그를 실행하는 동작을 더 발생시키는
    물품.
  17. Nt개의 타겟 레지스터를 포함하는 프로세서와,
    동적 바이너리 변환기, 레지스터 맵핑 모듈과, Ns개의 소스 레지스터를 갖는 환경에서 실행되도록 구성된 소스 바이너리 애플리케이션을 저장하도록 구성된 메모리 - Nt는 Ns보다 작고, 상기 소스 바이너리 애플리케이션은 상기 프로세서 상에서 실행될 복수의 소스 바이너리 코드 블럭을 포함함 -
    를 포함하고,
    상기 동적 바이너리 변환기 및 상기 레지스터 맵핑 모듈이 상기 프로세서 상에서 실행될 때, 상기 동적 바이너리 변환기 및 상기 레지스터 맵핑 모듈 중 적어도 하나는, 상기 프로세서로 하여금,
    상기 소스 바이너리 애플리케이션의 런타임동안, 상기 소스 바이너리 애플리케이션 내에서 빈번히 실행되는 소스 바이너리 코드 블럭을 식별하고,
    상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 관련성 임계값을 초과하는 적어도 하나의 이웃하는 소스 바이너리 코드 블럭을 포함하는 영역을 정의 - 상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 모두 적어도 하나의 소스 레지스터에 액세스하라는 명령어를 포함함 - 하고,
    상기 영역에서 액세스되는 각각의 소스 레지스터에 대한 액세스의 빈도를 판정하고,
    상기 영역에서 가장 빈번히 액세스되는 N개의 소스 레지스터의 각각을 상기 Nt개의 타겟 레지스터의 각각에 맵핑 - 여기서 N은 Nt 이하임- 하게 하는
    시스템.
  18. 제 17 항에 있어서,
    상기 레지스터 맵핑 모듈은 또한, 상기 프로세서로 하여금, 상기 레지스터 맵핑에 적어도 부분적으로 기초하여 상기 영역에서 각각의 소스 바이너리 코드 블럭에 대응하는 최적화된 타겟 바이너리 코드 블럭을 생성하게 하고,
    각각의 최적화된 타겟 바이너리 코드 블럭은, 메모리로부터 각각의 맵핑된 소스 레지스터와 연관된 데이터를 대응하는 타겟 레지스터로 로딩하도록 구성된 프롤로그와, 상기 소스 바이너리 코드 블럭에 대응하는 변환된 소스 바이너리 코드를 포함하는 본문과, 조건부점프와, 적어도 하나의 에필로그를 포함하고, 상기 조건부점프 및 상기 적어도 하나의 에필로그는, 제 2 타겟 바이너리 코드 블럭이 상기 영역에 있는지 여부에 적어도 부분적으로 기초하여 상기 영역에서의 제 1 최적화 타겟 바이너리 코드 블럭으로부터 상기 제 2 타겟 바이너리 코드 블럭으로의 흐름을 제어하도록 구성되는
    시스템.
  19. 제 18 항에 있어서,
    복수의 상기 에필로그는 제 1 에필로그 및 제 2 에필로그를 포함하고, 상기 제 1 에필로그는, 상기 제 2 타겟 바이너리 코드 블럭이 상기 영역의 제 2 최적화 타겟 바이너리 코드 블럭이면 실행되도록 구성되고, 상기 제 1 에필로그는 상기 제 2 최적화 타겟 바이너리 코드 블럭의 본문으로 점프하라는 제 1 명령어를 포함하고, 상기 제 2 에필로그는, 상기 제 2 타겟 바이너리 코드 블럭이 상기 영역에 없으면 실행되도록 구성되고, 상기 제 2 에필로그는 각각의 맵핑된 소스 레지스터에 대응하는 각각의 타겟 레지스터를 메모리에 저장하라는 제 2 명령어와, 상기 제 2 타겟 바이너리 코드 블럭의 시작으로 점프하라는 제 3 명령어를 포함하는
    시스템.
  20. 제 17 항에 있어서,
    상기 레지스터 맵핑 모듈은 또한, 상기 프로세서로 하여금, 상기 영역의 각 소스 바이너리 코드 블럭에 대해 리브인 레지스터 및 리브아웃 레지스터를 식별하는 것을 포함하는, 상기 영역에 대해 리브인 레지스터 및 리브아웃 레지스터를 식별하게 하는
    시스템.
  21. 제 10 항에 있어서,
    관련성은 상기 빈번히 실행되는 소스 바이너리 코드 블럭과 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭의 실행 가능성의 상관관계에 대응하는
    물품.
  22. 제 10 항에 있어서,
    상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 분기 명령어에 의해 각각 경계를 이루는
    물품.
  23. 제 17 항에 있어서,
    관련성은 상기 빈번히 실행되는 소스 바이너리 코드 블럭과 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭의 실행 가능성의 상관관계에 대응하는
    시스템.
  24. 제 17 항에 있어서,
    상기 빈번히 실행되는 소스 바이너리 코드 블럭 및 상기 적어도 하나의 이웃하는 소스 바이너리 코드 블럭은 분기 명령어에 의해 각각 경계를 이루는
    시스템.
KR1020127032581A 2010-06-14 2011-06-14 효율적인 동적 바이너리 변환을 위한 레지스터 맵핑 기술 KR20130018925A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US12/815,023 US8479176B2 (en) 2010-06-14 2010-06-14 Register mapping techniques for efficient dynamic binary translation
US12/815,023 2010-06-14
PCT/US2011/040406 WO2011159739A2 (en) 2010-06-14 2011-06-14 Register mapping techniques for efficient dynamic binary translation

Publications (1)

Publication Number Publication Date
KR20130018925A true KR20130018925A (ko) 2013-02-25

Family

ID=44785163

Family Applications (2)

Application Number Title Priority Date Filing Date
KR1020110057530A KR101381274B1 (ko) 2010-06-14 2011-06-14 효율적인 동적 이진 변환을 위한 레지스터 매핑 방법, 시스템 및 컴퓨터 판독가능 저장 매체
KR1020127032581A KR20130018925A (ko) 2010-06-14 2011-06-14 효율적인 동적 바이너리 변환을 위한 레지스터 맵핑 기술

Family Applications Before (1)

Application Number Title Priority Date Filing Date
KR1020110057530A KR101381274B1 (ko) 2010-06-14 2011-06-14 효율적인 동적 이진 변환을 위한 레지스터 매핑 방법, 시스템 및 컴퓨터 판독가능 저장 매체

Country Status (9)

Country Link
US (1) US8479176B2 (ko)
EP (1) EP2400388A1 (ko)
JP (1) JP2012003761A (ko)
KR (2) KR101381274B1 (ko)
CN (2) CN102934082B (ko)
HK (1) HK1165039A1 (ko)
RU (1) RU2515217C2 (ko)
SG (1) SG176872A1 (ko)
WO (1) WO2011159739A2 (ko)

Families Citing this family (45)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10621092B2 (en) 2008-11-24 2020-04-14 Intel Corporation Merging level cache and data cache units having indicator bits related to speculative execution
US9672019B2 (en) 2008-11-24 2017-06-06 Intel Corporation Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
US8479176B2 (en) * 2010-06-14 2013-07-02 Intel Corporation Register mapping techniques for efficient dynamic binary translation
US9195486B2 (en) * 2010-07-30 2015-11-24 Apple Inc. Observation and analysis based code optimization
WO2012095901A1 (ja) * 2011-01-12 2012-07-19 パナソニック株式会社 プログラム実行装置およびコンパイラシステム
US9141389B2 (en) * 2011-04-07 2015-09-22 Via Technologies, Inc. Heterogeneous ISA microprocessor with shared hardware ISA registers
US9274795B2 (en) 2011-04-07 2016-03-01 Via Technologies, Inc. Conditional non-branch instruction prediction
US9292470B2 (en) 2011-04-07 2016-03-22 Via Technologies, Inc. Microprocessor that enables ARM ISA program to access 64-bit general purpose registers written by x86 ISA program
US9176733B2 (en) 2011-04-07 2015-11-03 Via Technologies, Inc. Load multiple and store multiple instructions in a microprocessor that emulates banked registers
US9645822B2 (en) 2011-04-07 2017-05-09 Via Technologies, Inc Conditional store instructions in an out-of-order execution microprocessor
US9317288B2 (en) 2011-04-07 2016-04-19 Via Technologies, Inc. Multi-core microprocessor that performs x86 ISA and ARM ISA machine language program instructions by hardware translation into microinstructions executed by common execution pipeline
US8880851B2 (en) 2011-04-07 2014-11-04 Via Technologies, Inc. Microprocessor that performs X86 ISA and arm ISA machine language program instructions by hardware translation into microinstructions executed by common execution pipeline
US9898291B2 (en) 2011-04-07 2018-02-20 Via Technologies, Inc. Microprocessor with arm and X86 instruction length decoders
US9244686B2 (en) 2011-04-07 2016-01-26 Via Technologies, Inc. Microprocessor that translates conditional load/store instructions into variable number of microinstructions
US9336180B2 (en) 2011-04-07 2016-05-10 Via Technologies, Inc. Microprocessor that makes 64-bit general purpose registers available in MSR address space while operating in non-64-bit mode
US9146742B2 (en) * 2011-04-07 2015-09-29 Via Technologies, Inc. Heterogeneous ISA microprocessor that preserves non-ISA-specific configuration state when reset to different ISA
US9032189B2 (en) 2011-04-07 2015-05-12 Via Technologies, Inc. Efficient conditional ALU instruction in read-port limited register file microprocessor
US9043580B2 (en) 2011-04-07 2015-05-26 Via Technologies, Inc. Accessing model specific registers (MSR) with different sets of distinct microinstructions for instructions of different instruction set architecture (ISA)
US9378019B2 (en) 2011-04-07 2016-06-28 Via Technologies, Inc. Conditional load instructions in an out-of-order execution microprocessor
US9128701B2 (en) 2011-04-07 2015-09-08 Via Technologies, Inc. Generating constant for microinstructions from modified immediate field during instruction translation
US9417855B2 (en) * 2011-09-30 2016-08-16 Intel Corporation Instruction and logic to perform dynamic binary translation
US10146545B2 (en) 2012-03-13 2018-12-04 Nvidia Corporation Translation address cache for a microprocessor
US9880846B2 (en) 2012-04-11 2018-01-30 Nvidia Corporation Improving hit rate of code translation redirection table with replacement strategy based on usage history table of evicted entries
US10241810B2 (en) 2012-05-18 2019-03-26 Nvidia Corporation Instruction-optimizing processor with branch-count table in hardware
US9032381B2 (en) 2012-06-29 2015-05-12 Intel Corporation State recovery methods and apparatus for computing platforms
JP5727107B2 (ja) * 2012-09-21 2015-06-03 インテル コーポレイション バイナリトランスレーションを実行する方法及びシステム
US10157063B2 (en) * 2012-09-28 2018-12-18 Intel Corporation Instruction and logic for optimization level aware branch prediction
US20140189310A1 (en) 2012-12-27 2014-07-03 Nvidia Corporation Fault detection in instruction translations
KR20140097927A (ko) * 2013-01-30 2014-08-07 삼성전자주식회사 소프트웨어의 보안을 높이는 방법
US10108424B2 (en) * 2013-03-14 2018-10-23 Nvidia Corporation Profiling code portions to generate translations
US9891936B2 (en) 2013-09-27 2018-02-13 Intel Corporation Method and apparatus for page-level monitoring
US20150277914A1 (en) * 2014-03-27 2015-10-01 John H. Kelm Lock elision with binary translation based processors
US10162617B2 (en) * 2015-04-10 2018-12-25 Google Llc Binary translation into native client
US10007497B2 (en) * 2015-04-10 2018-06-26 Google Llc Binary translation on shared object level
US10176001B2 (en) 2015-05-28 2019-01-08 Mitsubishi Electric Corporation Simulation device, simulation method, and computer readable medium
US9811324B2 (en) * 2015-05-29 2017-11-07 Google Inc. Code caching system
WO2017028909A1 (en) * 2015-08-18 2017-02-23 Huawei Technologies Co., Ltd. Shared physical registers and mapping table for architectural registers of multiple threads
US10235177B2 (en) * 2016-07-02 2019-03-19 Intel Corporation Register reclamation
US10282182B2 (en) * 2016-09-23 2019-05-07 Intel Corporation Technologies for translation cache management in binary translation systems
US10191745B2 (en) * 2017-03-31 2019-01-29 Intel Corporation Optimized call-return and binary translation
KR102006242B1 (ko) * 2017-09-29 2019-08-06 주식회사 인사이너리 바이너리 파일에 기초하여 오픈소스 소프트웨어 패키지를 식별하는 방법 및 시스템
US10613877B2 (en) * 2018-03-23 2020-04-07 International Business Machines Corporation Container hyperlinking
US10691435B1 (en) * 2018-11-26 2020-06-23 Parallels International Gmbh Processor register assignment for binary translation
CN111459572B (zh) * 2020-03-31 2023-01-31 深圳市汇顶科技股份有限公司 程序加载方法、控制器、芯片以及电子设备
US11900136B2 (en) 2021-07-28 2024-02-13 Sony Interactive Entertainment LLC AoT compiler for a legacy game

Family Cites Families (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01217632A (ja) 1988-02-26 1989-08-31 Nec Corp データへのレジスタ割付け方式
US6091897A (en) * 1996-01-29 2000-07-18 Digital Equipment Corporation Fast translation and execution of a computer program on a non-native architecture by use of background translator
US5842017A (en) * 1996-01-29 1998-11-24 Digital Equipment Corporation Method and apparatus for forming a translation unit
US6535903B2 (en) * 1996-01-29 2003-03-18 Compaq Information Technologies Group, L.P. Method and apparatus for maintaining translated routine stack in a binary translation environment
US7275246B1 (en) * 1999-01-28 2007-09-25 Ati International Srl Executing programs for a first computer architecture on a computer of a second architecture
US6763452B1 (en) * 1999-01-28 2004-07-13 Ati International Srl Modifying program execution based on profiling
US8127121B2 (en) * 1999-01-28 2012-02-28 Ati Technologies Ulc Apparatus for executing programs for a first computer architechture on a computer of a second architechture
US8065504B2 (en) * 1999-01-28 2011-11-22 Ati International Srl Using on-chip and off-chip look-up tables indexed by instruction address to control instruction execution in a processor
US6820255B2 (en) * 1999-02-17 2004-11-16 Elbrus International Method for fast execution of translated binary code utilizing database cache for low-level code correspondence
US6625807B1 (en) * 1999-08-10 2003-09-23 Hewlett-Packard Development Company, L.P. Apparatus and method for efficiently obtaining and utilizing register usage information during software binary translation
US6862730B1 (en) 2000-04-26 2005-03-01 Lucent Technologies Inc. Register allocation in code translation between processors
US7219336B2 (en) * 2002-01-03 2007-05-15 Intel Corporation Tracking format of registers having multiple content formats in binary translation
US20030154419A1 (en) * 2002-01-10 2003-08-14 Binyu Zang Register renaming in binary translation using rollback and recovery
US7076769B2 (en) * 2003-03-28 2006-07-11 Intel Corporation Apparatus and method for reproduction of a source ISA application state corresponding to a target ISA application state at an execution stop point
GB0309056D0 (en) * 2003-04-22 2003-05-28 Transitive Technologies Ltd Block translation optimizations for program code conversion
US7260705B2 (en) * 2003-06-26 2007-08-21 Intel Corporation Apparatus to implement mesocode
US7260815B1 (en) * 2003-06-30 2007-08-21 Vmware, Inc. Method and apparatus for managing registers in a binary translator
US7805710B2 (en) * 2003-07-15 2010-09-28 International Business Machines Corporation Shared code caching for program code conversion
GB0316532D0 (en) * 2003-07-15 2003-08-20 Transitive Ltd Method and apparatus for partitioning code in program code conversion
US8549166B2 (en) * 2004-03-01 2013-10-01 Qualcomm Incorporated Execution of unverified programs in a wireless, device operating environment
CN100498711C (zh) * 2004-07-20 2009-06-10 明星游戏株式会社 自动翻译程序和程序翻译服务器
US8255882B2 (en) * 2004-12-30 2012-08-28 Intel Corporation Selecting formats for multi-format instructions in binary translation of code from a hybrid source instruction set architecture to a unitary target instruction set architecture
US20070006178A1 (en) * 2005-05-12 2007-01-04 Microsoft Corporation Function-level just-in-time translation engine with multiple pass optimization
US7757221B2 (en) 2005-09-30 2010-07-13 Intel Corporation Apparatus and method for dynamic binary translator to support precise exceptions with minimal optimization constraints
US8479174B2 (en) * 2006-04-05 2013-07-02 Prevx Limited Method, computer program and computer for analyzing an executable computer file
US7596781B2 (en) * 2006-10-16 2009-09-29 International Business Machines Corporation Register-based instruction optimization for facilitating efficient emulation of an instruction stream
US7712092B2 (en) 2007-10-01 2010-05-04 The Board Of Trustees Of The Leland Stanford Junior University Binary translation using peephole translation rules
US8296749B2 (en) * 2007-12-28 2012-10-23 Intel Corporation Program translation and transactional memory formation
US20100115494A1 (en) * 2008-11-03 2010-05-06 Gorton Jr Richard C System for dynamic program profiling
US8479176B2 (en) * 2010-06-14 2013-07-02 Intel Corporation Register mapping techniques for efficient dynamic binary translation

Also Published As

Publication number Publication date
KR101381274B1 (ko) 2014-04-04
KR20110136749A (ko) 2011-12-21
US20110307876A1 (en) 2011-12-15
WO2011159739A2 (en) 2011-12-22
HK1165039A1 (en) 2012-09-28
RU2011153335A (ru) 2013-07-10
WO2011159739A3 (en) 2012-04-05
CN102298514A (zh) 2011-12-28
CN102934082A (zh) 2013-02-13
RU2515217C2 (ru) 2014-05-10
CN102298514B (zh) 2014-07-16
EP2400388A1 (en) 2011-12-28
JP2012003761A (ja) 2012-01-05
SG176872A1 (en) 2012-01-30
US8479176B2 (en) 2013-07-02
CN102934082B (zh) 2017-06-09

Similar Documents

Publication Publication Date Title
KR20130018925A (ko) 효율적인 동적 바이너리 변환을 위한 레지스터 맵핑 기술
JP5419325B2 (ja) プログラム・コードを変換するための共用コード・キャッシングの方法および装置
KR101731742B1 (ko) 결합된 분기 타깃 및 프레디킷 예측
US20040255279A1 (en) Block translation optimizations for program code conversation
JP2007531075A5 (ko)
US10268497B2 (en) Conjugate code generation for efficient dynamic optimizations
WO2012154606A1 (en) Efficient conditional flow control compilation
WO2011116113A1 (en) Loop transformation for compiler optimization
JP5536593B2 (ja) 最適化装置、最適化方法およびコンパイラ・プログラム
Choi et al. Shortcut: Architectural support for fast object access in scripting languages
US11029929B2 (en) Using emulation to improve startup time for just-in-time compilation
US20160011889A1 (en) Simulation method and storage medium
JP4093484B2 (ja) コンパイラ、コンパイル方法、コンパイルプログラム、及び記録媒体
Spink et al. Efficient code generation in a region-based dynamic binary translator
KR101083271B1 (ko) 액티브엑스 컨트롤 변환 시스템 및 방법
TWI743698B (zh) 解譯執行位元組碼指令流的方法及裝置
US20170115973A1 (en) Operating method of semiconductor device and semiconductor system
US9875101B1 (en) Induction variable identification
Chow Intermediate representation: The increasing significance of intermediate representations in compilers
Bagnères et al. Switchable scheduling for runtime adaptation of optimization
US10671780B2 (en) Information processing device that executes simulation and a simulation method
KR100763199B1 (ko) 가상 머신 환경에서의 메소드 호출 방법 및 상기 방법을수행하는 가상 머신이 탑재된 시스템
Antoy et al. A target implementation for high-performance functional programs
US20050223370A1 (en) Stack caching using code sharing
WO2005096136A1 (en) Stack caching using code sharing

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E601 Decision to refuse application