changeset 17:8ea8be1671d0

modify
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sun, 20 Nov 2011 07:14:49 +0900
parents a58b6ca9e5af
children 085054e84bc5
files Paper/figure/cs_stack.eps Paper/figure/cs_stack.graffle Paper/figure/fastcall.graffle Paper/nobu-prosym.tex
diffstat 4 files changed, 66 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/Paper/figure/cs_stack.eps	Sat Nov 19 20:48:37 2011 +0900
+++ b/Paper/figure/cs_stack.eps	Sun Nov 20 07:14:49 2011 +0900
@@ -658,16 +658,16 @@
 
dup 37 /B put
 
dup 38 /C put
 
dup 39 /four put
-
dup 40 /f put
-
dup 41 /u put
-
dup 42 /n put
-
dup 43 /c put
-
dup 44 /a put
-
dup 45 /s put
-
dup 46 /e put
-
dup 47 /P put
-
dup 48 /o put
-
dup 49 /i put
+
dup 40 /c put
+
dup 41 /s put
+
dup 42 /underscore put
+
dup 43 /a put
+
dup 44 /b put
+
dup 45 /e put
+
dup 46 /P put
+
dup 47 /o put
+
dup 48 /i put
+
dup 49 /n put
 
dup 50 /t put
 
dup 51 /r put
 
dup 52 /g put
@@ -679,16 +679,16 @@
 
/FontMatrix matrix def
 
/FontBBox[2048 -1947 1 index div -985 2 index div 2961 3 index div 2297 5 -1 roll div]cvx def
 
