diff --git a/src/spider/runtime/cpu/Register.hpp b/src/spider/runtime/cpu/Register.hpp index 2948e22..d7aeaf4 100644 --- a/src/spider/runtime/cpu/Register.hpp +++ b/src/spider/runtime/cpu/Register.hpp @@ -18,10 +18,53 @@ namespace spider { * type-punning which is the "standard" right now. */ union register_t { + + // -- Un/Signed 64 -- // + u64 _u64; i64 _i64; - f64 _f64; - u8 _bytes[8]; + + // -- Un/Signed 32 -- // + + struct { + #if SPIDER_LITTLE_ENDIAN + u32 _u32; u32 : 32; + #else + u32 : 32; u32 _u32; + #endif + }; + + struct { + #if SPIDER_LITTLE_ENDIAN + i32 _i32; i32 : 32; + #else + i32 : 32; i32 _i32; + #endif + }; + + // -- Un/Signed 16 -- // + + struct { + #if SPIDER_LITTLE_ENDIAN + u16 _u16; + u16 : 16; u16 : 16; u16 : 16; + #else + u16 : 16; u16 : 16; u16 : 16; + u16 _u16; + #endif + }; + + struct { + #if SPIDER_LITTLE_ENDIAN + i16 _i16; + i16 : 16; i16 : 16; i16 : 16; + #else + i16 : 16; i16 : 16; i16 : 16; + i16 _i16; + #endif + }; + + // -- Un/Signed 8 -- // struct { #if SPIDER_LITTLE_ENDIAN @@ -35,22 +78,17 @@ namespace spider { struct { #if SPIDER_LITTLE_ENDIAN - u16 _u16; - u16 : 16; u16 : 16; u16 : 16; + i8 _i8; // ditto + i8 : 8; i8 : 8; i8 : 8; i8 : 8; i8 : 8; i8 : 8; i8 : 8; #else - u16 : 16; u16 : 16; u16 : 16; - u16 _u16; + i8 : 8; i8 : 8; i8 : 8; i8 : 8; i8 : 8; i8 : 8; i8 : 8; + i8 _i8; #endif }; - struct { - #if SPIDER_LITTLE_ENDIAN - u32 _u32; u32 : 32; - #else - u32 : 32; u32 _u32; - #endif - }; + // -- Floating Point -- // + f64 _f64; struct { #if SPIDER_LITTLE_ENDIAN f32 _f32; u32 : 32; @@ -59,6 +97,10 @@ namespace spider { #endif }; + // -- Access -- // + + u8 _bytes[8]; + u8& operator[](size_t i) { // 0 is always LSB #if SPIDER_LITTLE_ENDIAN return _bytes[i]; @@ -75,6 +117,7 @@ namespace spider { return _bytes[7 - i]; #endif } + }; static_assert(sizeof(register_t) == 8, "The register type must be exactly 8 bytes.");