/*	
 *	frambary.c
 *
 *	斈梡價僢僩攝楍
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2016 Naoyuki Sawa
 *
 *	* Tue Dec 20 00:06:44 JST 2011 Naoyuki Sawa
 *	- 1st 儕儕乕僗丅
 *	* Thu Nov 20 20:22:14 JST 2014 Naoyuki Sawa
 *	- 婛懚偺LSB愭峴僶乕僕儑儞偵壛偊偰丄MSB愭峴僶乕僕儑儞傪嶌惉偟傑偟偨丅
 *	- 婛懚偺bitarray_get(),bitarray_set()傪丄bitarray_lsb1st_get(),bitarray_lsb1st_set()偵柤徧曄峏偟傑偟偨丅
 *	- 怴婯偵丄bitarray_msb1st_get(),bitarray_msb1st_set()傪捛壛偟傑偟偨丅
 *	  bitarray_msb1st_get(),bitarray_msb1st_set()偼傑偩丄傾僙儞僽儔壔偟偰偄傑偣傫丅
 *	* Sat Nov 22 11:57:45 JST 2014 Naoyuki Sawa
 *	- bitarray_msb1st_get()傪傾僙儞僽儔壔偟傑偟偨丅
 *	  張棟偺彉斦乣拞斦偼丄婛懚偺bitarray_lsb1st_get()偺傾僙儞僽儔斉偲傎傏摨偠偱丄僔僼僩曽岦偑堘偆偩偗偱偡丅
 *	  張棟偺廔斦偼丄婛懚偺bitarray_lsb1st_get()偲堎側傝丄儅僗僋傪庢傞昁梫偑柍偄偺偱丄傛傝扨弮偵側傝傑偟偨丅
 *	- HuffmanDecoder_Decode()偐傜巊梡偟偰丄C尵岅斉偲摨偠寢壥偵側傞偙偲傪摦嶌妋擣偟傑偟偨丅
 *	  HuffmanDecoder_Decode()偱丄栺39KB佀栺62KB偺揥奐傪峴偭偨帪偺懍搙偑丄栺1.203昩佀栺1.106昩偵崅懍壔偟傑偟偨丅(Clock=48MHz,Stack=FRAM)
 *	  bitarray_msb1st_get()扨懱偱丄偳傟偖傜偄崅懍壔偟偨偐偼丄傑偩寁應偟偰偄傑偣傫丅
 *	* Sat Nov 22 13:00:53 JST 2014 Naoyuki Sawa
 *	- bitarray_msb1st_set()傪傾僙儞僽儔壔偟傑偟偨丅
 *	  張棟偺彉斦偲廔斦偼丄婛懚偺bitarray_lsb1st_set()偺傾僙儞僽儔斉偲傎傏摨偠偱丄僔僼僩曽岦偑堘偆偩偗偱偡丅
 *	  張棟偺拞斦偼丄婛懚偺bitarray_lsb1st_set()偲堎側傝丄儅僗僋偲抣傪偦傟偧傟偵僔僼僩偡傞傛偆偵側傝傑偟偨丅
 *	- HuffmanEncoder_Encode()偐傜巊梡偟偰丄C尵岅斉偲摨偠寢壥偵側傞偙偲傪摦嶌妋擣偟傑偟偨丅
 *	  HuffmanEncoder_Encode()偱丄栺62KB佀栺39KB偺埑弅傪峴偭偨帪偺懍搙偑丄栺12.91昩佀栺12.69昩偵崅懍壔偟傑偟偨丅(Clock=48MHz,Stack=FRAM)
 *	  bitarray_msb1st_set()扨懱偱丄偳傟偖傜偄崅懍壔偟偨偐偼丄傑偩寁應偟偰偄傑偣傫丅
 *	* Sat Nov 29 10:50:31 JST 2014 Naoyuki Sawa
 *	- bitarray_lsb1st_get(),bitarray_msb1st_get()傪丄clipbary.c偐傜frambary.c傊暘棧偟傑偟偨丅
 *	  HuffmanDecoder_Decode()偱丄栺39KB佀栺62KB偺揥奐傪峴偭偨帪偺懍搙偑丄埲壓偺傛偆偵崅懍壔偟傑偟偨丅(Clock=48MHz,Code=FRAM,Stack=FRAM)
 *	  崅懍RAM偵攝抲偡傞儌僕儏乕儖:柍偟                佀栺0.756昩
 *	  崅懍RAM偵攝抲偡傞儌僕儏乕儖:frambary.o          佀栺0.586昩
 *	  崅懍RAM偵攝抲偡傞儌僕儏乕儖:framhfm.o           佀栺0.418昩
 *	  崅懍RAM偵攝抲偡傞儌僕儏乕儖:frambary.o+framhfm.o佀栺0.248昩
 *	* Thu Dec 11 21:02:26 JST 2014 Naoyuki Sawa
 *	- bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偵丄bits=0傪巜掕偱偒傞傛偆偵曄峏偟傑偟偨丅
 *	  偙傟傑偱偼丄bits=1乣32偱偟偨偑丄崱屻偼丄bits=0乣32偲側傝傑偡丅
 *	  bits=0傪嫋梕偟偨棟桼偼丄屇傃弌偟懁偺張棟偺搒崌忋bits=0偲側傝摼傞働乕僗偑傛偔桳傝丄屇傃弌偟懁偱敾抐偟偰屇傃弌偟傪夞旔偡傞傛傝傕丄摉儌僕儏乕儖懁偱敾抐偡傞曽偑曋棙偱偁傞偲峫偊偨偐傜偱偡丅
 *	- 崱夞曄峏傪峴偭偨売強偼丄bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偺C尵岅斉偺傒偱偡丅
 *	  bitarray_lsb1st_get(),bitarray_msb1st_get()偼丄張棟偺愭摢偱bits=0偱偁傞偐敾抐偟偰丄偦偆側傜偽0傪曉偡傛偆偵摿椺張棟傪捛壛偟傑偟偨丅
 *	  bitarray_lsb1st_set(),bitarray_msb1st_set()偼丄張棟偺愭摢偱bits=0偱偁傞偐敾抐偟偰丄偦偆側傜偽壗傕偣偢偵婣傞摿椺張棟傪捛壛偟傑偟偨丅
 *	  C尵岅斉偱丄忋婰偺摿椺張棟偑昁梫偱偁傞棟桼偼丄bits=0偺帪偵偦偺傑傑張棟傪峴偆偲丄(32-bits)價僢僩偺僔僼僩傪峴偆売強偑偁傝丄32價僢僩偺僔僼僩偑敪惗偟偰偟傑偆偐傜偱偡丅
 *	  C尵岅偺巇條偵傛傝丄32價僢僩偺僔僼僩偼晄壜偱偁傝丄偨偲偊偽x86偱偼0價僢僩僔僼僩偲摨偠埖偄偲側傝丄娫堘偭偨寢壥偵側偭偰偟傑偆偐傜偱偡丅
 *	- 崱夞偺曄峏偵偍偄偰丄bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偺Asm斉偼丄壗傕曄峏偟偰偄傑偣傫丅
 *	  Asm斉偺張棟偼丄婛偵32價僢僩偺僔僼僩偵傕懳墳偱偒傞傛偆偵嶌惉偝傟偰偍傝丄偦偺傑傑張棟傪峴偭偰傕惓偟偄寢壥偲側傞偐傜偱偡丅
 *	  C尵岅斉偺曄峏偲摨條偵丄張棟偺愭摢偱摿椺張棟傪峴偭偰傕峔偄傑偣傫偑丄僐乕僪僒僀僘偑憹偊傞偩偗偱柍懯側偺偱丄摿椺張棟偺捛壛傪峴傢側偄偙偲偵偟傑偟偨丅
 *	  bits=0偱屇傃弌偝傟傞働乕僗傛傝傕丄偦偆偱側偄働乕僗偺曽偑懡偄偺偱丄bits=0偺応崌偩偗偺惈擻岦忋傪恾偭偰摿椺張棟傪捛壛偡傞偙偲偼丄摼嶔偱偼偁傝傑偣傫丅
 *	* Thu Dec 11 22:00:00 JST 2014 Naoyuki Sawa
 *	- bitarray_lsb1st_test(),bitarray_msb1st_test()傪捛壛偟傑偟偨丅
 *	  巊梡昿搙偼掅偄偲巚偆偺偱丄frambary.c偱偼側偔clipbary.c偵娷傔傑偟偨丅
 *	* Mon Oct 19 22:47:19 JST 2015 Naoyuki Sawa
 *	- bitarray_lsb1st_copy(),bitarray_msb1st_copy()傪捛壛偟傑偟偨丅
 *	  巊梡昿搙偼掅偄偲巚偆偺偱丄frambary.c偱偼側偔clipbary.c偵娷傔傑偟偨丅
 *	* Tue Dec 27 21:52:53 JST 2016 Naoyuki Sawa
 *	- Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
 *	  曄峏慜偼丄S1C33 ABI巇條捠傝偺儗僕僗僞傪攋夡偟偰偄傑偟偨偑丄曄峏屻偼丄%r9,%r10,%r12,%r13,%psr偩偗傪攋夡偡傞傛偆偵側傝傑偟偨丅
 *	  S1C33 ABI巇條偱攋夡偟側偄帠傪曐徹偡傞%r0乣%r3偵壛偊偰丄%r4乣%r7,%r11,%r14,%r15,%alr,%ahr傕攋夡偟側偄帠傪曐徹偟傑偡丅
 *	- 偙偺傛偆偵曄峏偟偨棟桼偼丄摉娭悢偼懍搙偑廳梫側張棟偐傜屇傃弌偝傟傞帠偑懡偔丄屇傃弌偟懁偺張棟偵偍偄偰丄彮偟偱傕儗僕僗僞偺戅旔/暅婣傪彮側偔偟偨偄偲巚偭偨偐傜偱偡丅
 *	  婛偵丄ksvec200.s偺__divsi3傗framflt1.s偺__addsf3摍偱懳嶔傪峴偭偰偄傑偡偑丄崱夞丄bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偵傕摨條偺懳嶔傪峴偆帠偵偟傑偟偨丅
 *	- 崱夞偺曄峏偺偨傔偵丄Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰慡懱傪曄峏偟丄偙傟傑偱巆偟偰偄偨曄峏僐儊儞僩傪嶍彍偟傑偟偨丅
 *	  偟偐偟丄巊梡偡傞儗僕僗僞偺曄峏傗丄張棟弴彉偺曄峏傪峴偭偨偩偗偱丄Asm斉偺傾儖僑儕僘儉帺懱偼曄峏偟偰偄傑偣傫丅柦椷悢偼曄傢偭偰偄側偄偟丄懍搙傕曄傢偭偰偄側偄偼偢偱偡丅
 *	  Asm斉偺嵟揔壔偺宱堒摍偵偮偄偰偼丄曄峏慜偺僐乕僪(僐儊儞僩傾僂僩偟偰巆偟偰偁傝傑偡)偺拞偺僐儊儞僩傪嶲徠偟偰壓偝偄丅
 */