/sfnts [<
-
74727565000900000000000063767420000000000000009C0000036C6670676D000000000000040800000A1D676C79660000000000000E280000136468656164000000000000218C000000366868656100000000000021C400000024686D747800000000000021E8000000546C6F6361000000000000223C0000002C6D617870000000000000226800000020707265700000000000002288000003CF05C0001005BD00280580001A042F001F0000FFD90000FFDA0000FFD9FE55FFE605C70010FE6DFFF1033B000000B9000000B902FE3F3C00C0008D009B00AF000600A800C00028005E009800C9016A00B9015C00B400D6011E002E0080000400B8004C00CC01FFFFD1006600A400AF007400C2009500B1000C0028006D0015004C008E0125FF7A000C0040004C00620084FFA200240038008600BD0039005E008E00EDFFA9FFB300400052005500AA00AB00C200CB012302B10413FFAEFFE4000800510074008400AA00D1FF4CFFAF0012002C004200500051008400BE012503DAFF680018003B0098009C009F00A100C100EC018201B4FF68FF76FFD0FFE100020018001C00530053007D01B401E103AF0486FF9CFFEAFFFE001F0028002A00520060009300A300AA00AF00AF00C001000145016B0174019301950240028202B404850517FEFD00060029004700470048006F008800B400B900C400F200F901EF02180310037403C5FF35FFF3000B004B004C0052005500650076007600870087008E00AB00BB0106013001430150017D0194019501D3022A025502580277027802E6034E035C037903D3047304B2058C0598060BFEF5FFBBFFC7FFD50017001D005B0072007E009C00C200D000F400FA01030106011C0125013B0142015E015E0180019B02B901A101B9025001C001D002AA01DF01E301EF01FB0205020C0215022B0274029302AB02C202CE03690395039903DF03F5043E050205A105E5062507DBFE62FE89FECEFF3BFFE1FFF800030008002100390042004E005F0061006F00700034007F008E00AD00AD00AF00BD00C400C500C900C900C900E3011C00ED00F800F901000112011A0132014D014D014E014F01660169019E01BA01BA01BE01E301EF01F602000200020902110217021C02530262026D028002D50280031B032A034A035A03AF03AF03C803D603FB03FB04050413041504470449008C046D049A049A04A604A804B204CF0539053E054E055605800589058C036305D105D6067E068E06B206EF06F00728074C076F078C00B400C900C000C10000000000000000000000000004012400AF0032006E0063014401620096014301A10161008A00740064018801EF01700028FF5D037E0347023000AA00BE007B0062009A007D0089035C00A1FFD803AA00D70093006C0000008000A70442001D0597001D00820030002A
+
74727565000900000000000063767420000000000000009C0000036C6670676D000000000000040800000A1D676C79660000000000000E280000131468656164000000000000213C0000003668686561000000000000217400000024686D74780000000000002198000000546C6F636100000000000021EC0000002C6D617870000000000000221800000020707265700000000000002238000003CF05C0001005BD00280580001A042F001F0000FFD90000FFDA0000FFD9FE55FFE605C70010FE6DFFF1033B000000B9000000B902FE3F3C00C0008D009B00AF000600A800C00028005E009800C9016A00B9015C00B400D6011E002E0080000400B8004C00CC01FFFFD1006600A400AF007400C2009500B1000C0028006D0015004C008E0125FF7A000C0040004C00620084FFA200240038008600BD0039005E008E00EDFFA9FFB300400052005500AA00AB00C200CB012302B10413FFAEFFE4000800510074008400AA00D1FF4CFFAF0012002C004200500051008400BE012503DAFF680018003B0098009C009F00A100C100EC018201B4FF68FF76FFD0FFE100020018001C00530053007D01B401E103AF0486FF9CFFEAFFFE001F0028002A00520060009300A300AA00AF00AF00C001000145016B0174019301950240028202B404850517FEFD00060029004700470048006F008800B400B900C400F200F901EF02180310037403C5FF35FFF3000B004B004C0052005500650076007600870087008E00AB00BB0106013001430150017D0194019501D3022A025502580277027802E6034E035C037903D3047304B2058C0598060BFEF5FFBBFFC7FFD50017001D005B0072007E009C00C200D000F400FA01030106011C0125013B0142015E015E0180019B02B901A101B9025001C001D002AA01DF01E301EF01FB0205020C0215022B0274029302AB02C202CE03690395039903DF03F5043E050205A105E5062507DBFE62FE89FECEFF3BFFE1FFF800030008002100390042004E005F0061006F00700034007F008E00AD00AD00AF00BD00C400C500C900C900C900E3011C00ED00F800F901000112011A0132014D014D014E014F01660169019E01BA01BA01BE01E301EF01F602000200020902110217021C02530262026D028002D50280031B032A034A035A03AF03AF03C803D603FB03FB04050413041504470449008C046D049A049A04A604A804B204CF0539053E054E055605800589058C036305D105D6067E068E06B206EF06F00728074C076F078C00B400C900C000C10000000000000000000000000004012400AF0032006E0063014401620096014301A10161008A00740064018801EF01700028FF5D037E0347023000AA00BE007B0062009A007D0089035C00A1FFD803AA00D70093006C0000008000A70442001D0597001D00820030002A
 
002A002A002A002A40292A292827262524232221201F1E1D1C1B1A191817161514131211100D0C0B0A090807060504030201002C4523466020B02660B004262348482D2C452346236120B02661B004262348482D2C45234660B0206120B04660B004262348482D2C4523462361B0206020B02661B02061B004262348482D2C45234660B0406120B06660B004262348482D2C4523462361B0406020B02661B04061B004262348482D2C0110203C003C2D2C20452320B0CD442320B8015A51582320B08D44235920B0ED51582320B04D44235920B09051582320B00D44235921212D2C20204518684420B001602045B04676688A4560442D2C01B9400000000A2D2C00B9000040000B2D2C2045B00043617D6818B0004360442D2C45B01A234445B01923442D2C2045B00325456164B050515845441B2121592D2C20B0032552582359212D2C69B04061B0008B0C6423648BB8400062600C642364615C58B0036159B002602D2C45B0112BB0172344B0177AE5182D2C45B0112BB01723442D2C45B0112BB017458CB0172344B0177AE5182D2CB002254661658A46B040608B482D2CB0022546608A46B040618C482D2C4B53205C58B002855958B00185592D2C20B0032545B019236A4445B01A23444565234520B00325606A20B009234223688A6A606120B0005258B21A401A4523614459B0005058B219401945236144592D2CB9187E3B210B2D2CB92D412D410B2D2CB93B21187E0B2D2CB93B21E7830B2D2CB92D41D2C00B2D2CB9187EC4E00B2D2C4B525845441B2121592D2C0120B003252349B04060B0206320B000525823B002253823B002256538008A63381B212121212159012D2C456920B00943B0022660B00325B005254961B0805358B21940194523616844B21A401A4523606A44B209191A45652345604259B00943608A103A2D2C01B005251023208AF500B0016023EDEC2D2C01B005251023208AF500B0016123EDEC2D2C01B0062510F500EDEC2D2C20B001600110203C003C2D2C20B001610110203C003C2D2C764520B003254523616818236860442D2C7645B00325452361682318456860442D2C7645B0032545616823452361442D2C4569B014B0324B505821B0205961442DB8002B2C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB8002C2C2020456944B001602DB8002D2CB8002C2A212DB8002E2C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB8002F2C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB800302C4B20B0032650585158B080441BB04044591B21212045B0C05058B0C0441B2159592DB800312C2020456944B0016020
 
20457D691844B001602DB800322CB800312A2DB800332C4B20B003265358B0801BB040598A8A20B0032653582321B0C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB800342C4B535845441B2121592DB800352C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB800362C2020456944B001602DB800372CB800362A212DB800382C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB800392C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB8003A2C4B20B0032650585158B080441BB04044591B21212045B0C05058B0C0441B2159592DB8003B2C2020456944B001602020457D691844B001602DB8003C2CB8003B2A2DB8003D2C4B20B003265358B0801BB040598A8A20B0032653582321B0C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB8003E2C4B535845441B2121592DB8003F2C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB800402C2020456944B001602DB800412CB800402A212DB800422C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB800432C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB800442C4B20B0032650585158B080441BB04044591B21212045B0C05058B0C0441B2159592DB800452C2020456944B001602020457D691844B001602DB800462CB800452A2DB800472C4B20B003265358B0801BB040598A8A20B0032653582321B0C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB800482C4B535845441B2121592DB800492C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB8004A2C2020456944B001602DB8004B2CB8004A2A212DB8004C2C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB8004D2C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB8004E2C4B20B0032650585158
 
B080441BB04044591B21212045B0C05058B0C0441B2159592DB8004F2C2020456944B001602020457D691844B001602DB800502CB8004F2A2DB800512C4B20B003265358B0801BB040598A8A20B0032653582321B0C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB800522C4B535845441B2121592DB800532C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB800542C2020456944B001602DB800552CB800542A212DB800562C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB800572C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB800582C4B20B0032650585158B080441BB04044591B21212045B0C05058B0C0441B2159592DB800592C2020456944B001602020457D691844B001602DB8005A2CB800592A2DB8005B2C4B20B003265358B0401BB000598A8A20B0032653582321B0808A8A1B8A235920B0032653582321B800C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB8005C2C4B535845441B2121592D00000000020042000004D005BD00030007003FB800532BB800082FB800092FB8000810B80000D0B800002FB8000910B80003DCB80004DCB8000010B80007DC00BA0007000000562BBA0002000500562B3031331121112711211142048EB8FCE205BDFA43B8044DFBB30000000100C4000002D5059200080023B10801B80133400C0404070C04079605000A47091076C418C4D5FD39003F3FF4CD313013353E013733112311C4C39A268EC003F68A1359A6FA6E03F60000000100400000041E059D002200A6404E3604460457056B1D6E1E7A1E84018702082A085A196B197C197C1CB519050022010F041C0E1921071C19040100051F0F0F22130A351305201F7521220C217F0738166F220E270F811F38222447231076C418D4EDF4ED10F5EDE4003F3CFD3C3FED1112392F1217390111123912393911391239005D31304379401C04190C2511260B120E2800091407280119040D100A280108150A2801002B2B1010012B2B2B2B81005D36123F01363736353426232207060723363736213212151407060F01060706072115214A85C1C0813452967DB9472604B70342750128F6E37946B5896238641A030EFC29B90112706F4B35536B7D938C4B85BB76D0FEF6A3AC7A47654C3631576AAA000000010031FFD9041A059A0031
 
00C4401F490C532D6529632D7529752D069626014B082B0A182B140D03F93114350D20B8012340141135107F0D0D311B3524050735310D1896274411B8014A400F0A382E6F021F2920810327023347321076C418D4EDF4ED10F5EDEDF4ED003FED3FED12392FF4FDE610ED10ED111239011112393130437940362F301926000905261D2522260600032800040308300A28011C231F28001A251828010401072800092F0728001E211B280119261B2801002B2B2B2B012B2B2B103C2B2B2B2B818181005D015D0402353316171633323635342623220607351E013332373635342623220706072334373621321615140706071E01151400230116E5BC0C2846B78EACB5A11225131C26166541729865B4452605B2406E0115DBF0472C46717FFEF2F8270117C88B3F719878947601019F03022038906B7478427AA070C8C3B98452331D1FB180CDFEFE000000000200340000042F059C0002000D005C402209020A080D010202BE12060607020601050708030106070A02750B05EF030C070403B80117B501960D08AC0AB80158B3050F470E1076C418D4F5F43CFDE4003F3FF43CFD3C1139390111123911123939872E2B047D10C50F3130011109011121350133113315231102A5FE3501CEFD8C029098D3D301FB0289FD77FE05015EB0038EFC5F9DFEA20000000003001E0000053D05BD0002000A000B00DA40504801580168010388039704980AA90AB809B80A06280A010007060601020809090102080A000705018C01030420140A0A251209090114050525120606010B0B0503090A040605010B02010300021E0708B80159400904030206090A030508B801A840120D0D17171A059E019E0A190C0DA1218C5E182B2B194EF4184DFDFD194E456544E6464418003F173C3F3C4DFD3CFD3C11393F011112393912393911392F872E2B7D104B5158B004C01BB004C459872E182B7D104B5158B003C01BB003C4592B1112393912393987103C3C07103C3C3130015D5D005D010B01133301230321032301038EDFED85E10215DA95FDBB9FCC0290025A0289FD770363FA4301B8FE4805BD000300970000050405BD000A00150028008240385A0D5A116A026A0D6A117A02772107490D4811021D081F0F041F131E000027081E17020B1E270804311B690F31231A2A091525281619292AB8015FB3217666182B2B4EF43C4DFD3C4E10F64DEDF4ED003FFD3FED12392FFD3901111239313043794012181A0508192506260718042B01051A082B01002B012B2B2B8181015D5D013237363534272623211101323736353427262321110321201716151407060716171615140706290102C47E466E754282FE9D01ADB74E318F4C7DFE75C3027701026D404F294D7138635985FEDEFD93035023378F90321CFE39FD5A6A435FA03A1FFDFB05139A5B778B592F
-
272B3660A98E73AC0002005AFFDA057105E5001D001E00B1403B1B0597019605031F011F0482018705891305530803861D111115063A1D030C3A15091E021E1E190331023B1031111A20093119191F20A1216A66182B2B4EF44DED4E10F64DEDF4ED12392F003F3FED3FED12392F10ED31304379403A001C172513260E251B260B160932000D1410320112110F10071C0932000500033201010204030A180C32000F120C3200081A06320104010632012B2B2B2B01103C103C2B2B103C103C2B2B2B2B2B2B815D015D080117232E0123220011101233323736373306070621202726111037362123041E013411C221C5B2D9FEF5F1EFDC733D1EC21A92AFFED7FF00AEE5ACBA01472805E5FEDABB8EA6FECFFEC5FEFEFEBFA95991E89DBD9BCD01AC0145D0E20000000200AF000004F805BD000A001400614035690C6912790C7A12044814581468147A140407081E1110100A010E0F1E0100020A080206120C0409141431041A160F092500191516B8010BB3219589182B2B4EF44DFD3C4E10F64DFD11121739003F3F3CFD3C1012392F3CFD3C015D31305D132132161514062321112300272623211121323635AF0295C4F0D6DEFE32C70380784273FE74018C86A705BDDDC8ACFFFD9304B93A1FFE0372900000030052FFDC04470449000F003B003C00DD40382A30010A100B1B0C1C2733481069096A10073908120C09031B320724091D100C1D3B2B022E293BB73B023B322A2512100705081C2722171CB8018A4023171D1F07271D2E0B021D350B3C073C3C1C1407292AA8241A3E1B291C4A0F2738193D3EBC0197002100B9019600182B2B4EF44DEDF4ED4E10F64DE4FDC412392F003F3FED3FED3FEDED1239111217395D1112392EED2EED01111239111739313043794028363715220001192501360F2100181E1B21001620142101212200370221001A1D1721011521172101002B2B2B01103C2B2B2B2B818181005D015D2416333237363D010E010F0106070615013637363534262322070607233E01333217161511141633323637150E0123222726270E012322263534363713010E724E5F59962168326D62315301B43E150C837A8D3B210AA805F7A3BD767517250C1E112A2C265D2A160937CE7C95BDBA978ACF5A2C49A691151C060E0D1C2F67016C082C182D5C534C2A53C69B484898FD971C220303850C06422340486AB58895A41301E4000002003BFFE103D0044E001A001B00A7402FA719019818A808AA18034A08119B14030314061D1A070D1D140B1B071B1B1710271201032702111A1D0A2717191C1DB80107B321727D182B2B4EF44DED4E10F63C4DED3939ED12392F003F3FED3FED12392F10ED313043794034001908250C150A26000E1310260112110F1007190A26000500032101010204030B160D26000F120D26000918
-
06260104010621012B2B2B2B01103C103C2B2B103C103C2B2B2B81005D015D001617232E012322070615141633323637330E01232202351000330702D6E317AF10727EAC4A308892708319AF1EF0BBD2FA0112D41C044EB0D76383A86DA0A1DC8977D5C50133E6011A013A0500030048FFDA041A0449001C00240025010C40799708991AA71F03050E020F0514150E120F1514400C401408291A014B0BB603C701C603C71BD808D909D61FD823E817E8230BC711C712025C080521240F9A161D243906070716211D1C070A1D160B2507971CA71CB71CD71C0425160F251C05190A0C07110E270F1D27051A27242E072719192627D421A65D182B2B4EF44DFDE44E10F64DEDD4FD391239391112393912392F5D003F3FED3FED12392F3CFD3C10ED1112393130437940460023040503050205010504061F26111012101310141004060C25221B24260020001D26011E1D09170726000B150E26010D0E231A2126011E0521260108180A26000D100A2600002B2B2B2B01103C2B2B103C2B2B2B2A2B2A8101715D00715D5D00161716171615211E013332373637330E01070607062322001110003301262726232206070102B4D638361210FCEF0590978D543014B1074F3152794152C8FEEA0118E2011F0B284AAD7CA805012304476B55516C4AA2A3C55D36473B912E501C100123010601020142FE26754682B38A01DC0000000001001C0000021705D20017004D402B071D060A1D03010F1439160D06120A1917171A0E0D1129171207120F0E1F0E020EFC14191819FC21677E182B2B4EF44DFD5D39C42F3CFD3C104E456544E6003F3F3C4DFD3C3FEDD4ED313012373633321617152E012322061533152311231123353335B5233FB41124171C190B5220B2B4B295950542345C0202A4020155AE8EFC64039C8EA800000003003DFE3B03E80449001F002D002E00B7404D36144908490958085909880CA91BA81DA927A62BB91B0B4008031622290EC40A221D1F070406291D190A121D0A0F2E072E2E051C032E162E2D29051A300C0E270D3E26271C192F3087217242182B2B4EF44DEDF4ED394E10F64DFDE4F51112392F003F3FED3FED3F3FED10ED1112393931304379402C23281A1E0B1124251026231E262600281A262600110B0E21000F0E0C0D251D222601271B2926000F0C122100002B2B2B01103C103C2B2B2B2B2B818181005D00171617353311140706212226273316171633323736270E0123222411100033002623220706151416333237363501027C5E3335A63C70FEC9ADEC0EB70D273D83CF40260336987DAEFEFB0107BA0144A47FBE4625937CC24F2CFED104423E234387FC32CC76DA9BA548273C9256DD5250F7011D010D012EFEA1C0B25F9AB5BDAF6384022D0000000200840000013B05BD000300070036401C07E504000100
-
06030A0917171A06010229070300190809AA216242182B2B4EF43C4DC4FD3CC44E456544E6003F3F3C3F4DED3130133311231133152384B7B7B7B7042AFBD605BDCC000000020084000003ED04490019001A005E4031B706C706020406140627147606740705140C021418101D05070006180B0A1A071A1A000C29091A1C012E18291900191B1CB80106B3216242182B2B4EF43C4DFDE44E10F64DED12392F003F3F3C3F3FED1139390112393130005D015D1333153E01333217161511231134272623220706070E011511230184AB4CAA68E4502CB71D307E40294A382D1BB401A7042F985E529F57A2FD5102A3623C640D1642357169FDCF0449000003003BFFD90421044E000C0018001900904033980896109916A504A808A610A916B808C808D704E50EE9140C3A08061D18070C1D120B190719191502270F1A1B092715191A1BB80109B321725D182B2B4EF44DED4E10F64DED12392F003F3FED3FED31304379402C001704260B1309260000110226010717092600050D0226010A140C260001100C26000816062601030E0626012B2B2B2B012B2B2B2B2B81005D241235342726232206151416331200111002212200351000330702E085304CBAA59696A3D6011EFCFEF7DDFEFC0112E70674010FA6965E94FCB2ABE403DAFEECFEF4FEFDFEAE012BFC010E014005000100890000029204470011004F40262703260D37034704040E0810020E0911090C270805070006110A081A13012E10291100191213B80145B321627E182B2B4EF43C4DFDE44E10E6003F3F4D3FC4FDC411123939011112393130005D1333153E0133321617152E0123220615112389AB15A46B05181D101B108892B4042FB9369B0203BE0302AF72FD980000020042FFD703B6044B002E002F012E408F38099805961299149815982A062824252736214621472447275624572766246726790C790D790E7623742474257426A61EA82C1303000B15052D042E13001A151B171C18152D142E280F0B6908262536250225220D0A042B1318C61C1D1307041D2E9A2B0B2F07090E100207002F212F1A1F18161827173E28260727281A310E1F27103E00272E193031B221A65D182B2B4EF44DEDF4FD394E10F64DFD3910F4FD3911123939392F111239113939003F3FEDED3FEDED111217397131304379404C012D022615251A26210E1F21000926072101032C002100052A0721011D121F21001B14182101200F22210021220E0D08270A21012625090A012D04210006290421001E111C210119161C2101002B2B2B2B103C103C2B103C103C2B012B2B2B2B2B2B2B2B2B81005D5D015D13161716333236353427262F01262726353436333217160723262726232206151417161F011617161514062322262701EF082544A864983D27738F894174DBB9F26B4302AA05263E9966
-
6945284E77C24269D9DEEFC70701B701505A3057575B4524161D24222A498198BC8E5A683D32474E40462A19131D2F2C45948FD0D9A002F900010017FFEF0209055A00180052B50D2E0AC00E01B8013F40250416391703060E0A111A17171A0301062900150E150F031F030203FC1619191AFC21677D182B2B4EF44DFD5D39C42F3CFD3C104E456544E6002F3F3F3C4DFD3CED10FDE431301333113315231114171633323637150E012322263511233533A8B6ABAB2615310D1E141F43277E5A9191055AFED593FD4538130B01028E0908816702C593000000020080FFE303DE044900170018005E403AB814C81402091308141913191428067703D707070800050E0A00060D0A051D120B180718180B160D2E0A290C0B1A1A01291619191AD2216242182B2B4EF44DED4E10F63C4DFDE41112392F003F3FED3F3F3C391112393130005D015D0111141716333237363511331123370607062322272635112501381A3083BC4425B4AA0223346793E5532D01AF042FFD39523460A85A9D020EFBD19E3D2A5499528902D81A0000010000000000006B8BED625F0F3CF500110800000000005F4D8F0000000000C9C13CF7F865FC270B9108F9000000090001000000000000000100000629FE2900000C01F865FCED0B9100010000000000000000000000000000001505120042047300C40473004004730031047300340556001E0556009705C7005A055600AF047300520400003B047300480239001C0473003D01C70084047300840473003B02AA008904000042023900170473008000000034005A00E6019201E0026C02F0038003D604A0052205EC063806E0070E076A07E208280908095809B200010000001500920009006B0007000200100010005D000007E80A1D00040001B800532BB800492BB8003F2BB800352BB8002B2B4118008001A6009001A600A001A600030069018B0079018B0089018B0099018B00040089018B0099018B00A9018B00B9018BB2040840BA0179001A014A400B041F5414191F180A0B1FD2B80106B49E1FD918E3BB0119000D00E10119B20D0009410A01A0019F0064001F01A50025017A00480028019AB3296C1F60410A01A9007001A9008001A90003008001A9000101A9B21E321FBE012C00250401001F0126001E0401B61FE7312D1FE531B80201B21FC227B80401B21FC11EB80201400F1FC01D9E1FBF1D671FBE1D671FAB27B80401B21FAA29B80401B61FA91D6C1F931EB8019AB21F921DB80101B21F911DB80101B21F751DB80201B61F6D29961F6431B8019AB21F4C96B802ABB21F391DB80156400B1F3638211F351DE41F2F27B80801400B1F2D1D4C1F2A31CD1F241DB802ABB21F201EB8012540111F1C1D931F3A1D4C1F1E1D45273A1D4527BB01AA019B002A019BB2254A1FBA019B0025017AB349293896
-
B8017BB348283125B8017A403648289629482725294C1F252946272729482756C80784075B07410732072B072807260721071B071408120810080E080C080A08080807B801ACB23F1F06BB01AB003F001F01ABB308060805B801AEB23F1F04BB01AD003F001F01ADB70804080208000814B8FFE0B40000010014B801ABB41000000100B801ABB606100000010006B801ADB300000100B801AD401F04000001000410000001001002000001000200000001000002010802004A00B0018DB806008516763F183F123E113946443E113946443E113946443E113946443E113946443E11394660443E11394660443E11394660442B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B18011DB0964B5358B0AA1D59B0324B5358B0FF1D592B2B2B2B2B2B2B2B182B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B74752B2B2B65422B2B4B5279B376706A66456523456023456560234560B08B766818B080622020B16A704565234520B003266062636820B003266165B070236544B06A234420B176664565234520B003266062636820B003266165B066236544B0762344B10066455458B166406544B27640764523614459B36242725D456523456023456560234560B089766818B080622020B172424565234520B003266062636820B003266165B042236544B072234420B1625D4565234520B003266062636820B003266165B05D236544B0622344B1005D455458B15D406544B262406245236144592B2B2B2B456953427374B8019A2045694B20B02853B049515A58B020615944B801A6204569447500
+
272B3660A98E73AC0002005AFFDA057105E5001D001E00B1403B1B0597019605031F011F0482018705891305530803861D111115063A1D030C3A15091E021E1E190331023B1031111A20093119191F20A1216A66182B2B4EF44DED4E10F64DEDF4ED12392F003F3FED3FED12392F10ED31304379403A001C172513260E251B260B160932000D1410320112110F10071C0932000500033201010204030A180C32000F120C3200081A06320104010632012B2B2B2B01103C103C2B2B103C103C2B2B2B2B2B2B815D015D080117232E0123220011101233323736373306070621202726111037362123041E013411C221C5B2D9FEF5F1EFDC733D1EC21A92AFFED7FF00AEE5ACBA01472805E5FEDABB8EA6FECFFEC5FEFEFEBFA95991E89DBD9BCD01AC0145D0E20000000200AF000004F805BD000A001400614035690C6912790C7A12044814581468147A140407081E1110100A010E0F1E0100020A080206120C0409141431041A160F092500191516B8010BB3219589182B2B4EF44DFD3C4E10F64DFD11121739003F3F3CFD3C1012392F3CFD3C015D31305D132132161514062321112300272623211121323635AF0295C4F0D6DEFE32C70380784273FE74018C86A705BDDDC8ACFFFD9304B93A1FFE0372900000010000FF000473FF650003000FB50146000205003C103C002FED3130113521150473FF0065650000030052FFDC04470449000F003B003C00DD40382A30010A100B1B0C1C2733481069096A10073908120C09031B320724091D100C1D3B2B022E293BB73B023B322A2512100705081C2722171CB8018A4023171D1F07271D2E0B021D350B3C073C3C1C1407292AA8241A3E1B291C4A0F2738193D3EBC0197002100B9019600182B2B4EF44DEDF4ED4E10F64DE4FDC412392F003F3FED3FED3FEDED1239111217395D1112392EED2EED01111239111739313043794028363715220001192501360F2100181E1B21001620142101212200370221001A1D1721011521172101002B2B2B01103C2B2B2B2B818181005D015D2416333237363D010E010F0106070615013637363534262322070607233E01333217161511141633323637150E0123222726270E012322263534363713010E724E5F59962168326D62315301B43E150C837A8D3B210AA805F7A3BD767517250C1E112A2C265D2A160937CE7C95BDBA978ACF5A2C49A691151C060E0D1C2F67016C082C182D5C534C2A53C69B484898FD971C220303850C06422340486AB58895A41301E40000020076FFDE042505C20011001E0070402EA607A71CD71C0322080F1E02050000171D0507110A1E1D0B0B1427081A201A2E102E01290011191F208721BD5D182B2B4EF43C4DFDE4E44E10F64DED003FED3F3FED3F113911393130437940181216060A1606142601120A142601150717
+
260113091E26002B2B012B2B8181005D1333113E01333212111402232227262715232436353426232206151417163376AF3BA460C8F9F6DA7A543239A6026691918D7BB92647C205C2FDEB4D51FEEDFEF4FEFEB03B234D897DE8BEA9DEB6D1975EB100000002003BFFE103D0044E001A001B00A7402FA719019818A808AA18034A08119B14030314061D1A070D1D140B1B071B1B1710271201032702111A1D0A2717191C1DB80107B321727D182B2B4EF44DED4E10F63C4DED3939ED12392F003F3FED3FED12392F10ED313043794034001908250C150A26000E1310260112110F1007190A26000500032101010204030B160D26000F120D2600091806260104010621012B2B2B2B01103C103C2B2B103C103C2B2B2B81005D015D001617232E012322070615141633323637330E01232202351000330702D6E317AF10727EAC4A308892708319AF1EF0BBD2FA0112D41C044EB0D76383A86DA0A1DC8977D5C50133E6011A013A0500030048FFDA041A0449001C00240025010C40799708991AA71F03050E020F0514150E120F1514400C401408291A014B0BB603C701C603C71BD808D909D61FD823E817E8230BC711C712025C080521240F9A161D243906070716211D1C070A1D160B2507971CA71CB71CD71C0425160F251C05190A0C07110E270F1D27051A27242E072719192627D421A65D182B2B4EF44DFDE44E10F64DEDD4FD391239391112393912392F5D003F3FED3FED12392F3CFD3C10ED1112393130437940460023040503050205010504061F26111012101310141004060C25221B24260020001D26011E1D09170726000B150E26010D0E231A2126011E0521260108180A26000D100A2600002B2B2B2B01103C2B2B103C2B2B2B2A2B2A8101715D00715D5D00161716171615211E013332373637330E01070607062322001110003301262726232206070102B4D638361210FCEF0590978D543014B1074F3152794152C8FEEA0118E2011F0B284AAD7CA805012304476B55516C4AA2A3C55D36473B912E501C100123010601020142FE26754682B38A01DC0000000003003DFE3B03E80449001F002D002E00B7404D36144908490958085909880CA91BA81DA927A62BB91B0B4008031622290EC40A221D1F070406291D190A121D0A0F2E072E2E051C032E162E2D29051A300C0E270D3E26271C192F3087217242182B2B4EF44DEDF4ED394E10F64DFDE4F51112392F003F3FED3FED3F3FED10ED1112393931304379402C23281A1E0B1124251026231E262600281A262600110B0E21000F0E0C0D251D222601271B2926000F0C122100002B2B2B01103C103C2B2B2B2B2B818181005D00171617353311140706212226273316171633323736270E0123222411100033002623220706151416333237363501027C5E3335A63C70FEC9ADEC
+
0EB70D273D83CF40260336987DAEFEFB0107BA0144A47FBE4625937CC24F2CFED104423E234387FC32CC76DA9BA548273C9256DD5250F7011D010D012EFEA1C0B25F9AB5BDAF6384022D0000000200840000013B05BD000300070036401C07E50400010006030A0917171A06010229070300190809AA216242182B2B4EF43C4DC4FD3CC44E456544E6003F3F3C3F4DED3130133311231133152384B7B7B7B7042AFBD605BDCC000000020084000003ED04490019001A005E4031B706C706020406140627147606740705140C021418101D05070006180B0A1A071A1A000C29091A1C012E18291900191B1CB80106B3216242182B2B4EF43C4DFDE44E10F64DED12392F003F3F3C3F3FED1139390112393130005D015D1333153E01333217161511231134272623220706070E011511230184AB4CAA68E4502CB71D307E40294A382D1BB401A7042F985E529F57A2FD5102A3623C640D1642357169FDCF0449000003003BFFD90421044E000C0018001900904033980896109916A504A808A610A916B808C808D704E50EE9140C3A08061D18070C1D120B190719191502270F1A1B092715191A1BB80109B321725D182B2B4EF44DED4E10F64DED12392F003F3FED3FED31304379402C001704260B1309260000110226010717092600050D0226010A140C260001100C26000816062601030E0626012B2B2B2B012B2B2B2B2B81005D241235342726232206151416331200111002212200351000330702E085304CBAA59696A3D6011EFCFEF7DDFEFC0112E70674010FA6965E94FCB2ABE403DAFEECFEF4FEFDFEAE012BFC010E014005000100890000029204470011004F40262703260D37034704040E0810020E0911090C270805070006110A081A13012E10291100191213B80145B321627E182B2B4EF43C4DFDE44E10E6003F3F4D3FC4FDC411123939011112393130005D1333153E0133321617152E0123220615112389AB15A46B05181D101B108892B4042FB9369B0203BE0302AF72FD980000020042FFD703B6044B002E002F012E408F38099805961299149815982A062824252736214621472447275624572766246726790C790D790E7623742474257426A61EA82C1303000B15052D042E13001A151B171C18152D142E280F0B6908262536250225220D0A042B1318C61C1D1307041D2E9A2B0B2F07090E100207002F212F1A1F18161827173E28260727281A310E1F27103E00272E193031B221A65D182B2B4EF44DEDF4FD394E10F64DFD3910F4FD3911123939392F111239113939003F3FEDED3FEDED111217397131304379404C012D022615251A26210E1F21000926072101032C002100052A0721011D121F21001B14182101200F22210021220E0D08270A21012625090A012D04210006290421001E111C210119161C2101002B2B2B2B
+
103C103C2B103C103C2B012B2B2B2B2B2B2B2B2B81005D5D015D13161716333236353427262F01262726353436333217160723262726232206151417161F011617161514062322262701EF082544A864983D27738F894174DBB9F26B4302AA05263E99666945284E77C24269D9DEEFC70701B701505A3057575B4524161D24222A498198BC8E5A683D32474E40462A19131D2F2C45948FD0D9A002F900010017FFEF0209055A00180052B50D2E0AC00E01B8013F40250416391703060E0A111A17171A0301062900150E150F031F030203FC1619191AFC21677D182B2B4EF44DFD5D39C42F3CFD3C104E456544E6002F3F3F3C4DFD3CED10FDE431301333113315231114171633323637150E012322263511233533A8B6ABAB2615310D1E141F43277E5A9191055AFED593FD4538130B01028E0908816702C593000000010000000000006B8BED625F0F3CF500110800000000005F4D8F0000000000C9C13CF7F865FC270B9108F9000000090001000000000000000100000629FE2900000C01F865FCED0B9100010000000000000000000000000000001505120042047300C40473004004730031047300340556001E0556009705C7005A055600AF0473000004730052047300760400003B047300480473003D01C70084047300840473003B02AA0089040000420239001700000034005A00E6019201E0026C02F0038003D603EA04B4051E05A0066A07120740079C0814085A093A098A00010000001500920009006B0007000200100010005D000007E80A1D00040001B800532BB800492BB8003F2BB800352BB8002B2B4118008001A6009001A600A001A600030069018B0079018B0089018B0099018B00040089018B0099018B00A9018B00B9018BB2040840BA0179001A014A400B041F5414191F180A0B1FD2B80106B49E1FD918E3BB0119000D00E10119B20D0009410A01A0019F0064001F01A50025017A00480028019AB3296C1F60410A01A9007001A9008001A90003008001A9000101A9B21E321FBE012C00250401001F0126001E0401B61FE7312D1FE531B80201B21FC227B80401B21FC11EB80201400F1FC01D9E1FBF1D671FBE1D671FAB27B80401B21FAA29B80401B61FA91D6C1F931EB8019AB21F921DB80101B21F911DB80101B21F751DB80201B61F6D29961F6431B8019AB21F4C96B802ABB21F391DB80156400B1F3638211F351DE41F2F27B80801400B1F2D1D4C1F2A31CD1F241DB802ABB21F201EB8012540111F1C1D931F3A1D4C1F1E1D45273A1D4527BB01AA019B002A019BB2254A1FBA019B0025017AB349293896B8017BB348283125B8017A403648289629482725294C1F252946272729482756C80784075B07410732072B072807260721071B071408120810080E080C080A08080807B801ACB23F1F06BB01AB003F00
+
1F01ABB308060805B801AEB23F1F04BB01AD003F001F01ADB70804080208000814B8FFE0B40000010014B801ABB41000000100B801ABB606100000010006B801ADB300000100B801AD401F04000001000410000001001002000001000200000001000002010802004A00B0018DB806008516763F183F123E113946443E113946443E113946443E113946443E113946443E11394660443E11394660443E11394660442B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B18011DB0964B5358B0AA1D59B0324B5358B0FF1D592B2B2B2B2B2B2B2B182B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B74752B2B2B65422B2B4B5279B376706A66456523456023456560234560B08B766818B080622020B16A704565234520B003266062636820B003266165B070236544B06A234420B176664565234520B003266062636820B003266165B066236544B0762344B10066455458B166406544B27640764523614459B36242725D456523456023456560234560B089766818B080622020B172424565234520B003266062636820B003266165B042236544B072234420B1625D4565234520B003266062636820B003266165B05D236544B0622344B1005D455458B15D406544B262406245236144592B2B2B2B456953427374B8019A2045694B20B02853B049515A58B020615944B801A6204569447500
 
00>] def
 
