<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Passing on the Left &#187; liboil</title>
	<atom:link href="http://www.schleef.org/blog/category/liboil/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.schleef.org/blog</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 23 Jan 2012 16:23:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Orc-0.4.0</title>
		<link>http://www.schleef.org/blog/2009/05/31/orc-040/</link>
		<comments>http://www.schleef.org/blog/2009/05/31/orc-040/#comments</comments>
		<pubDate>Sun, 31 May 2009 23:33:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[liboil]]></category>
		<category><![CDATA[orc]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.schleef.org/blog/2009/05/31/orc-040/</guid>
		<description><![CDATA[Lately, I&#8217;ve been working on a side project called Orc as a replacement for liboil.  Liboil&#8217;s first major problem has always been that it doesn&#8217;t scale well &#8212; every software package that wanted to use liboil typically required several new liboil functions, and then someone would need to actually write assembly code for those functions [...]]]></description>
			<content:encoded><![CDATA[<p>Lately, I&#8217;ve been working on a side project called <a href="http://cgit.freedesktop.org/~ds/orc">Orc</a> as a replacement for <a href="http://liboil.freedesktop.org/wiki/">liboil</a>.  Liboil&#8217;s first major problem has always been that it doesn&#8217;t scale well &#8212; every software package that wanted to use liboil typically required several new liboil functions, and then someone would need to actually write assembly code for those functions on several architectures.  My original plan was to develop a critical mass of functions, and then additions would be &#8220;simple&#8221;.  This never happened.  The second major problem is that liboil&#8217;s compilation is terribly fragile.  Thousands of lines of inline assembly code that depends on specific compilers, compiler versions, libtool internals, and random snippets of code such as &#8220;if $user != msmith&#8221; do not lead to a maintainable project.</p>
<p>Orc is now to the point where it can not only reproduce about 90% of the code that is currently in liboil, but also generate 90% of the code that <em>should</em> be in liboil, but nobody ever wrote.  At runtime.  And the Orc language allows you to describe your own liboil-style functions.  At runtime.  Or, you can also use it like a normal compiler, converting Orc language source into N different assembly source files for every possible vector instruction set combination.</p>
<p>A large part of the decoding path in Schroedinger has been converted to optionally use Orc, where speed is either slightly faster or 20-30% faster than the previous liboil code.  The real benefit is that takes only a few minutes to convert code that took weeks to develop originally.  A side project of mine, <a href="http://cgit.freedesktop.org/~ds/cog">Cog</a>, has turned into a showcase for Orc, with demonstrations of video processing <a href="http://gstreamer.net/">GStreamer</a> elements, such as format and colorspace conversion and scaling.  I&#8217;ve found that since it is so easy and fast to create vectorized code, it now becomes possible to offer additional features to users, such as quality vs. speed tradeoffs.</p>
<p>Orc can generate code for MMX and SSE on x86 and x86_64, and Altivec on PowerPC, as well as NEON for ARM and c64x+DSP code.  The NEON and c64x+ backends are not currently open source.</p>
<p><a href="http://www.schleef.org/orc/download/">Download 0.4.0</a>.  <a href="http://www.schleef.org/orc/documentation/">Online documentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.schleef.org/blog/2009/05/31/orc-040/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Introducing Orc</title>
		<link>http://www.schleef.org/blog/2008/05/23/introducing-orc/</link>
		<comments>http://www.schleef.org/blog/2008/05/23/introducing-orc/#comments</comments>
		<pubDate>Fri, 23 May 2008 17:42:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[liboil]]></category>

		<guid isPermaLink="false">http://www.schleef.org/blog/2008/05/23/introducing-orc/</guid>
		<description><![CDATA[Orc is a new sub-project of Liboil that I&#8217;ve been working on for a few weeks.  Orc stands for Oil Runtime Compiler, which further expands to Optimized Inner Loop Runtime Compiler.  As its name implies, the Orc library compiles code into a runnable function, and does it using SIMD instructions when available.  The &#8220;code&#8221; is [...]]]></description>
			<content:encoded><![CDATA[<p>Orc is a new sub-project of Liboil that I&#8217;ve been working on for a few weeks.  Orc stands for Oil Runtime Compiler, which further expands to Optimized Inner Loop Runtime Compiler.  As its name implies, the Orc library compiles code into a runnable function, and does it using SIMD instructions when available.  The &#8220;code&#8221; is currently an intermediate form that is roughly a platform-agnostic assembly language that understands variables and simple arrays.  It&#8217;s an intermediate form in the sense that it&#8217;s currently only stored as a list of structs &#8212; there isn&#8217;t a parser yet.  Orc can generate MMX and Altivec code for a few simple functions that is as fast as the corresponding liboil function.  There are also software fallbacks for those not-so-mainstream architectures.</p>
<p>There have been many motivations for creating Orc, which I will go into at another time.</p>
<p>One of the primary goals of Orc is to create a simple compiler (actually, it&#8217;s a really fancy assembler that understands register allocation) that is user-expandable: an Orc user can create additional opcodes, variable types, and rules for translating those opcodes into machine code.  One of the potential applications for Orc is pixman, which would require adding types (ARGB pixels) and opcodes (compositing operations).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.schleef.org/blog/2008/05/23/introducing-orc/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

