1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h> 2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h> 3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct { 5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint64_t high; 6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint64_t low; 7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} quad_word; 8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid 10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtest(quad_word op1_init, uint64_t op2_init, quad_word op3_init) 11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int cc; // unused 13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng quad_word op1 = op1_init; 14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint64_t op2 = op2_init; 15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng quad_word op3 = op3_init; 16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng __asm__ volatile ( 18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "lmg %%r0,%%r1,%1\n\t" 19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "lmg %%r2,%%r3,%3\n\t" 20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "cds %%r0,%%r2,%2\n\t" // cds 1st,3rd,2nd 21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "stmg %%r0,%%r1,%1\n" // store r0,r1 to op1 22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "stmg %%r2,%%r3,%3\n" // store r2,r3 to op3 23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : "=d" (cc), "+QS" (op1), "+QS" (op2), "+QS" (op3) 24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : 25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng : "r0", "r1", "r2", "r3", "cc"); 26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// Return a quad-word that only bits low[32:63] are undefined 30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengquad_word 31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengmake_undefined(void) 32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng quad_word val; 34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng val.high = 0; 36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng val.low |= 0xFFFFFFFF00000000ull; 37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return val; 39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid op1_undefined(void) 42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng quad_word op1, op3; 44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint64_t op2; 45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // op1 undefined 47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op1 = make_undefined(); 48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op2 = 42; 49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op3.high = op3.low = 0xdeadbeefdeadbabeull; 50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test(op1, op2, op3); // complaint 51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid op2_undefined(void) 54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng quad_word op1, op3; 56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint64_t op2; 57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op1.high = op1.low = 42; 59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng // op2 undefined 60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op3.high = op3.low = 0xdeadbeefdeadbabeull; 61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test(op1, op2, op3); // complaint 62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid op3_undefined(void) 65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng quad_word op1, op3; 67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng uint64_t op2; 68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op1.high = op1.low = 42; 70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op2 = 100; 71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op3 = make_undefined(); 72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng test(op1, op2, op3); // no complaint; op3 is just copied around 73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main () 76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op1_undefined(); 78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op2_undefined(); 79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng op3_undefined(); 80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 0; 82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 83