/CharStrings 21 dict dup begin
 
/.notdef 0 def
@@ -700,18 +700,18 @@
 /B 6 def
 /C 7 def
 /P 8 def
-/a 9 def
-/c 10 def
-/e 11 def
-/f 12 def
-/g 13 def
-/i 14 def
-/n 15 def
-/o 16 def
-/r 17 def
-/s 18 def
-/t 19 def
-/u 20 def
+/underscore 9 def
+/a 10 def
+/b 11 def
+/c 12 def
+/e 13 def
+/g 14 def
+/i 15 def
+/n 16 def
+/o 17 def
+/r 18 def
+/s 19 def
+/t 20 def
  end readonly def
 
currentdict dup/FontName get exch definefont pop end
 
%APLsfntEnd
@@ -723,9 +723,9 @@
 
/UniqueID 4257378 def
 
currentdict currentfile eexec
 
54544758EC884CF30C3CD503CEDBFF3839C47C3C3333173232E3FDBFF439491DB843E1924E63AA7726BBB0485AB56D93D8C0906F647A47162891E73FFC2A9873C4B1EAC5EEBDFFC4D06084FBD84139DF4583C6E259D10699944D1068C9C45667DCCCFB9B7EA01B606435EDCBD273ABAC093D14085CCBAC149BD7382E842CFE0D7FE4FD2EF589A2471F6074A80A8B675C2F7A50D63AC1EF90D787BADD11633CB01CF6EE3B37AAF9078A69AC4740E9B6525D78BBD839551A1CB80DB8682FA5E87591BBD6EE8B946063A2A58D9CA3685AB305495DC5FB5747EB8A9A059C4976C0FE4EEAB1D56FF47F1E9664ED9F4A7DAB763AF92B2F6CF2FA7DEC24710E0B9096E30F772BA7FEA9BDBE496C42ED2CEB58F54E80BDF57CE7B4DB6CCFE7182F43BF93CCA0767AF95D62C5D2C3DC6AE1E6D139F51A2C63432117F1714C5566572EE9967A715420ABDCD1D7BD74F8450B89965FCC81C6ACA565C5F3CCF91D430D1F953E4F1A645300A98DD8C47CD64555F08F422340A85404EAE0D3229C4F9336B9470CACBD6BBF3395104750A915CC6EAAC197668267B8C62D2764C8CD69FD937CA3C924D997A0EDE7964BEB9EA2F92EF70C5E5DA0AA5567765E71F2B911B3C5586B741EEB93F3C73016EC16BFF283758900903D203992EFC8BAFAF13579C602F38C92633B2598E0B1EDFA3C2732C9D3498122A5E23C1999619F9F2A05B057FF2148EC959C8A2C02A2A019957BFFE16C5880F5564968C1625987940DE6BD70F90A24E5C1472AC5B757411251CCBEBE4DFC7671C4AF15535CAEA09C978A066E394B4289B51F1C72FE5FBC06BB36A6BCFF0B4EC25719FA85667926EDBBDFFA212F56A221A189E8B2491585584537C456E4A79B2AF87FA7555DFDA4D57A524D6EC0AE096BFACC3D5D18EE497C2FFA65E3ECB2BC70D2C3D7443492F3B903862BEF150DA74D2ADBC968F6E99122BAE4A2A6716C0C281CA48F5BB5360313F2A8494238B04C3BC9C312AD3C47F8EF7BF5D55ECCD58EEA49CDA442E0124E7FED95D4235DF7504C606B0AF08BCA60BE80366AF9DB68B50AA88BB40509DB43836013C91632C55C204E1D96CE50B788D300ADB6717EC9DA6E109FDE78FACFB4CD10A38582179BC9BC0C464B240688A1258F64C706A9D7D5DB5CE7223DAE1553010D8F068EA503E7E7D34885524AE4E3A0C51F0BF7242FB9E5A58F0BB4265B64120EAB094E31D92761CEC9BDC9CA6F1B23F467F0D0873608553BF965FEC3510E108359358E2264C9DD465226101DAB4BA7D7BF5535E13C6675DBE150A2FBD4044DEE5BFBDFD433059D7B0A3C766B678835F8FABF96BAFD77DCAA48A773BBF7012A6B4E8439B7A5FC51774BB674CDFED03D42BF57CA0CF26015A5F1522D791E8C82D4CF6391201F712BE837004301CB40A0D9AF6DDDCF524C5BB9B5CC0AC6B87B20C352D4F250EAD2DA
-
307D24E992CC69D9B67ED4CB40090A52D9819A92BDEB0140D40EDCD07923AB856B64B8D423C6B427D4DA5814303222AD6EC2D5247A3FD28B0F4C3301341F2882910AC5C78248096B1718D5014AECEACA6A703D29F56346B4A40C14C9E998D988496738272F0757842D984F12349471F116BC678761061C895BB139AC99F2E293B7ED46401734B8EABF2D1860217AA70CEB722706ED8B85996AE3F5694BB54D04C13AA4FAA7EACECFEA0A187454E8D0FFDEBE30B7DF4DA35816D1F50F01EA9C9E0E3BDB59B5DAF8CF14B42D963A198C0B7F8E8B64C864C26AF23E2126921750BE4D32008567D281FBFC61DCCD16EED8F0E01650222BB5AD267E994BC8EA55E13F6A32277CFF8E560D0FDEEB6073E55EE12739BF789C85D7AFAFD6EF40E9CA0C6FAF81F934E4824898597BF8AA2BEC6795956E3CFEC0AA9B898A2FBB64346A349E7A4C101E8AF1EB75D446694A9DB7C764F511E73888E867FE4B5050122FBA15756F864CFBA995EE372BE57C8AE09935553E7F623C37C1AFA703A61428CD5F79F2ED727B94873A9172FA8A0570D61C8ACB71B641165FA9829619408311A450500E2F31E570378C3F231B38B659514106125D031CC5B5BC6177C87ECDF716B3F72CD67A6260A1AE800CC8DB99718A817A72296FF305E849A87C84C10D0D6800A3CF22F5721F4F865E5DB5FCB984F13957C67D8BCDF9C016683005A96A22A05D997D8BC893F2087765DF68DAA48F646461ED929F61AF9F893407B1A808580E33FA39580AE0D9E8DBB23B7381B8283170A8A4FB219D8516A8977EEFA3346E3DA7A892E64A43C54A1585E46D16955C6FEDC6F0828CFAA755997EDDF2786DE1EE09891A71536A1419477D879AEED1E1AFA27F83B146A18BC86C10060583F3BE430C4C72262028BF3466D0805A3769E6FEB51F2A2BC40DE9CAF17AF193B3A001C668752B6AA1A7E864F5B3BE877F0F9C3B89097CAEB429EA64A4EBC5470DA99C7F956B422B06C2CBDA58B06E4ECB58B5CDFEF5423D2BE1E1A84582C2DBFC0867F32E7F50F6F58FF14497C227D14BDDF2A33177B4D386BA6C14FCB7A3EC843E94FB623B33B4186B7D337AF9B64C74790930FB33A61986C5BBABDEC5B7BC18963248C02C56439B420637269DA39BBB39C5F462610747AD8F60E9300B767A93ED77E62A0B123FDE28954172C6C2000A5DAA2FC7F1FC668AA364365B8F9A389BAAD074F80820BCEE6C20C733320A5C5402F34972E570FEE82F820EFED6F83199C008E5D16D7FEA0CCAB6E0667289A1502F32A590B2AA0A8219C9F69495AE874A9BBB70867EF71853F146E6FDEE776D6215C3FB7322653429FA4AAE0454D89DDA843A7A80D91F5BFEC8507F0049EC23D41495A184D31D3E09500A00433D849EA147E3CAF495296F5BA23354C9E48104E12A231EDACE1BC1533B42716B3039AA1B2C6E56024140
-
47CCCCA6D21C48D5C350AC106887E26785EA9D069F1F001680BB0A4565ADA067F2EBF45AF0F55CF239548D2945E36251629B08DC36E9730281AAD8B55400D3B592398BF8F0CA2ACEA2EFD50ABF54D1B13DCDF374E05F8E423797210F29086C0CE3024509857CE1F317EDFED1A7B31E47DD2D4DC0877CE3A7B3674071EBB89524AA658F5C6D21918ABB9F64EE8CF99EAA68C4BB66EF86171DE0B03DC9B284AC264915E5E829811809352DD63C3857ADD7C6C689C9936D245862752A83B4E9B957384BF0EA6727E877CEA8C8B992D120A7B76690F3656162D98DFD0D8D1727400020BCC4C97BDA29CF9968B99319C66E4A6A64C5B129E8832F1E1D314939840E8FCE6DA6FD1100401A71649032EF2598D1FE24A45AEEDFFF2A3CAFDB4F3BD19F016465744BDEC5BE3831CAA66DBC04DBFF67AD7AA78C84287FB881EFBA408A324CFA01CBEEA6315B580CACD990975077F9D0FA573313ABA69107EED0034D2A405490D992E36826FB8AD28A4D5E02889F3C851F226204980FE104B87C120C29A821C6006499F84F3AA11ED70870ED708315285D501A43347B7BD6FF37285F9B0B4D40571526F2F761A14189E46F3BC1806CD56F561C9CDE9E79FF7D0C4B6DA375866D538497541995265926BCE7D7E696E2E47AEC499DE6A58D1265456ECD4A367126A3EDB4391E75FE937111B4A42060C65A13AB960F73BB109FD2BE306949B274E53ACCDE71D95D8B3C58A637EA7EBF2ACF37D8E27CE9861868C49DC577AE795746CF113B32B3549DCCF4C806047C10495D4B8552201079C567AE4BE6971E879C763702CF9F206E44343860327C687932C1E66BB7D939F4A332177F4F21C0BDD509FF7E572A64F866CF10CCE0F8BA7DD4292FF470A8D48D3CE876B411956296280017FA65086409BD3CD512B87CBEEC0DCC36A065AF2D452CCABC8A7E257F35A75A7D91817C38247587B5D18943A1E0B94B4EB5266AA5D524BD53A3B34C6F1CA8E7D7579BFDAA3A096AD3114151A071355CE8F93DA334B895FD6AC36D2B94FBFB6995B2D0A5D87D8E4330FF0B5FB0457C6580763BBDFB0FAA9420B59A1EB6796BF488C4DDF97EE0DECBFA70258CB84B8137CABCD3BEE4C900B63779E8B47BC64BF56649A9EF301B122D53B1F646261BFC0B5218917711C31E3816476062C238AB83F5B9E14FF0A44F40F4944DFC3879E403EAF3F0CC24EE7F564E1653704AAFFAA4386B093C7F45F19933933A2DD1907268CCD4D06CA3716944FD0C4930DAEA3F76F158951BA4BA5264DC25007AA4B968A8B3DBD5B2E21B2B8CC1F8C37B2B2AB3B69603357F87E3F27A0ED147BC1F49832B478E5E75C0D909A90B6728AC9ED97C48BCF8C7F4A81A74EB84AD6366DAAEDA0274976CCC4A2AF94210F2E0DBB0AEE43DCFCC044B7E5FD68D2283DCA64258BF7D594DB529108392B34F90805F8A9BFE
-
4A412EB9882A90B84C706F4650D14DB056B784001CB1D730A2515335C1F92487EC6DB3F26263F8A70E87655FFE7419A563FE6E0956A536C6C753164FFD9F38A08CDE0D365BD84B03852CC224E0DEF1830D25792D3FCCED40214E9CFD4D1F0BA6399BC0B3D69A6DB2B078A4126E9BB08A29195D186CF3F12E3ACD68BD73C9BBDC596A2E0693336D7FED979B8FC393B350ED3E6D82AA53A7D7A0D376DDDBFA3E7F5E31FBB41232DE9DD0C6D36AE1017A6BC83ECA8BF97B0AFCA24D295361F1D745A9F0C91E06A75304BF423076D4FF67F7DA21AD213BBE9B764CE68133BBAA50068E04D732E726FEEB66206A16FAF50A7EC804F812485E7F424BC27AABA0AAB319C759A6AA7898E5B3DFF0070C251C7AF176602CD7662148DF9183F42BFBE0586AED270A1EDF0D379F0B145453EC33EF79025C3FAF7EC29A520777B7E08BFA343831B1690B0D1AA14492827DD176CA97E8AED862E976C79AEFC60B04306465A051869E5B95F5A010271143BB2F21095EFCE08A41DEF007E0C38F88207690828935418A304E7C4CAB7C77B53E9EEACFC729091264FCB7F57B1EAD65FD38CAEB24F88AF5A4EFFDD2A3F94DC16546D8C053F31DE01F502563B60D5B6245EF37831EBAAEA0CF8928120F9673E4C024F0EB438E7D9EB231F16DFCF565FF116ECA304EEA2EBFE6E1CE2F4FCEF3F43E97329BC69FFCC7C0A9D14CF6E7A1C84696F9330C88CCA3E2565676BA13FF634FD608A902A36243405A01BE4BE921275C5524AB51A4018FB3C3D6B4DC654BC542E0D08ABA359616AA781ECCACB5F66C58DFF9C005C6AC822356F18A32EB9D2D9B6AC6E9C6D914611EADF53A491D815445700C1CCFF829CDE9C26A0BF07C942BE252A57DE182D166CA37CBEAFB66A03675
+
307D24E992CC69D9B67ED4CB40090A52D9819A92BDEB0140D40EDCD07923AB856B64B8D423C6B427D4DA5814303222AD6EC2D5247A3FD28B0F4C3301341F2882910AC5C78248096B1718D5014AECEACA6A703D29F56346B4A40C14C9E998D988496738272F0757842D984F12349471F116BC678761061C895BB139AC99F2E293B7ED46401734B8EABF2D1860217AA70CEB722706ED8B85996AE3F5694BB54D04C13AA4FAA7EACECFEA0A187454E8D0FFDEBE30B7DF4DA35816D1F50F01EA9C9E0E3BDB59B5DAF8CF14B42D963A198C0B7F8E8B64C864C26AF23E2126921750BE4D32008567D281FBFC61DCCD16EED8F0E01650222BB5AD267E994BC8EA55E13F6A32277CFF8E560D0FDEEB6073E55EE12739BF789C85D7AFAFD6EF40E9CA0C6FAF81F934E4824898597BF8AA2BEC6795956E3CFEC0AA9B898A2FBB64346A349E7A4C101E8AF1EB75D446694A9DB7C764F511E73888E867FE4B5050122FBA15756F864CFBA995EE372BE57C8AE09935553E7F623C37C1AFA703A61428CD5F79F2ED727B94873A9172FA8A0570D61C8ACB71B641165FA9829619408311A450500E2F31E570378C3F231B38B659514106125D031CC5B5BC6177C87ECDF716B3F72CD67A6260A1AE800CC8DB99718A817A72296FF305E849A87C84C10D0D6800A3CF22F5721F4F865E5DB5FCB984F13957C67D8BCDF9C016683005A96A22A05D997D8BC893F2087765DF68DAA48F646461ED929F61AF9F893407B1A808580E33FA39580AE0D9E8DBB23B7381B8283170A8A4FB219D8516A8977EEFA3346E3DA7A892E64A43C54A1585E46D16955C6FEDC6F0828CFAA755997EDDF2786DE1EE09891A71536A1419477D879AEED1E1AFA27F83B146A18BC86C10060583F3BE430C4C72262028BF3466D0805A3769E6FEB51F2A2BC40DE9CAF17AF193B3A001C668752B6AA1A7E864F5B3BE877F0F9C3B89097CAEB429EA64A4EBC5470DA98850D584573075B4E24E7647FA4C18CA9680B451FBCA12A465794DC13B70B964A0EED13063941882CCA034B9E052DAAD342297E4C45F0D77C9CDF5B937A58AF3EFC826FC74D541B4A20BF06B65A28367833619A78AD1DD5435109B28441155F4C1933360095D1CB6DFF6E248821430D89D67FAD006E0A583999FA5EFF79CB123F07F266B4C0480EB19E588268951071BC7975D516ADB8CF94685E3512B4FCA7245BD498030C67290C382E40CFFE8765F9F728FFB827C3DCF8D8DED545239767BE11FBA9A3019B7AC642AC5862F94F85B4C7F2EDD1B19A26542A40CE03F0D4AC9ACF7C7E34D6225B135F420A23DC9ADDC35F1072F2DC08C3D15B8916A757AFAEF17DE7A8C88E10749FC0F75AEA5CBF3355481D15C8FFDAD27AA7F73AC391CB1FD1EA4B49E81D82E54B13871C87452BEF4E42C7A3655BC42CD892B43D47EB1364BAB1EB888E1
+
FFCCBA4F60C6C67B25B88ACAEF2C0E211EE5764522169477D0309E77798C5461E9F33F8D2717C6DBFD9064DDCB7239956C2072434DE4120233191409959673264DC4DE91E300D619FF5D7C44AF55E53B87BE80DDE9980D242D77A4D328A970A24DA7907102F2058BD362A25DFBE4C822BA1815E50F30DFCCC0FF388C082CEC4DC675BCFA9BFCC07E21E0B4FD61EC3B17E9220FBB400FEC8738BC9853868C91BB2F98F21F9DF500FC5444B18BF6AEF94D99548E87CBAE9F5FC7CED05FB1207A08C3DDD0CBBF761A313D95D6B9A2AC3E9144645E7FB743AA30F73C11B145A0263083E1CA39E68D7501AE033CA0E94D44A210C3DAB85D373473C25056A17CEB106BC717631E9393DE590FFE9235832E69989B949BB5ECB181E258608604BF5F1C8C93F1A1F3DCA8153EFA5C8513D72EE3FE217F8D4830956496AA6AE185EF31810AAF45D97ABB6DB35FD99100CCBC7D1A2878E7F2302079FCF6D96B280E8322D06A228CE72CC3CEF520D0EF6C803A385BEC7CB67508182E1732161D9E9799600C2E1EF158718B67C4BEE9B0F23E056FC9343E60F9F654C2EE4D4CD63C1F06762D3437829FF82B08518F9F23AE6EFF38AC62C11A52560C3EF60F595E21B03DC921188970DC14CAC115688D800399AC13E791A98EEFD02284C6910F0830D82CF4A07C680B3B57AE8D4EF944FC1CC45956A2D7F22293E274AEF42CF6940150BC77AE929641F1350AA628EC024A57A482232F73381C8B4B7A69180E693B6318AF1DC6CE80F52482DB6238BD4A45DF56B5417C7787683054A145E93C19277068744FE3D5531F415F132D00409DB05E299856E78BE1C0F61039CE5BA93D3A972D548FA98E614B13C27ED56E0ACE5085C04B67E9D47EF1D8251CA60B60452779F20159CE4C5D1402A932D772CB5B33742BB3BA587D3D6895AA655BCB7238691599859D76BFE20BC09F06A62C2C5BE932626954E847322F424929330EAC4D461944A5ED53F8DE3DD2BFA1A4BAD7279CE9FBDD9E8A6780FC271C20FE355963F5DD40FA2B4687ACF47BFC73012207384624C55E740C1EE6E33839E0672CBBA4167FF59446201907220E0AD4C992B671743544F9E49FFBAC36E724380AE74A7DD01D6F54E7745720F57EE08BA31D834E443863D2025BA0426F097341FC2F3530DF4C875FC8597662D43A768CA1F38683BEA28599220F3D74ABA3DE04659DA3052CBBD3148EDDE9F13FDD0BE8B144977A12640CBDFC7FDC962D918E921BFA0872C3DFEC159E172DEC2C092E8EB6B358C2897648FCADF1BE11C4A897E903DEA17BF9BDDA302D0902DCE2EAC717D6F2B0B2039ADB4C758CC537D9E1C2069A8036F4952DF24C5F7EC363C2A8D24555DADE0B9E72C394F0DD9A7A14D5BDA29DB306F4ECE32F4087C1CA1B93AF2319287C0E24B6C266542876FAA32B42E22B1480778E22710950D7206D
+
1F4D8FA3AC890CB13E7C7980CB35E6E491EDABDBBEAE54575207063DAC8D4696918FA2AEDEC3F38090F02BBCE2E8D9487122B0CC24EA8016FBA83FA3914A84794E0DA5BB5B6E4B9B31060765171B203FF5E6F2F9277C75DACB18117974615A579B7D4B3AD94AE5FDBD3AE342CE3D0260973D4230D482934AAF751C21651582434409E58F85EABFF8E7D94E9291E8BE1F9C0F8EB4B5B7FA3809854E0C064F66C856CE501B520BCD598CC40776611F2F49049DDA8B69BFA1260888D199A42B0745D3728D4043DA3863B61CEF418376CD471ED8640CD805B4D7333B746CAEC0E9693482775C5583F2CB25894567B3158DF88F969C7FE67A6C2610499E5E8F170080696C5D1A36A531FF57886F8281567D44092072FF3517204315D408D183FE324756F820EBACF8D53742681E08680D5AFDC140B420F69036F2642F80A6F967A6A7056A1C06BC82A782799576BF992879DA7FC9C5EDD1DB364A747CC8A71D6DFD043D1FFF3707333242B2F38386E72765CD2E07BCEBF5CB344EC7091833C5C522392255D8CC604E3B12669A42D2E3B8365313A9AE0E4B6EA84508B94D2324933FA67A37AD0608C1780951981DF5564D6039190336ADCF5FE8171C5E14C5283087268F74DC3FD17BB1CEA904372D3B44064999E795D94FBE3EA0F4813DC93EA0C5B6ED6C65D62E78A7FBAA8E33714D70479BB2857706D175BAB29BB7954313FAC6F26CE1D8802E2B731ECBF4C1089B63A5F5F2316C92A2FE224348F030902689730B2F7603832FC5C4A2372FD7529B986273D9D650AC5A587C94785F46EB104E653E8A43459A8F7E0C6A3DB7822871C37D30C1A85BA9B39D269039292A6D97B964236F2CC774D61F538DACBE949355B7CE1056E10C6EA1C80039
 
