diff --git a/internal/c/common.h b/internal/c/common.h index d0bb0fe9a..3403474ec 100644 --- a/internal/c/common.h +++ b/internal/c/common.h @@ -63,6 +63,7 @@ # include # include # include +# include # include # include diff --git a/internal/c/qbx.cpp b/internal/c/qbx.cpp index ae8f09edd..c79b0fe3e 100755 --- a/internal/c/qbx.cpp +++ b/internal/c/qbx.cpp @@ -1142,6 +1142,60 @@ inline int32 func_sgn(long double v) { return 0; } +// a740g: ROR & ROL additions start +// The rotation functions below are the way they are for a couple of reasons: +// 1. They are safer (well folks seem to think so; see https://en.wikipedia.org/wiki/Circular_shift#Implementing_circular_shifts) +// 2. We are using C library constants and there is just 1 numeric literal - '1' +// 3. GGC recognizes the 'pattern' and will optimize it out to 'roX' and 3 more instructions when using O2 +inline uint8_t func__rol8(uint8_t value, unsigned int count) { + const unsigned int mask = CHAR_BIT * sizeof(value) - 1; + count &= mask; + return (value << count) | (value >> (-count & mask)); +} + +inline uint8_t func__ror8(uint8_t value, unsigned int count) { + const unsigned int mask = CHAR_BIT * sizeof(value) - 1; + count &= mask; + return (value >> count) | (value << (-count & mask)); +} + +inline uint16_t func__rol16(uint16_t value, unsigned int count) { + const unsigned int mask = CHAR_BIT * sizeof(value) - 1; + count &= mask; + return (value << count) | (value >> (-count & mask)); +} + +inline uint16_t func__ror16(uint16_t value, unsigned int count) { + const unsigned int mask = CHAR_BIT * sizeof(value) - 1; + count &= mask; + return (value >> count) | (value << (-count & mask)); +} + +inline uint32_t func__rol32(uint32_t value, unsigned int count) { + const unsigned int mask = CHAR_BIT * sizeof(value) - 1; + count &= mask; + return (value << count) | (value >> (-count & mask)); +} + +inline uint32_t func__ror32(uint32_t value, unsigned int count) { + const unsigned int mask = CHAR_BIT * sizeof(value) - 1; + count &= mask; + return (value >> count) | (value << (-count & mask)); +} + +inline uint64_t func__rol64(uint64_t value, unsigned int count) { + const unsigned int mask = CHAR_BIT * sizeof(value) - 1; + count &= mask; + return (value << count) | (value >> (-count & mask)); +} + +inline uint64_t func__ror64(uint64_t value, unsigned int count) { + const unsigned int mask = CHAR_BIT * sizeof(value) - 1; + count &= mask; + return (value >> count) | (value << (-count & mask)); +} +// a740g: ROR & ROL additions end + // bit-shifting inline uint64 func__shl(uint64 a1, int b1) { return a1 << b1; } diff --git a/source/qb64pe.bas b/source/qb64pe.bas index 68b76ea0b..64ab65015 100644 --- a/source/qb64pe.bas +++ b/source/qb64pe.bas @@ -16384,6 +16384,44 @@ FUNCTION evaluatefunc$ (a2$, args AS LONG, typ AS LONG) IF Error_Happened THEN EXIT FUNCTION '------------------------------------------------------------------------------------------------------------ + ' a740g: ROR & ROL support + IF n$ = "_ROR" OR (n$ = "ROR" AND qb64prefix_set = 1) OR n$ = "_ROL" OR (n$ = "ROL" AND qb64prefix_set = 1) THEN + rotlr_n$ = LCASE$(RIGHT$(n$, 3)) ' Get the last 3 characters and convert to lower case. We'll need this to construct the C call + IF curarg = 1 THEN ' First paramater + IF (sourcetyp AND ISSTRING) OR (sourcetyp AND ISFLOAT) OR (sourcetyp AND ISOFFSET) OR (sourcetyp AND ISUDT) THEN ' Bad parameters types + Give_Error "Expected non-floating-point value" + EXIT FUNCTION + END IF + IF sourcetyp AND ISREFERENCE THEN e$ = refer(e$, sourcetyp, 0) ' This gets the C-style dereferencing syntax for an identifier (I think XD) + IF Error_Happened THEN EXIT FUNCTION + ' Establish which function (if any!) should be used + IF (sourcetyp AND 511) = 8 THEN ' sourcetyp is the type of data (bits can be examined to get more details) + e$ = "func__" + rotlr_n$ + "8(" + e$ + typ& = UBYTETYPE - ISPOINTER ' We force the return type here. This is passed back up to the caller + ELSEIF (sourcetyp AND 511) = 16 THEN + e$ = "func__" + rotlr_n$ + "16(" + e$ + typ& = UINTEGERTYPE - ISPOINTER + ELSEIF (sourcetyp AND 511) = 32 THEN + e$ = "func__" + rotlr_n$ + "32(" + e$ + typ& = ULONGTYPE - ISPOINTER + ELSEIF (sourcetyp AND 511) = 64 THEN + e$ = "func__" + rotlr_n$ + "64(" + e$ + typ& = UINTEGER64TYPE - ISPOINTER + ELSE + Give_Error "Unknown data size" + EXIT FUNCTION + END IF + r$ = e$ ' Save whatever syntax he have so far + e$ = "" ' This must be cleared so that it is not repeated when we get to parameter 2 + GOTO dontevaluate ' Don't evaluate until we get the second parameter + ELSEIF curarg = 2 THEN ' Second parameter + IF sourcetyp AND ISREFERENCE THEN e$ = refer(e$, sourcetyp, 0) + IF Error_Happened THEN EXIT FUNCTION + r$ = r$ + e$ + ")" + GOTO evalfuncspecial ' Evaluate now that we have everything + END IF + END IF + '***special case*** IF n$ = "_MEM" OR (n$ = "MEM" AND qb64prefix_set = 1) THEN IF curarg = 1 THEN diff --git a/source/subs_functions/subs_functions.bas b/source/subs_functions/subs_functions.bas index e7a13e202..f9f5f3133 100644 --- a/source/subs_functions/subs_functions.bas +++ b/source/subs_functions/subs_functions.bas @@ -3668,7 +3668,7 @@ id.hr_syntax = "_AUTODISPLAY" regid clearid -id.n = qb64prefix$ + "SHR" +id.n = qb64prefix$ + "ShR" ' a740g: Changed to camel case id.subfunc = 1 id.callname = "func__shr" id.args = 2 @@ -3678,7 +3678,7 @@ id.hr_syntax = "_SHR(numericalVariable, numericalValue)" regid clearid -id.n = qb64prefix$ + "SHL" +id.n = qb64prefix$ + "ShL" ' a740g: Changed to camel case id.subfunc = 1 id.callname = "func__shl" id.args = 2 @@ -3687,6 +3687,26 @@ id.ret = UINTEGER64TYPE - ISPOINTER id.hr_syntax = "_SHL(numericalVariable, numericalValue)" regid +' a740g: ROR & ROL additions +clearid +id.n = qb64prefix$ + "RoL" +id.subfunc = 1 +id.args = 2 +id.arg = MKL$(UINTEGER64TYPE - ISPOINTER) + MKL$(ULONGTYPE - ISPOINTER) ' ***overridden by function evaluatefunc*** +id.ret = UINTEGER64TYPE - ISPOINTER ' ***overridden by function evaluatefunc*** +id.hr_syntax = "_ROL(numericalVariable, numericalValue)" +regid + +clearid +id.n = qb64prefix$ + "RoR" +id.subfunc = 1 +id.args = 2 +id.arg = MKL$(UINTEGER64TYPE - ISPOINTER) + MKL$(ULONGTYPE - ISPOINTER) ' ***overridden by function evaluatefunc*** +id.ret = UINTEGER64TYPE - ISPOINTER ' ***overridden by function evaluatefunc*** +id.hr_syntax = "_ROR(numericalVariable, numericalValue)" +regid +' a740g: end of ROR & ROL additions + clearid id.n = qb64prefix$ + "Deflate" id.Dependency=DEPENDENCY_ZLIB diff --git a/source/subs_functions/syntax_highlighter_list.bas b/source/subs_functions/syntax_highlighter_list.bas index 684fe1f9c..d6a2a4b8f 100644 --- a/source/subs_functions/syntax_highlighter_list.bas +++ b/source/subs_functions/syntax_highlighter_list.bas @@ -3,6 +3,6 @@ listOfKeywords$ = "@?@$CHECKING@$ERROR@$CONSOLE@ONLY@$DYNAMIC@$ELSE@$ELSEIF@$END listOfKeywords$ = listOfKeywords$ + "_ERRORLINE@_ERRORMESSAGE$@_EXIT@_EXPLICIT@_EXPLICITARRAY@_FILEEXISTS@_FLOAT@_FONT@_FONTHEIGHT@_FONTWIDTH@_FREEFONT@_FREEIMAGE@_FREETIMER@_FULLSCREEN@_G2D@_G2R@_GLRENDER@_GREEN@_GREEN32@_HEIGHT@_HIDE@_HYPOT@_ICON@_INCLERRORFILE$@_INCLERRORLINE@_INTEGER64@_KEYCLEAR@_KEYDOWN@_KEYHIT@_LASTAXIS@_LASTBUTTON@_LASTWHEEL@_LIMIT@_LOADFONT@_LOADIMAGE@_MAPTRIANGLE@_MAPUNICODE@_MEM@_MEMCOPY@_MEMELEMENT@_MEMEXISTS@_MEMFILL@_MEMFREE@_MEMGET@_MEMIMAGE@_MEMSOUND@_MEMNEW@_MEMPUT@_MIDDLE@_MK$@_MOUSEBUTTON@_MOUSEHIDE@_MOUSEINPUT@_MOUSEMOVE@_MOUSEMOVEMENTX@_MOUSEMOVEMENTY@_MOUSEPIPEOPEN@_MOUSESHOW@_MOUSEWHEEL@_MOUSEX@_MOUSEY@_NEWIMAGE@_OFFSET@_OPENCLIENT@_OPENCONNECTION@_OPENHOST@_OS$@_PALETTECOLOR@_PI@_PIXELSIZE@_PRESERVE@_PRINTIMAGE@_PRINTMODE@_PRINTSTRING@_PRINTWIDTH@_PUTIMAGE@_R2D@_R2G@_RED@_RED32@_RESIZE@_RESIZEHEIGHT@_RESIZEWIDTH@_RGB@_RGB32@_RGBA@_RGBA32@_ROUND@_SCREENCLICK@_SCREENEXISTS@_SCREENHIDE@_SCREENICON@_SCREENIMAGE@_SCREENMOVE@_SCREENPRINT@_SCREENSHOW@_SCREENX@_SCREENY@_SEC@_SECH@_SETALPHA@_SHELLHIDE@_SINH@_SNDBAL@_SNDCLOSE@_SNDCOPY@_SNDGETPOS@_SNDLEN@_SNDLIMIT@_SNDLOOP@_SNDOPEN@_SNDOPENRAW@_SNDPAUSE@_SNDPAUSED@_SNDPLAY@_SNDPLAYCOPY@_SNDPLAYFILE@_SNDPLAYING@_SNDRATE@_SNDRAW@_SNDRAWDONE@_SNDRAWLEN@_SNDSETPOS@_SNDSTOP@_SNDVOL@_SOURCE@_STARTDIR$@_STRCMP@_STRICMP@_TANH@_TITLE@_TITLE$@_UNSIGNED@_WHEEL@_WIDTH@_WINDOWHANDLE@_WINDOWHASFOCUS@_GLACCUM@_GLALPHAFUNC@_GLARETEXTURESRESIDENT@_GLARRAYELEMENT@_GLBEGIN@_GLBINDTEXTURE@_GLBITMAP@_GLBLENDFUNC@_GLCALLLIST@_GLCALLLISTS@_GLCLEAR@_GLCLEARACCUM@_GLCLEARCOLOR@_GLCLEARDEPTH@_GLCLEARINDEX@_GLCLEARSTENCIL@_GLCLIPPLANE@_GLCOLOR3B@_GLCOLOR3BV@_GLCOLOR3D@_GLCOLOR3DV@_GLCOLOR3F@_GLCOLOR3FV@_GLCOLOR3I@_GLCOLOR3IV@_GLCOLOR3S@_GLCOLOR3SV@_GLCOLOR3UB@_GLCOLOR3UBV@_GLCOLOR3UI@_GLCOLOR3UIV@_GLCOLOR3US@_GLCOLOR3USV@_GLCOLOR4B@_GLCOLOR4BV@_GLCOLOR4D@_GLCOLOR4DV@_GLCOLOR4F@_GLCOLOR4FV@_GLCOLOR4I@_GLCOLOR4IV@_GLCOLOR4S@_GLCOLOR4SV@_GLCOLOR4UB@_GLCOLOR4UBV@_GLCOLOR4UI@_GLCOLOR4UIV@_GLCOLOR4US@_GLCOLOR4USV@_GLCOLORMASK@_GLCOLORMATERIAL@_GLCOLORPOINTER@_GLCOPYPIXELS@_GLCOPYTEXIMAGE1D@_GLCOPYTEXIMAGE2D@_GLCOPYTEXSUBIMAGE1D@" listOfKeywords$ = listOfKeywords$ + "_GLCOPYTEXSUBIMAGE2D@_GLCULLFACE@_GLDELETELISTS@_GLDELETETEXTURES@_GLDEPTHFUNC@_GLDEPTHMASK@_GLDEPTHRANGE@_GLDISABLE@_GLDISABLECLIENTSTATE@_GLDRAWARRAYS@_GLDRAWBUFFER@_GLDRAWELEMENTS@_GLDRAWPIXELS@_GLEDGEFLAG@_GLEDGEFLAGPOINTER@_GLEDGEFLAGV@_GLENABLE@_GLENABLECLIENTSTATE@_GLEND@_GLENDLIST@_GLEVALCOORD1D@_GLEVALCOORD1DV@_GLEVALCOORD1F@_GLEVALCOORD1FV@_GLEVALCOORD2D@_GLEVALCOORD2DV@_GLEVALCOORD2F@_GLEVALCOORD2FV@_GLEVALMESH1@_GLEVALMESH2@_GLEVALPOINT1@_GLEVALPOINT2@_GLFEEDBACKBUFFER@_GLFINISH@_GLFLUSH@_GLFOGF@_GLFOGFV@_GLFOGI@_GLFOGIV@_GLFRONTFACE@_GLFRUSTUM@_GLGENLISTS@_GLGENTEXTURES@_GLGETBOOLEANV@_GLGETCLIPPLANE@_GLGETDOUBLEV@_GLGETERROR@_GLGETFLOATV@_GLGETINTEGERV@_GLGETLIGHTFV@_GLGETLIGHTIV@_GLGETMAPDV@_GLGETMAPFV@_GLGETMAPIV@_GLGETMATERIALFV@_GLGETMATERIALIV@_GLGETPIXELMAPFV@_GLGETPIXELMAPUIV@_GLGETPIXELMAPUSV@_GLGETPOINTERV@_GLGETPOLYGONSTIPPLE@_GLGETSTRING@_GLGETTEXENVFV@_GLGETTEXENVIV@_GLGETTEXGENDV@_GLGETTEXGENFV@_GLGETTEXGENIV@_GLGETTEXIMAGE@_GLGETTEXLEVELPARAMETERFV@_GLGETTEXLEVELPARAMETERIV@_GLGETTEXPARAMETERFV@_GLGETTEXPARAMETERIV@_GLHINT@_GLINDEXMASK@_GLINDEXPOINTER@_GLINDEXD@_GLINDEXDV@_GLINDEXF@_GLINDEXFV@_GLINDEXI@_GLINDEXIV@_GLINDEXS@_GLINDEXSV@_GLINDEXUB@_GLINDEXUBV@_GLINITNAMES@_GLINTERLEAVEDARRAYS@_GLISENABLED@_GLISLIST@_GLISTEXTURE@_GLLIGHTMODELF@_GLLIGHTMODELFV@_GLLIGHTMODELI@_GLLIGHTMODELIV@_GLLIGHTF@_GLLIGHTFV@_GLLIGHTI@_GLLIGHTIV@_GLLINESTIPPLE@_GLLINEWIDTH@_GLLISTBASE@_GLLOADIDENTITY@_GLLOADMATRIXD@_GLLOADMATRIXF@_GLLOADNAME@_GLLOGICOP@_GLMAP1D@_GLMAP1F@_GLMAP2D@_GLMAP2F@_GLMAPGRID1D@_GLMAPGRID1F@_GLMAPGRID2D@_GLMAPGRID2F@_GLMATERIALF@_GLMATERIALFV@_GLMATERIALI@_GLMATERIALIV@_GLMATRIXMODE@_GLMULTMATRIXD@_GLMULTMATRIXF@_GLNEWLIST@_GLNORMAL3B@_GLNORMAL3BV@_GLNORMAL3D@_GLNORMAL3DV@_GLNORMAL3F@_GLNORMAL3FV@_GLNORMAL3I@_GLNORMAL3IV@_GLNORMAL3S@_GLNORMAL3SV@_GLNORMALPOINTER@_GLORTHO@_GLPASSTHROUGH@_GLPIXELMAPFV@_GLPIXELMAPUIV@_GLPIXELMAPUSV@_GLPIXELSTOREF@_GLPIXELSTOREI@_GLPIXELTRANSFERF@_GLPIXELTRANSFERI@_GLPIXELZOOM@_GLPOINTSIZE@_GLPOLYGONMODE@_GLPOLYGONOFFSET@_GLPOLYGONSTIPPLE@" listOfKeywords$ = listOfKeywords$ + "_GLPOPATTRIB@_GLPOPCLIENTATTRIB@_GLPOPMATRIX@_GLPOPNAME@_GLPRIORITIZETEXTURES@_GLPUSHATTRIB@_GLPUSHCLIENTATTRIB@_GLPUSHMATRIX@_GLPUSHNAME@_GLRASTERPOS2D@_GLRASTERPOS2DV@_GLRASTERPOS2F@_GLRASTERPOS2FV@_GLRASTERPOS2I@_GLRASTERPOS2IV@_GLRASTERPOS2S@_GLRASTERPOS2SV@_GLRASTERPOS3D@_GLRASTERPOS3DV@_GLRASTERPOS3F@_GLRASTERPOS3FV@_GLRASTERPOS3I@_GLRASTERPOS3IV@_GLRASTERPOS3S@_GLRASTERPOS3SV@_GLRASTERPOS4D@_GLRASTERPOS4DV@_GLRASTERPOS4F@_GLRASTERPOS4FV@_GLRASTERPOS4I@_GLRASTERPOS4IV@_GLRASTERPOS4S@_GLRASTERPOS4SV@_GLREADBUFFER@_GLREADPIXELS@_GLRECTD@_GLRECTDV@_GLRECTF@_GLRECTFV@_GLRECTI@_GLRECTIV@_GLRECTS@_GLRECTSV@_GLRENDERMODE@_GLROTATED@_GLROTATEF@_GLSCALED@_GLSCALEF@_GLSCISSOR@_GLSELECTBUFFER@_GLSHADEMODEL@_GLSTENCILFUNC@_GLSTENCILMASK@_GLSTENCILOP@_GLTEXCOORD1D@_GLTEXCOORD1DV@_GLTEXCOORD1F@_GLTEXCOORD1FV@_GLTEXCOORD1I@_GLTEXCOORD1IV@_GLTEXCOORD1S@_GLTEXCOORD1SV@_GLTEXCOORD2D@_GLTEXCOORD2DV@_GLTEXCOORD2F@_GLTEXCOORD2FV@_GLTEXCOORD2I@_GLTEXCOORD2IV@_GLTEXCOORD2S@_GLTEXCOORD2SV@_GLTEXCOORD3D@_GLTEXCOORD3DV@_GLTEXCOORD3F@_GLTEXCOORD3FV@_GLTEXCOORD3I@_GLTEXCOORD3IV@_GLTEXCOORD3S@_GLTEXCOORD3SV@_GLTEXCOORD4D@_GLTEXCOORD4DV@_GLTEXCOORD4F@_GLTEXCOORD4FV@_GLTEXCOORD4I@_GLTEXCOORD4IV@_GLTEXCOORD4S@_GLTEXCOORD4SV@_GLTEXCOORDPOINTER@_GLTEXENVF@_GLTEXENVFV@_GLTEXENVI@_GLTEXENVIV@_GLTEXGEND@_GLTEXGENDV@_GLTEXGENF@_GLTEXGENFV@_GLTEXGENI@_GLTEXGENIV@_GLTEXIMAGE1D@_GLTEXIMAGE2D@_GLTEXPARAMETERF@_GLTEXPARAMETERFV@_GLTEXPARAMETERI@_GLTEXPARAMETERIV@_GLTEXSUBIMAGE1D@_GLTEXSUBIMAGE2D@_GLTRANSLATED@_GLTRANSLATEF@_GLVERTEX2D@_GLVERTEX2DV@_GLVERTEX2F@_GLVERTEX2FV@_GLVERTEX2I@_GLVERTEX2IV@_GLVERTEX2S@_GLVERTEX2SV@_GLVERTEX3D@_GLVERTEX3DV@_GLVERTEX3F@_GLVERTEX3FV@_GLVERTEX3I@_GLVERTEX3IV@_GLVERTEX3S@_GLVERTEX3SV@_GLVERTEX4D@_GLVERTEX4DV@_GLVERTEX4F@_GLVERTEX4FV@_GLVERTEX4I@_GLVERTEX4IV@_GLVERTEX4S@_GLVERTEX4SV@_GLVERTEXPOINTER@_GLVIEWPORT@SMOOTH@STRETCH@_ANTICLOCKWISE@_BEHIND@_CLEAR@_FILLBACKGROUND@_GLUPERSPECTIVE@_HARDWARE@_HARDWARE1@_KEEPBACKGROUND@_NONE@_OFF@_ONLY@_ONLYBACKGROUND@_ONTOP@_SEAMLESS@_SMOOTH@_SMOOTHSHRUNK@_SMOOTHSTRETCHED@" -listOfKeywords$ = listOfKeywords$ + "_SOFTWARE@_SQUAREPIXELS@_STRETCH@_ALLOWFULLSCREEN@_ALL@_ECHO@_INSTRREV@_TRIM$@_ACCEPTFILEDROP@_FINISHDROP@_TOTALDROPPEDFILES@_DROPPEDFILE@_DROPPEDFILE$@_SHR@_SHL@" +listOfKeywords$ = listOfKeywords$ + "_SOFTWARE@_SQUAREPIXELS@_STRETCH@_ALLOWFULLSCREEN@_ALL@_ECHO@_INSTRREV@_TRIM$@_ACCEPTFILEDROP@_FINISHDROP@_TOTALDROPPEDFILES@_DROPPEDFILE@_DROPPEDFILE$@_SHR@_SHL@_ROR@_ROL@" ' a740g: added ROR & ROL listOfKeywords$ = listOfKeywords$ + "_DEFLATE$@_INFLATE$@_READBIT@_RESETBIT@_SETBIT@_TOGGLEBIT@$ASSERTS@_ASSERT@_CAPSLOCK@_NUMLOCK@_SCROLLLOCK@_TOGGLE@_CONSOLEFONT@_CONSOLECURSOR@_CONSOLEINPUT@_CINP@$NOPREFIX@$COLOR@$DEBUG@_ENVIRONCOUNT@" diff --git a/tests/compile_tests/rotations/test.bas b/tests/compile_tests/rotations/test.bas new file mode 100644 index 000000000..d841154a5 --- /dev/null +++ b/tests/compile_tests/rotations/test.bas @@ -0,0 +1,123 @@ +$CONSOLE:ONLY +OPTION _EXPLICIT + +DIM a AS _UNSIGNED _BYTE +DIM b AS _UNSIGNED INTEGER +DIM c AS _UNSIGNED LONG +DIM d AS _UNSIGNED _INTEGER64 + +a = &B11110000 +b = &B1111111100000000 +c = &B11111111111111110000000000000000 +d = &B1111111111111111111111111111111100000000000000000000000000000000 + +PRINT "*** Unsigned values ***" +PRINT a; ":"; _BIN$(a) +PRINT b; ":"; _BIN$(b) +PRINT c; ":"; _BIN$(c) +PRINT d; ":"; _BIN$(d) + +PRINT "Rotating left by 5" +PRINT _ROL(a, 1); ":"; _BIN$(_ROL(a, 5)) +PRINT _ROL(b, 1); ":"; _BIN$(_ROL(b, 5)) +PRINT _ROL(c, 1); ":"; _BIN$(_ROL(c, 5)) +PRINT _ROL(d, 1); ":"; _BIN$(_ROL(d, 5)) + +PRINT "Rotating right by 5" +PRINT _ROR(a, 1); ":"; _BIN$(_ROR(a, 5)) +PRINT _ROR(b, 1); ":"; _BIN$(_ROR(b, 5)) +PRINT _ROR(c, 1); ":"; _BIN$(_ROR(c, 5)) +PRINT _ROR(d, 1); ":"; _BIN$(_ROR(d, 5)) + +PRINT "Rotating left past size" +PRINT _ROL(a, 1); ":"; _BIN$(_ROL(a, 9)) +PRINT _ROL(b, 1); ":"; _BIN$(_ROL(b, 17)) +PRINT _ROL(c, 1); ":"; _BIN$(_ROL(c, 33)) +PRINT _ROL(d, 1); ":"; _BIN$(_ROL(d, 65)) + +PRINT "Rotating right past size" +PRINT _ROR(a, 1); ":"; _BIN$(_ROR(a, 9)) +PRINT _ROR(b, 1); ":"; _BIN$(_ROR(b, 17)) +PRINT _ROR(c, 1); ":"; _BIN$(_ROR(c, 33)) +PRINT _ROR(d, 1); ":"; _BIN$(_ROR(d, 65)) + +PRINT "Rotating left by -5" +PRINT _ROL(a, 1); ":"; _BIN$(_ROL(a, -5)) +PRINT _ROL(b, 1); ":"; _BIN$(_ROL(b, -5)) +PRINT _ROL(c, 1); ":"; _BIN$(_ROL(c, -5)) +PRINT _ROL(d, 1); ":"; _BIN$(_ROL(d, -5)) + +PRINT "Rotating right by -5" +PRINT _ROR(a, 1); ":"; _BIN$(_ROR(a, -5)) +PRINT _ROR(b, 1); ":"; _BIN$(_ROR(b, -5)) +PRINT _ROR(c, 1); ":"; _BIN$(_ROR(c, -5)) +PRINT _ROR(d, 1); ":"; _BIN$(_ROR(d, -5)) + + +DIM e AS _BYTE +DIM f AS INTEGER +DIM g AS LONG +DIM h AS _INTEGER64 + +e = -128 +f = -32768 +g = -2147483648 +h = -9223372036854775808 + +PRINT "*** Signed values ***" +PRINT e; ":"; _BIN$(e) +PRINT f; ":"; _BIN$(f) +PRINT g; ":"; _BIN$(g) +PRINT h; ":"; _BIN$(h) + +PRINT "Rotating left by 5" +PRINT _ROL(e, 1); ":"; _BIN$(_ROL(e, 5)) +PRINT _ROL(f, 1); ":"; _BIN$(_ROL(f, 5)) +PRINT _ROL(g, 1); ":"; _BIN$(_ROL(g, 5)) +PRINT _ROL(h, 1); ":"; _BIN$(_ROL(h, 5)) + +PRINT "Rotating right by 5" +PRINT _ROR(e, 1); ":"; _BIN$(_ROR(e, 5)) +PRINT _ROR(f, 1); ":"; _BIN$(_ROR(f, 5)) +PRINT _ROR(g, 1); ":"; _BIN$(_ROR(g, 5)) +PRINT _ROR(h, 1); ":"; _BIN$(_ROR(h, 5)) + +PRINT "Rotating left past size" +PRINT _ROL(e, 1); ":"; _BIN$(_ROL(e, 9)) +PRINT _ROL(f, 1); ":"; _BIN$(_ROL(f, 17)) +PRINT _ROL(g, 1); ":"; _BIN$(_ROL(g, 33)) +PRINT _ROL(h, 1); ":"; _BIN$(_ROL(h, 65)) + +PRINT "Rotating right past size" +PRINT _ROR(e, 1); ":"; _BIN$(_ROR(e, 9)) +PRINT _ROR(f, 1); ":"; _BIN$(_ROR(f, 17)) +PRINT _ROR(g, 1); ":"; _BIN$(_ROR(g, 33)) +PRINT _ROR(h, 1); ":"; _BIN$(_ROR(h, 65)) + +PRINT "Rotating left by -5" +PRINT _ROL(e, 1); ":"; _BIN$(_ROL(e, -5)) +PRINT _ROL(f, 1); ":"; _BIN$(_ROL(f, -5)) +PRINT _ROL(g, 1); ":"; _BIN$(_ROL(g, -5)) +PRINT _ROL(h, 1); ":"; _BIN$(_ROL(h, -5)) + +PRINT "Rotating right by -5" +PRINT _ROR(e, 1); ":"; _BIN$(_ROR(e, -5)) +PRINT _ROR(f, 1); ":"; _BIN$(_ROR(f, -5)) +PRINT _ROR(g, 1); ":"; _BIN$(_ROR(g, -5)) +PRINT _ROR(h, 1); ":"; _BIN$(_ROR(h, -5)) + + +PRINT "*** Rotating some numeric literals left by 5 ***" +PRINT 240~%%; ":"; _BIN$(_ROL(240~%%, 5)) +PRINT 65280~%; ":"; _BIN$(_ROL(65280~%, 5)) +PRINT 4294901760~&; ":"; _BIN$(_ROL(4294901760~&, 5)) +PRINT 18446744069414584320~&&; ":"; _BIN$(_ROL(18446744069414584320~&&, 5)) + +PRINT "*** Rotating some numeric literals right by 5 ***" +PRINT 240~%%; ":"; _BIN$(_ROR(240~%%, 5)) +PRINT 65280~%; ":"; _BIN$(_ROR(65280~%, 5)) +PRINT 4294901760~&; ":"; _BIN$(_ROR(4294901760~&, 5)) +PRINT 18446744069414584320~&&; ":"; _BIN$(_ROR(18446744069414584320~&&, 5)) + +SYSTEM + diff --git a/tests/compile_tests/rotations/test.output b/tests/compile_tests/rotations/test.output new file mode 100644 index 000000000..f0dba0181 --- /dev/null +++ b/tests/compile_tests/rotations/test.output @@ -0,0 +1,80 @@ +*** Unsigned values *** + 240 :11110000 + 65280 :1111111100000000 + 4294901760 :11111111111111110000000000000000 + 18446744069414584320 :1111111111111111111111111111111100000000000000000000000000000000 +Rotating left by 5 + 225 :11110 + 65025 :1110000000011111 + 4294836225 :11111111111000000000000000011111 + 18446744065119617025 :1111111111111111111111111110000000000000000000000000000000011111 +Rotating right by 5 + 120 :10000111 + 32640 :11111111000 + 2147450880 :111111111111111100000000000 + 9223372034707292160 :11111111111111111111111111111111000000000000000000000000000 +Rotating left past size + 225 :11100001 + 65025 :1111111000000001 + 4294836225 :11111111111111100000000000000001 + 18446744065119617025 :1111111111111111111111111111111000000000000000000000000000000001 +Rotating right past size + 120 :1111000 + 32640 :111111110000000 + 2147450880 :1111111111111111000000000000000 + 9223372034707292160 :111111111111111111111111111111110000000000000000000000000000000 +Rotating left by -5 + 225 :10000111 + 65025 :11111111000 + 4294836225 :111111111111111100000000000 + 18446744065119617025 :11111111111111111111111111111111000000000000000000000000000 +Rotating right by -5 + 120 :11110 + 32640 :1110000000011111 + 2147450880 :11111111111000000000000000011111 + 9223372034707292160 :1111111111111111111111111110000000000000000000000000000000011111 +*** Signed values *** +-128 :10000000 +-32768 :1000000000000000 +-2147483648 :10000000000000000000000000000000 +-9223372036854775808 :1000000000000000000000000000000000000000000000000000000000000000 +Rotating left by 5 + 1 :10000 + 1 :10000 + 1 :10000 + 1 :10000 +Rotating right by 5 + 64 :100 + 16384 :10000000000 + 1073741824 :100000000000000000000000000 + 4611686018427387904 :10000000000000000000000000000000000000000000000000000000000 +Rotating left past size + 1 :1 + 1 :1 + 1 :1 + 1 :1 +Rotating right past size + 64 :1000000 + 16384 :100000000000000 + 1073741824 :1000000000000000000000000000000 + 4611686018427387904 :100000000000000000000000000000000000000000000000000000000000000 +Rotating left by -5 + 1 :100 + 1 :10000000000 + 1 :100000000000000000000000000 + 1 :10000000000000000000000000000000000000000000000000000000000 +Rotating right by -5 + 64 :10000 + 16384 :10000 + 1073741824 :10000 + 4611686018427387904 :10000 +*** Rotating some numeric literals left by 5 *** + 240 :11110 + 65280 :1110000000011111 + 4294901760 :11111111111000000000000000011111 + 18446744069414584320 :1111111111111111111111111110000000000000000000000000000000011111 +*** Rotating some numeric literals right by 5 *** + 240 :10000111 + 65280 :11111111000 + 4294901760 :111111111111111100000000000 + 18446744069414584320 :11111111111111111111111111111111000000000000000000000000000