#include "clip.h"

/*****************************************************************************
 *	
 *****************************************************************************/

#ifndef PIECE
int bitarray_lsb1st_get(const void* ptr, int pos, int bits) {
	//
	//	                                              s2               s1
	//	                                              /                /
	//	                                        +----------+----------------------+
	//	MSB|........ .......x xxxxxxxx xxxxxxxx|xxxxxxxx xxx..... ........ ........|LSB
	//	                    +------------------------------+                      |
	//	                                   /               |                      |
	//	                                 bits             pos                     p
	//	             mask = 1_11111111_11111111_11111111_111
	//
	int value;
	int s1;
	int s2;
	const int* p;
//{{2014/12/11曄峏:bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偵丄bits=0傪巜掕偱偒傞傛偆偵曄峏偟傑偟偨丅
//	/* 1bit枹枮丄媦傃丄32bit挻夁偺憖嶌偼懳墳偟偰偄傑偣傫丅 */
//	if((bits < 1) || (bits > 32)) { DIE(); }
//伀2014/12/11曄峏:bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偵丄bits=0傪巜掕偱偒傞傛偆偵曄峏偟傑偟偨丅
	/* 32bit挻夁偺憖嶌偼懳墳偟偰偄傑偣傫丅 */
	if((unsigned)bits > 32) { DIE(); }
	/* bits=0側傜偽丄0傪曉偟傑偡丅 */
	if(!bits) { return 0; }
//}}2014/12/11曄峏:bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偵丄bits=0傪巜掕偱偒傞傛偆偵曄峏偟傑偟偨丅
	/* 32bit扨埵偺億僀儞僞傪媮傔傑偡丅 */
	p = (const int*)ptr + (pos >> 5);
	/* p[0]偺埵抲偺int抣偵娷傑傟傞丄晄梫bit悢傪媮傔傑偡丅 */
	s1 = pos & 31;	/* 0乣31 */
	/* p[0]偺埵抲偺int抣偵娷傑傟傞丄昁梫bit悢傪媮傔傑偡丅 */
	s2 = 32 - s1;	/* 1乣32 */
	/* p[0]偺埵抲偺int抣偐傜丄昁梫bit傪庢摼偟傑偡丅 */
	value = (unsigned)p[0] >> s1;
	/* p[1]偺埵抲偺int抣偵丄昁梫bit偑傑偨偑偭偰偄偨傜乧 */
	if(bits > s2) {
		/* p[1]偺埵抲偺int抣偐傜丄昁梫bit傪庢摼偟傑偡丅 */
		value |= (unsigned)p[1] << s2;
	}
	/* 晄梫bit傪儅僗僋偟傑偡丅(昁梫bit偺晞崋奼挘偼峴傢側偄) */
	value &= ((unsigned)-1 >> (32 - bits));											//{{2014/12/11僐儊儞僩:bits=0側傜偽晄惓側32價僢僩僔僼僩偑敪惗偡傞偺偱丄bits=0偱偙偙傊棃側偄傛偆摉娭悢偺愭摢偱敾抐偟偰偄傞丅}}
	return value;
}
#else /*PIECE*/
int bitarray_lsb1st_get(const void* ptr, int pos, int bits);
//{{2016/12/27曄峏:Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
//asm("
//		.code
//		.align		1
//		.global		bitarray_lsb1st_get
//bitarray_lsb1st_get:
//		;//-------------------------------------;//
//		;// %r12 := ptr
//		;// %r13 := pos
//		;// %r14 := bits
//		xand		%r4, %r13, 31		;// %r4  := s1 = pos & 31
//;//{{xld偺ext奼挘傪愡栺
//;//		xld.w		%r5, 32			;// %r5  := s2 = 32 - s1
//;//		sub		%r5, %r4
//;//伀xld偺ext奼挘傪愡栺
//		not		%r5, %r4		;// %r5  := s2 = 32 - s1 = 33 + ~s1
//		add		%r5, 33
//;//}}xld偺ext奼挘傪愡栺
//		srl		%r13, 5			;// %r12 := p = (const int*)ptr + (pos >> 5)
//		sll		%r13, 2
//		add		%r12, %r13
//		;//-------------------------------------;//
//		;// %r4  := s1
//		;// %r5  := s2
//		;// %r12 := p
//		;// %r14 := bits
//		ld.w		%r10, [%r12]+		;// %r10 := value = (unsigned)p[0]
//;//{{%r4傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔
//;//		xsrl		%r10, %r4		;// %r10 := value = (unsigned)p[0] >> s1
//;//伀%r4傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔
//		cmp		%r4, 8			;//<---+
//		jrle		4			;//--+ |
//		srl		%r10, 8			;//  | |
//		jp.d		-3			;//--|-+
//		sub		%r4, 8			;//  |							*delay*
//		srl		%r10, %r4		;//<-+
//;//}}%r4傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔
//		;//-------------------------------------;//
//		;// %r5  := s2
//		;// %r10 := value
//		;// %r12 := p
//		;// %r14 := bits
//		cmp		%r14, %r5		;// if(bits > s2)
//		jrle.d		10			;//---------------------------------------------+
//		 ld.w		%r6, -1			;//   %r6  := -1				|	*delay*
//		 ld.w		%r11, [%r12]		;//   %r11 := (unsigned)p[1]			|
//;//{{%r5傪攋夡偟偰傕椙偄偺偱xsll傪嵟揔壔		;//						|
//;//		 xsll		%r11, %r5		;//   %r11 := (unsigned)p[1] << s2		|
//;//伀%r5傪攋夡偟偰傕椙偄偺偱xsll傪嵟揔壔		;//						|
//		 cmp		%r5, 8			;//<---+					|
//		 jrle		4			;//--+ |					|
//		 sll		%r11, 8			;//  | |					|
//		 jp.d		-3			;//--|-+					|
//		 sub		%r5, 8			;//  |						|	*delay*
//		 sll		%r11, %r5		;//<-+						|
//;//}}%r5傪攋夡偟偰傕椙偄偺偱xsll傪嵟揔壔		;//						|
//		 or		%r10, %r11		;// %r10 := value |= (unsigned)p[1] << s2	|
//		;//-------------------------------------;//<--------------------------------------------+
//		;// %r6  := -1
//		;// %r10 := value
//		;// %r14 := bits
//;//{{xld偺ext奼挘傪愡栺
//;//		xld.w		%r7, 32			;// %r7  := 32 - bits
//;//		sub		%r7, %r14
//;//伀xld偺ext奼挘傪愡栺
//		not		%r7, %r14		;// %r7  := 32 - bits = 33 + ~bits
//		add		%r7, 33
//;//}}xld偺ext奼挘傪愡栺
//;//{{%r7傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔
//;//		xsrl		%r6, %r7		;// %r6  :=          (unsigned)-1 >> (32 - bits)
//;//伀%r7傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔
//		cmp		%r7, 8			;//<---+								//{{2014/12/11僐儊儞僩:Asm斉偼32價僢僩僔僼僩壜擻側偺偱丄C尵岅斉偺傛偆側摿椺張棟偼晄梫偱丄捠忢偲摨偠曽朄偱張棟偟偰峔傢側偄丅}}
//		jrle		4			;//--+ |
//		srl		%r6, 8			;//  | |
//		jp.d		-3			;//--|-+
//		sub		%r7, 8			;//  |							*delay*
//		srl		%r6, %r7		;//<-+
//;//}}%r7傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔
//		ret.d
//		and		%r10, %r6		;// %r10 := value &= (unsigned)-1 >> (32 - bits)	*delay*
//");
//伀2016/12/27曄峏:Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
//劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅
// * Tue Dec 27 21:52:53 JST 2016 Naoyuki Sawa
// - Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
//   曄峏慜偼丄S1C33 ABI巇條捠傝偺儗僕僗僞傪攋夡偟偰偄傑偟偨偑丄曄峏屻偼丄%r9,%r10,%r12,%r13,%psr偩偗傪攋夡偡傞傛偆偵側傝傑偟偨丅
//   S1C33 ABI巇條偱攋夡偟側偄帠傪曐徹偡傞%r0乣%r3偵壛偊偰丄%r4乣%r7,%r11,%r14,%r15,%alr,%ahr傕攋夡偟側偄帠傪曐徹偟傑偡丅
// - 偙偺傛偆偵曄峏偟偨棟桼偼丄摉娭悢偼懍搙偑廳梫側張棟偐傜屇傃弌偝傟傞帠偑懡偔丄屇傃弌偟懁偺張棟偵偍偄偰丄彮偟偱傕儗僕僗僞偺戅旔/暅婣傪彮側偔偟偨偄偲巚偭偨偐傜偱偡丅
//   婛偵丄ksvec200.s偺__divsi3傗framflt1.s偺__addsf3摍偱懳嶔傪峴偭偰偄傑偡偑丄崱夞丄bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偵傕摨條偺懳嶔傪峴偆帠偵偟傑偟偨丅
// - 崱夞偺曄峏偺偨傔偵丄Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰慡懱傪曄峏偟丄偙傟傑偱巆偟偰偄偨曄峏僐儊儞僩傪嶍彍偟傑偟偨丅
//   偟偐偟丄巊梡偡傞儗僕僗僞偺曄峏傗丄張棟弴彉偺曄峏傪峴偭偨偩偗偱丄Asm斉偺傾儖僑儕僘儉帺懱偼曄峏偟偰偄傑偣傫丅柦椷悢偼曄傢偭偰偄側偄偟丄懍搙傕曄傢偭偰偄側偄偼偢偱偡丅
//   Asm斉偺嵟揔壔偺宱堒摍偵偮偄偰偼丄曄峏慜偺僐乕僪(僐儊儞僩傾僂僩偟偰巆偟偰偁傝傑偡)偺拞偺僐儊儞僩傪嶲徠偟偰壓偝偄丅
//劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅
asm("
		.code
		.align		1
		.global		bitarray_lsb1st_get
bitarray_lsb1st_get:
		;//劕劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劜廳丂梫劙劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劖
		;//劔* Tue Dec 27 21:52:53 JST 2016 Naoyuki Sawa                                                                                                     劔
		;//劔- Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偼丄%r4,%r5,%r6,%r7,%r11,%r14,%r15,%alr,%ahr偺抣傪曄峏偟傑偣傫丅                           劔
		;//劔  S1C33 ABI巇條偵廬偭偰抣傪堐帩偡傞%r0,%r1,%r2,%r3偵壛偊偰丄%r4,%r5,%r6,%r7,%r11,%r14,%r15,%alr,%ahr偺抣傕堐帩偟傑偡丅                          劔
		;//劔  屇傃弌偟懁僾儘僌儔儉偼丄%r0,%r1,%r2,%r3,%r4,%r5,%r6,%r7,%r11,%r14,%r15,%alr,%ahr偺抣偑曄峏偝傟側偄偙偲傪慜採偵丄儗僕僗僞巊梡傪嵟揔壔偱偒傑偡丅劔
		;//劘劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劗
		;//-------------------------------------;//
		;//%r12 := ptr
		;//%r13 := pos
		;//%r14 := bits
		xand		%r9, %r13, 31		;//%r9  := s1 = pos & 31
		srl		%r13, 5			;//%r13 :=                        pos >> 5
		sll		%r13, 2			;//%r13 :=                       (pos >> 5) * sizeof(int)
		add		%r12, %r13		;//%r12 := p = (const int*)ptr + (pos >> 5)
		not		%r13, %r9		;//%r13 := s2 =         =      ~s1
		add		%r13, 33		;//%r13 := s2 = 32 - s1 = 33 + ~s1
		;//-------------------------------------;//
		;//%r9  := s1
		;//%r12 := p
		;//%r13 := s2
		;//%r14 := bits
		ld.w		%r10, [%r12]+		;//%r10 := value = (unsigned)p[0], %r12 := &p[1]
		cmp		%r9, 8			;//仼劅劉
		jrle		4			;//劅劉劆
		srl		%r10, 8			;//丂劆劆
		jp.d		-3			;//劅劆劊
		sub		%r9, 8			;//丂劆							*delay*
		srl		%r10, %r9		;//仼劊
		;//-------------------------------------;//%r10 := value = (unsigned)p[0] >> s1
		;//%r10 := value
		;//%r12 := p
		;//%r13 := s2
		;//%r14 := bits
		cmp		%r14, %r13		;//if(bits > s2) {
		jrle.d		10			;//劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅-劉
		 not		%r9, %r14		;//%r9  :=                  ~bits		劆	*delay*
		 ld.w		%r12, [%r12]		;//  %r12 :=        (unsigned)p[1]		劆
		 cmp		%r13, 8			;//仼劅劉					劆
		 jrle		4			;//劅劉劆					劆
		 sll		%r12, 8			;//丂劆劆					劆
		 jp.d		-3			;//劅劆劊					劆
		 sub		%r13, 8			;//丂劆						劆	*delay*
		 sll		%r12, %r13		;//仼劊						劆
		 or		%r10, %r12		;//%r10 := value |= (unsigned)p[1] << s2	劆
		;//-------------------------------------;//仼劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅-劊
		;//%r9  := ~bits
		;//%r10 := value
		add		%r9, 33			;//%r9  := 32 - bits = 33 + ~bits
		ld.w		%r12, -1		;//%r12 :=          (unsigned)-1
		cmp		%r9, 8			;//仼劅劉								//{{2014/12/11僐儊儞僩:Asm斉偼32價僢僩僔僼僩壜擻側偺偱丄C尵岅斉偺傛偆側摿椺張棟偼晄梫偱丄捠忢偲摨偠曽朄偱張棟偟偰峔傢側偄丅}}
		jrle		4			;//劅劉劆
		srl		%r12, 8			;//丂劆劆
		jp.d		-3			;//劅劆劊
		sub		%r9, 8			;//丂劆							*delay*
		srl		%r12, %r9		;//仼劊	
		ret.d					;//return  value
		and		%r10, %r12		;//%r10 := value &= (unsigned)-1 >> (32 - bits)		*delay*
");
//}}2016/12/27曄峏:Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
#endif/*PIECE*/

/*****************************************************************************
 *	
 *****************************************************************************/

#ifndef PIECE
int bitarray_msb1st_get(const void* ptr, int pos, int bits) {
	//
	//	                s1               s2
	//	                /                /
	//	    +----------------------+----------+
	//	MSB|........ ........ .....xxx xxxxxxxx|xxxxxxxx xxxxxxxx x....... ........|LSB
	//	    |                      +------------------------------+               |
	//	    |                      |              /                               |
	//	    p                     pos           bits                              p
	//	                    mask = 111_11111111_11111111_11111111_1
	//
	int value;
	int s1;
	int s2;
	const int* p;
//{{2014/12/11曄峏:bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偵丄bits=0傪巜掕偱偒傞傛偆偵曄峏偟傑偟偨丅
//	/* 1bit枹枮丄媦傃丄32bit挻夁偺憖嶌偼懳墳偟偰偄傑偣傫丅 */
//	if((bits < 1) || (bits > 32)) { DIE(); }
//伀2014/12/11曄峏:bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偵丄bits=0傪巜掕偱偒傞傛偆偵曄峏偟傑偟偨丅
	/* 32bit挻夁偺憖嶌偼懳墳偟偰偄傑偣傫丅 */
	if((unsigned)bits > 32) { DIE(); }
	/* bits=0側傜偽丄0傪曉偟傑偡丅 */
	if(!bits) { return 0; }
//}}2014/12/11曄峏:bitarray_lsb1st_get(),bitarray_msb1st_get(),bitarray_lsb1st_set(),bitarray_msb1st_set()偵丄bits=0傪巜掕偱偒傞傛偆偵曄峏偟傑偟偨丅
	/* 32bit扨埵偺億僀儞僞傪媮傔傑偡丅 */
	p = (const int*)ptr + (pos >> 5);
	/* p[0]偺埵抲偺int抣偵娷傑傟傞丄晄梫bit悢傪媮傔傑偡丅 */
	s1 = pos & 31;	/* 0乣31 */
	/* p[0]偺埵抲偺int抣偵娷傑傟傞丄昁梫bit悢傪媮傔傑偡丅 */
	s2 = 32 - s1;	/* 1乣32 */
	/* p[0]偺埵抲偺int抣偐傜丄昁梫bit傪庢摼偟傑偡丅 */
	value = (unsigned)p[0] << s1;
	/* p[1]偺埵抲偺int抣偵丄昁梫bit偑傑偨偑偭偰偄偨傜乧 */
	if(bits > s2) {
		/* p[1]偺埵抲偺int抣偐傜丄昁梫bit傪庢摼偟傑偡丅 */
		value |= (unsigned)p[1] >> s2;
	}
	/* 晄梫bit傪儅僗僋偟傑偡丅(昁梫bit偺晞崋奼挘偼峴傢側偄) */
	value = (unsigned)value >> (32 - bits);											//{{2014/12/11僐儊儞僩:bits=0側傜偽晄惓側32價僢僩僔僼僩偑敪惗偡傞偺偱丄bits=0偱偙偙傊棃側偄傛偆摉娭悢偺愭摢偱敾抐偟偰偄傞丅}}
	return value;
}
#else /*PIECE*/
int bitarray_msb1st_get(const void* ptr, int pos, int bits);
//{{2016/12/27曄峏:Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
//asm("
//		.code
//		.align		1
//		.global		bitarray_msb1st_get
//bitarray_msb1st_get:
//		;//-------------------------------------;//
//		;// %r12 := ptr
//		;// %r13 := pos
//		;// %r14 := bits
//		xand		%r4, %r13, 31		;// %r4  := s1 = pos & 31
//;//{{xld偺ext奼挘傪愡栺
//;//		xld.w		%r5, 32			;// %r5  := s2 = 32 - s1
//;//		sub		%r5, %r4
//;//伀xld偺ext奼挘傪愡栺
//		not		%r5, %r4		;// %r5  := s2 = 32 - s1 = 33 + ~s1
//		add		%r5, 33
//;//}}xld偺ext奼挘傪愡栺
//		srl		%r13, 5			;// %r12 := p = (const int*)ptr + (pos >> 5)
//		sll		%r13, 2
//		add		%r12, %r13
//		;//-------------------------------------;//
//		;// %r4  := s1
//		;// %r5  := s2
//		;// %r12 := p
//		;// %r14 := bits
//		ld.w		%r10, [%r12]+		;// %r10 := value = (unsigned)p[0]
//;//{{%r4傪攋夡偟偰傕椙偄偺偱xsll傪嵟揔壔
//;//		xsll		%r10, %r4		;// %r10 := value = (unsigned)p[0] << s1
//;//伀%r4傪攋夡偟偰傕椙偄偺偱xsll傪嵟揔壔
//		cmp		%r4, 8			;//<---+
//		jrle		4			;//--+ |
//		sll		%r10, 8			;//  | |
//		jp.d		-3			;//--|-+
//		sub		%r4, 8			;//  |							*delay*
//		sll		%r10, %r4		;//<-+
//;//}}%r4傪攋夡偟偰傕椙偄偺偱xsll傪嵟揔壔
//		;//-------------------------------------;//
//		;// %r5  := s2
//		;// %r10 := value
//		;// %r12 := p
//		;// %r14 := bits
//		cmp		%r14, %r5		;// if(bits > s2)
//		jrle.d		10			;//---------------------------------------------+
//		 not		%r7, %r14		;//   %r7  :=                ~bits		|	*delay*
//		 ld.w		%r11, [%r12]		;//   %r11 := (unsigned)p[1]			|
//;//{{%r5傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔		;//						|
//;//		 xsrl		%r11, %r5		;//   %r11 := (unsigned)p[1] >> s2		|
//;//伀%r5傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔		;//						|
//		 cmp		%r5, 8			;//<---+					|
//		 jrle		4			;//--+ |					|
//		 srl		%r11, 8			;//  | |					|
//		 jp.d		-3			;//--|-+					|
//		 sub		%r5, 8			;//  |						|	*delay*
//		 srl		%r11, %r5		;//<-+						|
//;//}}%r5傪攋夡偟偰傕椙偄偺偱xsrl傪嵟揔壔		;//						|
//		 or		%r10, %r11		;// %r10 := value |= (unsigned)p[1] >> s2	|
//		;//-------------------------------------;//<--------------------------------------------+
//		;// %r7  := ~bits
//		;// %r10 := value
//		add		%r7, 33			;// %r7  := 32 - bits = 33 + ~bits
//		cmp		%r7, 8			;//<---+								//{{2014/12/11僐儊儞僩:Asm斉偼32價僢僩僔僼僩壜擻側偺偱丄C尵岅斉偺傛偆側摿椺張棟偼晄梫偱丄捠忢偲摨偠曽朄偱張棟偟偰峔傢側偄丅}}
//		jrle		4			;//--+ |
//		srl		%r10, 8			;//  | |
//		jp.d		-3			;//--|-+
//		sub		%r7, 8			;//  |							*delay*
//		ret.d					;//<-+
//		srl		%r10, %r7		;// %r10 := value = (unsigned)value >> (32 - bits)	*delay*
//");
//伀2016/12/27曄峏:Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
//劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅
// * Tue Dec 27 21:52:53 JST 2016 Naoyuki Sawa
// - Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
//   曄峏慜偼丄S1C33 ABI巇條捠傝偺儗僕僗僞傪攋夡偟偰偄傑偟偨偑丄曄峏屻偼丄%r9,%r10,%r12,%r13,%psr偩偗傪攋夡偡傞傛偆偵側傝傑偟偨丅
//   S1C33 ABI巇條偱攋夡偟側偄帠傪曐徹偡傞%r0乣%r3偵壛偊偰丄%r4乣%r7,%r11,%r14,%r15,%alr,%ahr傕攋夡偟側偄帠傪曐徹偟傑偡丅
// - 偙偺傛偆偵曄峏偟偨棟桼偼丄摉娭悢偼懍搙偑廳梫側張棟偐傜屇傃弌偝傟傞帠偑懡偔丄屇傃弌偟懁偺張棟偵偍偄偰丄彮偟偱傕儗僕僗僞偺戅旔/暅婣傪彮側偔偟偨偄偲巚偭偨偐傜偱偡丅
//   婛偵丄ksvec200.s偺__divsi3傗framflt1.s偺__addsf3摍偱懳嶔傪峴偭偰偄傑偡偑丄崱夞丄bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偵傕摨條偺懳嶔傪峴偆帠偵偟傑偟偨丅
// - 崱夞偺曄峏偺偨傔偵丄Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰慡懱傪曄峏偟丄偙傟傑偱巆偟偰偄偨曄峏僐儊儞僩傪嶍彍偟傑偟偨丅
//   偟偐偟丄巊梡偡傞儗僕僗僞偺曄峏傗丄張棟弴彉偺曄峏傪峴偭偨偩偗偱丄Asm斉偺傾儖僑儕僘儉帺懱偼曄峏偟偰偄傑偣傫丅柦椷悢偼曄傢偭偰偄側偄偟丄懍搙傕曄傢偭偰偄側偄偼偢偱偡丅
//   Asm斉偺嵟揔壔偺宱堒摍偵偮偄偰偼丄曄峏慜偺僐乕僪(僐儊儞僩傾僂僩偟偰巆偟偰偁傝傑偡)偺拞偺僐儊儞僩傪嶲徠偟偰壓偝偄丅
//劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅
asm("
		.code
		.align		1
		.global		bitarray_msb1st_get
bitarray_msb1st_get:
		;//劕劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劜廳丂梫劙劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劖
		;//劔* Tue Dec 27 21:52:53 JST 2016 Naoyuki Sawa                                                                                                     劔
		;//劔- Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偼丄%r4,%r5,%r6,%r7,%r11,%r14,%r15,%alr,%ahr偺抣傪曄峏偟傑偣傫丅                           劔
		;//劔  S1C33 ABI巇條偵廬偭偰抣傪堐帩偡傞%r0,%r1,%r2,%r3偵壛偊偰丄%r4,%r5,%r6,%r7,%r11,%r14,%r15,%alr,%ahr偺抣傕堐帩偟傑偡丅                          劔
		;//劔  屇傃弌偟懁僾儘僌儔儉偼丄%r0,%r1,%r2,%r3,%r4,%r5,%r6,%r7,%r11,%r14,%r15,%alr,%ahr偺抣偑曄峏偝傟側偄偙偲傪慜採偵丄儗僕僗僞巊梡傪嵟揔壔偱偒傑偡丅劔
		;//劘劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劒劗
		;//-------------------------------------;//
		;//%r12 := ptr
		;//%r13 := pos
		;//%r14 := bits
		xand		%r9, %r13, 31		;//%r9  := s1 = pos & 31
		srl		%r13, 5			;//%r13 :=                        pos >> 5
		sll		%r13, 2			;//%r13 :=                       (pos >> 5) * sizeof(int)
		add		%r12, %r13		;//%r12 := p = (const int*)ptr + (pos >> 5)
		not		%r13, %r9		;//%r13 := s2 =         =      ~s1
		add		%r13, 33		;//%r13 := s2 = 32 - s1 = 33 + ~s1
		;//-------------------------------------;//
		;//%r9  := s1
		;//%r12 := p
		;//%r13 := s2
		;//%r14 := bits
		ld.w		%r10, [%r12]+		;//%r10 := value = (unsigned)p[0], %r12 := &p[1]
		cmp		%r9, 8			;//仼劅劉
		jrle		4			;//劅劉劆
		sll		%r10, 8			;//丂劆劆
		jp.d		-3			;//劅劆劊
		sub		%r9, 8			;//丂劆							*delay*
		sll		%r10, %r9		;//仼劊
		;//-------------------------------------;//%r10 := value = (unsigned)p[0] << s1
		;//%r10 := value
		;//%r12 := p
		;//%r13 := s2
		;//%r14 := bits
		cmp		%r14, %r13		;//if(bits > s2) {
		jrle.d		10			;//劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅-劉
		 not		%r9, %r14		;//%r9  :=                  ~bits		劆	*delay*
		 ld.w		%r12, [%r12]		;//  %r12 :=        (unsigned)p[1]		劆
		 cmp		%r13, 8			;//仼劅劉					劆
		 jrle		4			;//劅劉劆					劆
		 srl		%r12, 8			;//丂劆劆					劆
		 jp.d		-3			;//劅劆劊					劆
		 sub		%r13, 8			;//丂劆						劆	*delay*
		 srl		%r12, %r13		;//仼劊						劆
		 or		%r10, %r12		;//%r10 := value |= (unsigned)p[1] >> s2	劆
		;//-------------------------------------;//仼劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅劅-劊
		;//%r9  := ~bits
		;//%r10 := value
		add		%r9, 33			;//%r9  := 32 - bits = 33 + ~bits
		cmp		%r9, 8			;//仼劅劉								//{{2014/12/11僐儊儞僩:Asm斉偼32價僢僩僔僼僩壜擻側偺偱丄C尵岅斉偺傛偆側摿椺張棟偼晄梫偱丄捠忢偲摨偠曽朄偱張棟偟偰峔傢側偄丅}}
		jrle		4			;//劅劉劆
		srl		%r10, 8			;//丂劆劆
		jp.d		-3			;//劅劆劊
		sub		%r9, 8			;//丂劆							*delay*
		ret.d					;//仼劊
		srl		%r10, %r9		;//%r10 := value = (unsigned)value >> (32 - bits)	*delay*
");
//}}2016/12/27曄峏:Asm斉偺bitarray_lsb1st_get,媦傃,bitarray_msb1st_get偺幚憰偑丄攋夡偡傞儗僕僗僞傪尭傜偟傑偟偨丅
#endif/*PIECE*/