0000000000000000000000000000000000000000000000000000000000000000
 
0000000000000000000000000000000000000000000000000000000000000000
 
0000000000000000000000000000000000000000000000000000000000000000
@@ -6737,14 +6737,14 @@
 0 i
 1.5 0 0 -1.5 161.25 307.5 cm
 /F1.1[ 14 0 0 -14 0 0]sf
--17.899902 5.5 m
-(\(\)*+!)[ 3.889648 7.786133 7.786133 7.000000 0.000000 ] xS
+-14.786133 5.5 m
+(\(\)*+)[ 7.000000 7.000000 7.786133 0.000000 ] xS
 1.5 0 0 -1.5 307.5 307.5 cm
--17.899902 5.5 m
-(\(\)*+%)[ 3.889648 7.786133 7.786133 7.000000 0.000000 ] xS
+-14.786133 5.5 m
+(\(\)*,)[ 7.000000 7.000000 7.786133 0.000000 ] xS
 1.5 0 0 -1.5 456.75 307.5 cm
--18.286133 5.5 m
-(\(\)*+&)[ 3.889648 7.786133 7.786133 7.000000 0.000000 ] xS
+-14.393066 5.5 m
+(\(\)*\()[ 7.000000 7.000000 7.786133 0.000000 ] xS
 1 J
 1 j
 0.60000002 i
@@ -6775,9 +6775,9 @@
 0 i
 1.5 0 0 -1.5 65.25 228 cm
 -15.955078 -3 m
-(%,-.)[ 9.337893 7.786132 7.000000 0.000000 ] xS
+(%+\)-)[ 9.337893 7.786132 7.000000 0.000000 ] xS
 -22.179199 14 m
-(/01*2.3)[ 9.337893 7.786132 3.110352 7.786133 3.889648 7.786133 0.000000 ] xS
+(./012-3)[ 9.337893 7.786132 3.110352 7.786133 3.889648 7.786133 0.000000 ] xS
 1 J
 1 j
 0.60000002 i
@@ -6829,10 +6829,10 @@
 0 i
 1.5 0 0 -1.5 232.5 48 cm
 -13.624023 5.5 m
-(4020)[ 7.786133 7.786133 3.889648 0.000000 ] xS
+(4/2/)[ 7.786133 7.786133 3.889648 0.000000 ] xS
 1.5 0 0 -1.5 378.75 48 cm
 -13.624023 5.5 m
-(4020)[ 7.786133 7.786133 3.889648 0.000000 ] xS
+(4/2/)[ 7.786133 7.786133 3.889648 0.000000 ] xS
 ep
 end
 %%Trailer
--- a/Paper/figure/cs_stack.graffle	Sat Nov 19 20:48:37 2011 +0900
+++ b/Paper/figure/cs_stack.graffle	Sun Nov 20 07:14:49 2011 +0900
@@ -44,7 +44,7 @@
 	<key>Creator</key>
 	<string>Nobuyasu Oshiro</string>
 	<key>DisplayScale</key>
-	<string>1 0/72 in = 1 0/72 in</string>
+	<string>1 0/72 in = 1.0000 in</string>
 	<key>GraphDocumentVersion</key>
 	<integer>8</integer>
 	<key>GraphicsList</key>
@@ -362,7 +362,7 @@
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
 
-\f0\fs28 \cf0 funcC}</string>
+\f0\fs28 \cf0 cs_c}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -421,7 +421,7 @@
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
 
-\f0\fs28 \cf0 funcB}</string>
+\f0\fs28 \cf0 cs_b}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -480,7 +480,7 @@
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
 
-\f0\fs28 \cf0 funcA}</string>
+\f0\fs28 \cf0 cs_a}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -899,7 +899,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2011-11-18 08:42:17 +0000</string>
+	<string>2011-11-19 17:10:50 +0000</string>
 	<key>Modifier</key>
 	<string>Nobuyasu Oshiro</string>
 	<key>NotesVisible</key>
--- a/Paper/figure/fastcall.graffle	Sat Nov 19 20:48:37 2011 +0900
+++ b/Paper/figure/fastcall.graffle	Sun Nov 20 07:14:49 2011 +0900
@@ -105,24 +105,24 @@
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
 
 \f0\fs24 \cf0 \
-         case RID_CbC_CODE:\
-           if (!typespec_ok)\
-             goto out;                                                                                                       \
-           attrs_ok = true;                                                                                                  \
-           seen_type = true;                                                                                                 \
-           if (c_dialect_objc ())\
-             parser-&gt;objc_need_raw_identifier = true;                                                                        \
-           t.kind = ctsk_resword;                                                                                            \
-           t.spec = c_parser_peek_token (parser)-&gt;value;                                                                     \
-          declspecs_add_type (loc, specs, t);                                                                               \
-    \
-          if(!TARGET_64BIT) \{\
-            attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE);                                                \
-    	declspecs_add_attrs(specs, attrs);                                                                              \
-          \}\
-    \
-          c_parser_consume_token (parser);                                                                                  \
-          break;              }</string>
+     1 | case RID_CbC_CODE:\
+     2 |   if (!typespec_ok)\
+     3 |     goto out;\
+     4 |   attrs_ok = true;\
+     5 |   seen_type = true;\
+     6 |   if (c_dialect_objc ())\
+     7 |     parser-&gt;objc_need_raw_identifier = true;\
+     8 |   t.kind = ctsk_resword;\
+     9 |   t.spec = c_parser_peek_token (parser)-&gt;value;\
+    10 |   declspecs_add_type (loc, specs, t);\
+    11 |\
+    12 |   if(!TARGET_64BIT) \{\
+    13 |     attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE);\
+    14 |     declspecs_add_attrs(specs, attrs);\
+    15 |   \}\
+    16 |   c_parser_consume_token (parser);\
+    17 |   break;\
+}</string>
 				<key>VerticalPad</key>
 				<integer>0</integer>
 			</dict>
@@ -177,7 +177,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2011-11-18 00:01:57 +0000</string>
+	<string>2011-11-19 16:05:53 +0000</string>
 	<key>Modifier</key>
 	<string>Nobuyasu Oshiro</string>
 	<key>NotesVisible</key>
--- a/Paper/nobu-prosym.tex	Sat Nov 19 20:48:37 2011 +0900
+++ b/Paper/nobu-prosym.tex	Sun Nov 20 07:14:49 2011 +0900
@@ -1,1 +1,1 @@
-\documentclass[private]{ipsjpapers}
%\documentstyle{ipsjpapers}
\usepackage[dvipdfmx]{graphicx}
\usepackage{url}
\usepackage{multirow}  %% tabularの上下の結合
\usepackage{slashbox}  %% tabularでの斜め線
\usepackage{listings}
\usepackage{jtygm}


% 巻数,号数などの設定
%\setcounter{巻数}{41}
%\setcounter{号数}{6}
%\setcounter{volpageoffset}{1234}
%\受付{12}{2}{4}
%\採録{12}{5}{11}

\pagestyle{empty}

% ユーザが定義したマクロなど.
\makeatletter
\let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY}
\def\<{\(\langle\)}
\def\>{\(\rangle\)}
%\def\|{\verb|}
\def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline}
\def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\}
\def\LATEX{\iLATEX\Large}
\def\LATEx{\iLATEX\normalsize}
\def\LATex{\iLATEX\small}
\def\iLATEX#1{L\kern-.36em\raise.3ex\hbox{#1\bf A}\kern-.15em
    T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}
\def\LATEXe{\ifx\LaTeXe\undefined \LaTeX 2e\else\LaTeXe\fi}
\def\LATExe{\ifx\LaTeXe\undefined \iLATEX\scriptsize 2e\else\LaTeXe\fi}
\def\Quote{\list{}{}\item[]}
\let\endQuote\endlist
\def\TT{\if@LaTeX@e\tt\fi}
\def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else
	$\backslash$#1\fi}

%\checklines	% 行送りを確認する時に使用

\begin{document}%{
% 和文表題
\title[Continuation based C の GCC 4.6 上の実装について]%
	{Continuation based C の GCC 4.6 上の実装について}
% 英文表題
\etitle{The implementation of Continuation based C Compiler on GCC 4.6}

% 所属ラベルの定義
\affilabel{URYUKYU}{琉球大学\\University of the Ryukyu}

% 和文著者名
\author{大城 信康\affiref{URYUKYU}\nomember\and
	河野 真治\affiref{URYUKYU}\member{19841765}}
	

% 英文著者名
\eauthor{Nobuyasu Oshiro\affiref{URYUKYU}\and
	Shinji Kono\affiref{URYUKYU}}

% 連絡先(投稿時に必要.製版用では無視される.)
\contact{大城 信康\\
	〒903-0213 沖縄県中頭郡西原町字千原1番地\\
	琉球大学 情報工学科\\
        TEL: (098)895-8723\qquad FAX: (098)895-8727\\
	email: dimolto@cr.ie.u-ryukyu.ac.jp}

% 和文概要
\begin{abstract}
GCC-4.6 をベースとした CbC コンパイラの実装を行った.
CbC のコンパイラは GCC-4.2 ベースのコンパイラが2008年に開発されており,
以来 GCC のアップデートにあわせて CbC のコンパイラもアップデートが行われてきた.
今回は GCC-4.6 への実装を行った.
本論文では GCC-4.6 への CbC の具体的な実装について述べる。


%当研究室では継続を基本としたプログラミング言語 Continuation basede C (以下CbC) を開発している.
%また,CbC 自体の開発と共に CbC のコンパイラの開発も行っている.
%お陰で GCC の最適化やデバッグの機能を CbC のプログラミングで扱うことができるようになった.


\end{abstract}


% 英文概要
\begin{eabstract}
We implemented Continuation based C Compiler on GCC-4.6.
CbC Compiler on GCC-4.2 was developed on 2008.
Since then we kept to update it.
In this paper, we introduce implemented Continuation based C Compiler on GCC-4.6.

%Continuation based C is programming language. It is developing our laboratory.

\end{eabstract}

% 表題などの出力
\maketitle
\thispagestyle{empty} 

%}{

% 本文はここから始まる
\section{歴史的経緯}
%当研究室では, 継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している.
%CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる.
当研究室ではコードセグメント (Code Segment) 単位で記述するプログラミング言語 Continuation based C (以下CbC) を開発している.
コードセグメントは並列実行の単位として使うことができ, プログラムの正しさを示す単位としても使用することができる.これにより,
 Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている.

CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが,
2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され,
2010年には GCC-4.4 へとアップデートが行われた.
GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった.
%以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている.
%今回,CbC コンパイラを GCC-4.6 へとアップデートを行った.
%本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる.
だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある.
本研究では, GCC-4.5 をベースとしていた CbC-GCC を GCC-4.6 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う.


%}{

\section{Continuation based C (CbC)}
CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る.
構文は C と同じであるが, ループ制御や関数コールが取り除かれる.

%Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である.
%構文は C と同じであるが,ループ制御や関数コールを取り除き継続(goto)を用いている.
%また,コードセグメント単位で処理を記述するという特徴がある.
%図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している.


\subsection{継続(goto)}
コードセグメントの記述は C の関数の構文と同じで, 型に“\verb+__code+” を使うことで宣言できる.
コードセグメントへの移動は“goto” の後にコードセグメント名と引数を並べて記述することで行える.
図\ref{fig:cs}はコードセグメント間の処理の流れを表している.

%コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない.
%コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る.
%この goto によるコードセグメント間の移動を継続と言う.
%継続の実態は jmp による関数の移動となる.

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.35}{\includegraphics{figure/codesegment.eps}}
  \end{center}
  \caption{コードセグメント間の継続(goto)}
  \label{fig:cs}
\end{figure}

\subsection{コードセグメント(code segment)}
コードセグメントは C の関数と違って返り値を持たず, 処理が終われば次のコードセグメントへと処理を移る.
C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく.
だが, 返り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない.

軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる.

図\ref{fig:factorial}は CbC で書いたプログラムの例である.
与えられた数 x の階上を計算して出力するプログラムとなっている.

\begin{figure}
\lstinputlisting[language=c]{source/factorial.cbc}
\caption{階上を計算する CbC プログラムの例}
\label{fig:factorial}
\end{figure}

%CbC におけるプログラムの基本単位としてコードセグメントという概念がある.
%コードセグメントの記述の仕方は C の関数と同じだが, 型に“\_\_code”を使って宣言を行うところだけが違う.
%関数と同じように引数を持たせて継続させることもできる.
%しかし,関数とは違ってリターンを行わない為返り値を取得することはできない.

%コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる.
%コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる.
\section{GCCの3つの内部表現}
GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく.

\subsection{3つの内部表現}
GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う.
それぞれが
読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき,
最後にアセンブラ言語へと出力される.
図\ref{fig:ir}は GCC がソースコードを読み込みアセンブラ言語出力までの流れを表した図である.

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.35}{\includegraphics{figure/ir.eps}}
  \end{center}
  \caption{GCC によるコンパイルの一連の流れ}
  \label{fig:ir}
\end{figure}


\subsubsection{Generic Tree}
ソースコードより読み込んだ関数の情報を木構造で表したものが Generic Tree となる.
関数の返り値,引数,変数の型,条件式とプログラムの処理全てが木構造で表される.
CbC の実装では parse の部分からこの Generic Tree 生成の部分に手が加わっている.


\subsubsection{GIMPLE}
Generic Tree で表現されたデータは GIMPLE というデータ構造に変換される.
GIMPLE も Generic Tree と同じ構文木だが、より制約がかかった状態で作成された構文木となる.
制約は「1つの枝に4つ以上の子を持たせない」等といったもので,
GIMPLE へと変換されたデータは Generic Tree より簡単な命令で表されることになり最適化がかけやすくなる.
CbC の実装では特に修正は加えていない.


\subsubsection{Register Transfer Language (RTL)}
構文木 GIMPLE は解析が行われた後 RTL へと変換される.
RTL はレジスタの割り当てといった低レベルの表現で,アセンブラとほぼ同じ表現を行うことができる.
プログラム内部では RTL も木構造で表される.

CbC における継続は,この RTL への変換で行われる最適化の1つ Tail Call Elimination が重要となってくる.


\section{GCC-4.6 への実装}
前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した.
ここからは GCC-4.6 への実装について述べていく.


%\subsection{“\_\_code” のパース}

\subsection{Tail Call Elimination}
CbC の継続の実装には GCC の最適化の1つ, Tail Call Elimination (末尾除去) を強制することで実装する.
これにより, コードセグメント間の移動を, call ではなく jmp 命令で実現する.
%Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に,
%call ではなく jmp を用いることができるという最適化である.
図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している.

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.35}{\includegraphics{figure/continuation.eps}}
  \end{center}
  \caption{Tail Call Elimination}
  \label{fig:continue}
\end{figure}
funcB は jmp 命令で funcC を呼び出す.
funcC は,返り値を funcB ではなく funcA へと返すことになる.

\subsubsection{expand\_call}
ある関数が Tail Call Elimination を行えるかどうかは \verb+expand_call+ 関数で判断される.
\verb+expand_call+ 関数内でチェックされる Tail Call Elimination が行える条件は以下になる.

\begin{itemize}
  \item caller 側と callee 側の戻値の型が一致している.
  \item 関数呼び出しがリターンの直前に行われている.
  \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない.
  \item 引数の並びのコピーに上書きがない.
\end{itemize}

CbC の実装では上記の条件を,以下の様にして解決させている.

\begin{itemize}
  \item コードセグメントは void 型で統一する. Cの関数からコードセグメントに goto する場合は返す値の型チェックを行わない.
  \item goto の直後に retrun を置く.
  \item スタックサイズは関数宣言時に決まったサイズにする.
  \item 引数は一旦, 一時変数にコピーして重なりがないようにする.
\end{itemize}

スタックサイズを決め打ちで行うことで,ベースポインタを変えずにスタックを扱うことができる.
これも CbC の1つの特徴である.
図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している.


\begin{figure}[htpb]
  \begin{center}
\scalebox{0.33}{\includegraphics{figure/cs_stack.eps}}
  \end{center}
  \caption{継続による引数のスタック格納の様子}
  \label{fig:cs_stack}
\end{figure}

GCCでは, この他にもTCEを禁止しするルールがあり, GCC-4.5, 4.6 でも
Tail Call Elimination にかからないコードセグメントがある.
この点を改善する必要がある.



\subsection{環境付き継続}
CbC には通常の C の関数からコードセグメントに継続する際,
 その関数から値を戻す処理への継続を得ることができる.
これを環境付き継続という.
これらは, 以下の二種類の CbC で定義した特殊変数である.
\verb+__environment+ は, 環境を表す情報である.
\verb__return+ は,  これを環境付き継続の行き先であり, 関数の戻値と \verb+__environment+ の二つの引数を持つ
コードセグメントである. 例えば, 以下のように使うと, \verb+main()+ は 1 を返す.

\begin{verbatim}
__code c1(__code ret(int,void *),void *env) {
    goto ret(1,env);
}

int main() {
    goto c1(__return, __environment);
}
\end{verbatim}

GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す.
戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:_ret_val}).

\begin{figure}[h]
  \begin{minipage}[b]{.45\textwidth}
    \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:_ret_val]
__label__ _cbc_exit0;
static int retval; // should be thread local
void _cbc_internal_return(int retval_, void *_envp){
  retval = retval_;
  goto _cbc_exit0;
}
if (0) {
 _cbc_exit0:
  return retval;
 }
_cbc_internal_return;
    \end{lstlisting}
  \end{minipage}
  \hfill
\end{figure}

\subsubsection{環境付き継続の問題}
現在環境付き継続は
このコードを GCC 内部で生成することで実現している. これは正しく動作しているが,
 \verb+retval+に static を指定してしまうと,
 スレッドセーフな実装でなくなる.
これを通常の変数にすると, 関数内の関数は closure として実装される. しかし, GCC 4.6 と Lion の
組合せでは closure は正しく動作してないことがわかった. 
Thread local 変数を用いると, やはり closure が出力されてしまう.
本来は, 戻値用のレジスタが使用されれば問題ないが, 戻値の型は整数やポインタとは限らず,
浮動小数点や構造体自体である可能性があり複雑である. 
一つの解決策はレジスタ渡しと考えているが, 他の方法もありえる. 少し重いが setjmp を用いた実装方法もある.


\subsection{引数渡し}
通常コードセグメントの継続において, 引数は C の関数と同じスタックを用いて渡される.
 GCC には引数渡しをスタックではなくレジスタを用いて行う機能として fastcall がある.
fastcall を用いてコードセグメントへ継続することで, 速度の向上を図る.

\subsubsection{fastcall}
C において fastcall を用いる場合は関数にキーワード “\_\_attribute\_\_ ((fastcall))” をつけて行う.
だが, コードセグメントを全てこのキーワードをつけて宣言することは実用できではない.
そこで, コードセグメントで宣言された場合, fastcall が自動で付くように実装を行う.
図\ref{fig:fastcall}はコードセグメントに fastcall 属性を付与しているソースである.

%\lstinputlisting[language=c]{source/fastcall.c}

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.33}{\includegraphics{figure/fastcall.eps}}
  \end{center}
  \caption{コードセグメントへのfastcall属性付与}
  \label{fig:fastcall}
\end{figure}


if 文で条件を決めているのは, 64 bit の場合 fastcall が標準で行われ,
fastcall 属性を付けると warning を出すからである.



\subsection{typedefrecの実装の構想}
C を基本とした CbC には型推論がない.

\begin{figure}[h]
  \begin{minipage}[b]{.45\textwidth}
    \begin{lstlisting}[caption=typedefrecの例,label=code:typedefrec]
typedefrec void *funcA(int, funcA);

typedefrec struct {
  node left;
  node right;
} *NODE;
    \end{lstlisting}
  \end{minipage}
  \hfill
\end{figure}

\section{評価}
今回実装を行った GCC-4.6 ベースのコンパイラを GCC-4.4 ベース,
Micro-C コンパイラとそれぞれ比較を行った.
比較を行うのはクイックソートのプログラムである.
クイックソートは再帰的にプログラムされる為 CbC に向いている
プログラムだと言える.
比較を行うのは以下のアーキテクチャと OS になる.

%\begin{description}
\begin{itemize}
  \item x86/Linux
  \item x86/OS X
\end{itemize}
%\end{description}

また,比較を行うプログラムは最適化(-O0 オプション)を行わないものと,
速度最適化(-O2 -fomit-frame-pointer)を行うものの2つ,
それと -m32 オプションと -m64 オプションをつけたものそれぞれで行う.

表\ref{tab:speed-mc-vs-gcc-nonopt}が最適化無し,
表\ref{tab:speed-mc-vs-gcc-opt}が速度最適化有りとなる.


\begin{table}[htpb]
  \centering
  \small
  \begin{tabular}{|c|c|c|c|} \hline
      CPU/OS      &GCC-4.4& GCC-4.6 &Micro-C  \\ \hline
    x86/Linux     & 7.378 & 0.829 & 2.890 \\ \hline
 x86\_64/OS X(-m32)& 3.890 & 0.382 & 2.288 \\ \hline
 x86\_64/OS X      & 4.078 & 0.450 &        \\ \hline
  \end{tabular}
  \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(最適化無し)}
  \label{tab:speed-mc-vs-gcc-nonopt}
\end{table}


\begin{table}[htpb]
  \centering
  \small
  \begin{tabular}{|c|c|c|c|} \hline
      CPU/OS      &GCC-4.4& GCC-4.6 &Micro-C  \\ \hline
    x86/Linux     & 3.252 & 2.906 & 2.890 \\ \hline
 x86\_64/OS X(-m32)& 1.827 & 0.934 & 2.288 \\ \hline
 x86\_64/OS X      & 1.101 & 2.896 &        \\ \hline
  \end{tabular}
  \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)}
  \label{tab:speed-mc-vs-gcc-opt}
\end{table}

\nocite{kono:2002a, kono:2008a, yogi:2008a, gcc_internals}
\bibliographystyle{junsrt}
\bibliography{cbc.bib}

\end{document}
\ No newline at end of file
+\documentclass[private]{ipsjpapers}
%\documentstyle{ipsjpapers}
\usepackage[dvipdfmx]{graphicx}
\usepackage{url}
\usepackage{multirow}  %% tabularの上下の結合
\usepackage{slashbox}  %% tabularでの斜め線
\usepackage{listings}
\usepackage{jtygm}


% 巻数,号数などの設定
%\setcounter{巻数}{41}
%\setcounter{号数}{6}
%\setcounter{volpageoffset}{1234}
%\受付{12}{2}{4}
%\採録{12}{5}{11}

\pagestyle{empty}

% ユーザが定義したマクロなど.
\makeatletter
\let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY}
\def\<{\(\langle\)}
\def\>{\(\rangle\)}
%\def\|{\verb|}
\def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline}
\def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\}
\def\LATEX{\iLATEX\Large}
\def\LATEx{\iLATEX\normalsize}
\def\LATex{\iLATEX\small}
\def\iLATEX#1{L\kern-.36em\raise.3ex\hbox{#1\bf A}\kern-.15em
    T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}
\def\LATEXe{\ifx\LaTeXe\undefined \LaTeX 2e\else\LaTeXe\fi}
\def\LATExe{\ifx\LaTeXe\undefined \iLATEX\scriptsize 2e\else\LaTeXe\fi}
\def\Quote{\list{}{}\item[]}
\let\endQuote\endlist
\def\TT{\if@LaTeX@e\tt\fi}
\def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else
	$\backslash$#1\fi}

%\checklines	% 行送りを確認する時に使用

\begin{document}%{
% 和文表題
\title[Continuation based C の GCC 4.6 上の実装について]%
	{Continuation based C の GCC 4.6 上の実装について}
% 英文表題
\etitle{The implementation of Continuation based C Compiler on GCC 4.6}

% 所属ラベルの定義
\affilabel{URYUKYU}{琉球大学\\University of the Ryukyu}

% 和文著者名
\author{大城 信康\affiref{URYUKYU}\nomember\and
	河野 真治\affiref{URYUKYU}\member{19841765}}
	

% 英文著者名
\eauthor{Nobuyasu Oshiro\affiref{URYUKYU}\and
	Shinji Kono\affiref{URYUKYU}}

% 連絡先(投稿時に必要.製版用では無視される.)
\contact{大城 信康\\
	〒903-0213 沖縄県中頭郡西原町字千原1番地\\
	琉球大学 情報工学科\\
        TEL: (098)895-8723\qquad FAX: (098)895-8727\\
	email: dimolto@cr.ie.u-ryukyu.ac.jp}

% 和文概要
\begin{abstract}
GCC-4.6 をベースとした CbC コンパイラの実装を行った.
CbC のコンパイラは GCC-4.2 ベースのコンパイラが2008年に開発されており,
以来 GCC のアップデートにあわせて CbC のコンパイラもアップデートが行われてきた.
今回は GCC-4.6 への実装を行った.
本論文では GCC-4.6 への CbC の具体的な実装について述べる。


%当研究室では継続を基本としたプログラミング言語 Continuation basede C (以下CbC) を開発している.
%また,CbC 自体の開発と共に CbC のコンパイラの開発も行っている.
%お陰で GCC の最適化やデバッグの機能を CbC のプログラミングで扱うことができるようになった.


\end{abstract}


% 英文概要
\begin{eabstract}
We implemented Continuation based C Compiler on GCC-4.6.
CbC Compiler on GCC-4.2 was developed on 2008.
Since then we kept to update it.
In this paper, we introduce implemented Continuation based C Compiler on GCC-4.6.

%Continuation based C is programming language. It is developing our laboratory.

\end{eabstract}

% 表題などの出力
\maketitle
\thispagestyle{empty} 

%}{

% 本文はここから始まる
\section{歴史的経緯}
%当研究室では, 継続により処理を行うプログラミング言語 Continuation based C (以下CbC) を開発している.
%CbC の構文は C と同じであるが,継続によりループ制御や関数コールが取り除かれる.
当研究室ではコードセグメント (Code Segment) 単位で記述するプログラミング言語 Continuation based C (以下CbC) を開発している.
コードセグメントは並列実行の単位として使うことができ, プログラムの正しさを示す単位としても使用することができる.これにより,
 Many Core での並列実行を高い性能と高い信頼性で実現することができると考えている.

CbC のコンパイルには元々 Micoro-C 版の独自のコンパイラを用いていたが,
2008年の研究において GCC-4.2 ベースの CbC コンパイラが開発され,
2010年には GCC-4.4 へとアップデートが行われた.
GCC への実装により,GCC の最適化やデバッガの機能を使うことができより実用的な CbC プログラミングが行えるようになった.
%以来,GCC のアップデートに合わせて GCC ベースの CbC コンパイラのアップデートを行って来ている.
%今回,CbC コンパイラを GCC-4.6 へとアップデートを行った.
%本論文では, CbC,GCC の簡単な説明と,GCC-4.6 への実装を述べる.
だが, GCC をベースとした CbC のコンパイラ (以下 CbC-GCC)は, GCC のアップデートに合わせて変更する必要がある.
本研究では, GCC-4.5 をベースとしていた CbC-GCC を GCC-4.6 へのアップデートを行い, Intel64 に対応するとともに, CbC の拡張を行う.


%}{

\section{Continuation based C (CbC)}
CbC のプログラムはコードセグメント毎に記述され, コード間をgoto(軽量継続)により処理を移る.
構文は C と同じであるが, ループ制御や関数コールが取り除かれる.

%Continuation based C (以下CbC) は当研究室で開発しているプログラミング言語である.
%構文は C と同じであるが,ループ制御や関数コールを取り除き継続(goto)を用いている.
%また,コードセグメント単位で処理を記述するという特徴がある.
%図\ref{fig:cs}は CbC におけるプログラムの処理の流れを表している.


\subsection{継続(goto)}
コードセグメントの記述は C の関数の構文と同じで, 型に ``\verb+__code+'' を使うことで宣言できる.
コードセグメントへの移動は ``goto'' の後にコードセグメント名と引数を並べて記述することで行える.
図\ref{fig:cs}はコードセグメント間の処理の流れを表している.

%コードセグメントへと移った処理は C の関数と違って呼び出し元の関数に戻ることはない.
%コードセグメントは自身の処理が終えると goto により次のコードセグメントへと処理に移る.
%この goto によるコードセグメント間の移動を継続と言う.
%継続の実態は jmp による関数の移動となる.

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.35}{\includegraphics{figure/codesegment.eps}}
  \end{center}
  \caption{コードセグメント間の継続(goto)}
  \label{fig:cs}
\end{figure}

\subsection{コードセグメント(code segment)}
コードセグメントは C の関数と違って返り値を持たず, 処理が終われば次のコードセグメントへと処理を移る.
C において関数呼び出しを繰り返し行う場合, 呼び出された関数の引数の数だけスタックに値が積まれていく.
だが, 返り値を持たないコードセグメントではスタックに値を積んでいく必要な無く, スタックは変更されない.

軽量継続により並列化, ループ制御, 関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようになる.

図\ref{fig:factorial}は CbC で書いたプログラムの例である.
与えられた数 x の階上を計算して出力するプログラムとなっている.

\begin{figure}
\lstinputlisting[language=c]{source/factorial.cbc}
\caption{階上を計算する CbC プログラムの例}
\label{fig:factorial}
\end{figure}

%CbC におけるプログラムの基本単位としてコードセグメントという概念がある.
%コードセグメントの記述の仕方は C の関数と同じだが, 型に ``\_\_code''を使って宣言を行うところだけが違う.
%関数と同じように引数を持たせて継続させることもできる.
%しかし,関数とは違ってリターンを行わない為返り値を取得することはできない.

%コードセグメントは関数よりも小さな単位で記述される為,最適化がされやすくなる.
%コードセグメントの記述の仕方は C の関数と同じで,引数を持たせて継続を行うことができる.
\section{GCCの3つの内部表現}
GCC-4.6 への実装の前に,GCC で扱われる3つの内部表現について触れておく.

\subsection{3つの内部表現}
GCC は内部で Generic Tree, GIMPLE, RTL という3つの内部表現を扱う.
それぞれが
読み込んだソースコードは Generic Tree, GIMPLE, RTL の順に変換されていき,
最後にアセンブラ言語へと出力される.
図\ref{fig:ir}は GCC がソースコードを読み込みアセンブラ言語出力までの流れを表した図である.

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.35}{\includegraphics{figure/ir.eps}}
  \end{center}
  \caption{GCC によるコンパイルの一連の流れ}
  \label{fig:ir}
\end{figure}


\subsubsection{Generic Tree}
ソースコードより読み込んだ関数の情報を木構造で表したものが Generic Tree となる.
関数の返り値,引数,変数の型,条件式とプログラムの処理全てが木構造で表される.
CbC の実装では parse の部分からこの Generic Tree 生成の部分に手が加わっている.


\subsubsection{GIMPLE}
Generic Tree で表現されたデータは GIMPLE というデータ構造に変換される.
GIMPLE も Generic Tree と同じ構文木だが、より制約がかかった状態で作成された構文木となる.
制約は「1つの枝に4つ以上の子を持たせない」等といったもので,
GIMPLE へと変換されたデータは Generic Tree より簡単な命令で表されることになり最適化がかけやすくなる.
CbC の実装では特に修正は加えていない.


\subsubsection{Register Transfer Language (RTL)}
構文木 GIMPLE は解析が行われた後 RTL へと変換される.
RTL はレジスタの割り当てといった低レベルの表現で,アセンブラとほぼ同じ表現を行うことができる.
プログラム内部では RTL も木構造で表される.

CbC における継続は,この RTL への変換で行われる最適化の1つ Tail Call Elimination が重要となってくる.


\section{GCC-4.6 への実装}
前節までで CbC の基本仕様と GCC でのアセンブラ出力までの流れを確認した.
ここからは GCC-4.6 への実装について述べていく.


%\subsection{``\_\_code'' のパース}

\subsection{Tail Call Elimination}
CbC の継続の実装には GCC の最適化の1つ, Tail Call Elimination (末尾除去) を強制することで実装する.
これにより, コードセグメント間の移動を, call ではなく jmp 命令で実現する.
%Tail Call Elimination とは関数の最後の処理で別の関数呼び出しを行った際に,
%call ではなく jmp を用いることができるという最適化である.
図\ref{fig:continue}は Tail Call Elimination が行われた際のプログラムの処理を表している.

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.35}{\includegraphics{figure/continuation.eps}}
  \end{center}
  \caption{Tail Call Elimination}
  \label{fig:continue}
\end{figure}
funcB は jmp 命令で funcC を呼び出す.
funcC は,返り値を funcB ではなく funcA へと返すことになる.

\subsubsection{expand\_call}
ある関数が Tail Call Elimination を行えるかどうかは \verb+expand_call+ 関数で判断される.
\verb+expand_call+ 関数内でチェックされる Tail Call Elimination が行える条件は以下になる.

\begin{itemize}
  \item caller 側と callee 側の戻値の型が一致している.
  \item 関数呼び出しがリターンの直前に行われている.
  \item 呼出先関数の引数に用いられるスタックサイズが呼出元関数のそれより少ない.
  \item 引数の並びのコピーに上書きがない.
\end{itemize}

CbC の実装では上記の条件を,以下の様にして解決させている.

\begin{itemize}
  \item コードセグメントは void 型で統一する. Cの関数からコードセグメントに goto する場合は返す値の型チェックを行わない.
  \item goto の直後に retrun を置く.
  \item スタックサイズは関数宣言時に決まったサイズにする.
  \item 引数は一旦, 一時変数にコピーして重なりがないようにする.
\end{itemize}

スタックサイズを決め打ちで行うことで,ベースポインタを変えずにスタックを扱うことができる.
これも CbC の1つの特徴である.
図\ref{fig:cs_stack}はコードセグメントの継続の際にスタックに積まれる引数を表している.

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.33}{\includegraphics{figure/cs_stack.eps}}
  \end{center}
  \caption{継続による引数のスタック格納の様子}
  \label{fig:cs_stack}
\end{figure}

%GCCでは, この他にもTCEを禁止するルールがあり, GCC-4.5, 4.6 でも
%Tail Call Elimination にかからないコードセグメントがある.
%この点を改善する必要がある.


%\subsection{引数の一時変数への避難}
%\subsection{スタック書き換えの問題}
\subsection{引数の並びの上書きコピー}
CbC の継続では, 引数渡しでスタックを入れ替える為値が書き換えられる可能性がでてくる.
例えばlistlising\ref{code:cs_prog}のような継続である.
\begin{figure}[h]
  \begin{minipage}[b]{.45\textwidth}
    \begin{lstlisting}[caption=,label=code:cs_prog]
__code cs_a(int a, int b) {
        goto cs_b(b, a)
}
    \end{lstlisting}
  \end{minipage}
  \hfill
\end{figure}

この時のスタックの様子を表したのが図\ref{fig:cs_prog}となる.

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.33}{\includegraphics{figure/cs_prog.eps}}
  \end{center}
  \caption{スタック書き換えの問題}
  \label{fig:cs_prog}
\end{figure}

数字の 1 と 2 は \verb+cs_b+ の引数をスタックに乗せる順を表している.
CbC ではこの問題を一時変数に引数の値を代入することで問題を解決している.

\subsubsection{一時変数へのコピー}
一時変数へのコピーは, goto が行われた時の, コードセグメントの Generic Tree 生成時に行われる.

図\ref{fig:cbc_replace}に示す \verb+cbc_replace_arguments+ 関数が実際のコードとなる.
%\begin{figure}
%\lstinputlisting[language=c]{source/cbc_replace_arguments.c}
%\caption{引数の一時変数へのコピー}
%\label{fig:cbc_replace}
%\end{figure}

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.33}{\includegraphics{figure/cbc_replace.eps}}
  \end{center}
  \caption{引数の一時変数へのコピー}
  \label{fig:cbc_replace}
\end{figure}


具体的には, 内部で以下の事が行われている.
\begin{itemize}
\item 引数と同じ型の一時変数を作成
\item 一時変数に引数の値を代入
\item 関数に渡す引数のポインタを一時変数に変更
\end{itemize}

tree call は継続を行うコードセグメントになる.
コードセグメントに渡された引数の情報を抜き出す部分が \verb+FOR_EACH_CALL_EXPR_ARG+ である.
 \verb+tmp_decl+ という一時変数を作り,最後に \verb+CALL_EXPR_ARG+ を使って引数の情報が入っていた
ところへ一時変数を入れている.



\subsection{環境付き継続}
CbC には通常の C の関数からコードセグメントに継続する際,
 その関数から値を戻す処理への継続を得ることができる.
これを環境付き継続という.
これらは, 以下の二種類の CbC で定義した特殊変数である.
\verb+__environment+ は, 環境を表す情報である.
\verb__return+ は,  これを環境付き継続の行き先であり, 関数の戻値と \verb+__environment+ の二つの引数を持つ
コードセグメントである. 例えば, 以下のように使うと, \verb+main()+ は 1 を返す.

\begin{verbatim}
__code c1(__code ret(int,void *),void *env) {
    goto ret(1,env);
}

int main() {
    goto c1(__return, __environment);
}
\end{verbatim}

GCC内部では, \verb+__return+ は, 関数内で定義された \verb+_cbc_internal_return+関数へのポインタを返す.
戻値は, \verb+cbc_internal_return+ 関数内で定義された変数\verb+retval+を通して返される(Listing\ref{code:_ret_val}).

\begin{figure}[h]
  \begin{minipage}[b]{.45\textwidth}
    \begin{lstlisting}[caption=環境付き継続を行うコード,label=code:_ret_val]
__label__ _cbc_exit0;
static int retval; // should be thread local
void _cbc_internal_return(int retval_, void *_envp){
  retval = retval_;
  goto _cbc_exit0;
}
if (0) {
 _cbc_exit0:
  return retval;
 }
_cbc_internal_return;
    \end{lstlisting}
  \end{minipage}
  \hfill
\end{figure}

\subsubsection{環境付き継続の問題}
現在環境付き継続は
このコードを GCC 内部で生成することで実現している. これは正しく動作しているが,
 \verb+retval+に static を指定してしまうと,
 スレッドセーフな実装でなくなる.
これを通常の変数にすると, 関数内の関数は closure として実装される. しかし, GCC 4.6 と Lion の
組合せでは closure は正しく動作してないことがわかった. 
Thread local 変数を用いると, やはり closure が出力されてしまう.
本来は, 戻値用のレジスタが使用されれば問題ないが, 戻値の型は整数やポインタとは限らず,
浮動小数点や構造体自体である可能性があり複雑である. 
一つの解決策はレジスタ渡しと考えているが, 他の方法もありえる. 少し重いが setjmp を用いた実装方法もある.


\subsection{引数渡し}
通常コードセグメントの継続において, 引数は C の関数と同じスタックを用いて渡される.
 GCC には引数渡しをスタックではなくレジスタを用いて行う機能として fastcall がある.
 fastcall を用いてコードセグメント間を継続することで, 速度の向上を図る.

\subsubsection{fastcall}
C において fastcall を用いる場合は関数にキーワード ``\verb+__attribute__ ((fastcall))+'' をつけて行う.
だが, コードセグメントを全てこのキーワードをつけて宣言することは実用できではない.
そこで, コードセグメントで宣言された場合, fastcall が自動で付くように実装を行う.
図\ref{fig:fastcall}はコードセグメントに fastcall 属性を付与しているコードである.

%\lstinputlisting[language=c]{source/fastcall.c}

\begin{figure}[htpb]
  \begin{center}
\scalebox{0.33}{\includegraphics{figure/fastcall.eps}}
  \end{center}
  \caption{コードセグメントへのfastcall属性付与}
  \label{fig:fastcall}
\end{figure}

13,14 行目が fastcall 属性を付与している部分になる.
if 文で条件を決めているのは, 64 bit の場合 fastcall が標準で行われていて,
 warning を出すからである.


\subsection{typedefrecの実装の構想}
C では関数や構造体の宣言の時に自分自身を引数にすることができない。
そこで ``typedefrec'' という構文を作り、図\ref{code:typedefrec}のような宣言を行えるようにしたい。

%C を基本としている CbC には型推論がない.

\begin{figure}[h]
  \begin{minipage}[b]{.45\textwidth}
    \begin{lstlisting}[caption=typedefrecの例,label=code:typedefrec]
typedefrec void *funcA(int, funcA);

typedefrec struct {
  NODE left;
  NODE right;
} *NODE;
    \end{lstlisting}
  \end{minipage}
  \hfill
\end{figure}

typedefrec によりコードセグメントは自分自身に戻る構成ができる.
より柔軟なプログラミングが行えるように typdefrec の実装を行う予定である.


\section{評価}
今回実装を行った GCC-4.6 ベースのコンパイラを GCC-4.4 ベース,
Micro-C コンパイラとそれぞれ比較を行った.
比較を行うのはクイックソートのプログラムである.
クイックソートは再帰的にプログラムされる為 CbC に向いている
プログラムだと言える.
比較を行うのは以下のアーキテクチャと OS になる.

%\begin{description}
\begin{itemize}
  \item x86/Linux
  \item x86/OS X
\end{itemize}
%\end{description}

また,比較を行うプログラムは最適化(-O0 オプション)を行わないものと,
速度最適化(-O2 -fomit-frame-pointer)を行うものの2つ,
それと -m32 オプションと -m64 オプションをつけたものそれぞれで行う.

表\ref{tab:speed-mc-vs-gcc-nonopt}が最適化無し,
表\ref{tab:speed-mc-vs-gcc-opt}が速度最適化有りとなる.


\begin{table}[htpb]
  \centering
  \small
  \begin{tabular}{|c|c|c|c|} \hline
      CPU/OS      &GCC-4.4& GCC-4.6 &Micro-C  \\ \hline
    x86/Linux     & 7.378 & 0.829 & 2.890 \\ \hline
 x86\_64/OS X(-m32)& 3.890 & 0.382 & 2.288 \\ \hline
 x86\_64/OS X      & 4.078 & 0.450 &        \\ \hline
  \end{tabular}
  \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(最適化無し)}
  \label{tab:speed-mc-vs-gcc-nonopt}
\end{table}


\begin{table}[htpb]
  \centering
  \small
  \begin{tabular}{|c|c|c|c|} \hline
      CPU/OS      &GCC-4.4& GCC-4.6 &Micro-C  \\ \hline
    x86/Linux     & 3.252 & 2.906 & 2.890 \\ \hline
 x86\_64/OS X(-m32)& 1.827 & 0.934 & 2.288 \\ \hline
 x86\_64/OS X      & 1.101 & 2.896 &        \\ \hline
  \end{tabular}
  \caption{アーキテクチャ毎のGCCとmicro-cの速度比較(単位: 秒)(速度最適化)}
  \label{tab:speed-mc-vs-gcc-opt}
\end{table}

\nocite{kono:2002a, kono:2008a, yogi:2008a, gcc_internals}
\bibliographystyle{junsrt}
\bibliography{cbc.bib}

\end{document}
\ No newline at end of file